MythTV master
audiooutput.h
Go to the documentation of this file.
1#ifndef AUDIOOUTPUT
2#define AUDIOOUTPUT
3
4#include <chrono>
5using namespace std::chrono_literals;
6#include <utility>
7
8// Qt headers
9#include <QCoreApplication>
10#include <QString>
11#include <QVector>
12
13// MythTV headers
18#include "libmythbase/compat.h"
22
23#include "libmythtv/mythtvexp.h"
24
25// forward declaration
26struct AVCodecContext;
27struct AVPacket;
28struct AVFrame;
29
31{
33
34 public:
36 {
37 public:
38 QString m_name;
39 QString m_desc;
42 m_settings(AudioOutputSettings(true)) { };
43 AudioDeviceConfig(QString name,
44 QString desc) :
45 m_name(std::move(name)), m_desc(std::move(desc)),
46 m_settings(AudioOutputSettings(true)) { };
49 AudioDeviceConfig &operator= (const AudioDeviceConfig &) = default;
50 AudioDeviceConfig &operator= (AudioDeviceConfig &&) = default;
51 };
52
53 class Event;
54
55 using ADCVect = QVector<AudioDeviceConfig>;
56
57 static void Cleanup(void);
58 static ADCVect* GetOutputList(void);
59 static AudioDeviceConfig* GetAudioDeviceConfig(
60 QString &name, const QString &desc, bool willsuspendpa = false);
61
62 // opens one of the concrete subclasses
63 static AudioOutput *OpenAudio(
64 const QString &main_device, const QString &passthru_device,
65 AudioFormat format, int channels, AVCodecID codec, int samplerate,
66 AudioOutputSource source, bool set_initial_vol, bool passthru,
67 int upmixer_startup = 0, AudioOutputSettings *custom = nullptr);
68 static AudioOutput *OpenAudio(AudioSettings &settings,
69 bool willsuspendpa = true);
70 static AudioOutput *OpenAudio(
71 const QString &main_device,
72 const QString &passthru_device = QString(),
73 bool willsuspendpa = true);
74
75 AudioOutput() = default;
76 ~AudioOutput() override;
77
78 // reconfigure sound out for new params
79 virtual void Reconfigure(const AudioSettings &settings) = 0;
80 bool isConfigured() const { return m_isConfigured; };
81
82 virtual void SetStretchFactor(float factor);
83 virtual float GetStretchFactor(void) const { return 1.0F; }
84 virtual int GetChannels(void) const { return 2; }
85 virtual AudioFormat GetFormat(void) const { return FORMAT_S16; };
86 virtual int GetBytesPerFrame(void) const { return 4; };
87
88 virtual AudioOutputSettings* GetOutputSettingsCleaned(bool digital = true);
89 virtual AudioOutputSettings* GetOutputSettingsUsers(bool digital = true);
90 virtual bool CanPassthrough(int samplerate, int channels,
91 AVCodecID codec, int profile) const;
92 virtual bool CanDownmix(void) const { return false; };
93
94 // dsprate is in 100 * samples/second
95 virtual void SetEffDsp(int dsprate) = 0;
96
97 virtual void Reset(void) = 0;
98
109 virtual bool AddFrames(void *buffer, int frames,
110 std::chrono::milliseconds timecode) = 0;
111
123 virtual bool AddData(void *buffer, int len,
124 std::chrono::milliseconds timecode, int frames) = 0;
125
131 virtual bool NeedDecodingBeforePassthrough(void) const { return true; };
132
138 virtual std::chrono::milliseconds LengthLastData(void) const { return -1ms; };
139
140 virtual void SetTimecode(std::chrono::milliseconds timecode) = 0;
141 virtual bool IsPaused(void) const = 0;
142 virtual void Pause(bool paused) = 0;
143 virtual void PauseUntilBuffered(void) = 0;
144
145 // Wait for all data to finish playing
146 virtual void Drain(void) = 0;
147
148 virtual std::chrono::milliseconds GetAudiotime(void) = 0;
149
151 virtual std::chrono::milliseconds GetAudioBufferedTime(void) { return 0ms; }
152
153 virtual void SetSourceBitrate(int /*rate*/ ) { }
154
155 virtual void GetBufferStatus(uint &fill, uint &total)
156 { fill = total = 0; }
157
158 // Only really used by the AudioOutputNULL object
159 virtual void bufferOutputData(bool y) = 0;
160 virtual int readOutputData(unsigned char *read_buffer,
161 size_t max_length) = 0;
162
163 virtual bool IsUpmixing(void) { return false; }
164 virtual bool ToggleUpmix(void) { return false; }
165 virtual bool CanUpmix(void) { return false; }
166 bool PulseStatus(void) const { return m_pulseWasSuspended; }
167
173 virtual bool CanProcess(AudioFormat fmt) { return fmt == FORMAT_S16; }
174
179 virtual uint32_t CanProcess(void) { return 1 << FORMAT_S16; }
180
195 int DecodeAudio(AVCodecContext *ctx,
196 uint8_t *buffer, int &data_size,
197 const AVPacket *pkt);
201 static const int kMaxSizeBuffer = 384000;
202
203 bool hasVisual(void) { return !m_visuals.empty(); }
204 void addVisual(Visualization *v);
205 void removeVisual(Visualization *v);
206
216 bool playPinkNoise(char* frames, int channels, int channel, int count, int bits);
217
218 virtual bool has_optimized_SIMD() { return false; }
219
220 protected:
221 void dispatchError(const QString &e);
222 void dispatchVisual(uchar *b, unsigned long b_len,
223 std::chrono::milliseconds timecode, int chan, int prec);
224 void prepareVisuals();
225
226 bool m_isConfigured {false};
227 bool m_pulseWasSuspended {false};
228 AVFrame *m_frame {nullptr};
229 std::vector<Visualization*> m_visuals;
230};
231
233{
234 public:
235 explicit Event(Type type) : MythEvent(type) {}
236 Event(std::chrono::seconds s, unsigned long w, int b, int f, int p, int c) :
237 MythEvent(kInfo), m_elaspedSeconds(s), m_writtenBytes(w),
238 m_brate(b), m_freq(f), m_prec(p), m_chan(c) {}
239 explicit Event(QString e) :
240 MythEvent(kError),
241 m_errorMsg(std::move(e))
242 {
243 }
244
245 ~Event() override = default;
246
247 QString errorMessage() const { return m_errorMsg; }
248
249 const std::chrono::seconds &elapsedSeconds() const { return m_elaspedSeconds; }
250 const unsigned long &writtenBytes() const { return m_writtenBytes; }
251 const int &bitrate() const { return m_brate; }
252 const int &frequency() const { return m_freq; }
253 const int &precision() const { return m_prec; }
254 const int &channels() const { return m_chan; }
255
256 MythEvent *clone(void) const override // MythEvent
257 { return new Event(*this); }
258
259 static const inline QEvent::Type kPlaying {static_cast<QEvent::Type>(QEvent::registerEventType())};
260 static const inline QEvent::Type kBuffering {static_cast<QEvent::Type>(QEvent::registerEventType())};
261 static const inline QEvent::Type kInfo {static_cast<QEvent::Type>(QEvent::registerEventType())};
262 static const inline QEvent::Type kPaused {static_cast<QEvent::Type>(QEvent::registerEventType())};
263 static const inline QEvent::Type kStopped {static_cast<QEvent::Type>(QEvent::registerEventType())};
264 static const inline QEvent::Type kError {static_cast<QEvent::Type>(QEvent::registerEventType())};
265
266 private:
267 Event(const Event &o) = default;
268
269 // No implicit copying.
270 public:
271 Event &operator=(const Event &other) = delete;
272 Event(Event &&) = delete;
273 Event &operator=(Event &&) = delete;
274
275 private:
276 QString m_errorMsg;
277
278 std::chrono::seconds m_elaspedSeconds {0s};
279 unsigned long m_writtenBytes {0};
280 int m_brate {0};
281 int m_freq {0};
282 int m_prec {0};
283 int m_chan {0};
284};
285
286#endif
AVFrame AVFrame
@ FORMAT_S16
AudioOutputSource
Definition: audiosettings.h:21
AudioDeviceConfig(const AudioDeviceConfig &)=default
AudioOutputSettings m_settings
Definition: audiooutput.h:40
AudioDeviceConfig(QString name, QString desc)
Definition: audiooutput.h:43
AudioDeviceConfig(AudioDeviceConfig &&)=default
AudioOutput()=default
Event(Type type)
Definition: audiooutput.h:235
virtual void bufferOutputData(bool y)=0
virtual int GetChannels(void) const
Definition: audiooutput.h:84
bool isConfigured() const
Definition: audiooutput.h:80
virtual bool AddData(void *buffer, int len, std::chrono::milliseconds timecode, int frames)=0
Add data to the audiobuffer for playback.
virtual bool IsPaused(void) const =0
virtual void SetTimecode(std::chrono::milliseconds timecode)=0
Event(std::chrono::seconds s, unsigned long w, int b, int f, int p, int c)
Definition: audiooutput.h:236
virtual bool NeedDecodingBeforePassthrough(void) const
Definition: audiooutput.h:131
const std::chrono::seconds & elapsedSeconds() const
Definition: audiooutput.h:249
virtual void Drain(void)=0
virtual bool has_optimized_SIMD()
Definition: audiooutput.h:218
virtual std::chrono::milliseconds GetAudioBufferedTime(void)
report amount of audio buffered in milliseconds.
Definition: audiooutput.h:151
virtual bool IsUpmixing(void)
Definition: audiooutput.h:163
virtual void PauseUntilBuffered(void)=0
virtual std::chrono::milliseconds GetAudiotime(void)=0
Event(QString e)
Definition: audiooutput.h:239
virtual AudioFormat GetFormat(void) const
Definition: audiooutput.h:85
virtual std::chrono::milliseconds LengthLastData(void) const
Definition: audiooutput.h:138
virtual void SetEffDsp(int dsprate)=0
virtual bool ToggleUpmix(void)
Definition: audiooutput.h:164
QVector< AudioDeviceConfig > ADCVect
Definition: audiooutput.h:55
virtual int GetBytesPerFrame(void) const
Definition: audiooutput.h:86
bool hasVisual(void)
Definition: audiooutput.h:203
~Event() override=default
Event(const Event &o)=default
Event & operator=(const Event &other)=delete
const int & frequency() const
Definition: audiooutput.h:252
virtual bool CanDownmix(void) const
Definition: audiooutput.h:92
virtual void Reset(void)=0
virtual bool CanUpmix(void)
Definition: audiooutput.h:165
virtual bool AddFrames(void *buffer, int frames, std::chrono::milliseconds timecode)=0
Add frames to the audiobuffer for playback.
const int & bitrate() const
Definition: audiooutput.h:251
bool PulseStatus(void) const
Definition: audiooutput.h:166
virtual bool CanProcess(AudioFormat fmt)
Definition: audiooutput.h:173
virtual void Reconfigure(const AudioSettings &settings)=0
QString errorMessage() const
Definition: audiooutput.h:247
const unsigned long & writtenBytes() const
Definition: audiooutput.h:250
virtual uint32_t CanProcess(void)
Definition: audiooutput.h:179
virtual void GetBufferStatus(uint &fill, uint &total)
Definition: audiooutput.h:155
virtual void Pause(bool paused)=0
const int & precision() const
Definition: audiooutput.h:253
virtual float GetStretchFactor(void) const
Definition: audiooutput.h:83
Event & operator=(Event &&)=delete
QString m_errorMsg
Definition: audiooutput.h:276
MythEvent * clone(void) const override
Definition: audiooutput.h:256
Event(Event &&)=delete
Q_DECLARE_TR_FUNCTIONS(AudioOutput)
virtual void SetSourceBitrate(int)
Definition: audiooutput.h:153
std::vector< Visualization * > m_visuals
Definition: audiooutput.h:229
const int & channels() const
Definition: audiooutput.h:254
virtual int readOutputData(unsigned char *read_buffer, size_t max_length)=0
Event details.
Definition: zmdefines.h:28
This class is used as a container for messages.
Definition: mythevent.h:17
Superclass for making an object have a set of listeners.
unsigned int uint
Definition: compat.h:68
#define MTV_PUBLIC
Definition: mythtvexp.h:11
STL namespace.
VERBOSE_PREAMBLE Most true
Definition: verbosedefs.h:95