qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v4 15/24] audio: add mixing-engine option (documentation)


From: Zoltán Kővágó
Subject: Re: [PATCH v4 15/24] audio: add mixing-engine option (documentation)
Date: Tue, 24 Sep 2019 02:21:32 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1

On 2019-09-23 15:08, Markus Armbruster wrote:
"Kővágó, Zoltán" <address@hidden> writes:

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.

However mixeng is not removed, only made optional, so this shouldn't be
a big concern.

Signed-off-by: Kővágó, Zoltán <address@hidden>
---

Notes:
     Changes from v1:
* renamed mixeng to mixing-engine

  qapi/audio.json | 5 +++++
  qemu-options.hx | 6 ++++++
  2 files changed, 11 insertions(+)

diff --git a/qapi/audio.json b/qapi/audio.json
index 9fefdf5186..0535eff794 100644
--- a/qapi/audio.json
+++ b/qapi/audio.json
@@ -11,6 +11,10 @@
  # General audio backend options that are used for both playback and
  # recording.
  #
+# @mixing-engine: use QEMU's mixing engine to mix all streams inside QEMU. When
+#                 set to off, fixed-settings must be also off. Not every 
backend
+#                 compatible with the off setting (default on, since 4.2)
+#

Last sentence no verb.

Which backends are compatible?

Actually that's a simplification, it depends on a few things. When mixeng is off, qemu will try to use the same format as the emulated sound card, and if the backend doesn't support that format, it won't work (no audio). Also attaching multiple sound cards to the same audiodev might not work, if the backend doesn't support multiple playback streams. If you use pulseaudio, it'll work without problems, if you use alsa, it depends on your device. If you use a hw: device directly, you'll likely only be able to use one emulated sound card with a few selected audio formats. If you use dmix: (and plug), alsa will handle the conversion and mixing, so it will work no matter what format the emulated sound card uses. With OSS the situation is probably similar, it depends on the kernel/hw what works and what not. wav and spice certainly doesn't support multiple streams. I'm not completely sure about the other backends right now, but I think dsound and coreaudio can handle the necessary sample format conversions and mixing.

What happens when you try the off setting with incompatible backends?
See above.


  # @fixed-settings: use fixed settings for host input/output. When off,
  #                  frequency, channels and format must not be
  #                  specified (default true)
@@ -31,6 +35,7 @@
  ##
  { 'struct': 'AudiodevPerDirectionOptions',
    'data': {
+    '*mixing-engine':  'bool',
      '*fixed-settings': 'bool',
      '*frequency':      'uint32',
      '*channels':       'uint32',
diff --git a/qemu-options.hx b/qemu-options.hx
index bbfd936d29..395427422a 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -433,6 +433,7 @@ DEF("audiodev", HAS_ARG, QEMU_OPTION_audiodev,
      "                specifies the audio backend to use\n"
      "                id= identifier of the backend\n"
      "                timer-period= timer period in microseconds\n"
+    "                in|out.mixing-engine= use mixing engine to mix streams inside 
QEMU\n"
      "                in|out.fixed-settings= use fixed settings for host 
audio\n"
      "                in|out.frequency= frequency to use with fixed settings\n"
      "                in|out.channels= number of channels to use with fixed 
settings\n"
@@ -503,6 +504,11 @@ Identifies the audio backend.
  Sets the timer @var{period} used by the audio subsystem in microseconds.
  Default is 10000 (10 ms).
+@item in|out.mixing-engine=on|off
+Use QEMU's mixing engine to mix all streams inside QEMU.  When off,
+@var{fixed-settings} must be off too.  Not every backend is fully
+compatible with the off setting.  Default is on.
+
  @item in|out.fixed-settings=on|off
  Use fixed settings for host audio.  When off, it will change based on
  how the guest opens the sound card.  In this case you must not specify




reply via email to

[Prev in Thread] Current Thread [Next in Thread]