00001 #ifndef DECODER_H_
00002 #define DECODER_H_
00003
00004 #include "config.h"
00005 #include <qstring.h>
00006 #include <qevent.h>
00007 #include <qthread.h>
00008 #include <qptrlist.h>
00009 #include <mythtv/mythobservable.h>
00010
00011 class Metadata;
00012 class MetaIO;
00013 class Decoder;
00014 class DecoderFactory;
00015
00016 class QObject;
00017 class QIODevice;
00018 class QThread;
00019 class OutputEvent;
00020
00021 class Buffer;
00022 class Recycler;
00023 class AudioOutput;
00024
00025 class DecoderEvent : public MythEvent
00026 {
00027 public:
00028 enum Type { Decoding = (QEvent::User + 100), Stopped, Finished, Error };
00029
00030 DecoderEvent(Type t)
00031 : MythEvent(t), error_msg(0)
00032 { ; }
00033
00034 DecoderEvent(QString *e)
00035 : MythEvent(Error), error_msg(e)
00036 { ; }
00037
00038 ~DecoderEvent()
00039 {
00040 if (error_msg)
00041 delete error_msg;
00042 }
00043
00044 const QString *errorMessage() const { return error_msg; }
00045
00046 virtual DecoderEvent *clone();
00047
00048 private:
00049 QString *error_msg;
00050 };
00051
00052 class Decoder : public QThread, public MythObservable
00053 {
00054 public:
00055 virtual ~Decoder();
00056
00057 virtual bool initialize() = 0;
00058 virtual void seek(double) = 0;
00059 virtual void stop() = 0;
00060
00061 DecoderFactory *factory() const { return fctry; }
00062
00063 QIODevice *input() { return in; }
00064 AudioOutput *output() { return out; }
00065 void setInput(QIODevice *);
00066 void setOutput(AudioOutput *);
00067 void setFilename(const QString &newName) { filename = newName; }
00068
00069 virtual void lock(void) { return mtx.lock(); }
00070 virtual void unlock(void) { return mtx.unlock(); }
00071 virtual bool tryLock(void) { return mtx.tryLock(); }
00072 virtual bool locked(void) { return mtx.locked(); }
00073
00074 QWaitCondition *cond() { return &cnd; }
00075
00076 void setBlockSize(unsigned int sz) { blksize = sz; }
00077 unsigned int blockSize() const { return blksize; }
00078 QString getFilename(void) const { return filename; }
00079
00080 virtual Metadata *readMetadata(void);
00081 virtual Metadata *getMetadata(void);
00082 virtual MetaIO *doCreateTagger (void);
00083 virtual void commitMetadata(Metadata *mdata);
00084
00085
00086 static QStringList all();
00087 static bool supports(const QString &);
00088 static void registerFactory(DecoderFactory *);
00089 static Decoder *create(const QString &, QIODevice *, AudioOutput *,
00090 bool = FALSE);
00091 static void SetLocationFormatUseTags(void);
00092
00093 protected:
00094 Decoder(DecoderFactory *, QIODevice *, AudioOutput *);
00095 QMutex* getMutex(void) { return &mtx; }
00096 void error(const QString &);
00097
00098 QString filename;
00099
00100 static QString filename_format;
00101 static int ignore_id3;
00102 static QString musiclocation;
00103
00104 private:
00105 DecoderFactory *fctry;
00106
00107 QIODevice *in;
00108 AudioOutput *out;
00109
00110 QMutex mtx;
00111 QWaitCondition cnd;
00112
00113 int blksize;
00114 };
00115
00116 class DecoderFactory
00117 {
00118 public:
00119 virtual bool supports(const QString &source) const = 0;
00120 virtual const QString &extension() const = 0;
00121 virtual const QString &description() const = 0;
00122 virtual Decoder *create(const QString &, QIODevice *, AudioOutput *, bool) = 0;
00123 virtual ~DecoderFactory() {}
00124 };
00125
00126 class VorbisDecoderFactory : public DecoderFactory
00127 {
00128 public:
00129 bool supports(const QString &) const;
00130 const QString &extension() const;
00131 const QString &description() const;
00132 Decoder *create(const QString &, QIODevice *, AudioOutput *, bool);
00133 };
00134
00135 class MadDecoderFactory : public DecoderFactory
00136 {
00137 public:
00138 bool supports(const QString &) const;
00139 const QString &extension() const;
00140 const QString &description() const;
00141 Decoder *create(const QString &, QIODevice *, AudioOutput *, bool);
00142 };
00143
00144 class CdDecoderFactory : public DecoderFactory
00145 {
00146 public:
00147 bool supports(const QString &) const;
00148 const QString &extension() const;
00149 const QString &description() const;
00150 Decoder *create(const QString &, QIODevice *, AudioOutput *, bool);
00151 };
00152
00153 class FlacDecoderFactory : public DecoderFactory
00154 {
00155 public:
00156 bool supports(const QString &) const;
00157 const QString &extension() const;
00158 const QString &description() const;
00159 Decoder *create(const QString &, QIODevice *, AudioOutput *, bool);
00160 };
00161
00162 class avfDecoderFactory : public DecoderFactory
00163 {
00164 public:
00165 bool supports(const QString &) const;
00166 const QString &extension() const;
00167 const QString &description() const;
00168 Decoder *create(const QString &, QIODevice *, AudioOutput *, bool);
00169 };
00170
00171 #ifdef AAC_SUPPORT
00172 class aacDecoderFactory : public DecoderFactory
00173 {
00174 public:
00175 bool supports(const QString &) const;
00176 const QString &extension() const;
00177 const QString &description() const;
00178 Decoder *create(const QString &, QIODevice *, AudioOutput *, bool);
00179 };
00180 #endif
00181
00182 #endif