The calculation of the buffer size needed to store audio samples
after resampling is wrong for audio recording. For audio recording
sw->ratio is calculated as
sw->ratio = frontend sample rate / backend sample rate.
From this follows
frontend samples = frontend sample rate / backend sample rate
* backend samples
frontend samples = sw->ratio * backend samples
In 2 of 3 places in the audio recording code where sw->ratio
is used in a calculation to get the number of frontend frames,
the calculation is wrong. Fix this. The 3rd formula in
audio_pcm_sw_read() is correct.
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/71
Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <
20220923183640.8314-11-vr_qemu@t-online.de>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
*/
static size_t audio_frontend_frames_in(SWVoiceIn *sw, size_t frames_in)
{
- return ((int64_t)frames_in << 32) / sw->ratio;
+ return (int64_t)frames_in * sw->ratio >> 32;
}
static size_t audio_get_avail (SWVoiceIn *sw)
return 0;
}
+#ifdef DAC
samples = ((int64_t) sw->HWBUF->size << 32) / sw->ratio;
+#else
+ samples = (int64_t)sw->HWBUF->size * sw->ratio >> 32;
+#endif
sw->buf = audio_calloc(__func__, samples, sizeof(struct st_sample));
if (!sw->buf) {