Setting the default audio output depends on specific graphic device
but requires having sound device configured as well and it's the sound
device that handles the audio.
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
---
src/qemu/qemu_command.c | 84 +++++++++++++++-------
.../qemuxml2argv-clock-france.args | 2 +-
2 files changed, 58 insertions(+), 28 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index eb72db33ba..e1ef1b05fa 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -4442,10 +4442,62 @@ qemuBuildSoundCodecStr(virDomainSoundDefPtr sound,
}
+static void
+qemuBuildSoundAudioEnv(virCommandPtr cmd,
+ const virDomainDef *def,
+ virQEMUDriverConfigPtr cfg)
+{
+ if (def->ngraphics == 0) {
+ if (cfg->nogfxAllowHostAudio)
+ virCommandAddEnvPassBlockSUID(cmd, "QEMU_AUDIO_DRV", NULL);
+ else
+ virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=none");
+ } else {
+ switch (def->graphics[def->ngraphics - 1]->type) {
+ case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
+ /* If using SDL for video, then we should just let it
+ * use QEMU's host audio drivers, possibly SDL too
+ * User can set these two before starting libvirtd
+ */
+ virCommandAddEnvPassBlockSUID(cmd, "QEMU_AUDIO_DRV", NULL);
+ virCommandAddEnvPassBlockSUID(cmd, "SDL_AUDIODRIVER", NULL);
+
+ break;
+
+ case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
+ /* Unless user requested it, set the audio backend to none, to
+ * prevent it opening the host OS audio devices, since that causes
+ * security issues and might not work when using VNC.
+ */
+ if (cfg->vncAllowHostAudio)
+ virCommandAddEnvPassBlockSUID(cmd, "QEMU_AUDIO_DRV", NULL);
+ else
+ virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=none");
+
+ break;
+
+ case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
+ /* SPICE includes native support for tunnelling audio, so we
+ * set the audio backend to point at SPICE's own driver
+ */
+ virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=spice");
+
+ break;
+
+ case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
+ case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
+ case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
+ break;
+ }
+ }
+}
+
+
static int
qemuBuildSoundCommandLine(virCommandPtr cmd,
const virDomainDef *def,
- virQEMUCapsPtr qemuCaps)
+ virQEMUCapsPtr qemuCaps,
+ virQEMUDriverConfigPtr cfg)
{
size_t i, j;
@@ -4498,6 +4550,9 @@ qemuBuildSoundCommandLine(virCommandPtr cmd,
}
}
}
+
+ qemuBuildSoundAudioEnv(cmd, def, cfg);
+
return 0;
}
@@ -7951,15 +8006,6 @@ qemuBuildGraphicsVNCCommandLine(virQEMUDriverConfigPtr cfg,
if (graphics->data.vnc.keymap)
virCommandAddArgList(cmd, "-k", graphics->data.vnc.keymap, NULL);
- /* Unless user requested it, set the audio backend to none, to
- * prevent it opening the host OS audio devices, since that causes
- * security issues and might not work when using VNC.
- */
- if (cfg->vncAllowHostAudio)
- virCommandAddEnvPassBlockSUID(cmd, "QEMU_AUDIO_DRV", NULL);
- else
- virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=none");
-
return 0;
error:
@@ -8201,10 +8247,6 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg,
if (graphics->data.spice.keymap)
virCommandAddArgList(cmd, "-k",
graphics->data.spice.keymap, NULL);
- /* SPICE includes native support for tunnelling audio, so we
- * set the audio backend to point at SPICE's own driver
- */
- virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=spice");
return 0;
@@ -8235,13 +8277,6 @@ qemuBuildGraphicsCommandLine(virQEMUDriverConfigPtr cfg,
if (graphics->data.sdl.fullscreen)
virCommandAddArg(cmd, "-full-screen");
- /* If using SDL for video, then we should just let it
- * use QEMU's host audio drivers, possibly SDL too
- * User can set these two before starting libvirtd
- */
- virCommandAddEnvPassBlockSUID(cmd, "QEMU_AUDIO_DRV", NULL);
- virCommandAddEnvPassBlockSUID(cmd, "SDL_AUDIODRIVER", NULL);
-
/* New QEMU has this flag to let us explicitly ask for
* SDL graphics. This is better than relying on the
* default, since the default changes :-( */
@@ -9995,11 +10030,6 @@ qemuBuildCommandLine(virQEMUDriverPtr driver,
} else {
virCommandAddArg(cmd, "-nographic");
}
-
- if (cfg->nogfxAllowHostAudio)
- virCommandAddEnvPassBlockSUID(cmd, "QEMU_AUDIO_DRV", NULL);
- else
- virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=none");
}
/* Disable global config files and default devices */
@@ -10083,7 +10113,7 @@ qemuBuildCommandLine(virQEMUDriverPtr driver,
if (qemuBuildVideoCommandLine(cmd, def, qemuCaps) < 0)
goto error;
- if (qemuBuildSoundCommandLine(cmd, def, qemuCaps) < 0)
+ if (qemuBuildSoundCommandLine(cmd, def, qemuCaps, cfg) < 0)
goto error;
if (qemuBuildWatchdogCommandLine(cmd, def, qemuCaps) < 0)
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-clock-france.args b/tests/qemuxml2argvdata/qemuxml2argv-clock-france.args
index 9bde6d967b..2701179273 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-clock-france.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-clock-france.args
@@ -3,8 +3,8 @@ PATH=/bin \
HOME=/home/test \
USER=test \
LOGNAME=test \
-QEMU_AUDIO_DRV=none \
TZ=Europe/Paris \
+QEMU_AUDIO_DRV=none \
/usr/bin/qemu-system-i686 \
-name QEMUGuest1 \
-S \
--
2.13.6
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On 11/14/2017 08:45 AM, Pavel Hrdina wrote:
> Setting the default audio output depends on specific graphic device
> but requires having sound device configured as well and it's the sound
> device that handles the audio.
>
> Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
> ---
> src/qemu/qemu_command.c | 84 +++++++++++++++-------
> .../qemuxml2argv-clock-france.args | 2 +-
> 2 files changed, 58 insertions(+), 28 deletions(-)
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index eb72db33ba..e1ef1b05fa 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -4442,10 +4442,62 @@ qemuBuildSoundCodecStr(virDomainSoundDefPtr sound,
> }
> >
> +static void
> +qemuBuildSoundAudioEnv(virCommandPtr cmd,
> + const virDomainDef *def,
> + virQEMUDriverConfigPtr cfg)
> +{
> + if (def->ngraphics == 0) {
> + if (cfg->nogfxAllowHostAudio)
> + virCommandAddEnvPassBlockSUID(cmd, "QEMU_AUDIO_DRV", NULL);
> + else
> + virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=none");
> + } else {
> + switch (def->graphics[def->ngraphics - 1]->type) {
So it's the "last" graphics device that then defines "how" this all
works? Makes sense for QEMU_AUDIO_DRV since whichever is last would be
the winner and get the chicken dinner, but...
> + case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
> + /* If using SDL for video, then we should just let it
> + * use QEMU's host audio drivers, possibly SDL too
> + * User can set these two before starting libvirtd
> + */
> + virCommandAddEnvPassBlockSUID(cmd, "QEMU_AUDIO_DRV", NULL);
> + virCommandAddEnvPassBlockSUID(cmd, "SDL_AUDIODRIVER", NULL);
... if there was more than one graphics device defined, where one was
SDL and it wasn't the last one, then theoretically at least this would
not be defined.
I think it's easily fixable...
> +
> + break;
> +
> + case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
> + /* Unless user requested it, set the audio backend to none, to
> + * prevent it opening the host OS audio devices, since that causes
> + * security issues and might not work when using VNC.
> + */
> + if (cfg->vncAllowHostAudio)
> + virCommandAddEnvPassBlockSUID(cmd, "QEMU_AUDIO_DRV", NULL);
> + else
> + virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=none");
> +
> + break;
> +
> + case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
> + /* SPICE includes native support for tunnelling audio, so we
> + * set the audio backend to point at SPICE's own driver
> + */
> + virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=spice");
> +
> + break;
> +
> + case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
> + case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
> + case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
> + break;
> + }
> + }
> +}
> +
> +
> static int
> qemuBuildSoundCommandLine(virCommandPtr cmd,
> const virDomainDef *def,
> - virQEMUCapsPtr qemuCaps)
> + virQEMUCapsPtr qemuCaps,
> + virQEMUDriverConfigPtr cfg)
> {
> size_t i, j;
>
> @@ -4498,6 +4550,9 @@ qemuBuildSoundCommandLine(virCommandPtr cmd,
> }
> }
> }
> +
> + qemuBuildSoundAudioEnv(cmd, def, cfg);
> +
> return 0;
> }
>
> @@ -7951,15 +8006,6 @@ qemuBuildGraphicsVNCCommandLine(virQEMUDriverConfigPtr cfg,
> if (graphics->data.vnc.keymap)
> virCommandAddArgList(cmd, "-k", graphics->data.vnc.keymap, NULL);
>
> - /* Unless user requested it, set the audio backend to none, to
> - * prevent it opening the host OS audio devices, since that causes
> - * security issues and might not work when using VNC.
> - */
> - if (cfg->vncAllowHostAudio)
> - virCommandAddEnvPassBlockSUID(cmd, "QEMU_AUDIO_DRV", NULL);
> - else
> - virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=none");
> -
> return 0;
>
> error:
> @@ -8201,10 +8247,6 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg,
> if (graphics->data.spice.keymap)
> virCommandAddArgList(cmd, "-k",
> graphics->data.spice.keymap, NULL);
> - /* SPICE includes native support for tunnelling audio, so we
> - * set the audio backend to point at SPICE's own driver
> - */
> - virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=spice");
>
> return 0;
>
> @@ -8235,13 +8277,6 @@ qemuBuildGraphicsCommandLine(virQEMUDriverConfigPtr cfg,
> if (graphics->data.sdl.fullscreen)
> virCommandAddArg(cmd, "-full-screen");
>
> - /* If using SDL for video, then we should just let it
> - * use QEMU's host audio drivers, possibly SDL too
> - * User can set these two before starting libvirtd
> - */
> - virCommandAddEnvPassBlockSUID(cmd, "QEMU_AUDIO_DRV", NULL);
> - virCommandAddEnvPassBlockSUID(cmd, "SDL_AUDIODRIVER", NULL);
... perhaps the fix to above is to just keep SDL_AUDIODRIVER here, just
in case there's more than one graphics device and SDL isn't last.
Reviewed-by: John Ferlan <jferlan@redhat.com>
John
> -
> /* New QEMU has this flag to let us explicitly ask for
> * SDL graphics. This is better than relying on the
> * default, since the default changes :-( */
> @@ -9995,11 +10030,6 @@ qemuBuildCommandLine(virQEMUDriverPtr driver,
> } else {
> virCommandAddArg(cmd, "-nographic");
> }
> -
> - if (cfg->nogfxAllowHostAudio)
> - virCommandAddEnvPassBlockSUID(cmd, "QEMU_AUDIO_DRV", NULL);
> - else
> - virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=none");
> }
>
> /* Disable global config files and default devices */
> @@ -10083,7 +10113,7 @@ qemuBuildCommandLine(virQEMUDriverPtr driver,
> if (qemuBuildVideoCommandLine(cmd, def, qemuCaps) < 0)
> goto error;
>
> - if (qemuBuildSoundCommandLine(cmd, def, qemuCaps) < 0)
> + if (qemuBuildSoundCommandLine(cmd, def, qemuCaps, cfg) < 0)
> goto error;
>
> if (qemuBuildWatchdogCommandLine(cmd, def, qemuCaps) < 0)
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-clock-france.args b/tests/qemuxml2argvdata/qemuxml2argv-clock-france.args
> index 9bde6d967b..2701179273 100644
> --- a/tests/qemuxml2argvdata/qemuxml2argv-clock-france.args
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-clock-france.args
> @@ -3,8 +3,8 @@ PATH=/bin \
> HOME=/home/test \
> USER=test \
> LOGNAME=test \
> -QEMU_AUDIO_DRV=none \
> TZ=Europe/Paris \
> +QEMU_AUDIO_DRV=none \
> /usr/bin/qemu-system-i686 \
> -name QEMUGuest1 \
> -S \
>
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On Mon, Nov 20, 2017 at 05:39:38PM -0500, John Ferlan wrote:
>
>
> On 11/14/2017 08:45 AM, Pavel Hrdina wrote:
> > Setting the default audio output depends on specific graphic device
> > but requires having sound device configured as well and it's the sound
> > device that handles the audio.
> >
> > Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
> > ---
> > src/qemu/qemu_command.c | 84 +++++++++++++++-------
> > .../qemuxml2argv-clock-france.args | 2 +-
> > 2 files changed, 58 insertions(+), 28 deletions(-)
> >
> > diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> > index eb72db33ba..e1ef1b05fa 100644
> > --- a/src/qemu/qemu_command.c
> > +++ b/src/qemu/qemu_command.c
> > @@ -4442,10 +4442,62 @@ qemuBuildSoundCodecStr(virDomainSoundDefPtr sound,
> > }
> > >
> > +static void
> > +qemuBuildSoundAudioEnv(virCommandPtr cmd,
> > + const virDomainDef *def,
> > + virQEMUDriverConfigPtr cfg)
> > +{
> > + if (def->ngraphics == 0) {
> > + if (cfg->nogfxAllowHostAudio)
> > + virCommandAddEnvPassBlockSUID(cmd, "QEMU_AUDIO_DRV", NULL);
> > + else
> > + virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=none");
> > + } else {
> > + switch (def->graphics[def->ngraphics - 1]->type) {
>
> So it's the "last" graphics device that then defines "how" this all
> works? Makes sense for QEMU_AUDIO_DRV since whichever is last would be
> the winner and get the chicken dinner, but...
>
> > + case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
> > + /* If using SDL for video, then we should just let it
> > + * use QEMU's host audio drivers, possibly SDL too
> > + * User can set these two before starting libvirtd
> > + */
> > + virCommandAddEnvPassBlockSUID(cmd, "QEMU_AUDIO_DRV", NULL);
> > + virCommandAddEnvPassBlockSUID(cmd, "SDL_AUDIODRIVER", NULL);
>
> ... if there was more than one graphics device defined, where one was
> SDL and it wasn't the last one, then theoretically at least this would
> not be defined.
This is intentional, I should have mentioned it in the commit message.
The original design was just wrong, nothing else. Setting
"SDL_AUDIODRIVER" if the SDL audio output is not used is pointless
and we shouldn't do it. I can move this change to separate patch.
Pavel
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On 11/21/2017 03:59 AM, Pavel Hrdina wrote:
> On Mon, Nov 20, 2017 at 05:39:38PM -0500, John Ferlan wrote:
>>
>>
>> On 11/14/2017 08:45 AM, Pavel Hrdina wrote:
>>> Setting the default audio output depends on specific graphic device
>>> but requires having sound device configured as well and it's the sound
>>> device that handles the audio.
>>>
>>> Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
>>> ---
>>> src/qemu/qemu_command.c | 84 +++++++++++++++-------
>>> .../qemuxml2argv-clock-france.args | 2 +-
>>> 2 files changed, 58 insertions(+), 28 deletions(-)
>>>
>>> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>>> index eb72db33ba..e1ef1b05fa 100644
>>> --- a/src/qemu/qemu_command.c
>>> +++ b/src/qemu/qemu_command.c
>>> @@ -4442,10 +4442,62 @@ qemuBuildSoundCodecStr(virDomainSoundDefPtr sound,
>>> }
>>> >
>>> +static void
>>> +qemuBuildSoundAudioEnv(virCommandPtr cmd,
>>> + const virDomainDef *def,
>>> + virQEMUDriverConfigPtr cfg)
>>> +{
>>> + if (def->ngraphics == 0) {
>>> + if (cfg->nogfxAllowHostAudio)
>>> + virCommandAddEnvPassBlockSUID(cmd, "QEMU_AUDIO_DRV", NULL);
>>> + else
>>> + virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=none");
>>> + } else {
>>> + switch (def->graphics[def->ngraphics - 1]->type) {
>>
>> So it's the "last" graphics device that then defines "how" this all
>> works? Makes sense for QEMU_AUDIO_DRV since whichever is last would be
>> the winner and get the chicken dinner, but...
>>
>>> + case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
>>> + /* If using SDL for video, then we should just let it
>>> + * use QEMU's host audio drivers, possibly SDL too
>>> + * User can set these two before starting libvirtd
>>> + */
>>> + virCommandAddEnvPassBlockSUID(cmd, "QEMU_AUDIO_DRV", NULL);
>>> + virCommandAddEnvPassBlockSUID(cmd, "SDL_AUDIODRIVER", NULL);
>>
>> ... if there was more than one graphics device defined, where one was
>> SDL and it wasn't the last one, then theoretically at least this would
>> not be defined.
>
> This is intentional, I should have mentioned it in the commit message.
> The original design was just wrong, nothing else. Setting
> "SDL_AUDIODRIVER" if the SDL audio output is not used is pointless
> and we shouldn't do it. I can move this change to separate patch.
>
> Pavel
>
I figured you had gone through the history - I certain hadn't ;-)... I
would say by this point in the review I was still "missing" the final
detail regarding the bug you're working on O:) - that the audio was
being 'tied to' that last device only. Guess I was thinking it could
somehow be magically applied to "any" device.
Anyway, long way of saying - it's fine here. Adding a bit more detail to
the commit message will help though.
John
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
© 2016 - 2025 Red Hat, Inc.