So far it was not possible to specify how the audio output from guest should be presented to host/users. Now it will be possible to do so via <output> element for <sound> device where you specify the output "type". Signed-off-by: Pavel Hrdina <phrdina@xxxxxxxxxx> --- docs/formatdomain.html.in | 9 +++++++ docs/schemas/domaincommon.rng | 14 ++++++++++ src/conf/domain_conf.c | 61 +++++++++++++++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 14 ++++++++++ src/libvirt_private.syms | 2 ++ 5 files changed, 100 insertions(+) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 47c43d0666..3b7c367fc7 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -7058,6 +7058,15 @@ qemu-kvm -net nic,model=? /dev/null slot, <a href="#elementsAddress">documented above</a>. </p> + <p> + <span class="since">Since 3.10.0</span> sound device can have + an optional <code>output</code> element which configures where + the audio output is connected within host. There is mandatory + <code>type</code> attribute where valid values are 'none' to + disable the audio output, 'spice', 'pa', 'sdl', 'alsa', 'oss'. + This might not be supported by all hypervisors. + </p> + <h4><a id="elementsWatchdog">Watchdog device</a></h4> <p> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 9cec1a0637..c499229c43 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -3803,6 +3803,20 @@ <zeroOrMore> <ref name="codec"/> </zeroOrMore> + <optional> + <element name="output"> + <attribute name="type"> + <choice> + <value>none</value> + <value>spice</value> + <value>pa</value> + <value>sdl</value> + <value>alsa</value> + <value>oss</value> + </choice> + </attribute> + </element> + </optional> </interleave> </element> </define> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index fffcc8e9da..33e59c7667 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -517,6 +517,15 @@ VIR_ENUM_IMPL(virDomainSoundModel, VIR_DOMAIN_SOUND_MODEL_LAST, "ich9", "usb") +VIR_ENUM_IMPL(virDomainSoundOutput, VIR_DOMAIN_SOUND_OUTPUT_TYPE_LAST, + "default", + "none", + "spice", + "pa", + "sdl", + "alsa", + "oss") + VIR_ENUM_IMPL(virDomainKeyWrapCipherName, VIR_DOMAIN_KEY_WRAP_CIPHER_NAME_LAST, "aes", @@ -13687,6 +13696,50 @@ virDomainSoundCodecDefParseXML(xmlNodePtr node) } +static int +virDomainSoundOutputParseXML(xmlXPathContextPtr ctxt, + virDomainSoundDefPtr sound) +{ + int ret = -1; + char *type = NULL; + int typeVal; + xmlNodePtr *outputNodes = NULL; + int noutputs; + + noutputs = virXPathNodeSet("./output", ctxt, &outputNodes); + if (noutputs < 0) + return -1; + + if (noutputs > 1) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("sound device can have only one output configured")); + goto cleanup; + } + + if (noutputs > 0) { + if (!(type = virXMLPropString(outputNodes[0], "type"))) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("sound output type must be specified")); + goto cleanup; + } + + if ((typeVal = virDomainSoundOutputTypeFromString(type)) < 0) { + virReportError(VIR_ERR_INVALID_ARG, + _("invalid sound output type '%s'"), type); + goto cleanup; + } + + sound->output = typeVal; + } + + ret = 0; + cleanup: + VIR_FREE(outputNodes); + VIR_FREE(type); + return ret; +} + + static virDomainSoundDefPtr virDomainSoundDefParseXML(virDomainXMLOptionPtr xmlopt, xmlNodePtr node, @@ -13741,6 +13794,9 @@ virDomainSoundDefParseXML(virDomainXMLOptionPtr xmlopt, } } + if (virDomainSoundOutputParseXML(ctxt, def) < 0) + goto error; + if (virDomainDeviceInfoParseXML(xmlopt, node, NULL, &def->info, flags) < 0) goto error; @@ -24111,6 +24167,11 @@ virDomainSoundDefFormat(virBufferPtr buf, virDomainDeviceInfoFormat(&childBuf, &def->info, flags); + if (def->output != VIR_DOMAIN_SOUND_OUTPUT_TYPE_DEFAULT) { + virBufferAsprintf(&childBuf, "<output type='%s'/>\n", + virDomainSoundOutputTypeToString(def->output)); + } + if (virBufferCheckError(&childBuf) < 0) return -1; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index e3f060b122..55a984c781 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1332,12 +1332,25 @@ struct _virDomainSoundCodecDef { int cad; }; +typedef enum { + VIR_DOMAIN_SOUND_OUTPUT_TYPE_DEFAULT, + VIR_DOMAIN_SOUND_OUTPUT_TYPE_NONE, + VIR_DOMAIN_SOUND_OUTPUT_TYPE_SPICE, + VIR_DOMAIN_SOUND_OUTPUT_TYPE_PA, + VIR_DOMAIN_SOUND_OUTPUT_TYPE_SDL, + VIR_DOMAIN_SOUND_OUTPUT_TYPE_ALSA, + VIR_DOMAIN_SOUND_OUTPUT_TYPE_OSS, + + VIR_DOMAIN_SOUND_OUTPUT_TYPE_LAST +} virDomainSoundOutputType; + struct _virDomainSoundDef { int model; virDomainDeviceInfo info; size_t ncodecs; virDomainSoundCodecDefPtr *codecs; + virDomainSoundOutputType output; }; typedef enum { @@ -3246,6 +3259,7 @@ VIR_ENUM_DECL(virDomainChrTcpProtocol) VIR_ENUM_DECL(virDomainChrSpicevmc) VIR_ENUM_DECL(virDomainSoundCodec) VIR_ENUM_DECL(virDomainSoundModel) +VIR_ENUM_DECL(virDomainSoundOutput) VIR_ENUM_DECL(virDomainKeyWrapCipherName) VIR_ENUM_DECL(virDomainMemballoonModel) VIR_ENUM_DECL(virDomainSmbiosMode) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 5a4d50471d..0ef7e896d8 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -516,6 +516,8 @@ virDomainSmbiosModeTypeToString; virDomainSoundDefFree; virDomainSoundModelTypeFromString; virDomainSoundModelTypeToString; +virDomainSoundOutputTypeFromString; +virDomainSoundOutputTypeToString; virDomainStartupPolicyTypeFromString; virDomainStartupPolicyTypeToString; virDomainStateReasonFromString; -- 2.13.6 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list