From a2c424c76165ab22105270cddb8e5a79bf554837 Mon Sep 17 00:00:00 2001 From: Mark Kendall Date: Fri, 18 Mar 2011 16:48:04 +0800 Subject: [PATCH] libmythtv: Add visualiser support to AudioPlayer. --- mythtv/libs/libmythtv/audioplayer.cpp | 53 +++++++++++++++++++++++++++ mythtv/libs/libmythtv/audioplayer.h | 13 +++++++ 2 files changed, 66 insertions(+) diff --git a/mythtv/libs/libmythtv/audioplayer.cpp b/mythtv/libs/libmythtv/audioplayer.cpp index ddf7cf7a9b7..461904a9568 100644 --- a/mythtv/libs/libmythtv/audioplayer.cpp +++ b/mythtv/libs/libmythtv/audioplayer.cpp @@ -18,6 +18,55 @@ AudioPlayer::AudioPlayer(MythPlayer *parent, bool muted) AudioPlayer::~AudioPlayer() { DeleteOutput(); + m_visuals.clear(); +} + +void AudioPlayer::addVisual(MythTV::Visual *vis) +{ + if (!m_audioOutput) + return; + + QMutexLocker lock(&m_lock); + Visuals::iterator it = std::find(m_visuals.begin(), m_visuals.end(), vis); + if (it == m_visuals.end()) + { + m_visuals.push_back(vis); + m_audioOutput->addVisual(vis); + } +} + +void AudioPlayer::removeVisual(MythTV::Visual *vis) +{ + if (!m_audioOutput) + return; + + QMutexLocker lock(&m_lock); + Visuals::iterator it = std::find(m_visuals.begin(), m_visuals.end(), vis); + if (it != m_visuals.end()) + { + m_visuals.erase(it); + m_audioOutput->removeVisual(vis); + } +} + +void AudioPlayer::AddVisuals(void) +{ + if (!m_audioOutput) + return; + + QMutexLocker lock(&m_lock); + for (uint i = 0; i < m_visuals.size(); i++) + m_audioOutput->addVisual(m_visuals[i]); +} + +void AudioPlayer::RemoveVisuals(void) +{ + if (!m_audioOutput) + return; + + QMutexLocker lock(&m_lock); + for (uint i = 0; i < m_visuals.size(); i++) + m_audioOutput->removeVisual(m_visuals[i]); } void AudioPlayer::Reset(void) @@ -31,6 +80,7 @@ void AudioPlayer::Reset(void) void AudioPlayer::DeleteOutput(void) { + RemoveVisuals(); QMutexLocker locker(&m_lock); if (m_audioOutput) { @@ -81,6 +131,7 @@ QString AudioPlayer::ReinitAudio(void) { errMsg = m_audioOutput->GetError(); } + AddVisuals(); } else if (want_audio && !m_no_audio_in) { @@ -150,7 +201,9 @@ void AudioPlayer::PauseAudioUntilBuffered() void AudioPlayer::SetAudioOutput(AudioOutput *ao) { m_lock.lock(); + RemoveVisuals(); m_audioOutput = ao; + AddVisuals(); m_lock.unlock(); } diff --git a/mythtv/libs/libmythtv/audioplayer.h b/mythtv/libs/libmythtv/audioplayer.h index b9e173688df..8ff42f0933d 100644 --- a/mythtv/libs/libmythtv/audioplayer.h +++ b/mythtv/libs/libmythtv/audioplayer.h @@ -6,12 +6,20 @@ class MythPlayer; class AudioOutput; +namespace MythTV +{ + class Visual; +} + class MTV_PUBLIC AudioPlayer { public: AudioPlayer(MythPlayer *parent, bool muted); ~AudioPlayer(); + void addVisual(MythTV::Visual *vis); + void removeVisual(MythTV::Visual *vis); + void Reset(void); void DeleteOutput(void); QString ReinitAudio(void); @@ -62,6 +70,10 @@ class MTV_PUBLIC AudioPlayer bool GetBufferStatus(uint &fill, uint &total); bool IsBufferAlmostFull(void); + private: + void AddVisuals(void); + void RemoveVisuals(void); + private: MythPlayer *m_parent; AudioOutput *m_audioOutput; @@ -79,6 +91,7 @@ class MTV_PUBLIC AudioPlayer QString m_passthru_device; bool m_no_audio_in; bool m_no_audio_out; + vector m_visuals; }; #endif // AUDIOPLAYER_H