From 7300f1b75d048eea00cbc2a5000da0fb7d4c4172 Mon Sep 17 00:00:00 2001 From: Andrew Eikum Date: Wed, 15 Jun 2016 08:44:42 -0500 Subject: [PATCH] dsound: Capture all available data on each period callback. Signed-off-by: Andrew Eikum Signed-off-by: Alexandre Julliard --- 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 412b59e46da..30870ae6ba5 100644 --- a/dlls/dsound/capture.c +++ b/dlls/dsound/capture.c @@ -876,11 +876,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; @@ -892,45 +887,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; -- 2.11.4.GIT