11#define LOC QString("AudioPlayer: ")
17 m_mutedOnCreation(muted)
33 QMutexLocker lock(&
m_lock);
47 QMutexLocker lock(&
m_lock);
61 QMutexLocker lock(&
m_lock);
71 QMutexLocker lock(&
m_lock);
81 QMutexLocker lock(&
m_lock);
91 QMutexLocker lock(&
m_lock);
98 QMutexLocker locker(&
m_lock);
111 QMutexLocker lock(&
m_lock);
132 errMsg = tr(
"Unable to create AudioOutput.");
136 errMsg = tr(
"AudioOutput has not been successfully configured.");
148 errMsg = tr(
"AudioOutput has not been successfully configured.");
153 if (!errMsg.isEmpty())
155 LOG(VB_GENERAL, LOG_NOTICE,
LOC +
"Disabling Audio" +
156 QString(
", reason is: %1").arg(errMsg));
158 AudioPlayer::tr(
"Audio Player" ), errMsg);
163 LOG(VB_GENERAL, LOG_NOTICE,
LOC +
"Enabling Audio");
189 QMutexLocker lock(&
m_lock);
198 QMutexLocker lock(&
m_lock);
206 QMutexLocker lock(&
m_lock);
224 QMutexLocker lock(&
m_lock);
233 const QString &passthru_device,
239 if (!main_device.isEmpty())
241 if (!passthru_device.isEmpty())
253 int channels, AVCodecID codec,
254 int samplerate,
bool passthru,
272 QMutexLocker lock(&
m_lock);
279 QMutexLocker lock(&
m_lock);
284 LOG(VB_AUDIO, LOG_INFO, QString(
"muting sound %1").arg(
IsMuted()));
290 LOG(VB_AUDIO, LOG_INFO, QString(
"unmuting sound %1").arg(
IsMuted()));
294 LOG(VB_AUDIO, LOG_ERR,
295 QString(
"not changing sound mute state %1").arg(
IsMuted()));
304 QMutexLocker lock(&
m_lock);
319 QMutexLocker lock(&
m_lock);
327 QMutexLocker lock(&
m_lock);
336 QMutexLocker lock(&
m_lock);
345 QMutexLocker lock(&
m_lock);
353 QMutexLocker lock(&
m_lock);
361 QMutexLocker lock(&
m_lock);
371 QMutexLocker lock(&
m_lock);
380 QMutexLocker lock(&
m_lock);
456 std::chrono::milliseconds timecode,
int frames)
468 if (frames == 0 && len > 0)
469 frames = len / samplesize;
472 LOG(VB_PLAYBACK, LOG_ERR,
LOC +
"AddAudioData(): "
473 "Audio buffer overflow, audio data lost!");
505 uint othresh = ((ototal>>1) + (ototal>>2));
544 uint8_t *buffer,
int &data_size,
static const std::array< featureStruct, 7 > feature
bool TestDigitalFeature(AudioOutput *ao, DigitalFeature feature)
int BestSupportedChannels()
bool canFeature(DigitalFeature arg) const
return DigitalFeature mask.
int GetMaxHDRate() const
return the highest iec958 rate supported.
void addVisual(Visualization *v)
bool isConfigured() const
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 bool NeedDecodingBeforePassthrough(void) const
virtual void Drain(void)=0
void removeVisual(Visualization *v)
static AudioOutput * OpenAudio(const QString &main_device, const QString &passthru_device, AudioFormat format, int channels, AVCodecID codec, int samplerate, AudioOutputSource source, bool set_initial_vol, bool passthru, int upmixer_startup=0, AudioOutputSettings *custom=nullptr)
virtual std::chrono::milliseconds GetAudioBufferedTime(void)
report amount of audio buffered in milliseconds.
virtual bool IsUpmixing(void)
virtual void PauseUntilBuffered(void)=0
virtual std::chrono::milliseconds GetAudiotime(void)=0
virtual std::chrono::milliseconds LengthLastData(void) const
virtual void SetEffDsp(int dsprate)=0
virtual AudioOutputSettings * GetOutputSettingsUsers(bool digital=true)
virtual bool ToggleUpmix(void)
virtual int GetBytesPerFrame(void) const
int DecodeAudio(AVCodecContext *ctx, uint8_t *buffer, int &data_size, const AVPacket *pkt)
Utility routine.
virtual bool CanPassthrough(int samplerate, int channels, AVCodecID codec, int profile) const
virtual bool CanDownmix(void) const
virtual void Reset(void)=0
virtual bool CanUpmix(void)
virtual bool CanProcess(AudioFormat fmt)
virtual void Reconfigure(const AudioSettings &settings)=0
virtual void GetBufferStatus(uint &fill, uint &total)
virtual void Pause(bool paused)=0
virtual void SetStretchFactor(float factor)
void AudioPlayerStateChanged(MythAudioPlayerState State)
std::chrono::milliseconds GetAudioTime(void)
MuteState IncrMuteState(void)
void PauseAudioUntilBuffered(void)
AudioOutput * m_audioOutput
void removeVisual(Visualization *vis)
uint SetVolume(int newvolume)
void addVisual(Visualization *vis)
QString ReinitAudio(void)
bool CanPassthrough(int samplerate, int channels, AVCodecID codec, int profile)
AudioPlayer(MythPlayer *parent, bool muted)
uint GetMaxChannels(void)
bool GetBufferStatus(uint &fill, uint &total)
std::vector< Visualization * > m_visuals
int DecodeAudio(AVCodecContext *ctx, uint8_t *buffer, int &data_size, const AVPacket *pkt)
DecodeAudio Utility routine.
void SetEffDsp(int dsprate)
void AddAudioData(char *buffer, int len, std::chrono::milliseconds timecode, int frames)
std::chrono::milliseconds LengthLastData(void)
bool NeedDecodingBeforePassthrough(void)
MythAudioPlayerState m_state
void SetAudioParams(AudioFormat format, int orig_channels, int channels, AVCodecID codec, int samplerate, bool passthru, int codec_profile=-1)
Set audio output parameters.
MuteState SetMuteState(MuteState mstate)
void SetAudioOutput(AudioOutput *ao)
MuteState GetMuteState(void)
std::chrono::milliseconds GetAudioBufferedTime(void)
void SetAudioInfo(const QString &main_device, const QString &passthru_device, uint samplerate, int codec_profile=-1)
Set audio output device parameters.
bool IsBufferAlmostFull(void)
bool EnableUpmix(bool enable, bool toggle=false)
void SetStretchFactor(float factor)
uint32_t CanProcess(void)
uint AdjustVolume(int change)
bool m_init
If set to false, AudioOutput instance will not try to initially open the audio device.
bool GetBoolSetting(const QString &key, bool defaultval=false)
virtual bool PrepareAudioSample(std::chrono::milliseconds &timecode)
static MuteState NextMuteState(MuteState)
virtual MuteState GetMuteState(void) const
virtual void SetCurrentVolume(int value)
virtual uint GetCurrentVolume(void) const
virtual MuteState SetMuteState(MuteState)
virtual void AdjustCurrentVolume(int change)
static pid_list_t::iterator find(const PIDInfoMap &map, pid_list_t &list, pid_list_t::iterator begin, pid_list_t::iterator end, bool find_open)
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
void ShowNotificationError(const QString &msg, const QString &from, const QString &detail, const VNMask visibility, const MythNotification::Priority priority)
convenience utility to display error message as notification