On Wednesday, 4 March 2026 07:16:58 CET Akihiko Odaki wrote:
> These functions can be used to re-initialize buffers when hardware
> parameters change due to device hotplug, for example.
>
> Signed-off-by: Akihiko Odaki <[email protected]>
> Reviewed-by: Phil Dennis-Jordan <[email protected]>
> Reviewed-by: Christian Schoenebeck <[email protected]>
> ---
> audio/audio_int.h | 2 ++
> audio/audio-mixeng-be.c | 24 ++++++++++++++++++------
> 2 files changed, 20 insertions(+), 6 deletions(-)
>
> diff --git a/audio/audio_int.h b/audio/audio_int.h
> index 06f79ade6b0a..290cf373b49f 100644
> --- a/audio/audio_int.h
> +++ b/audio/audio_int.h
> @@ -141,9 +141,11 @@ static inline void *advance(void *p, size_t incr)
> int wav_start_capture(AudioBackend *state, CaptureState *s, const char
> *path, int freq, int bits, int nchannels);
>
> +void audio_generic_initialize_buffer_in(HWVoiceIn *hw);
> void audio_generic_run_buffer_in(HWVoiceIn *hw);
> void *audio_generic_get_buffer_in(HWVoiceIn *hw, size_t *size);
> void audio_generic_put_buffer_in(HWVoiceIn *hw, void *buf, size_t size);
> +void audio_generic_initialize_buffer_out(HWVoiceOut *hw);
> void audio_generic_run_buffer_out(HWVoiceOut *hw);
> size_t audio_generic_buffer_get_free(HWVoiceOut *hw);
> void *audio_generic_get_buffer_out(HWVoiceOut *hw, size_t *size);
> diff --git a/audio/audio-mixeng-be.c b/audio/audio-mixeng-be.c
> index 370404505111..1419e7521503 100644
> --- a/audio/audio-mixeng-be.c
> +++ b/audio/audio-mixeng-be.c
> @@ -1187,14 +1187,20 @@ void audio_run(AudioMixengBackend *s, const char
> *msg) }
> }
>
> +void audio_generic_initialize_buffer_in(HWVoiceIn *hw)
> +{
> + g_free(hw->buf_emul);
> + hw->size_emul = hw->samples * hw->info.bytes_per_frame;
> + hw->buf_emul = g_malloc(hw->size_emul);
> + hw->pos_emul = hw->pending_emul = 0;
> +}
> +
> void audio_generic_run_buffer_in(HWVoiceIn *hw)
> {
> AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_GET_CLASS(hw->s);
>
> if (unlikely(!hw->buf_emul)) {
> - hw->size_emul = hw->samples * hw->info.bytes_per_frame;
> - hw->buf_emul = g_malloc(hw->size_emul);
> - hw->pos_emul = hw->pending_emul = 0;
> + audio_generic_initialize_buffer_in(hw);
> }
It would be cleaner having split this patch over 2 patches. One for pure
refactoring (no behaviour change), and one that adds g_free(hw->buf_emul);
> while (hw->pending_emul < hw->size_emul) {
> @@ -1227,6 +1233,14 @@ void audio_generic_put_buffer_in(HWVoiceIn *hw, void
> *buf, size_t size) hw->pending_emul -= size;
> }
>
> +void audio_generic_initialize_buffer_out(HWVoiceOut *hw)
> +{
> + g_free(hw->buf_emul);
> + hw->size_emul = hw->samples * hw->info.bytes_per_frame;
> + hw->buf_emul = g_malloc(hw->size_emul);
> + hw->pos_emul = hw->pending_emul = 0;
> +}
> +
> size_t audio_generic_buffer_get_free(HWVoiceOut *hw)
> {
> if (hw->buf_emul) {
> @@ -1260,9 +1274,7 @@ void audio_generic_run_buffer_out(HWVoiceOut *hw)
> void *audio_generic_get_buffer_out(HWVoiceOut *hw, size_t *size)
> {
> if (unlikely(!hw->buf_emul)) {
> - hw->size_emul = hw->samples * hw->info.bytes_per_frame;
> - hw->buf_emul = g_malloc(hw->size_emul);
> - hw->pos_emul = hw->pending_emul = 0;
> + audio_generic_initialize_buffer_out(hw);
> }
>
> *size = MIN(hw->size_emul - hw->pending_emul,