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