2019-03-09 06:34:12 +08:00
|
|
|
# -*- mode: python -*-
|
2021-12-20 22:56:24 +08:00
|
|
|
# vim: filetype=python
|
2019-03-09 06:34:12 +08:00
|
|
|
#
|
|
|
|
# Copyright (C) 2015-2019 Zoltán Kővágó <DirtY.iCE.hu@gmail.com>
|
|
|
|
#
|
|
|
|
# This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
|
|
# See the COPYING file in the top-level directory.
|
|
|
|
|
2020-11-02 16:15:50 +08:00
|
|
|
##
|
|
|
|
# = Audio
|
|
|
|
##
|
|
|
|
|
2019-03-09 06:34:12 +08:00
|
|
|
##
|
|
|
|
# @AudiodevPerDirectionOptions:
|
|
|
|
#
|
|
|
|
# General audio backend options that are used for both playback and
|
|
|
|
# recording.
|
|
|
|
#
|
audio: add mixing-engine option (documentation)
This will allow us to disable mixeng when we use a decent backend.
Disabling mixeng have a few advantages:
* we no longer convert the audio output from one format to another, when
the underlying audio system would just convert it to a third format.
We no longer convert, only the underlying system, when needed.
* the underlying system probably has better resampling and sample format
converting methods anyway...
* we may support formats that the mixeng currently does not support (S24
or float samples, more than two channels)
* when using an audio server (like pulseaudio) different sound card
outputs will show up as separate streams, even if we use only one
backend
Disadvantages:
* audio capturing no longer works (wavcapture, and vnc audio extension)
* some backends only support a single playback stream or very picky
about the audio format. In this case we can't disable mixeng.
Originally thw two main use cases of the disabled option was: using
unsupported audio formats (5.1 and 7.1 audio) and having different
pulseaudio streams per audio frontend. Since we can have multiple
-audiodevs, the latter is not that important, so currently you only need
this option if you want to use 5.1 or 7.1 audio (implemented in a later
patch), otherwise it's probably better to stick to the old and tried
mixeng, since it's less picky about the backends.
The ideal solution would be to port as much as possible to gstreamer,
but this is currently out of scope:
https://wiki.qemu.org/Internships/ProjectIdeas/AudioGStreamer
Signed-off-by: Kővágó, Zoltán <DirtY.iCE.hu@gmail.com>
Message-id: 5765186a7aadd51a72bc7d3e804307f0ee8a34ce.1570996490.git.DirtY.iCE.hu@gmail.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
2019-10-14 03:57:58 +08:00
|
|
|
# @mixing-engine: use QEMU's mixing engine to mix all streams inside QEMU and
|
|
|
|
# convert audio formats when not supported by the backend. When
|
|
|
|
# set to off, fixed-settings must be also off (default on,
|
|
|
|
# since 4.2)
|
|
|
|
#
|
2019-03-09 06:34:12 +08:00
|
|
|
# @fixed-settings: use fixed settings for host input/output. When off,
|
|
|
|
# frequency, channels and format must not be
|
|
|
|
# specified (default true)
|
|
|
|
#
|
|
|
|
# @frequency: frequency to use when using fixed settings
|
|
|
|
# (default 44100)
|
|
|
|
#
|
|
|
|
# @channels: number of channels when using fixed settings (default 2)
|
|
|
|
#
|
|
|
|
# @voices: number of voices to use (default 1)
|
|
|
|
#
|
|
|
|
# @format: sample format to use when using fixed settings
|
|
|
|
# (default s16)
|
|
|
|
#
|
|
|
|
# @buffer-length: the buffer length in microseconds
|
|
|
|
#
|
|
|
|
# Since: 4.0
|
|
|
|
##
|
|
|
|
{ 'struct': 'AudiodevPerDirectionOptions',
|
|
|
|
'data': {
|
audio: add mixing-engine option (documentation)
This will allow us to disable mixeng when we use a decent backend.
Disabling mixeng have a few advantages:
* we no longer convert the audio output from one format to another, when
the underlying audio system would just convert it to a third format.
We no longer convert, only the underlying system, when needed.
* the underlying system probably has better resampling and sample format
converting methods anyway...
* we may support formats that the mixeng currently does not support (S24
or float samples, more than two channels)
* when using an audio server (like pulseaudio) different sound card
outputs will show up as separate streams, even if we use only one
backend
Disadvantages:
* audio capturing no longer works (wavcapture, and vnc audio extension)
* some backends only support a single playback stream or very picky
about the audio format. In this case we can't disable mixeng.
Originally thw two main use cases of the disabled option was: using
unsupported audio formats (5.1 and 7.1 audio) and having different
pulseaudio streams per audio frontend. Since we can have multiple
-audiodevs, the latter is not that important, so currently you only need
this option if you want to use 5.1 or 7.1 audio (implemented in a later
patch), otherwise it's probably better to stick to the old and tried
mixeng, since it's less picky about the backends.
The ideal solution would be to port as much as possible to gstreamer,
but this is currently out of scope:
https://wiki.qemu.org/Internships/ProjectIdeas/AudioGStreamer
Signed-off-by: Kővágó, Zoltán <DirtY.iCE.hu@gmail.com>
Message-id: 5765186a7aadd51a72bc7d3e804307f0ee8a34ce.1570996490.git.DirtY.iCE.hu@gmail.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
2019-10-14 03:57:58 +08:00
|
|
|
'*mixing-engine': 'bool',
|
2019-03-09 06:34:12 +08:00
|
|
|
'*fixed-settings': 'bool',
|
|
|
|
'*frequency': 'uint32',
|
|
|
|
'*channels': 'uint32',
|
|
|
|
'*voices': 'uint32',
|
|
|
|
'*format': 'AudioFormat',
|
|
|
|
'*buffer-length': 'uint32' } }
|
|
|
|
|
|
|
|
##
|
|
|
|
# @AudiodevGenericOptions:
|
|
|
|
#
|
|
|
|
# Generic driver-specific options.
|
|
|
|
#
|
|
|
|
# @in: options of the capture stream
|
|
|
|
#
|
|
|
|
# @out: options of the playback stream
|
|
|
|
#
|
|
|
|
# Since: 4.0
|
|
|
|
##
|
|
|
|
{ 'struct': 'AudiodevGenericOptions',
|
|
|
|
'data': {
|
|
|
|
'*in': 'AudiodevPerDirectionOptions',
|
|
|
|
'*out': 'AudiodevPerDirectionOptions' } }
|
|
|
|
|
|
|
|
##
|
|
|
|
# @AudiodevAlsaPerDirectionOptions:
|
|
|
|
#
|
|
|
|
# Options of the ALSA backend that are used for both playback and
|
|
|
|
# recording.
|
|
|
|
#
|
|
|
|
# @dev: the name of the ALSA device to use (default 'default')
|
|
|
|
#
|
|
|
|
# @period-length: the period length in microseconds
|
|
|
|
#
|
|
|
|
# @try-poll: attempt to use poll mode, falling back to non-polling
|
|
|
|
# access on failure (default true)
|
|
|
|
#
|
|
|
|
# Since: 4.0
|
|
|
|
##
|
|
|
|
{ 'struct': 'AudiodevAlsaPerDirectionOptions',
|
|
|
|
'base': 'AudiodevPerDirectionOptions',
|
|
|
|
'data': {
|
|
|
|
'*dev': 'str',
|
|
|
|
'*period-length': 'uint32',
|
|
|
|
'*try-poll': 'bool' } }
|
|
|
|
|
|
|
|
##
|
|
|
|
# @AudiodevAlsaOptions:
|
|
|
|
#
|
|
|
|
# Options of the ALSA audio backend.
|
|
|
|
#
|
|
|
|
# @in: options of the capture stream
|
|
|
|
#
|
|
|
|
# @out: options of the playback stream
|
|
|
|
#
|
|
|
|
# @threshold: set the threshold (in microseconds) when playback starts
|
|
|
|
#
|
|
|
|
# Since: 4.0
|
|
|
|
##
|
|
|
|
{ 'struct': 'AudiodevAlsaOptions',
|
|
|
|
'data': {
|
|
|
|
'*in': 'AudiodevAlsaPerDirectionOptions',
|
|
|
|
'*out': 'AudiodevAlsaPerDirectionOptions',
|
|
|
|
'*threshold': 'uint32' } }
|
|
|
|
|
|
|
|
##
|
|
|
|
# @AudiodevCoreaudioPerDirectionOptions:
|
|
|
|
#
|
|
|
|
# Options of the Core Audio backend that are used for both playback and
|
|
|
|
# recording.
|
|
|
|
#
|
|
|
|
# @buffer-count: number of buffers
|
|
|
|
#
|
|
|
|
# Since: 4.0
|
|
|
|
##
|
|
|
|
{ 'struct': 'AudiodevCoreaudioPerDirectionOptions',
|
|
|
|
'base': 'AudiodevPerDirectionOptions',
|
|
|
|
'data': {
|
|
|
|
'*buffer-count': 'uint32' } }
|
|
|
|
|
|
|
|
##
|
|
|
|
# @AudiodevCoreaudioOptions:
|
|
|
|
#
|
|
|
|
# Options of the coreaudio audio backend.
|
|
|
|
#
|
|
|
|
# @in: options of the capture stream
|
|
|
|
#
|
|
|
|
# @out: options of the playback stream
|
|
|
|
#
|
|
|
|
# Since: 4.0
|
|
|
|
##
|
|
|
|
{ 'struct': 'AudiodevCoreaudioOptions',
|
|
|
|
'data': {
|
|
|
|
'*in': 'AudiodevCoreaudioPerDirectionOptions',
|
|
|
|
'*out': 'AudiodevCoreaudioPerDirectionOptions' } }
|
|
|
|
|
|
|
|
##
|
|
|
|
# @AudiodevDsoundOptions:
|
|
|
|
#
|
|
|
|
# Options of the DirectSound audio backend.
|
|
|
|
#
|
|
|
|
# @in: options of the capture stream
|
|
|
|
#
|
|
|
|
# @out: options of the playback stream
|
|
|
|
#
|
|
|
|
# @latency: add extra latency to playback in microseconds
|
|
|
|
# (default 10000)
|
|
|
|
#
|
|
|
|
# Since: 4.0
|
|
|
|
##
|
|
|
|
{ 'struct': 'AudiodevDsoundOptions',
|
|
|
|
'data': {
|
|
|
|
'*in': 'AudiodevPerDirectionOptions',
|
|
|
|
'*out': 'AudiodevPerDirectionOptions',
|
|
|
|
'*latency': 'uint32' } }
|
|
|
|
|
2020-04-29 13:53:58 +08:00
|
|
|
##
|
|
|
|
# @AudiodevJackPerDirectionOptions:
|
|
|
|
#
|
|
|
|
# Options of the JACK backend that are used for both playback and
|
|
|
|
# recording.
|
|
|
|
#
|
|
|
|
# @server-name: select from among several possible concurrent server instances
|
2020-08-11 03:50:01 +08:00
|
|
|
# (default: environment variable $JACK_DEFAULT_SERVER if set, else "default")
|
2020-04-29 13:53:58 +08:00
|
|
|
#
|
|
|
|
# @client-name: the client name to use. The server will modify this name to
|
2020-08-11 03:50:01 +08:00
|
|
|
# create a unique variant, if needed unless @exact-name is true (default: the
|
|
|
|
# guest's name)
|
2020-04-29 13:53:58 +08:00
|
|
|
#
|
|
|
|
# @connect-ports: if set, a regular expression of JACK client port name(s) to
|
2020-08-11 03:50:01 +08:00
|
|
|
# monitor for and automatically connect to
|
2020-04-29 13:53:58 +08:00
|
|
|
#
|
|
|
|
# @start-server: start a jack server process if one is not already present
|
2020-08-11 03:50:01 +08:00
|
|
|
# (default: false)
|
2020-04-29 13:53:58 +08:00
|
|
|
#
|
|
|
|
# @exact-name: use the exact name requested otherwise JACK automatically
|
2020-08-11 03:50:01 +08:00
|
|
|
# generates a unique one, if needed (default: false)
|
2020-04-29 13:53:58 +08:00
|
|
|
#
|
|
|
|
# Since: 5.1
|
|
|
|
##
|
|
|
|
{ 'struct': 'AudiodevJackPerDirectionOptions',
|
|
|
|
'base': 'AudiodevPerDirectionOptions',
|
|
|
|
'data': {
|
|
|
|
'*server-name': 'str',
|
|
|
|
'*client-name': 'str',
|
|
|
|
'*connect-ports': 'str',
|
|
|
|
'*start-server': 'bool',
|
|
|
|
'*exact-name': 'bool' } }
|
|
|
|
|
|
|
|
##
|
|
|
|
# @AudiodevJackOptions:
|
|
|
|
#
|
|
|
|
# Options of the JACK audio backend.
|
|
|
|
#
|
|
|
|
# @in: options of the capture stream
|
|
|
|
#
|
|
|
|
# @out: options of the playback stream
|
|
|
|
#
|
|
|
|
# Since: 5.1
|
|
|
|
##
|
|
|
|
{ 'struct': 'AudiodevJackOptions',
|
|
|
|
'data': {
|
|
|
|
'*in': 'AudiodevJackPerDirectionOptions',
|
|
|
|
'*out': 'AudiodevJackPerDirectionOptions' } }
|
|
|
|
|
2019-03-09 06:34:12 +08:00
|
|
|
##
|
|
|
|
# @AudiodevOssPerDirectionOptions:
|
|
|
|
#
|
|
|
|
# Options of the OSS backend that are used for both playback and
|
|
|
|
# recording.
|
|
|
|
#
|
|
|
|
# @dev: file name of the OSS device (default '/dev/dsp')
|
|
|
|
#
|
|
|
|
# @buffer-count: number of buffers
|
|
|
|
#
|
|
|
|
# @try-poll: attempt to use poll mode, falling back to non-polling
|
|
|
|
# access on failure (default true)
|
|
|
|
#
|
|
|
|
# Since: 4.0
|
|
|
|
##
|
|
|
|
{ 'struct': 'AudiodevOssPerDirectionOptions',
|
|
|
|
'base': 'AudiodevPerDirectionOptions',
|
|
|
|
'data': {
|
|
|
|
'*dev': 'str',
|
|
|
|
'*buffer-count': 'uint32',
|
|
|
|
'*try-poll': 'bool' } }
|
|
|
|
|
|
|
|
##
|
|
|
|
# @AudiodevOssOptions:
|
|
|
|
#
|
|
|
|
# Options of the OSS audio backend.
|
|
|
|
#
|
|
|
|
# @in: options of the capture stream
|
|
|
|
#
|
|
|
|
# @out: options of the playback stream
|
|
|
|
#
|
|
|
|
# @try-mmap: try using memory-mapped access, falling back to
|
|
|
|
# non-memory-mapped access on failure (default true)
|
|
|
|
#
|
|
|
|
# @exclusive: open device in exclusive mode (vmix won't work)
|
|
|
|
# (default false)
|
|
|
|
#
|
|
|
|
# @dsp-policy: set the timing policy of the device (between 0 and 10,
|
|
|
|
# where smaller number means smaller latency but higher
|
|
|
|
# CPU usage) or -1 to use fragment mode (option ignored
|
|
|
|
# on some platforms) (default 5)
|
|
|
|
#
|
|
|
|
# Since: 4.0
|
|
|
|
##
|
|
|
|
{ 'struct': 'AudiodevOssOptions',
|
|
|
|
'data': {
|
|
|
|
'*in': 'AudiodevOssPerDirectionOptions',
|
|
|
|
'*out': 'AudiodevOssPerDirectionOptions',
|
|
|
|
'*try-mmap': 'bool',
|
|
|
|
'*exclusive': 'bool',
|
|
|
|
'*dsp-policy': 'uint32' } }
|
|
|
|
|
|
|
|
##
|
|
|
|
# @AudiodevPaPerDirectionOptions:
|
|
|
|
#
|
|
|
|
# Options of the Pulseaudio backend that are used for both playback and
|
|
|
|
# recording.
|
|
|
|
#
|
|
|
|
# @name: name of the sink/source to use
|
|
|
|
#
|
2019-09-11 07:26:20 +08:00
|
|
|
# @stream-name: name of the PulseAudio stream created by qemu. Can be
|
|
|
|
# used to identify the stream in PulseAudio when you
|
|
|
|
# create multiple PulseAudio devices or run multiple qemu
|
|
|
|
# instances (default: audiodev's id, since 4.2)
|
|
|
|
#
|
2019-03-15 16:46:52 +08:00
|
|
|
# @latency: latency you want PulseAudio to achieve in microseconds
|
|
|
|
# (default 15000)
|
|
|
|
#
|
2019-03-09 06:34:12 +08:00
|
|
|
# Since: 4.0
|
|
|
|
##
|
|
|
|
{ 'struct': 'AudiodevPaPerDirectionOptions',
|
|
|
|
'base': 'AudiodevPerDirectionOptions',
|
|
|
|
'data': {
|
2019-03-15 16:46:52 +08:00
|
|
|
'*name': 'str',
|
2019-09-11 07:26:20 +08:00
|
|
|
'*stream-name': 'str',
|
2019-03-15 16:46:52 +08:00
|
|
|
'*latency': 'uint32' } }
|
2019-03-09 06:34:12 +08:00
|
|
|
|
|
|
|
##
|
|
|
|
# @AudiodevPaOptions:
|
|
|
|
#
|
|
|
|
# Options of the PulseAudio audio backend.
|
|
|
|
#
|
|
|
|
# @in: options of the capture stream
|
|
|
|
#
|
|
|
|
# @out: options of the playback stream
|
|
|
|
#
|
|
|
|
# @server: PulseAudio server address (default: let PulseAudio choose)
|
|
|
|
#
|
|
|
|
# Since: 4.0
|
|
|
|
##
|
|
|
|
{ 'struct': 'AudiodevPaOptions',
|
|
|
|
'data': {
|
|
|
|
'*in': 'AudiodevPaPerDirectionOptions',
|
|
|
|
'*out': 'AudiodevPaPerDirectionOptions',
|
|
|
|
'*server': 'str' } }
|
|
|
|
|
2021-01-10 18:02:19 +08:00
|
|
|
##
|
|
|
|
# @AudiodevSdlPerDirectionOptions:
|
|
|
|
#
|
|
|
|
# Options of the SDL audio backend that are used for both playback and
|
|
|
|
# recording.
|
|
|
|
#
|
|
|
|
# @buffer-count: number of buffers (default 4)
|
|
|
|
#
|
|
|
|
# Since: 6.0
|
|
|
|
##
|
|
|
|
{ 'struct': 'AudiodevSdlPerDirectionOptions',
|
|
|
|
'base': 'AudiodevPerDirectionOptions',
|
|
|
|
'data': {
|
|
|
|
'*buffer-count': 'uint32' } }
|
|
|
|
|
|
|
|
##
|
|
|
|
# @AudiodevSdlOptions:
|
|
|
|
#
|
|
|
|
# Options of the SDL audio backend.
|
|
|
|
#
|
|
|
|
# @in: options of the recording stream
|
|
|
|
#
|
|
|
|
# @out: options of the playback stream
|
|
|
|
#
|
|
|
|
# Since: 6.0
|
|
|
|
##
|
|
|
|
{ 'struct': 'AudiodevSdlOptions',
|
|
|
|
'data': {
|
|
|
|
'*in': 'AudiodevSdlPerDirectionOptions',
|
|
|
|
'*out': 'AudiodevSdlPerDirectionOptions' } }
|
|
|
|
|
2019-03-09 06:34:12 +08:00
|
|
|
##
|
|
|
|
# @AudiodevWavOptions:
|
|
|
|
#
|
|
|
|
# Options of the wav audio backend.
|
|
|
|
#
|
|
|
|
# @in: options of the capture stream
|
|
|
|
#
|
|
|
|
# @out: options of the playback stream
|
|
|
|
#
|
|
|
|
# @path: name of the wav file to record (default 'qemu.wav')
|
|
|
|
#
|
|
|
|
# Since: 4.0
|
|
|
|
##
|
|
|
|
{ 'struct': 'AudiodevWavOptions',
|
|
|
|
'data': {
|
|
|
|
'*in': 'AudiodevPerDirectionOptions',
|
|
|
|
'*out': 'AudiodevPerDirectionOptions',
|
|
|
|
'*path': 'str' } }
|
|
|
|
|
|
|
|
|
|
|
|
##
|
|
|
|
# @AudioFormat:
|
|
|
|
#
|
|
|
|
# An enumeration of possible audio formats.
|
|
|
|
#
|
2020-03-09 03:33:16 +08:00
|
|
|
# @u8: unsigned 8 bit integer
|
|
|
|
#
|
|
|
|
# @s8: signed 8 bit integer
|
|
|
|
#
|
|
|
|
# @u16: unsigned 16 bit integer
|
|
|
|
#
|
|
|
|
# @s16: signed 16 bit integer
|
|
|
|
#
|
|
|
|
# @u32: unsigned 32 bit integer
|
|
|
|
#
|
|
|
|
# @s32: signed 32 bit integer
|
|
|
|
#
|
|
|
|
# @f32: single precision floating-point (since 5.0)
|
|
|
|
#
|
2019-03-09 06:34:12 +08:00
|
|
|
# Since: 4.0
|
|
|
|
##
|
|
|
|
{ 'enum': 'AudioFormat',
|
2020-02-03 03:38:07 +08:00
|
|
|
'data': [ 'u8', 's8', 'u16', 's16', 'u32', 's32', 'f32' ] }
|
2019-03-09 06:34:12 +08:00
|
|
|
|
|
|
|
##
|
|
|
|
# @AudiodevDriver:
|
|
|
|
#
|
|
|
|
# An enumeration of possible audio backend drivers.
|
|
|
|
#
|
2020-04-29 13:53:58 +08:00
|
|
|
# @jack: JACK audio backend (since 5.1)
|
|
|
|
#
|
2019-03-09 06:34:12 +08:00
|
|
|
# Since: 4.0
|
|
|
|
##
|
|
|
|
{ 'enum': 'AudiodevDriver',
|
2021-03-09 21:15:28 +08:00
|
|
|
'data': [ 'none', 'alsa', 'coreaudio', 'dbus', 'dsound', 'jack', 'oss', 'pa',
|
2020-04-29 13:53:58 +08:00
|
|
|
'sdl', 'spice', 'wav' ] }
|
2019-03-09 06:34:12 +08:00
|
|
|
|
|
|
|
##
|
|
|
|
# @Audiodev:
|
|
|
|
#
|
|
|
|
# Options of an audio backend.
|
|
|
|
#
|
|
|
|
# @id: identifier of the backend
|
|
|
|
#
|
|
|
|
# @driver: the backend driver to use
|
|
|
|
#
|
|
|
|
# @timer-period: timer period (in microseconds, 0: use lowest possible)
|
|
|
|
#
|
|
|
|
# Since: 4.0
|
|
|
|
##
|
|
|
|
{ 'union': 'Audiodev',
|
|
|
|
'base': {
|
|
|
|
'id': 'str',
|
|
|
|
'driver': 'AudiodevDriver',
|
|
|
|
'*timer-period': 'uint32' },
|
|
|
|
'discriminator': 'driver',
|
|
|
|
'data': {
|
|
|
|
'none': 'AudiodevGenericOptions',
|
|
|
|
'alsa': 'AudiodevAlsaOptions',
|
|
|
|
'coreaudio': 'AudiodevCoreaudioOptions',
|
2021-03-09 21:15:28 +08:00
|
|
|
'dbus': 'AudiodevGenericOptions',
|
2019-03-09 06:34:12 +08:00
|
|
|
'dsound': 'AudiodevDsoundOptions',
|
2020-04-29 13:53:58 +08:00
|
|
|
'jack': 'AudiodevJackOptions',
|
2019-03-09 06:34:12 +08:00
|
|
|
'oss': 'AudiodevOssOptions',
|
|
|
|
'pa': 'AudiodevPaOptions',
|
2021-01-10 18:02:19 +08:00
|
|
|
'sdl': 'AudiodevSdlOptions',
|
2019-03-09 06:34:12 +08:00
|
|
|
'spice': 'AudiodevGenericOptions',
|
|
|
|
'wav': 'AudiodevWavOptions' } }
|