bhyve: allow to specify host sound device

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>
This commit is contained in:
Roman Bogorodskiy 2020-07-18 15:23:28 +04:00
parent 9375bc7373
commit 26a13ec469
7 changed files with 63 additions and 5 deletions

View 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;
}

View 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,

View 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);

View File

@ -298,6 +298,7 @@ virDomainDefCheckABIStability;
virDomainDefCheckABIStabilityFlags;
virDomainDefCompatibleDevice;
virDomainDefCopy;
virDomainDefFindAudioForSound;
virDomainDefFindDevice;
virDomainDefFormat;
virDomainDefFormatConvertXMLFlags;

View 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

View File

@ -19,6 +19,12 @@
<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>

View File

@ -30,7 +30,12 @@
<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>