]> git.proxmox.com Git - qemu-server.git/blobdiff - PVE/QemuServer.pm
audio follouwp: pull out parsing into a conf_has_audio
[qemu-server.git] / PVE / QemuServer.pm
index 582423e0555028f4f9aa6c76c45eb204a3169cae..c346af2cc1c5105d7288cca52acab0b0990dc898 100644 (file)
@@ -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
     },
@@ -3398,6 +3413,24 @@ sub conf_has_serial {
     return 0;
 }
 
+sub conf_has_audio {
+    my ($conf, $id) = @_;
+
+    $id //= 0;
+    my $audio = $conf->{"audio$id"};
+    return undef if !defined($audio);
+
+    my $audioproperties = PVE::JSONSchema::parse_property_string($audio_fmt, $audio);
+    my $audiodriver = $audioproperties->{driver} // 'spice';
+
+    return {
+       dev => $audioproperties->{device},
+       dev_id => "audio$id",
+       backend => $audiodriver,
+       backend_id => "$audiodriver-backend${id}",
+    };
+}
+
 sub vga_conf_has_spice {
     my ($vga) = @_;
 
@@ -3786,18 +3819,22 @@ sub config_to_command {
        }
     }
 
-    if (my $audiodevice = $conf->{audio0}) {
+    if (my $audio = conf_has_audio($conf)) {
+
        my $audiopciaddr = print_pci_addr("audio0", $bridges, $arch, $machine_type);
 
-       if ($audiodevice eq 'AC97') {
-           push @$devices, '-device', "AC97,id=sound0${audiopciaddr}";
-       } elsif ($audiodevice =~ /intel\-hda$/) {
-           push @$devices, '-device', "${audiodevice},id=sound5${audiopciaddr}";
-           push @$devices, '-device', "hda-micro,id=sound5-codec0,bus=sound5.0,cad=0";
-           push @$devices, '-device', "hda-duplex,id=sound5-codec1,bus=sound5.0,cad=1";
+       my $id = $audio->{dev_id};
+       if ($audio->{dev} eq 'AC97') {
+           push @$devices, '-device', "AC97,id=${id}${audiopciaddr}";
+       } elsif ($audio->{dev} =~ /intel\-hda$/) {
+           push @$devices, '-device', "$audio->{dev},id=${id}${audiopciaddr}";
+           push @$devices, '-device', "hda-micro,id=${id}-codec0,bus=${id}.0,cad=0";
+           push @$devices, '-device', "hda-duplex,id=${id}-codec1,bus=${id}.0,cad=1";
        } else {
-           die "unkown audio device '$audiodevice', implement me!";
+           die "unkown audio device '$audio->{dev}', implement me!";
        }
+
+       push @$devices, '-audiodev', "$audio->{backend},id=$audio->{backend_id}";
     }
 
     my $sockets = 1;
@@ -5574,8 +5611,6 @@ sub vm_qmp_command {
 sub vm_human_monitor_command {
     my ($vmid, $cmdline) = @_;
 
-    my $res;
-
     my $cmd = {
        execute => 'human-monitor-command',
        arguments => { 'command-line' => $cmdline},