audio: don't misuse audio_pcm_sw_write()

The audio_pcm_sw_write() function is intended to convert a
PCM audio stream to the internal representation, adjust the
volume, and then mix it with the other audio streams with a
possibly changed sample rate in mix_buf. In order for the
audio_capture_mix_and_clear() function to use audio_pcm_sw_write(),
it must bypass the first two tasks of audio_pcm_sw_write().

Since patch "audio: split out the resampling loop in
audio_pcm_sw_write()" this is no longer necessary, because now
the audio_pcm_sw_resample_out() function can be used instead of
audio_pcm_sw_write().

Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Message-Id: <20230224190555.7409-7-vr_qemu@t-online.de>
This commit is contained in:
Volker Rümelin 2023-02-24 20:05:47 +01:00 committed by Marc-André Lureau
parent d5647bd958
commit 671cca3520

View File

@ -1056,26 +1056,33 @@ static void audio_capture_mix_and_clear(HWVoiceOut *hw, size_t rpos,
for (sc = hw->cap_head.lh_first; sc; sc = sc->entries.le_next) { for (sc = hw->cap_head.lh_first; sc; sc = sc->entries.le_next) {
SWVoiceOut *sw = &sc->sw; SWVoiceOut *sw = &sc->sw;
int rpos2 = rpos; size_t rpos2 = rpos;
n = samples; n = samples;
while (n) { while (n) {
size_t till_end_of_hw = hw->mix_buf.size - rpos2; size_t till_end_of_hw = hw->mix_buf.size - rpos2;
size_t to_write = MIN(till_end_of_hw, n); size_t to_read = MIN(till_end_of_hw, n);
size_t bytes = to_write * hw->info.bytes_per_frame; size_t live, frames_in, frames_out;
size_t written;
sw->resample_buf.buffer = hw->mix_buf.buffer + rpos2; sw->resample_buf.buffer = hw->mix_buf.buffer + rpos2;
sw->resample_buf.size = to_write; sw->resample_buf.size = to_read;
written = audio_pcm_sw_write (sw, NULL, bytes); live = sw->total_hw_samples_mixed;
if (written - bytes) {
dolog("Could not mix %zu bytes into a capture " audio_pcm_sw_resample_out(sw,
to_read, sw->hw->mix_buf.size - live,
&frames_in, &frames_out);
sw->total_hw_samples_mixed += frames_out;
sw->empty = sw->total_hw_samples_mixed == 0;
if (to_read - frames_in) {
dolog("Could not mix %zu frames into a capture "
"buffer, mixed %zu\n", "buffer, mixed %zu\n",
bytes, written); to_read, frames_in);
break; break;
} }
n -= to_write; n -= to_read;
rpos2 = (rpos2 + to_write) % hw->mix_buf.size; rpos2 = (rpos2 + to_read) % hw->mix_buf.size;
} }
} }
} }