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"
17 #include "libmythbase/mythchrono.h"
18 
19 // forward declaration
20 struct AVCodecContext;
21 struct AVPacket;
22 struct AVFrame;
23 
25 {
26  Q_DECLARE_TR_FUNCTIONS(AudioOutput);
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)) { };
41  AudioDeviceConfig(const AudioDeviceConfig &) = default;
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
AudioOutput::GetError
QString GetError(void) const
Definition: audiooutput.h:146
AudioOutput::AudioDeviceConfig::m_desc
QString m_desc
Definition: audiooutput.h:33
MPUBLIC
#define MPUBLIC
Definition: mythexp.h:10
FORMAT_S16
@ FORMAT_S16
Definition: audiooutputsettings.h:27
AudioOutput::AudioDeviceConfig::AudioDeviceConfig
AudioDeviceConfig(QString name, QString desc)
Definition: audiooutput.h:37
AudioOutput::GetChannels
virtual int GetChannels(void) const
Definition: audiooutput.h:75
AudioOutput::GetBytesPerFrame
virtual int GetBytesPerFrame(void) const
Definition: audiooutput.h:77
AudioOutput::NeedDecodingBeforePassthrough
virtual bool NeedDecodingBeforePassthrough(void) const
Definition: audiooutput.h:122
OutputListeners
Definition: output.h:102
AudioOutput::GetWarning
QString GetWarning(void) const
Definition: audiooutput.h:147
AudioOutput::LengthLastData
virtual std::chrono::milliseconds LengthLastData(void) const
Definition: audiooutput.h:129
AudioOutput::PulseStatus
bool PulseStatus(void) const
Definition: audiooutput.h:160
true
VERBOSE_PREAMBLE Most true
Definition: verbosedefs.h:95
AudioOutput::CanDownmix
virtual bool CanDownmix(void) const
Definition: audiooutput.h:83
AudioOutput::CanProcess
virtual bool CanProcess(AudioFormat fmt)
Definition: audiooutput.h:167
AudioOutput::CanUpmix
virtual bool CanUpmix(void)
Definition: audiooutput.h:159
AudioOutput::GetAudioBufferedTime
virtual std::chrono::milliseconds GetAudioBufferedTime(void)
report amount of audio buffered in milliseconds.
Definition: audiooutput.h:142
AudioSettings
Definition: audiosettings.h:28
AVFrame
struct AVFrame AVFrame
Definition: BorderDetector.h:15
AudioOutput
Definition: audiooutput.h:24
hardwareprofile.scan.profile
profile
Definition: scan.py:96
VolumeBase
Definition: volumebase.h:15
AudioOutput::SetSourceBitrate
virtual void SetSourceBitrate(int)
Definition: audiooutput.h:144
audiosettings.h
compat.h
AudioOutput::AudioDeviceConfig::m_settings
AudioOutputSettings m_settings
Definition: audiooutput.h:34
volumebase.h
AudioOutput::AudioDeviceConfig
Definition: audiooutput.h:29
AudioOutput::GetStretchFactor
virtual float GetStretchFactor(void) const
Definition: audiooutput.h:74
AudioOutput::GetBufferStatus
virtual void GetBufferStatus(uint &fill, uint &total)
Definition: audiooutput.h:149
AudioOutputSettings
Definition: audiooutputsettings.h:48
AudioOutput::AudioDeviceConfig::m_name
QString m_name
Definition: audiooutput.h:32
AudioOutput::GetFormat
virtual AudioFormat GetFormat(void) const
Definition: audiooutput.h:76
AudioOutput::CanProcess
virtual uint32_t CanProcess(void)
Definition: audiooutput.h:173
AudioFormat
AudioFormat
Definition: audiooutputsettings.h:24
mythchrono.h
AudioOutput::AudioDeviceConfig::AudioDeviceConfig
AudioDeviceConfig(void)
Definition: audiooutput.h:35
AudioOutput::IsUpmixing
virtual bool IsUpmixing(void)
Definition: audiooutput.h:157
AudioOutput::m_lastWarn
QString m_lastWarn
Definition: audiooutput.h:205
AudioOutput::ADCVect
QVector< AudioDeviceConfig > ADCVect
Definition: audiooutput.h:47
audiooutputsettings.h
AudioOutput::ToggleUpmix
virtual bool ToggleUpmix(void)
Definition: audiooutput.h:158
output.h
AudioOutput::m_lastError
QString m_lastError
Definition: audiooutput.h:204
uint
unsigned int uint
Definition: freesurround.h:24
AudioOutputSource
AudioOutputSource
Definition: audiosettings.h:21