On Fri, Sep 23, 2022 at 10:58 PM Volker Rümelin wrote: > It seems there is a demand [1] for low latency playback over > SPICE. Add a pcm_ops buffer_get_free function to reduce the > playback latency. The mixing engine buffer becomes a temporary > buffer. > > [1] https://lists.nongnu.org/archive/html/qemu-devel/2022-01/msg01644.html > > Signed-off-by: Volker Rümelin > Reviewed-by: Marc-André Lureau > --- > audio/spiceaudio.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/audio/spiceaudio.c b/audio/spiceaudio.c > index a8d370fe6f..22892a7b9d 100644 > --- a/audio/spiceaudio.c > +++ b/audio/spiceaudio.c > @@ -120,6 +120,13 @@ static void line_out_fini (HWVoiceOut *hw) > spice_server_remove_interface (&out->sin.base); > } > > +static size_t line_out_get_free(HWVoiceOut *hw) > +{ > + SpiceVoiceOut *out = container_of(hw, SpiceVoiceOut, hw); > + > + return audio_rate_peek_bytes(&out->rate, &hw->info); > +} > + > static void *line_out_get_buffer(HWVoiceOut *hw, size_t *size) > { > SpiceVoiceOut *out = container_of(hw, SpiceVoiceOut, hw); > @@ -133,8 +140,6 @@ static void *line_out_get_buffer(HWVoiceOut *hw, > size_t *size) > *size = MIN((out->fsize - out->fpos) << 2, *size); > } > > - *size = audio_rate_get_bytes(&hw->info, &out->rate, *size); > - > return out->frame + out->fpos; > } > > @@ -142,6 +147,8 @@ static size_t line_out_put_buffer(HWVoiceOut *hw, void > *buf, size_t size) > { > SpiceVoiceOut *out = container_of(hw, SpiceVoiceOut, hw); > > + audio_rate_add_bytes(&out->rate, size); > + > if (buf) { > assert(buf == out->frame + out->fpos && out->fpos <= out->fsize); > out->fpos += size >> 2; > @@ -282,6 +289,7 @@ static struct audio_pcm_ops audio_callbacks = { > .init_out = line_out_init, > .fini_out = line_out_fini, > .write = audio_generic_write, > + .buffer_get_free = line_out_get_free, > .get_buffer_out = line_out_get_buffer, > .put_buffer_out = line_out_put_buffer, > .enable_out = line_out_enable, > -- > 2.35.3 > > > -- Marc-André Lureau