Andrew Eikum : dsound: Capture all available data on each period callback.

Alexandre Julliard julliard at winehq.org
Mon Aug 22 07:32:38 CDT 2016


Module: wine
Branch: stable
Commit: 6af169d49519c215f00e55f88ca11de20c4ea51d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6af169d49519c215f00e55f88ca11de20c4ea51d

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Wed Jun 15 08:44:42 2016 -0500

dsound: Capture all available data on each period callback.

Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 7300f1b75d048eea00cbc2a5000da0fb7d4c4172)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/dsound/capture.c | 82 +++++++++++++++++++++++++++------------------------
 1 file changed, 43 insertions(+), 39 deletions(-)

diff --git a/dlls/dsound/capture.c b/dlls/dsound/capture.c
index 0764261..1f09fba 100644
--- a/dlls/dsound/capture.c
+++ b/dlls/dsound/capture.c
@@ -875,11 +875,6 @@ static ULONG DirectSoundCaptureDevice_Release(
 
 static HRESULT DSOUND_capture_data(DirectSoundCaptureDevice *device)
 {
-    HRESULT hr;
-    UINT32 packet_frames, packet_bytes, avail_bytes, skip_bytes = 0;
-    DWORD flags;
-    BYTE *buf;
-
     if(!device->capture_buffer || device->state == STATE_STOPPED)
         return S_FALSE;
 
@@ -891,45 +886,54 @@ static HRESULT DSOUND_capture_data(DirectSoundCaptureDevice *device)
     if(device->state == STATE_STARTING)
         device->state = STATE_CAPTURING;
 
-    hr = IAudioCaptureClient_GetBuffer(device->capture, &buf, &packet_frames,
-            &flags, NULL, NULL);
-    if(FAILED(hr)){
-        WARN("GetBuffer failed: %08x\n", hr);
-        return hr;
-    }
+    while(1){
+        HRESULT hr;
+        UINT32 packet_frames, packet_bytes, avail_bytes, skip_bytes = 0;
+        DWORD flags;
+        BYTE *buf;
+
+        hr = IAudioCaptureClient_GetBuffer(device->capture, &buf, &packet_frames,
+                &flags, NULL, NULL);
+        if(FAILED(hr)){
+            WARN("GetBuffer failed: %08x\n", hr);
+            return hr;
+        }
+        if(hr == AUDCLNT_S_BUFFER_EMPTY)
+            break;
 
-    packet_bytes = packet_frames * device->pwfx->nBlockAlign;
-    if(packet_bytes > device->buflen){
-        TRACE("audio glitch: dsound buffer too small for data\n");
-        skip_bytes = packet_bytes - device->buflen;
-        packet_bytes = device->buflen;
-    }
+        packet_bytes = packet_frames * device->pwfx->nBlockAlign;
+        if(packet_bytes > device->buflen){
+            TRACE("audio glitch: dsound buffer too small for data\n");
+            skip_bytes = packet_bytes - device->buflen;
+            packet_bytes = device->buflen;
+        }
 
-    avail_bytes = device->buflen - device->write_pos_bytes;
-    if(avail_bytes > packet_bytes)
-        avail_bytes = packet_bytes;
-
-    memcpy(device->buffer + device->write_pos_bytes, buf + skip_bytes, avail_bytes);
-    capture_CheckNotify(device->capture_buffer, device->write_pos_bytes, avail_bytes);
-
-    packet_bytes -= avail_bytes;
-    if(packet_bytes > 0){
-        if(device->capture_buffer->flags & DSCBSTART_LOOPING){
-            memcpy(device->buffer, buf + skip_bytes + avail_bytes, packet_bytes);
-            capture_CheckNotify(device->capture_buffer, 0, packet_bytes);
-        }else{
-            device->state = STATE_STOPPED;
-            capture_CheckNotify(device->capture_buffer, 0, 0);
+        avail_bytes = device->buflen - device->write_pos_bytes;
+        if(avail_bytes > packet_bytes)
+            avail_bytes = packet_bytes;
+
+        memcpy(device->buffer + device->write_pos_bytes, buf + skip_bytes, avail_bytes);
+        capture_CheckNotify(device->capture_buffer, device->write_pos_bytes, avail_bytes);
+
+        packet_bytes -= avail_bytes;
+        if(packet_bytes > 0){
+            if(device->capture_buffer->flags & DSCBSTART_LOOPING){
+                memcpy(device->buffer, buf + skip_bytes + avail_bytes, packet_bytes);
+                capture_CheckNotify(device->capture_buffer, 0, packet_bytes);
+            }else{
+                device->state = STATE_STOPPED;
+                capture_CheckNotify(device->capture_buffer, 0, 0);
+            }
         }
-    }
 
-    device->write_pos_bytes += avail_bytes + packet_bytes;
-    device->write_pos_bytes %= device->buflen;
+        device->write_pos_bytes += avail_bytes + packet_bytes;
+        device->write_pos_bytes %= device->buflen;
 
-    hr = IAudioCaptureClient_ReleaseBuffer(device->capture, packet_frames);
-    if(FAILED(hr)){
-        WARN("ReleaseBuffer failed: %08x\n", hr);
-        return hr;
+        hr = IAudioCaptureClient_ReleaseBuffer(device->capture, packet_frames);
+        if(FAILED(hr)){
+            WARN("ReleaseBuffer failed: %08x\n", hr);
+            return hr;
+        }
     }
 
     return S_OK;




More information about the wine-cvs mailing list