Ref T730, improved threaded tone player

* allow to re-init and get device info
* mutable mutex
This commit is contained in:
Klaus Basan
2019-10-02 19:53:02 +02:00
committed by Mat Sutcliffe
parent 90e87835fc
commit 5d9ea83b93
2 changed files with 37 additions and 11 deletions

View File

@@ -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);
}

View File

@@ -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<BlackSound::CTonePair> &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<CTonePair, QByteArray> m_tonePairCache;
mutable QMutex m_mutex { QMutex::Recursive };
};
}
} // ns
#endif // guard