[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 07/17] audio: don't misuse audio_pcm_sw_write()
From: |
Volker Rümelin |
Subject: |
[PATCH 07/17] audio: don't misuse audio_pcm_sw_write() |
Date: |
Sun, 15 Jan 2023 14:12:14 +0100 |
From: Volker Rümelin <vr_qemu@t-online.de>
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().
Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
---
audio/audio.c | 29 ++++++++++++++++++-----------
1 file changed, 18 insertions(+), 11 deletions(-)
diff --git a/audio/audio.c b/audio/audio.c
index a8571100ff..0cfd56850f 100644
--- a/audio/audio.c
+++ b/audio/audio.c
@@ -1054,26 +1054,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;
}
}
}
--
2.35.3
- [PATCH 00/17] audio: improve callback interface for audio frontends, Volker Rümelin, 2023/01/15
- [PATCH 01/17] audio: change type of mix_buf and conv_buf, Volker Rümelin, 2023/01/15
- [PATCH 03/17] audio: make the resampling code greedy, Volker Rümelin, 2023/01/15
- [PATCH 02/17] audio: change type and name of the resample buffer, Volker Rümelin, 2023/01/15
- [PATCH 04/17] audio: replace the resampling loop in audio_pcm_sw_write(), Volker Rümelin, 2023/01/15
- [PATCH 05/17] audio: remove sw == NULL check, Volker Rümelin, 2023/01/15
- [PATCH 07/17] audio: don't misuse audio_pcm_sw_write(),
Volker Rümelin <=
- [PATCH 06/17] audio: rename variables in audio_pcm_sw_write(), Volker Rümelin, 2023/01/15
- [PATCH 08/17] audio: remove unused noop_conv() function, Volker Rümelin, 2023/01/15
- [PATCH 09/17] audio/mixeng: calculate number of input frames, Volker Rümelin, 2023/01/15
- [PATCH 10/17] audio: wire up st_rate_frames_in(), Volker Rümelin, 2023/01/15
- [PATCH 11/17] audio: replace the resampling loop in audio_pcm_sw_read(), Volker Rümelin, 2023/01/15
- [PATCH 12/17] audio: rename variables in audio_pcm_sw_read(), Volker Rümelin, 2023/01/15
- [PATCH 14/17] audio: wire up st_rate_frames_out(), Volker Rümelin, 2023/01/15
- [PATCH 16/17] audio/audio_template: substitute sw->hw with hw, Volker Rümelin, 2023/01/15
- [PATCH 13/17] audio/mixeng: calculate number of output frames, Volker Rümelin, 2023/01/15
- [PATCH 15/17] audio: handle leftover audio frame from upsampling, Volker Rümelin, 2023/01/15