</devices>
...
+:since:`Since 9.4.0` the ``usb`` sound device can be optionally switched into
+multi-channel mode by using the ``multichannel`` attribute::
+
+ <sound model='usb' multichannel='yes'/>
+
Each ``sound`` element has an optional sub-element ``<address>`` which can tie
the device to a particular PCI slot. See `Device Addresses`_.
}
}
+ if (def->model == VIR_DOMAIN_SOUND_MODEL_USB) {
+ if (virXMLPropTristateBool(node, "multichannel", VIR_XML_PROP_NONE,
+ &def->multichannel) < 0)
+ return NULL;
+ }
+
audioNode = virXPathNode("./audio", ctxt);
if (audioNode) {
if (virXMLPropUInt(audioNode, "id", 10,
return false;
}
+ if (a->multichannel != b->multichannel)
+ return false;
+
if (a->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
!virDomainDeviceInfoAddressIsEqual(&a->info, &b->info))
return false;
return false;
}
+ if (src->multichannel != dst->multichannel) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Target sound card multichannel setting '%1$s' does not match source '%2$s'"),
+ virTristateBoolTypeToString(dst->multichannel),
+ virTristateBoolTypeToString(src->multichannel));
+ return false;
+ }
+
if (!virDomainDeviceInfoCheckABIStability(&src->info, &dst->info))
return false;
virBufferAsprintf(&attrBuf, " model='%s'", model);
+ if (def->model == VIR_DOMAIN_SOUND_MODEL_USB &&
+ def->multichannel != VIR_TRISTATE_BOOL_ABSENT) {
+ virBufferAsprintf(&attrBuf, " multichannel='%s'",
+ virTristateBoolTypeToString(def->multichannel));
+ }
+
virXMLFormatElement(buf, "sound", &attrBuf, &childBuf);
return 0;
size_t ncodecs;
virDomainSoundCodecDef **codecs;
+ /* VIR_DOMAIN_SOUND_MODEL_USB can be optionally switched to
+ * multi-channel mode */
+ virTristateBool multichannel;
+
unsigned int audioId;
};
<value>usb</value>
</choice>
</attribute>
+ <optional>
+ <attribute name="multichannel">
+ <ref name="virYesNo"/>
+ </attribute>
+ </optional>
<interleave>
<optional>
<ref name="alias"/>
g_autoptr(virJSONValue) props = NULL;
const char *model = NULL;
g_autofree char *audioid = NULL;
+ virTristateBool multichannel = VIR_TRISTATE_BOOL_ABSENT;
switch (sound->model) {
case VIR_DOMAIN_SOUND_MODEL_ES1370:
break;
case VIR_DOMAIN_SOUND_MODEL_USB:
model = "usb-audio";
+ multichannel = sound->multichannel;
break;
case VIR_DOMAIN_SOUND_MODEL_ICH9:
model = "ich9-intel-hda";
"s:driver", model,
"s:id", sound->info.alias,
"S:audiodev", audioid,
+ "T:multi", multichannel,
NULL) < 0)
return -1;
-device hda-micro,id=sound7-codec0,bus=sound7.0,cad=0,audiodev=audio1 \
-device hda-duplex,id=sound7-codec1,bus=sound7.0,cad=1,audiodev=audio1 \
-device hda-output,id=sound7-codec2,bus=sound7.0,cad=2,audiodev=audio1 \
--device usb-audio,id=sound8,audiodev=audio1,bus=usb.0,port=1 \
+-device usb-audio,id=sound8,audiodev=audio1,multi=on,bus=usb.0,port=1 \
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x8 \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
-msg timestamp=on
-device '{"driver":"hda-micro","id":"sound7-codec0","bus":"sound7.0","cad":0,"audiodev":"audio1"}' \
-device '{"driver":"hda-duplex","id":"sound7-codec1","bus":"sound7.0","cad":1,"audiodev":"audio1"}' \
-device '{"driver":"hda-output","id":"sound7-codec2","bus":"sound7.0","cad":2,"audiodev":"audio1"}' \
--device '{"driver":"usb-audio","id":"sound8","audiodev":"audio1","bus":"usb.0","port":"1"}' \
+-device '{"driver":"usb-audio","id":"sound8","audiodev":"audio1","multi":true,"bus":"usb.0","port":"1"}' \
-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x8"}' \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
-msg timestamp=on
<codec type='duplex'/>
<codec type='output'/>
</sound>
- <sound model='usb'/>
+ <sound model='usb' multichannel='yes'/>
<memballoon model='virtio'/>
</devices>
</domain>
<codec type='output'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</sound>
- <sound model='usb'/>
+ <sound model='usb' multichannel='yes'/>
<audio id='1' type='none'/>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>