]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
bhyve: allow to specify host sound device
authorRoman Bogorodskiy <bogorodskiy@gmail.com>
Sat, 18 Jul 2020 11:23:28 +0000 (15:23 +0400)
committerRoman Bogorodskiy <bogorodskiy@gmail.com>
Tue, 25 Aug 2020 04:42:16 +0000 (08:42 +0400)
Allow to map sound playback and recording devices to host devices
using "<audio type='oss'/>" OSS audio backend.

Signed-off-by: Roman Bogorodskiy <bogorodskiy@gmail.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
src/bhyve/bhyve_command.c
src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms
tests/bhyvexml2argvdata/bhyvexml2argv-sound.args
tests/bhyvexml2argvdata/bhyvexml2argv-sound.xml
tests/bhyvexml2xmloutdata/bhyvexml2xmlout-sound.xml

index 1f42f713476a0a25fbe973dc21e0482470cdbdb3..5289e409fadf60b189c496ae2ccb84acc37bfc85 100644 (file)
@@ -478,9 +478,12 @@ bhyveBuildGraphicsArgStr(const virDomainDef *def,
 static int
 bhyveBuildSoundArgStr(const virDomainDef *def G_GNUC_UNUSED,
                       virDomainSoundDefPtr sound,
+                      virDomainAudioDefPtr audio,
                       bhyveConnPtr driver,
                       virCommandPtr cmd)
 {
+    g_auto(virBuffer) params = VIR_BUFFER_INITIALIZER;
+
     if (!(bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_SOUND_HDA)) {
         /* Currently, bhyve only supports "hda" sound devices, so
            if it's not supported, sound devices are not supported at all */
@@ -497,9 +500,33 @@ bhyveBuildSoundArgStr(const virDomainDef *def G_GNUC_UNUSED,
     }
 
     virCommandAddArg(cmd, "-s");
-    virCommandAddArgFormat(cmd, "%d:%d,hda,play=/dev/dsp0",
+
+    if (audio) {
+        switch ((virDomainAudioType) audio->type) {
+        case  VIR_DOMAIN_AUDIO_TYPE_OSS:
+            if (audio->backend.oss.inputDev)
+                virBufferAsprintf(&params, ",play=%s",
+                                  audio->backend.oss.inputDev);
+
+            if (audio->backend.oss.outputDev)
+                virBufferAsprintf(&params, ",rec=%s",
+                                  audio->backend.oss.outputDev);
+
+            break;
+
+        case VIR_DOMAIN_AUDIO_TYPE_LAST:
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("unsupported audio backend '%s'"),
+                           virDomainAudioTypeTypeToString(audio->type));
+            return -1;
+        }
+    }
+
+    virCommandAddArgFormat(cmd, "%d:%d,hda%s",
                            sound->info.addr.pci.slot,
-                           sound->info.addr.pci.function);
+                           sound->info.addr.pci.function,
+                           virBufferCurrentContent(&params));
+
     return 0;
 }
 
@@ -648,7 +675,9 @@ virBhyveProcessBuildBhyveCmd(bhyveConnPtr driver, virDomainDefPtr def,
     }
 
     for (i = 0; i < def->nsounds; i++) {
-        if (bhyveBuildSoundArgStr(def, def->sounds[i], driver, cmd) < 0)
+        if (bhyveBuildSoundArgStr(def, def->sounds[i],
+                                  virDomainDefFindAudioForSound(def, def->sounds[i]),
+                                  driver, cmd) < 0)
             goto error;
     }
 
index 4f3a83435dd9e1f51a7772292a2f6d75715ac589..cbce78ef9a7b4e8be01d2b921939e7b44655ba74 100644 (file)
@@ -31493,6 +31493,19 @@ virDomainDefFindDevice(virDomainDefPtr def,
 }
 
 
+virDomainAudioDefPtr
+virDomainDefFindAudioForSound(virDomainDefPtr def,
+                              virDomainSoundDefPtr sound)
+{
+    size_t i;
+    for (i = 0; i < def->naudios; i++)
+        if (def->audios[i]->id == sound->audioId)
+            return def->audios[i];
+
+    return NULL;
+}
+
+
 char *
 virDomainObjGetMetadata(virDomainObjPtr vm,
                         int type,
index e0827fee7454fef80be6c79a16feb16e7aee19ae..8a0f26f5c0cf3ecad08fa2381665214ae79a9839 100644 (file)
@@ -3712,6 +3712,10 @@ int virDomainDefFindDevice(virDomainDefPtr def,
                            virDomainDeviceDefPtr dev,
                            bool reportError);
 
+virDomainAudioDefPtr
+virDomainDefFindAudioForSound(virDomainDefPtr def,
+                              virDomainSoundDefPtr sound);
+
 const char *virDomainChrSourceDefGetPath(virDomainChrSourceDefPtr chr);
 
 void virDomainChrSourceDefClear(virDomainChrSourceDefPtr def);
index 35bf9f08ef0e683979a57d7ff592b200736956f2..f950a681792c3538963163655cb492acbff44127 100644 (file)
@@ -298,6 +298,7 @@ virDomainDefCheckABIStability;
 virDomainDefCheckABIStabilityFlags;
 virDomainDefCompatibleDevice;
 virDomainDefCopy;
+virDomainDefFindAudioForSound;
 virDomainDefFindDevice;
 virDomainDefFormat;
 virDomainDefFormatConvertXMLFlags;
index c242708ff1d57f074b1859098a0e8a2a6fad0b1a..05ff4965dd132dfa52121a4d1b5156d4fe724b23 100644 (file)
@@ -7,4 +7,4 @@
 -s 0:0,hostbridge \
 -s 2:0,ahci,hd:/tmp/freebsd.img \
 -s 3:0,virtio-net,faketapdev,mac=52:54:00:b9:94:02 \
--s 4:0,hda,play=/dev/dsp0 bhyve
+-s 4:0,hda,play=/dev/dsp0,rec=/dev/dsp0 bhyve
index 8e799301fba9786d194200bc2b1e18ca980b958f..831e8670e79824bd429b343e769803e26d01c462 100644 (file)
       <source bridge="virbr0"/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
     </interface>
-    <sound model='ich7'/>
+    <sound model='ich7'>
+      <audio id="1"/>
+    </sound>
+    <audio type="oss" id="1">
+      <input dev="/dev/dsp0"/>
+      <output dev="/dev/dsp0"/>
+    </audio>
   </devices>
 </domain>
index a64c5da27a53b1b568218d787ed8017a4cea1e86..c23892eec9a0439832a087510a2f9794d17d6316 100644 (file)
       <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
     </interface>
     <sound model='ich7'>
+      <audio id='1'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
     </sound>
+    <audio id='1' type='oss'>
+      <input dev='/dev/dsp0'/>
+      <output dev='/dev/dsp0'/>
+    </audio>
   </devices>
 </domain>