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