From 2422d893392d25a94323ea7faf88ae9e8527ce31 Mon Sep 17 00:00:00 2001 From: Val Doroshchuk Date: Mon, 12 Feb 2018 15:57:07 +0100 Subject: WindowsAudio: Pause playback before reset When some data has been written to play and waveOutReset is called some crackling could be heard at the end of playback. Proposed a fix to pause playback and wait for time of buffers pushed to play. Task-number: QTBUG-63492 Change-Id: Ieb72c0657eee3dd92a947999d70f366e2bd7f102 Reviewed-by: Maurice Kalinowski Reviewed-by: Oliver Wolff --- src/plugins/windowsaudio/qwindowsaudiooutput.cpp | 16 ++++++++++++---- src/plugins/windowsaudio/qwindowsaudiooutput.h | 1 + 2 files changed, 13 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/plugins/windowsaudio/qwindowsaudiooutput.cpp b/src/plugins/windowsaudio/qwindowsaudiooutput.cpp index eb4caf128..104055f30 100644 --- a/src/plugins/windowsaudio/qwindowsaudiooutput.cpp +++ b/src/plugins/windowsaudio/qwindowsaudiooutput.cpp @@ -291,11 +291,22 @@ bool QWindowsAudioOutput::open() return true; } +void QWindowsAudioOutput::pauseAndSleep() +{ + waveOutPause(hWaveOut); + int bitrate = settings.sampleRate() * settings.channelCount() * settings.sampleSize() / 8; + // Time of written data. + int delay = (buffer_size - bytesFree()) * 1000 / bitrate; + Sleep(delay + 10); +} + void QWindowsAudioOutput::close() { if(deviceState == QAudio::StoppedState) return; + // Pause playback before reset to avoid uneeded crackling at the end. + pauseAndSleep(); deviceState = QAudio::StoppedState; errorState = QAudio::NoError; waveOutReset(hWaveOut); @@ -451,10 +462,7 @@ void QWindowsAudioOutput::resume() void QWindowsAudioOutput::suspend() { if(deviceState == QAudio::ActiveState || deviceState == QAudio::IdleState) { - int delay = (buffer_size-bytesFree())*1000/(settings.sampleRate() - *settings.channelCount()*(settings.sampleSize()/8)); - waveOutPause(hWaveOut); - Sleep(delay+10); + pauseAndSleep(); deviceState = QAudio::SuspendedState; errorState = QAudio::NoError; emit stateChanged(deviceState); diff --git a/src/plugins/windowsaudio/qwindowsaudiooutput.h b/src/plugins/windowsaudio/qwindowsaudiooutput.h index f25475b02..b71f00e98 100644 --- a/src/plugins/windowsaudio/qwindowsaudiooutput.h +++ b/src/plugins/windowsaudio/qwindowsaudiooutput.h @@ -115,6 +115,7 @@ private slots: bool deviceReady(); private: + void pauseAndSleep(); QByteArray m_device; int bytesAvailable; QTime timeStamp; -- cgit v1.2.3