aboutsummaryrefslogblamecommitdiff
path: root/lib/decoder.h
blob: d5d34cf4eed70d96e70a441bef1ccb5142f46a7c (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14













                                                                    
                      
















































































































                                                                               


                                                      





























                                                      
// Copyright (c) 2000-2001 Brad Hughes <bhughes@trolltech.com>
//
// Use, modification and distribution is allowed without limitation,
// warranty, or liability of any kind.
//

#ifndef   DECODER_H
#define   DECODER_H

#include <QThread>
#include <QList>
#include <QMutex>
#include <QWaitCondition>
#include <QObject>
#include <QStringList>


#include "fileinfo.h"
#include "filetag.h"

class QObject;
class QIODevice;

class Decoder;
class DecoderFactory;
class Buffer;
class Recycler;
class Output;
class Visualization;



class DecoderState
{
public:
    enum Type { Decoding, Stopped, Finished, Error };

    DecoderState(Type t)
            : m_type(t), m_error_msg(0)
    {}

    DecoderState(const QString &e)
            : m_type(Error)
    {
        m_error_msg = new QString(e);
    }

    DecoderState()
            : m_type(Stopped), m_error_msg(0)
    {}

    ~DecoderState()
    {
        if (m_error_msg)
           delete m_error_msg;
    }

    const QString *errorMessage() const
    {
        return m_error_msg;
    }
    const Type &type() const
    {
        return m_type;
    }

private:
    Type m_type;
    const QString *m_error_msg;
};



class Decoder : public QThread
{
Q_OBJECT
public:
    Decoder(QObject *parent, DecoderFactory *d, 
               QIODevice *i, Output *o);
    virtual ~Decoder();

    // Standard Decoder API
    virtual bool initialize() = 0;
    virtual double lengthInSeconds() = 0;
    virtual void seek(double) = 0;
    virtual void stop() = 0;

    DecoderFactory *factory() const
    {
        return fctry;
    }

    QIODevice *input()
    {
        return in;
    }
    Output *output()
    {
        return out;
    }

    QMutex *mutex()
    {
        return &mtx;
    }
    QWaitCondition *cond()
    {
        return &cnd;
    }

    void setBlockSize(unsigned int sz)
    {
        blksize = sz;
    }

    unsigned int blockSize() const
    {
        return blksize;
    }
    ulong produceSound(char *data, ulong output_bytes, ulong bitrate, int nch);
    void setEQ(int bands[10], int preamp);
    void setEQEnabled(bool on) { m_useEQ = on; };

    // static methods
    static QStringList all();
    static bool supports(const QString &);
    //static void registerFactory(DecoderFactory *);
    static Decoder *create(QObject *, const QString &, QIODevice *, Output *);
    static DecoderFactory *findByPath(const QString&);
    static DecoderFactory *findByMime(const QString&);
    static DecoderFactory *findByContent(QIODevice *);
    static FileTag *createTag(const QString&);
    static QString filter();
    static QStringList nameFilters();
    static QList<DecoderFactory*> *decoderFactories();
    static QStringList decoderFiles();

signals:
    void stateChanged(const DecoderState&);

protected:
    void dispatch(DecoderState::Type);
    void dispatch(const DecoderState&);
    void error(const QString&);

private:
    DecoderFactory *fctry;

    QList<QObject*> listeners;
    QIODevice *in;
    Output *out;

    QMutex mtx;
    QWaitCondition cnd;

    uint blksize;
    bool m_eqInited;
    bool m_useEQ;
};

#endif // DECODER_H