[libvirt PATCH 06/18] conf: refactor OSS audio backend specific options
Michal Privoznik
mprivozn at redhat.com
Tue Mar 9 15:30:18 UTC 2021
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 at 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
More information about the libvir-list
mailing list