diff options
author | Volker Rümelin <vr_qemu@t-online.de> | 2023-02-24 20:05:47 +0100 |
---|---|---|
committer | Marc-André Lureau <marcandre.lureau@redhat.com> | 2023-03-06 10:30:23 +0400 |
commit | 671cca352075c9651e5c2e64bb0d2c70465082a3 (patch) | |
tree | e642cc6e2eed00dfb5dfec60cc7fbf628e15d0e9 /audio/audio.c | |
parent | d5647bd95831d9c98284033bd992f0a8b6deb103 (diff) | |
download | qemu-671cca352075c9651e5c2e64bb0d2c70465082a3.zip qemu-671cca352075c9651e5c2e64bb0d2c70465082a3.tar.gz qemu-671cca352075c9651e5c2e64bb0d2c70465082a3.tar.bz2 |
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>
Diffstat (limited to 'audio/audio.c')
-rw-r--r-- | audio/audio.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/audio/audio.c b/audio/audio.c index cd10f1e..44eb7b6 100644 --- a/audio/audio.c +++ b/audio/audio.c @@ -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) { SWVoiceOut *sw = &sc->sw; - int rpos2 = rpos; + size_t rpos2 = rpos; n = samples; while (n) { size_t till_end_of_hw = hw->mix_buf.size - rpos2; - size_t to_write = MIN(till_end_of_hw, n); - size_t bytes = to_write * hw->info.bytes_per_frame; - size_t written; + size_t to_read = MIN(till_end_of_hw, n); + size_t live, frames_in, frames_out; sw->resample_buf.buffer = hw->mix_buf.buffer + rpos2; - sw->resample_buf.size = to_write; - written = audio_pcm_sw_write (sw, NULL, bytes); - if (written - bytes) { - dolog("Could not mix %zu bytes into a capture " + sw->resample_buf.size = to_read; + live = sw->total_hw_samples_mixed; + + 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", - bytes, written); + to_read, frames_in); break; } - n -= to_write; - rpos2 = (rpos2 + to_write) % hw->mix_buf.size; + n -= to_read; + rpos2 = (rpos2 + to_read) % hw->mix_buf.size; } } } |