summaryrefslogtreecommitdiffstats
path: root/src/plugins/windowsaudio/qwindowsaudiooutput.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/windowsaudio/qwindowsaudiooutput.cpp')
-rw-r--r--src/plugins/windowsaudio/qwindowsaudiooutput.cpp16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/plugins/windowsaudio/qwindowsaudiooutput.cpp b/src/plugins/windowsaudio/qwindowsaudiooutput.cpp
index d1c0b475f..26eecb768 100644
--- a/src/plugins/windowsaudio/qwindowsaudiooutput.cpp
+++ b/src/plugins/windowsaudio/qwindowsaudiooutput.cpp
@@ -295,11 +295,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);
@@ -455,10 +466,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);