On 3/3/21 7:18 PM, Daniel P. Berrangé wrote:
To prepare for the introduction for more backend specific audio
options,
move the OSS options into a dedicated struct and introduce separate
helper methods for parse/format/free.
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
docs/schemas/domaincommon.rng | 17 +++++---
src/bhyve/bhyve_command.c | 8 ++--
src/conf/domain_conf.c | 77 ++++++++++++++++++++++++++---------
src/conf/domain_conf.h | 9 +++-
4 files changed, 79 insertions(+), 32 deletions(-)
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index d73db65742..efa1806a3a 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -4513,6 +4513,15 @@
</interleave>
</element>
</define>
+
+ <define name="audiooss">
+ <optional>
+ <attribute name="dev">
+ <ref name="filePath"/>
This previously allowed
"deviceName" only. If this change is needed
please put reasoning into commit message.
Looking into the future (next patch) - this change is needed. Please
mention it in the commit message.
+ </attribute>
+ </optional>
+ </define>
+
<define name="audio">
<element name="audio">
<attribute name="id">
@@ -4526,16 +4535,12 @@
<interleave>
<optional>
<element name="input">
- <attribute name="dev">
- <ref name="deviceName"/>
- </attribute>
+ <ref name="audiooss"/>
</element>
</optional>
<optional>
<element name="output">
- <attribute name="dev">
- <ref name="deviceName"/>
- </attribute>
+ <ref name="audiooss"/>
</element>
</optional>
</interleave>
diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c
index a963338654..e60a6bd393 100644
--- a/src/bhyve/bhyve_command.c
+++ b/src/bhyve/bhyve_command.c
@@ -514,13 +514,13 @@ bhyveBuildSoundArgStr(const virDomainDef *def G_GNUC_UNUSED,
if (audio) {
switch ((virDomainAudioType) audio->type) {
case VIR_DOMAIN_AUDIO_TYPE_OSS:
- if (audio->backend.oss.inputDev)
+ if (audio->backend.oss.input.dev)
virBufferAsprintf(¶ms, ",play=%s",
- audio->backend.oss.inputDev);
+ audio->backend.oss.input.dev);
- if (audio->backend.oss.outputDev)
+ if (audio->backend.oss.output.dev)
virBufferAsprintf(¶ms, ",rec=%s",
- audio->backend.oss.outputDev);
+ audio->backend.oss.output.dev);
break;
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 34d1673546..d5969c79a0 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -2889,15 +2889,22 @@ void virDomainSoundDefFree(virDomainSoundDefPtr def)
g_free(def);
}
-void virDomainAudioDefFree(virDomainAudioDefPtr def)
+static void
+virDomainAudioIOOSSFree(virDomainAudioIOOSS *def)
virDomainAudioIOOSSPtr perhaps?
+{
+ g_free(def->dev);
+}
+
+void
+virDomainAudioDefFree(virDomainAudioDefPtr def)
{
if (!def)
return;
switch ((virDomainAudioType) def->type) {
case VIR_DOMAIN_AUDIO_TYPE_OSS:
- g_free(def->backend.oss.inputDev);
- g_free(def->backend.oss.outputDev);
+ virDomainAudioIOOSSFree(&def->backend.oss.input);
+ virDomainAudioIOOSSFree(&def->backend.oss.output);
break;
case VIR_DOMAIN_AUDIO_TYPE_LAST:
@@ -13863,6 +13870,16 @@ virDomainSoundDefFind(const virDomainDef *def,
}
+static int
+virDomainAudioOSSParse(virDomainAudioIOOSS *def,
virDomainAudioIOOSSPtr?
+ xmlNodePtr node)
+{
+ def->dev = virXMLPropString(node, "dev");
+
+ return 0;
+}
+
+
static virDomainAudioDefPtr
virDomainAudioDefParseXML(virDomainXMLOptionPtr xmlopt G_GNUC_UNUSED,
xmlNodePtr node G_GNUC_UNUSED,
@@ -13872,6 +13889,7 @@ virDomainAudioDefParseXML(virDomainXMLOptionPtr xmlopt
G_GNUC_UNUSED,
VIR_XPATH_NODE_AUTORESTORE(ctxt)
g_autofree char *tmp = NULL;
g_autofree char *type = NULL;
+ xmlNodePtr inputNode, outputNode;
def = g_new0(virDomainAudioDef, 1);
ctxt->node = node;
@@ -13902,19 +13920,16 @@ virDomainAudioDefParseXML(virDomainXMLOptionPtr xmlopt
G_GNUC_UNUSED,
goto error;
}
- switch ((virDomainAudioType) def->type) {
- case VIR_DOMAIN_AUDIO_TYPE_OSS: {
- xmlNodePtr inputDevNode, outputDevNode;
-
- inputDevNode = virXPathNode("./input", ctxt);
- outputDevNode = virXPathNode("./output", ctxt);
+ inputNode = virXPathNode("./input", ctxt);
+ outputNode = virXPathNode("./output", ctxt);
- if (inputDevNode)
- def->backend.oss.inputDev = virXMLPropString(inputDevNode,
"dev");
- if (outputDevNode)
- def->backend.oss.outputDev = virXMLPropString(outputDevNode,
"dev");
+ switch ((virDomainAudioType) def->type) {
+ case VIR_DOMAIN_AUDIO_TYPE_OSS:
+ if (inputNode)
+ virDomainAudioOSSParse(&def->backend.oss.input, inputNode);
+ if (outputNode)
+ virDomainAudioOSSParse(&def->backend.oss.output, outputNode);
break;
- }
case VIR_DOMAIN_AUDIO_TYPE_LAST:
break;
@@ -26381,11 +26396,34 @@ virDomainSoundDefFormat(virBufferPtr buf,
}
+static void
+virDomainAudioCommonFormat(virBufferPtr childBuf,
+ virBufferPtr backendAttrBuf,
+ const char *direction)
+{
+ if (virBufferUse(backendAttrBuf)) {
+ virBufferAsprintf(childBuf, "<%s", direction);
+ virBufferAdd(childBuf, virBufferCurrentContent(backendAttrBuf), -1);
+ virBufferAddLit(childBuf, "/>\n");
+ }
+}
+
+
+static void
+virDomainAudioOSSFormat(virDomainAudioIOOSS *def,
virDomainAudioIOOSSPtr?
+ virBufferPtr buf)
+{
+ virBufferEscapeString(buf, " dev='%s'", def->dev);
+}
+
+
static int
virDomainAudioDefFormat(virBufferPtr buf,
virDomainAudioDefPtr def)
{
g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf);
+ g_auto(virBuffer) inputBuf = VIR_BUFFER_INITIALIZER;
+ g_auto(virBuffer) outputBuf = VIR_BUFFER_INITIALIZER;
const char *type = virDomainAudioTypeTypeToString(def->type);
if (!type) {
@@ -26398,15 +26436,14 @@ virDomainAudioDefFormat(virBufferPtr buf,
switch (def->type) {
case VIR_DOMAIN_AUDIO_TYPE_OSS:
- if (def->backend.oss.inputDev)
- virBufferAsprintf(&childBuf, "<input
dev='%s'/>\n",
- def->backend.oss.inputDev);
- if (def->backend.oss.outputDev)
- virBufferAsprintf(&childBuf, "<output
dev='%s'/>\n",
- def->backend.oss.outputDev);
+ virDomainAudioOSSFormat(&def->backend.oss.input, &inputBuf);
+ virDomainAudioOSSFormat(&def->backend.oss.output, &outputBuf);
break;
}
+ virDomainAudioCommonFormat(&childBuf, &inputBuf, "input");
+ virDomainAudioCommonFormat(&childBuf, &outputBuf, "output");
+
if (virBufferUse(&childBuf)) {
virBufferAddLit(buf, ">\n");
virBufferAddBuffer(buf, &childBuf);
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 8f2e559884..977dd48cc3 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1451,6 +1451,11 @@ typedef enum {
VIR_DOMAIN_AUDIO_TYPE_LAST
} virDomainAudioType;
+typedef struct _virDomainAudioIOOSS virDomainAudioIOOSS;
typedef virDomainAudioIOOSS *virDomainAudioIOOSSPtr;
+struct _virDomainAudioIOOSS {
+ char *dev;
+};
+
struct _virDomainAudioDef {
int type;
@@ -1458,8 +1463,8 @@ struct _virDomainAudioDef {
union {
struct {
- char *inputDev;
- char *outputDev;
+ virDomainAudioIOOSS input;
+ virDomainAudioIOOSS output;
} oss;
} backend;
};
Michal