On Fri, Sep 23, 2022 at 10:58 PM Volker Rümelin <vr_q...@t-online.de> 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 <vr_q...@t-online.de>
>

Reviewed-by: Marc-André Lureau <marcandre.lur...@redhat.com>



> ---
>  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

Reply via email to