dsoundaudio: fix crackling audio recordings

Audio recordings with the DirectSound backend don't sound right.
A look a the Microsoft online documentation tells us why.

From the DirectSound Programming Guide, Capture Buffer Information:
'You can safely copy data from the buffer only up to the read
cursor.'

Change the code to read up to the read cursor instead of the
capture cursor.

Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Message-Id: <20211226154017.6067-2-vr_qemu@t-online.de>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
staging
Volker Rümelin 2021-12-26 16:40:16 +01:00 committed by Gerd Hoffmann
parent ead789eb46
commit 9d90ceb274
1 changed files with 3 additions and 4 deletions

View File

@ -536,13 +536,12 @@ static void *dsound_get_buffer_in(HWVoiceIn *hw, size_t *size)
DSoundVoiceIn *ds = (DSoundVoiceIn *) hw; DSoundVoiceIn *ds = (DSoundVoiceIn *) hw;
LPDIRECTSOUNDCAPTUREBUFFER dscb = ds->dsound_capture_buffer; LPDIRECTSOUNDCAPTUREBUFFER dscb = ds->dsound_capture_buffer;
HRESULT hr; HRESULT hr;
DWORD cpos, rpos, act_size; DWORD rpos, act_size;
size_t req_size; size_t req_size;
int err; int err;
void *ret; void *ret;
hr = IDirectSoundCaptureBuffer_GetCurrentPosition( hr = IDirectSoundCaptureBuffer_GetCurrentPosition(dscb, NULL, &rpos);
dscb, &cpos, ds->first_time ? &rpos : NULL);
if (FAILED(hr)) { if (FAILED(hr)) {
dsound_logerr(hr, "Could not get capture buffer position\n"); dsound_logerr(hr, "Could not get capture buffer position\n");
*size = 0; *size = 0;
@ -554,7 +553,7 @@ static void *dsound_get_buffer_in(HWVoiceIn *hw, size_t *size)
ds->first_time = false; ds->first_time = false;
} }
req_size = audio_ring_dist(cpos, hw->pos_emul, hw->size_emul); req_size = audio_ring_dist(rpos, hw->pos_emul, hw->size_emul);
req_size = MIN(*size, MIN(req_size, hw->size_emul - hw->pos_emul)); req_size = MIN(*size, MIN(req_size, hw->size_emul - hw->pos_emul));
if (req_size == 0) { if (req_size == 0) {