Re: [RFC 24/24] WIP: rust/audio: add GStreamer backend

Markus Armbruster <[email protected]>
Newsgroups org.nongnu.qemu-rust,org.nongnu.qemu-devel
Message-ID <[email protected]>
[email protected] writes:

> From: Marc-André Lureau <[email protected]>
>
> This patch introduce a rust/audio crate that replaces QEMU audio/
> mixing/resampling code with GStreamer and Rust. It could potentially
> remove the need for all the system-specific audio API implementation,
> since GStreamer has audio elements for
> ALSA/Pipewire/PulseAudio/jack/OSX/WASAPI etc (removing ~10k loc).
>
> TODO:
> - test on various system, with various configuration to see if this
>   backend can replace the other QEMU audio backends
> - add a spicesink/spicesrc to handle spice, or rewrite spice to use
>   the capture approach used by VNC code. Or drop capture support, and
>   use custom qemusrc/qemusink for both Spice and VNC, lowering the feature
>   and behaviour disparity.
> - build-sys: make gstreamer optional
> - build-sys: loadable module support
> - investigate dropping get_buffer_size_out()
> - investigate improving emulated devices to not require regular
>   timers (appsrc need-data is called once)
> - add generic audio backend tests
> - more tests for the mixing/liveadder behaviour (synchronization)
> - other: replace audio/dbus with a rust implementation (not using gstreamer)
>
> Signed-off-by: Marc-André Lureau <[email protected]>
> ---
>  qapi/audio.json               |   29 +
>  audio/audio-driver_template.h |    2 +
>  rust/audio/wrapper.h          |   27 +
>  audio/audio.c                 |    5 +
>  Cargo.lock                    |  572 ++++++++++++++++--
>  Cargo.toml                    |    6 +
>  audio/trace-events            |    5 +
>  rust/audio/Cargo.toml         |   29 +
>  rust/audio/build.rs           |   49 ++
>  rust/audio/meson.build        |   75 +++
>  rust/audio/src/audio.rs       |  516 ++++++++++++++++
>  rust/audio/src/bindings.rs    |   32 +
>  rust/audio/src/gstreamer.rs   | 1070 +++++++++++++++++++++++++++++++++
>  rust/audio/src/lib.rs         |   99 +++
>  rust/meson.build              |    6 +
>  15 files changed, 2467 insertions(+), 55 deletions(-)
>  create mode 100644 rust/audio/wrapper.h
>  create mode 100644 rust/audio/Cargo.toml
>  create mode 100644 rust/audio/build.rs
>  create mode 100644 rust/audio/meson.build
>  create mode 100644 rust/audio/src/audio.rs
>  create mode 100644 rust/audio/src/bindings.rs
>  create mode 100644 rust/audio/src/gstreamer.rs
>  create mode 100644 rust/audio/src/lib.rs
>
> diff --git a/qapi/audio.json b/qapi/audio.json
> index 2df87b9710..76dc7cbfa6 100644
> --- a/qapi/audio.json
> +++ b/qapi/audio.json
> @@ -128,6 +128,33 @@
>      '*out':       'AudiodevAlsaPerDirectionOptions',
>      '*threshold': 'uint32' } }
>  
> +    ##
> +    # @AudiodevGStreamerOptions:
> +    #
> +    # Options of the GStreamer audio backend.
> +    #
> +    # @in: options of the capture stream
> +    #
> +    # @out: options of the playback stream
> +    #
> +    # @sink: the name of the GStreamer sink element to use
> +    #        (default 'autoaudiosink')
> +    #
> +    # @source: the name of the GStreamer source element to use
> +    #        (default 'autoaudiosrc')

Are 'autoaudiosink' and 'autoaudiosrc' well-known GStreamer names, or
arbitrary?

> +    #
> +    # Since: 11.0
> +    ##
> +    { 'struct': 'AudiodevGStreamerOptions',
> +      'data': {
> +        '*in':        'AudiodevPerDirectionOptions',
> +        '*out':       'AudiodevPerDirectionOptions',
> +        '*sink':      'str',
> +        '*source':    'str'
> +      }
> +    }

Unindent by four, and format the doc comment like this:

##
# @AudiodevGStreamerOptions:
#
# Options of the GStreamer audio backend.
#
# @in: options of the capture stream
#
# @out: options of the playback stream
#
# @sink: the name of the GStreamer sink element to use
#     (default 'autoaudiosink')
#
# @source: the name of the GStreamer source element to use
#     (default 'autoaudiosrc')
#
# Since: 11.0
##


> +
> +
>  ##
>  # @AudiodevSndioOptions:
>  #
> @@ -484,6 +511,7 @@
>              { 'name': 'sdl', 'if': 'CONFIG_AUDIO_SDL' },
>              { 'name': 'sndio', 'if': 'CONFIG_AUDIO_SNDIO' },
>              { 'name': 'spice', 'if': 'CONFIG_SPICE' },
> +            { 'name': 'gstreamer' },

Short form suffices:

               'gstreamer',

>              'wav' ] }
>  
>  ##
> @@ -530,6 +558,7 @@
>                     'if': 'CONFIG_AUDIO_SNDIO' },
>      'spice':     { 'type': 'AudiodevGenericOptions',
>                     'if': 'CONFIG_SPICE' },
> +    'gstreamer': { 'type': 'AudiodevGStreamerOptions' },

Short form suffices:

       'gstreamer': 'AudiodevGStreamerOptions',

>      'wav':       'AudiodevWavOptions' } }
>  
>  ##

[...]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.