[pve-devel] [PATCH qemu-server] audio dev: specify qemu audio backend

Thomas Lamprecht t.lamprecht at proxmox.com
Mon Jul 22 10:00:36 CEST 2019


On 7/19/19 3:15 PM, Aaron Lauterer wrote:
> QEMU 4 adds the `-audiodev` parameter to explicitly specify the audio
> backend. Setting it avoids occasional error messages when starting a
> virtual machine with an audio device and qemu wants to connect it to the
> physical audio device.

Occasional? The error is always there if no audio card/alsa is there.
The real issue is that this would have allowed access to host HW with
only having the VM.Config.Option permission on any VM..
(no big issue, I just like to have the commit messages tell the real reasons)

> 
> For now only SPICE is supported as it's also the biggest use case.


FYI, testing this in a VM I get the following errors/warnings:

> audio: Could not init `spice' audio driver
> audio: warning: Using timer based audio emulation

but host seems to work...

> 
> Signed-off-by: Aaron Lauterer <a.lauterer at proxmox.com>
> ---
>  PVE/QemuServer.pm | 24 ++++++++++++++++++++++--
>  1 file changed, 22 insertions(+), 2 deletions(-)
> 
> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
> index c852e04..e2c96e8 100644
> --- a/PVE/QemuServer.pm
> +++ b/PVE/QemuServer.pm
> @@ -267,6 +267,21 @@ my $ivshmem_fmt = {
>      },
>  };
>  
> +my $audio_fmt = {
> +    device => {
> +	type => 'string',
> +	enum => [qw(ich9-intel-hda intel-hda AC97)],
> +	description =>  "Configure an audio device."
> +    },
> +    driver =>  {
> +	type => 'string',
> +	enum => ['spice'],
> +	default => 'spice',
> +	optional => 1,
> +	description => "Driver backend for the audio device."
> +    },
> +};
> +
>  my $confdesc = {
>      onboot => {
>  	optional => 1,
> @@ -640,7 +655,7 @@ EODESCR
>      },
>      audio0 => {
>  	type => 'string',
> -	enum => [qw(ich9-intel-hda intel-hda AC97)],
> +	format => $audio_fmt,
>  	description => "Configure a audio device, useful in combination with QXL/Spice.",
>  	optional => 1
>      },
> @@ -3786,7 +3801,10 @@ sub config_to_command {
>  	}
>      }
>  
> -    if (my $audiodevice = $conf->{audio0}) {
> +    if ($conf->{audio0}) {

why above change, maybe just change it to

if (my $audio0 = $conf->{audio0}) {

> +	my $audioproperties = PVE::JSONSchema::parse_property_string($audio_fmt, $conf->{audio0});
> +	my $audiodevice = $audioproperties->{device};
> +	my $audiodriver = $audioproperties->{driver} // 'spice';

above not needed? just use the hash directly?

my $audiodev = PVE::JSONSchema::parse_property_string($audio_fmt, $audio0);
$audiodev->{driver} //= 'spice';



>  	my $audiopciaddr = print_pci_addr("audio0", $bridges, $arch, $machine_type);
>  
>  	if ($audiodevice eq 'AC97') {
> @@ -3798,6 +3816,8 @@ sub config_to_command {
>  	} else {
>  	    die "unkown audio device '$audiodevice', implement me!";
>  	}
> +
> +	push @$devices, '-audiodev', "${audiodriver},id=${audiodriver}-driver";

doesn't the ID of the main -device above? Or is this independent?

>      }
>  
>      my $sockets = 1;
> 





More information about the pve-devel mailing list