summaryrefslogtreecommitdiff
path: root/audio/winwaveaudio.c
diff options
context:
space:
mode:
Diffstat (limited to 'audio/winwaveaudio.c')
-rw-r--r--audio/winwaveaudio.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/audio/winwaveaudio.c b/audio/winwaveaudio.c
index 1486da1b95..f43ae95cf4 100644
--- a/audio/winwaveaudio.c
+++ b/audio/winwaveaudio.c
@@ -29,6 +29,7 @@ typedef struct {
int avail;
int pending;
int curhdr;
+ int paused;
CRITICAL_SECTION crit_sect;
} WaveVoiceOut;
@@ -282,6 +283,7 @@ static void winwave_fini_out (HWVoiceOut *hw)
static int winwave_ctl_out (HWVoiceOut *hw, int cmd, ...)
{
+ MMRESULT mr;
WaveVoiceOut *wave = (WaveVoiceOut *) hw;
switch (cmd) {
@@ -313,10 +315,26 @@ static int winwave_ctl_out (HWVoiceOut *hw, int cmd, ...)
else {
hw->poll_mode = 0;
}
+ if (wave->paused) {
+ mr = waveOutRestart (wave->hwo);
+ if (mr != MMSYSERR_NOERROR) {
+ winwave_logerr (mr, "waveOutRestart");
+ }
+ wave->paused = 0;
+ }
}
return 0;
case VOICE_DISABLE:
+ if (!wave->paused) {
+ mr = waveOutPause (wave->hwo);
+ if (mr != MMSYSERR_NOERROR) {
+ winwave_logerr (mr, "waveOutPause");
+ }
+ else {
+ wave->paused = 1;
+ }
+ }
if (wave->event) {
qemu_del_wait_object (wave->event, winwave_poll_out, wave);
}