On Mon, Feb 6, 2023 at 10:52 PM Volker Rümelin <[email protected]> wrote: > > 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 <[email protected]> > Signed-off-by: Volker Rümelin <[email protected]>
Acked-by: Marc-André Lureau <[email protected]> > --- > audio/audio.c | 29 ++++++++++++++++++----------- > 1 file changed, 18 insertions(+), 11 deletions(-) > > diff --git a/audio/audio.c b/audio/audio.c > index cd10f1ec10..44eb7b63b4 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; > } > } > } > -- > 2.35.3 > -- Marc-André Lureau
