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(a)redhat.com>
---
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