MythTV master
decoder.h
Go to the documentation of this file.
1// -*- Mode: c++ -*-
2
3#ifndef DECODER_H_
4#define DECODER_H_
5
6// Qt
7#include <QCoreApplication>
8#include <QEvent>
9#include <QMutex>
10#include <QStringList>
11#include <QWaitCondition>
12
13// MythTV
14#include <libmythbase/mthread.h>
16
17class MusicMetadata;
18class MetaIO;
19class Decoder;
20class DecoderFactory;
21
22class QObject;
23class QIODevice;
24class OutputEvent;
25
26class Buffer;
27class AudioOutput;
28
29class DecoderEvent : public MythEvent
30{
31 public:
32 explicit DecoderEvent(Type type) : MythEvent(type) { ; }
33 explicit DecoderEvent(QString *e) : MythEvent(kError), m_errorMsg(e) { ; }
34
35 ~DecoderEvent() override
36 {
37 delete m_errorMsg;
38 }
39
40 const QString *errorMessage() const { return m_errorMsg; }
41
42 MythEvent *clone(void) const override // MythEvent
43 { return new DecoderEvent(*this); }
44
45 static const Type kDecoding;
46 static const Type kStopped;
47 static const Type kFinished;
48 static const Type kError;
49
50 private:
52 {
53 if (o.m_errorMsg)
54 {
55 m_errorMsg = new QString(*o.m_errorMsg);
56 }
57 }
58
59 // No implicit copying.
60 protected:
61 DecoderEvent &operator=(const DecoderEvent &other) = default;
62 public:
65
66 private:
67 QString *m_errorMsg {nullptr};
68};
69
70class Decoder : public MThread, public MythObservable
71{
72 public:
73 ~Decoder() override;
74
75 virtual bool initialize() = 0;
76 virtual void seek(double) = 0;
77 virtual void stop() = 0;
78
79 DecoderFactory *factory() const { return m_fctry; }
80
81 AudioOutput *output() { return m_out; }
82 void setOutput(AudioOutput *o);
83 void setURL(const QString &url) { m_url = url; }
84
85 virtual void lock(void) { m_mtx.lock(); }
86 virtual void unlock(void) { m_mtx.unlock(); }
87 virtual bool tryLock(void) { return m_mtx.tryLock(); }
88
89 QWaitCondition *cond() { return &m_cnd; }
90
91 QString getURL(void) const { return m_url; }
92
93 // static methods
94 static QStringList all();
95 static bool supports(const QString &source);
96 static void registerFactory(DecoderFactory *fact);
97 static Decoder *create(const QString &source, AudioOutput *output, bool deletable = false);
98
99 protected:
101 : MThread("MythMusicDecoder"), m_fctry(d), m_out(o) {}
102 QMutex* getMutex(void) { return &m_mtx; }
103 void error(const QString &e);
104
105 QString m_url;
106
107 private:
109
110 AudioOutput *m_out {nullptr};
111
112 QMutex m_mtx;
113 QWaitCondition m_cnd;
114
115};
116
118{
119public:
120 virtual bool supports(const QString &source) const = 0;
121 virtual const QString &extension() const = 0; // file extension, ie. ".mp3" or ".ogg"
122 virtual const QString &description() const = 0; // file type, ie. "MPEG Audio Files"
123 virtual Decoder *create(const QString &source, AudioOutput *output, bool deletable) = 0;
124 virtual ~DecoderFactory() = default;
125};
126
128{
130
131public:
132 bool supports(const QString &source) const override; // DecoderFactory
133 const QString &extension() const override; // DecoderFactory
134 const QString &description() const override; // DecoderFactory
135 Decoder *create(const QString &file, AudioOutput *output, bool deletable) override; // DecoderFactory
136};
137
139{
141
142public:
143 bool supports(const QString &source) const override; // DecoderFactory
144 const QString &extension() const override; // DecoderFactory
145 const QString &description() const override; // DecoderFactory
146 Decoder *create(const QString &file, AudioOutput *output, bool deletable) override; // DecoderFactory
147};
148
149#endif
const QString & description() const override
Definition: cddecoder.cpp:718
bool supports(const QString &source) const override
Definition: cddecoder.cpp:705
Q_DECLARE_TR_FUNCTIONS(CdDecoderFactory)
Decoder * create(const QString &file, AudioOutput *output, bool deletable) override
Definition: cddecoder.cpp:725
const QString & extension() const override
Definition: cddecoder.cpp:711
DecoderEvent(const DecoderEvent &o)
Definition: decoder.h:51
static const Type kStopped
Definition: decoder.h:46
~DecoderEvent() override
Definition: decoder.h:35
DecoderEvent & operator=(const DecoderEvent &other)=default
static const Type kDecoding
Definition: decoder.h:45
DecoderEvent(QString *e)
Definition: decoder.h:33
static const Type kFinished
Definition: decoder.h:47
DecoderEvent & operator=(DecoderEvent &&)=delete
DecoderEvent(Type type)
Definition: decoder.h:32
MythEvent * clone(void) const override
Definition: decoder.h:42
QString * m_errorMsg
Definition: decoder.h:67
static const Type kError
Definition: decoder.h:48
DecoderEvent(DecoderEvent &&)=delete
const QString * errorMessage() const
Definition: decoder.h:40
virtual const QString & extension() const =0
virtual bool supports(const QString &source) const =0
virtual Decoder * create(const QString &source, AudioOutput *output, bool deletable)=0
virtual ~DecoderFactory()=default
virtual const QString & description() const =0
virtual void lock(void)
Definition: decoder.h:85
void error(const QString &e)
Definition: decoder.cpp:51
virtual bool tryLock(void)
Definition: decoder.h:87
virtual void stop()=0
QString getURL(void) const
Definition: decoder.h:91
virtual void unlock(void)
Definition: decoder.h:86
static Decoder * create(const QString &source, AudioOutput *output, bool deletable=false)
Definition: decoder.cpp:98
void setURL(const QString &url)
Definition: decoder.h:83
AudioOutput * m_out
Definition: decoder.h:110
virtual bool initialize()=0
virtual void seek(double)=0
QMutex m_mtx
Definition: decoder.h:112
AudioOutput * output()
Definition: decoder.h:81
QWaitCondition m_cnd
Definition: decoder.h:113
QWaitCondition * cond()
Definition: decoder.h:89
~Decoder() override
Definition: decoder.cpp:31
QString m_url
Definition: decoder.h:105
Decoder(DecoderFactory *d, AudioOutput *o)
Definition: decoder.h:100
static QStringList all()
Definition: decoder.cpp:74
static bool supports(const QString &source)
Definition: decoder.cpp:84
DecoderFactory * m_fctry
Definition: decoder.h:108
DecoderFactory * factory() const
Definition: decoder.h:79
QMutex * getMutex(void)
Definition: decoder.h:102
static void registerFactory(DecoderFactory *fact)
Definition: decoder.cpp:93
void setOutput(AudioOutput *o)
Definition: decoder.cpp:44
This is a wrapper around QThread that does several additional things.
Definition: mthread.h:49
Definition: metaio.h:18
This class is used as a container for messages.
Definition: mythevent.h:17
Superclass for making an object have a set of listeners.
Q_DECLARE_TR_FUNCTIONS(avfDecoderFactory)
bool supports(const QString &source) const override
Definition: avfdecoder.cpp:595
Decoder * create(const QString &file, AudioOutput *output, bool deletable) override
Definition: avfdecoder.cpp:614
const QString & description() const override
Definition: avfdecoder.cpp:608
const QString & extension() const override
Definition: avfdecoder.cpp:603
static const iso6937table * d
#define output