From 5d9ea83b939200451551c61be896ece176514127 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Wed, 2 Oct 2019 19:53:02 +0200 Subject: [PATCH] Ref T730, improved threaded tone player * allow to re-init and get device info * mutable mutex --- src/blacksound/threadedtonepairplayer.cpp | 35 ++++++++++++++++++----- src/blacksound/threadedtonepairplayer.h | 13 ++++++--- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/blacksound/threadedtonepairplayer.cpp b/src/blacksound/threadedtonepairplayer.cpp index daa9f8a7a..adc01bb38 100644 --- a/src/blacksound/threadedtonepairplayer.cpp +++ b/src/blacksound/threadedtonepairplayer.cpp @@ -36,18 +36,39 @@ namespace BlackSound QTimer::singleShot(0, this, &CThreadedTonePairPlayer::playBuffer); } + bool CThreadedTonePairPlayer::reinitializeAudio(const CAudioDeviceInfo &device) + { + if (this->getAudioDevice() == device) { return false; } + { + QMutexLocker ml(&m_mutex); + m_deviceInfo = device; + } + this->initialize(); + return true; + } + + CAudioDeviceInfo CThreadedTonePairPlayer::getAudioDevice() const + { + QMutexLocker ml(&m_mutex); + return m_deviceInfo; + } + void CThreadedTonePairPlayer::initialize() { + QMutexLocker ml(&m_mutex); CLogMessage(this).info(u"CThreadedTonePairPlayer for device '%1'") << m_deviceInfo.getName(); - m_audioFormat.setSampleRate(44100); - m_audioFormat.setChannelCount(1); - m_audioFormat.setSampleSize(16); // 8 or 16 works - m_audioFormat.setCodec("audio/pcm"); - m_audioFormat.setByteOrder(QAudioFormat::LittleEndian); - m_audioFormat.setSampleType(QAudioFormat::SignedInt); + QAudioFormat format; + format.setSampleRate(44100); + format.setChannelCount(1); + format.setSampleSize(16); // 8 or 16 works + format.setCodec("audio/pcm"); + format.setByteOrder(QAudioFormat::LittleEndian); + format.setSampleType(QAudioFormat::SignedInt); - QAudioDeviceInfo selectedDevice = getHighestCompatibleOutputDevice(m_deviceInfo, m_audioFormat); + // find best device + const QAudioDeviceInfo selectedDevice = getHighestCompatibleOutputDevice(m_deviceInfo, format); + m_audioFormat = format; m_audioOutput = new QAudioOutput(selectedDevice, m_audioFormat, this); connect(m_audioOutput, &QAudioOutput::stateChanged, this, &CThreadedTonePairPlayer::handleStateChanged); } diff --git a/src/blacksound/threadedtonepairplayer.h b/src/blacksound/threadedtonepairplayer.h index e70ef9c22..ca72ae6f5 100644 --- a/src/blacksound/threadedtonepairplayer.h +++ b/src/blacksound/threadedtonepairplayer.h @@ -39,12 +39,17 @@ namespace BlackSound //! Destructor virtual ~CThreadedTonePairPlayer() override; - public slots: //! Play the list of tones. //! If the player is currently active, this call will be ignored. void play(int volume, const QList &tonePairs); - protected slots: + //! Reinitialize audio + bool reinitializeAudio(const BlackMisc::Audio::CAudioDeviceInfo &device); + + //! Used audio device + BlackMisc::Audio::CAudioDeviceInfo getAudioDevice() const; + + protected: //! \copydoc BlackMisc::CContinuousWorker::initialize virtual void initialize() override; @@ -65,10 +70,10 @@ namespace BlackSound QAudioOutput *m_audioOutput = nullptr; QByteArray m_bufferData; QBuffer m_buffer; - QMutex m_mutex { QMutex::Recursive }; QAudioFormat m_audioFormat; QMap m_tonePairCache; + mutable QMutex m_mutex { QMutex::Recursive }; }; -} +} // ns #endif // guard