[libvirt] [PATCH 4/6] conf: introduce <output> element for <sound> devices

Pavel Hrdina phrdina at redhat.com
Tue Nov 14 13:45:09 UTC 2017


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 at 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




More information about the libvir-list mailing list