From 8149518ee130c7fc6cd80b0029740c3cdb08ab00 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20P=2E=20Berrang=C3=A9?= Date: Tue, 2 Mar 2021 14:59:28 +0000 Subject: [PATCH] conf: refactor OSS audio backend specific options MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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. Reviewed-by: Michal Privoznik Signed-off-by: Daniel P. Berrangé --- docs/schemas/domaincommon.rng | 17 +++++--- src/bhyve/bhyve_command.c | 8 ++-- src/conf/domain_conf.c | 77 ++++++++++++++++++++++++++--------- src/conf/domain_conf.h | 10 ++++- 4 files changed, 80 insertions(+), 32 deletions(-) diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 6dfd551e98..a2e2b1d9ea 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -4518,6 +4518,15 @@ + + + + + + + + + @@ -4531,16 +4540,12 @@ - - - + - - - + 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 687f7069ae..feecd43c5a 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(virDomainAudioIOOSSPtr def) +{ + 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: @@ -13873,6 +13880,16 @@ virDomainSoundDefFind(const virDomainDef *def, } +static int +virDomainAudioOSSParse(virDomainAudioIOOSSPtr def, + xmlNodePtr node) +{ + def->dev = virXMLPropString(node, "dev"); + + return 0; +} + + static virDomainAudioDefPtr virDomainAudioDefParseXML(virDomainXMLOptionPtr xmlopt G_GNUC_UNUSED, xmlNodePtr node G_GNUC_UNUSED, @@ -13882,6 +13899,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; @@ -13912,19 +13930,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; @@ -26360,11 +26375,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(virDomainAudioIOOSSPtr def, + 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) { @@ -26377,15 +26415,14 @@ virDomainAudioDefFormat(virBufferPtr buf, switch (def->type) { case VIR_DOMAIN_AUDIO_TYPE_OSS: - if (def->backend.oss.inputDev) - virBufferAsprintf(&childBuf, "\n", - def->backend.oss.inputDev); - if (def->backend.oss.outputDev) - virBufferAsprintf(&childBuf, "\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 d613d30495..bd8bd89a55 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1451,6 +1451,12 @@ 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 +1464,8 @@ struct _virDomainAudioDef { union { struct { - char *inputDev; - char *outputDev; + virDomainAudioIOOSS input; + virDomainAudioIOOSS output; } oss; } backend; }; -- 2.47.2