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:
parent
d5647bd958
commit
671cca3520
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user