mirror of
https://github.com/qemu/qemu.git
synced 2024-11-27 22:03:35 +08:00
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>
This commit is contained in:
parent
ead789eb46
commit
9d90ceb274
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user