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;
24
25class Buffer;
26class AudioOutput;
27
28class DecoderEvent : public MythEvent
29{
30 public:
31 explicit DecoderEvent(Type type) : MythEvent(type) { ; }
32 explicit DecoderEvent(QString *e) : MythEvent(kError), m_errorMsg(e) { ; }
33
34 ~DecoderEvent() override
35 {
36 delete m_errorMsg;
37 }
38
39 const QString *errorMessage() const { return m_errorMsg; }
40
41 MythEvent *clone(void) const override // MythEvent
42 { return new DecoderEvent(*this); }
43
44 static const Type kDecoding;
45 static const Type kStopped;
46 static const Type kFinished;
47 static const Type kError;
48
49 private:
51 {
52 if (o.m_errorMsg)
53 {
54 m_errorMsg = new QString(*o.m_errorMsg);
55 }
56 }
57
58 // No implicit copying.
59 protected:
60 DecoderEvent &operator=(const DecoderEvent &other) = default;
61 public:
64
65 private:
66 QString *m_errorMsg {nullptr};
67};
68
69class Decoder : public MThread, public MythObservable
70{
71 public:
72 ~Decoder() override;
73
74 virtual bool initialize() = 0;
75 virtual void seek(double) = 0;
76 virtual void stop() = 0;
77
78 DecoderFactory *factory() const { return m_fctry; }
79
80 AudioOutput *output() { return m_out; }
81 void setOutput(AudioOutput *o);
82 void setURL(const QString &url) { m_url = url; }
83
84 virtual void lock(void) { m_mtx.lock(); }
85 virtual void unlock(void) { m_mtx.unlock(); }
86 virtual bool tryLock(void) { return m_mtx.tryLock(); }
87
88 QWaitCondition *cond() { return &m_cnd; }
89
90 QString getURL(void) const { return m_url; }
91
92 // static methods
93 static QStringList all();
94 static bool supports(const QString &source);
95 static void registerFactory(DecoderFactory *fact);
96 static Decoder *create(const QString &source, AudioOutput *output, bool deletable = false);
97
98 protected:
100 : MThread("MythMusicDecoder"), m_fctry(d), m_out(o) {}
101 QMutex* getMutex(void) { return &m_mtx; }
102 void error(const QString &e);
103
104 QString m_url;
105
106 private:
108
109 AudioOutput *m_out {nullptr};
110
111 QMutex m_mtx;
112 QWaitCondition m_cnd;
113
114};
115
117{
118public:
119 virtual bool supports(const QString &source) const = 0;
120 virtual const QString &extension() const = 0; // file extension, ie. ".mp3" or ".ogg"
121 virtual const QString &description() const = 0; // file type, ie. "MPEG Audio Files"
122 virtual Decoder *create(const QString &source, AudioOutput *output, bool deletable) = 0;
123 virtual ~DecoderFactory() = default;
124};
125
127{
129
130public:
131 bool supports(const QString &source) const override; // DecoderFactory
132 const QString &extension() const override; // DecoderFactory
133 const QString &description() const override; // DecoderFactory
134 Decoder *create(const QString &file, AudioOutput *output, bool deletable) override; // DecoderFactory
135};
136
138{
140
141public:
142 bool supports(const QString &source) const override; // DecoderFactory
143 const QString &extension() const override; // DecoderFactory
144 const QString &description() const override; // DecoderFactory
145 Decoder *create(const QString &file, AudioOutput *output, bool deletable) override; // DecoderFactory
146};
147
148#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:50
static const Type kStopped
Definition: decoder.h:45
~DecoderEvent() override
Definition: decoder.h:34
DecoderEvent & operator=(const DecoderEvent &other)=default
static const Type kDecoding
Definition: decoder.h:44
DecoderEvent(QString *e)
Definition: decoder.h:32
static const Type kFinished
Definition: decoder.h:46
DecoderEvent & operator=(DecoderEvent &&)=delete
DecoderEvent(Type type)
Definition: decoder.h:31
MythEvent * clone(void) const override
Definition: decoder.h:41
QString * m_errorMsg
Definition: decoder.h:66
static const Type kError
Definition: decoder.h:47
DecoderEvent(DecoderEvent &&)=delete
const QString * errorMessage() const
Definition: decoder.h:39
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:84
void error(const QString &e)
Definition: decoder.cpp:49
virtual bool tryLock(void)
Definition: decoder.h:86
virtual void stop()=0
QString getURL(void) const
Definition: decoder.h:90
virtual void unlock(void)
Definition: decoder.h:85
static Decoder * create(const QString &source, AudioOutput *output, bool deletable=false)
Definition: decoder.cpp:96
void setURL(const QString &url)
Definition: decoder.h:82
AudioOutput * m_out
Definition: decoder.h:109
virtual bool initialize()=0
virtual void seek(double)=0
QMutex m_mtx
Definition: decoder.h:111
AudioOutput * output()
Definition: decoder.h:80
QWaitCondition m_cnd
Definition: decoder.h:112
QWaitCondition * cond()
Definition: decoder.h:88
~Decoder() override
Definition: decoder.cpp:29
QString m_url
Definition: decoder.h:104
Decoder(DecoderFactory *d, AudioOutput *o)
Definition: decoder.h:99
static QStringList all()
Definition: decoder.cpp:72
static bool supports(const QString &source)
Definition: decoder.cpp:82
DecoderFactory * m_fctry
Definition: decoder.h:107
DecoderFactory * factory() const
Definition: decoder.h:78
QMutex * getMutex(void)
Definition: decoder.h:101
static void registerFactory(DecoderFactory *fact)
Definition: decoder.cpp:91
void setOutput(AudioOutput *o)
Definition: decoder.cpp:42
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