Jörg Höhle : mmdevapi: After GetBuffer, refuse Reset, but Start/Stop is ok.

Alexandre Julliard julliard at winehq.org
Wed Aug 24 14:05:18 CDT 2011


Module: wine
Branch: master
Commit: 541075c3db2829031d783e54aaa1b639fb23155b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=541075c3db2829031d783e54aaa1b639fb23155b

Author: Jörg Höhle <hoehle at users.sourceforge.net>
Date:   Wed Aug 10 18:07:51 2011 +0200

mmdevapi: After GetBuffer, refuse Reset, but Start/Stop is ok.

---

 dlls/winealsa.drv/mmdevdrv.c      |    5 +++++
 dlls/winecoreaudio.drv/mmdevdrv.c |    5 +++++
 dlls/wineoss.drv/mmdevdrv.c       |    5 +++++
 3 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c
index 8ea2f09..01fe4fd 100644
--- a/dlls/winealsa.drv/mmdevdrv.c
+++ b/dlls/winealsa.drv/mmdevdrv.c
@@ -1753,6 +1753,11 @@ static HRESULT WINAPI AudioClient_Reset(IAudioClient *iface)
         return AUDCLNT_E_NOT_STOPPED;
     }
 
+    if(This->buf_state != NOT_LOCKED){
+        LeaveCriticalSection(&This->lock);
+        return AUDCLNT_E_BUFFER_OPERATION_PENDING;
+    }
+
     This->held_frames = 0;
     This->written_frames = 0;
     This->lcl_offs_frames = 0;
diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c
index fcb337d..8311a29 100644
--- a/dlls/winecoreaudio.drv/mmdevdrv.c
+++ b/dlls/winecoreaudio.drv/mmdevdrv.c
@@ -1391,6 +1391,11 @@ static HRESULT WINAPI AudioClient_Reset(IAudioClient *iface)
         return AUDCLNT_E_NOT_STOPPED;
     }
 
+    if(This->getbuf_last){
+        OSSpinLockUnlock(&This->lock);
+        return AUDCLNT_E_BUFFER_OPERATION_PENDING;
+    }
+
     This->written_frames = 0;
 
     hr = AudioClock_GetPosition_nolock(This, &This->last_time, NULL, TRUE);
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c
index f962f8a..0e44842 100644
--- a/dlls/wineoss.drv/mmdevdrv.c
+++ b/dlls/wineoss.drv/mmdevdrv.c
@@ -1379,6 +1379,11 @@ static HRESULT WINAPI AudioClient_Reset(IAudioClient *iface)
         return AUDCLNT_E_NOT_STOPPED;
     }
 
+    if(This->buf_state != NOT_LOCKED){
+        LeaveCriticalSection(&This->lock);
+        return AUDCLNT_E_BUFFER_OPERATION_PENDING;
+    }
+
     This->written_frames = 0;
     This->inbuf_frames = 0;
     This->held_frames = 0;




More information about the wine-cvs mailing list