MythTV master
audiooutput.h
Go to the documentation of this file.
1#ifndef AUDIOOUTPUT
2#define AUDIOOUTPUT
3
4#include <utility>
5
6// Qt headers
7#include <QCoreApplication>
8#include <QString>
9#include <QVector>
10
11// MythTV headers
15#include "libmyth/output.h"
16#include "libmythbase/compat.h"
18
19// forward declaration
20struct AVCodecContext;
21struct AVPacket;
22struct AVFrame;
23
25{
27
28 public:
30 {
31 public:
32 QString m_name;
33 QString m_desc;
36 m_settings(AudioOutputSettings(true)) { };
37 AudioDeviceConfig(QString name,
38 QString desc) :
39 m_name(std::move(name)), m_desc(std::move(desc)),
40 m_settings(AudioOutputSettings(true)) { };
43 AudioDeviceConfig &operator= (const AudioDeviceConfig &) = default;
44 AudioDeviceConfig &operator= (AudioDeviceConfig &&) = default;
45 };
46
47 using ADCVect = QVector<AudioDeviceConfig>;
48
49 static void Cleanup(void);
50 static ADCVect* GetOutputList(void);
51 static AudioDeviceConfig* GetAudioDeviceConfig(
52 QString &name, const QString &desc, bool willsuspendpa = false);
53
54 // opens one of the concrete subclasses
55 static AudioOutput *OpenAudio(
56 const QString &main_device, const QString &passthru_device,
57 AudioFormat format, int channels, AVCodecID codec, int samplerate,
58 AudioOutputSource source, bool set_initial_vol, bool passthru,
59 int upmixer_startup = 0, AudioOutputSettings *custom = nullptr);
60 static AudioOutput *OpenAudio(AudioSettings &settings,
61 bool willsuspendpa = true);
62 static AudioOutput *OpenAudio(
63 const QString &main_device,
64 const QString &passthru_device = QString(),
65 bool willsuspendpa = true);
66
67 AudioOutput() = default;
68 ~AudioOutput() override;
69
70 // reconfigure sound out for new params
71 virtual void Reconfigure(const AudioSettings &settings) = 0;
72
73 virtual void SetStretchFactor(float factor);
74 virtual float GetStretchFactor(void) const { return 1.0F; }
75 virtual int GetChannels(void) const { return 2; }
76 virtual AudioFormat GetFormat(void) const { return FORMAT_S16; };
77 virtual int GetBytesPerFrame(void) const { return 4; };
78
79 virtual AudioOutputSettings* GetOutputSettingsCleaned(bool digital = true);
80 virtual AudioOutputSettings* GetOutputSettingsUsers(bool digital = true);
81 virtual bool CanPassthrough(int samplerate, int channels,
82 AVCodecID codec, int profile) const;
83 virtual bool CanDownmix(void) const { return false; };
84
85 // dsprate is in 100 * samples/second
86 virtual void SetEffDsp(int dsprate) = 0;
87
88 virtual void Reset(void) = 0;
89
100 virtual bool AddFrames(void *buffer, int frames,
101 std::chrono::milliseconds timecode) = 0;
102
114 virtual bool AddData(void *buffer, int len,
115 std::chrono::milliseconds timecode, int frames) = 0;
116
122 virtual bool NeedDecodingBeforePassthrough(void) const { return true; };
123
129 virtual std::chrono::milliseconds LengthLastData(void) const { return -1ms; };
130
131 virtual void SetTimecode(std::chrono::milliseconds timecode) = 0;
132 virtual bool IsPaused(void) const = 0;
133 virtual void Pause(bool paused) = 0;
134 virtual void PauseUntilBuffered(void) = 0;
135
136 // Wait for all data to finish playing
137 virtual void Drain(void) = 0;
138
139 virtual std::chrono::milliseconds GetAudiotime(void) = 0;
140
142 virtual std::chrono::milliseconds GetAudioBufferedTime(void) { return 0ms; }
143
144 virtual void SetSourceBitrate(int /*rate*/ ) { }
145
146 QString GetError(void) const { return m_lastError; }
147 QString GetWarning(void) const { return m_lastWarn; }
148
149 virtual void GetBufferStatus(uint &fill, uint &total)
150 { fill = total = 0; }
151
152 // Only really used by the AudioOutputNULL object
153 virtual void bufferOutputData(bool y) = 0;
154 virtual int readOutputData(unsigned char *read_buffer,
155 size_t max_length) = 0;
156
157 virtual bool IsUpmixing(void) { return false; }
158 virtual bool ToggleUpmix(void) { return false; }
159 virtual bool CanUpmix(void) { return false; }
160 bool PulseStatus(void) const { return m_pulseWasSuspended; }
161
167 virtual bool CanProcess(AudioFormat fmt) { return fmt == FORMAT_S16; }
168
173 virtual uint32_t CanProcess(void) { return 1 << FORMAT_S16; }
174
189 virtual int DecodeAudio(AVCodecContext *ctx,
190 uint8_t *buffer, int &data_size,
191 const AVPacket *pkt);
195 static const int kMaxSizeBuffer = 384000;
196
197 protected:
198 void Error(const QString &msg);
199 void SilentError(const QString &msg);
200 void Warn(const QString &msg);
201 void ClearError(void);
202 void ClearWarning(void);
203
204 QString m_lastError;
205 QString m_lastWarn;
206 bool m_pulseWasSuspended {false};
207 AVFrame *m_frame {nullptr};
208};
209
210#endif
AVFrame AVFrame
@ FORMAT_S16
AudioOutputSource
Definition: audiosettings.h:21
AudioDeviceConfig(const AudioDeviceConfig &)=default
AudioOutputSettings m_settings
Definition: audiooutput.h:34
AudioDeviceConfig(QString name, QString desc)
Definition: audiooutput.h:37
AudioDeviceConfig(AudioDeviceConfig &&)=default
AudioOutput()=default
virtual void bufferOutputData(bool y)=0
virtual int GetChannels(void) const
Definition: audiooutput.h:75
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
virtual bool NeedDecodingBeforePassthrough(void) const
Definition: audiooutput.h:122
virtual void Drain(void)=0
virtual std::chrono::milliseconds GetAudioBufferedTime(void)
report amount of audio buffered in milliseconds.
Definition: audiooutput.h:142
virtual bool IsUpmixing(void)
Definition: audiooutput.h:157
virtual void PauseUntilBuffered(void)=0
virtual std::chrono::milliseconds GetAudiotime(void)=0
virtual AudioFormat GetFormat(void) const
Definition: audiooutput.h:76
virtual std::chrono::milliseconds LengthLastData(void) const
Definition: audiooutput.h:129
virtual void SetEffDsp(int dsprate)=0
virtual bool ToggleUpmix(void)
Definition: audiooutput.h:158
QVector< AudioDeviceConfig > ADCVect
Definition: audiooutput.h:47
virtual int GetBytesPerFrame(void) const
Definition: audiooutput.h:77
QString m_lastError
Definition: audiooutput.h:204
virtual bool CanDownmix(void) const
Definition: audiooutput.h:83
virtual void Reset(void)=0
virtual bool CanUpmix(void)
Definition: audiooutput.h:159
virtual bool AddFrames(void *buffer, int frames, std::chrono::milliseconds timecode)=0
Add frames to the audiobuffer for playback.
bool PulseStatus(void) const
Definition: audiooutput.h:160
virtual bool CanProcess(AudioFormat fmt)
Definition: audiooutput.h:167
virtual void Reconfigure(const AudioSettings &settings)=0
virtual uint32_t CanProcess(void)
Definition: audiooutput.h:173
virtual void GetBufferStatus(uint &fill, uint &total)
Definition: audiooutput.h:149
virtual void Pause(bool paused)=0
virtual float GetStretchFactor(void) const
Definition: audiooutput.h:74
QString m_lastWarn
Definition: audiooutput.h:205
Q_DECLARE_TR_FUNCTIONS(AudioOutput)
QString GetWarning(void) const
Definition: audiooutput.h:147
virtual void SetSourceBitrate(int)
Definition: audiooutput.h:144
QString GetError(void) const
Definition: audiooutput.h:146
virtual int readOutputData(unsigned char *read_buffer, size_t max_length)=0
unsigned int uint
Definition: freesurround.h:24
#define MPUBLIC
Definition: mythexp.h:10
STL namespace.
VERBOSE_PREAMBLE Most true
Definition: verbosedefs.h:95