audio: fix sw->buf size for audio recording
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>
This commit is contained in:
parent
0724c57988
commit
b73ef11ff6
@ -995,7 +995,7 @@ void AUD_set_active_in (SWVoiceIn *sw, int on)
|
|||||||
*/
|
*/
|
||||||
static size_t audio_frontend_frames_in(SWVoiceIn *sw, size_t frames_in)
|
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)
|
static size_t audio_get_avail (SWVoiceIn *sw)
|
||||||
|
@ -110,7 +110,11 @@ static int glue (audio_pcm_sw_alloc_resources_, TYPE) (SW *sw)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef DAC
|
||||||
samples = ((int64_t) sw->HWBUF->size << 32) / sw->ratio;
|
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));
|
sw->buf = audio_calloc(__func__, samples, sizeof(struct st_sample));
|
||||||
if (!sw->buf) {
|
if (!sw->buf) {
|
||||||
|
Loading…
Reference in New Issue
Block a user