summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVal Doroshchuk <valentyn.doroshchuk@qt.io>2018-02-12 15:57:07 +0100
committerVaL Doroshchuk <valentyn.doroshchuk@qt.io>2018-02-22 12:23:46 +0000
commit2422d893392d25a94323ea7faf88ae9e8527ce31 (patch)
tree6ae1a589c2c07354f8a8fb6aa2c299f653aa08ad
parent50479c87cbf5978c2e743ded47f5b472446b3589 (diff)
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 <maurice.kalinowski@qt.io> Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
-rw-r--r--src/plugins/windowsaudio/qwindowsaudiooutput.cpp16
-rw-r--r--src/plugins/windowsaudio/qwindowsaudiooutput.h1
2 files changed, 13 insertions, 4 deletions
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;