On Fri, Jan 08, 2010 at 05:23:19PM +0000, Daniel P. Berrange wrote: > The current syntax for audio devices is a horrible multiplexed > arg > > -soundhw sb16,pcspk,ac97 > > The new syntax is > > -device sb16,id=sound0 > > or > > -device AC97,id=sound1,addr=<PCI SLOT> > > NB, pcspk still uses the old -soundhw syntax > --- > src/qemu/qemu_conf.c | 97 ++++++++++++++++---- > .../qemuxml2argv-sound-device.args | 1 + > .../qemuxml2argvdata/qemuxml2argv-sound-device.xml | 26 +++++ > tests/qemuxml2argvtest.c | 1 + > 4 files changed, 106 insertions(+), 19 deletions(-) > create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-sound-device.args > create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-sound-device.xml > > diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c > index fa16f8c..067fe42 100644 > --- a/src/qemu/qemu_conf.c > +++ b/src/qemu/qemu_conf.c > @@ -2052,7 +2052,44 @@ error: > return NULL; > } > > -/* this function outputs a -chardev command line option which describes only the > + > +static char * > +qemuBuildSoundDevStr(virDomainSoundDefPtr sound) > +{ > + virBuffer buf = VIR_BUFFER_INITIALIZER; > + const char *model = virDomainSoundModelTypeToString(sound->model); > + > + if (!model) { > + qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, > + "%s", _("invalid sound model")); > + goto error; > + } > + > + /* Hack for 2 wierdly unusal devices name in QEMU */ > + if (STREQ(model, "es1370")) > + model = "ES1370"; > + else if (STREQ(model, "ac97")) > + model = "AC97"; > + > + virBufferVSprintf(&buf, "%s", model); > + virBufferVSprintf(&buf, ",id=%s", sound->info.alias); > + if (qemuBuildDeviceAddressStr(&buf, &sound->info) < 0) > + goto error; > + > + if (virBufferError(&buf)) { > + virReportOOMError(NULL); > + goto error; > + } > + > + return virBufferContentAndReset(&buf); > + > +error: > + virBufferFreeAndReset(&buf); > + return NULL; > +} > + > + > +/* This function outputs a -chardev command line option which describes only the > * host side of the character device */ > static void qemudBuildCommandLineChrDevChardevStr(virDomainChrDefPtr dev, > virBufferPtr buf) > @@ -3121,27 +3158,49 @@ int qemudBuildCommandLine(virConnectPtr conn, > > /* Add sound hardware */ > if (def->nsounds) { > - int size = 100; > - char *modstr; > - if (VIR_ALLOC_N(modstr, size+1) < 0) > - goto no_memory; > + if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) { > + for (i = 0 ; i < def->nsounds ; i++) { > + virDomainSoundDefPtr sound = def->sounds[i]; > + char *str = NULL; > + > + /* Sadly pcspk device doesn't use -device syntax. Fortunately > + * we don't need to set any PCI address on it, so we don't > + * mind too much */ > + if (sound->model == VIR_DOMAIN_SOUND_MODEL_PCSPK) { > + ADD_ARG_LIT("-soundhw"); > + ADD_ARG_LIT("pcspk"); > + } else { > + ADD_ARG_LIT("-device"); > > - for (i = 0 ; i < def->nsounds && size > 0 ; i++) { > - virDomainSoundDefPtr sound = def->sounds[i]; > - const char *model = virDomainSoundModelTypeToString(sound->model); > - if (!model) { > - VIR_FREE(modstr); > - qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, > - "%s", _("invalid sound model")); > - goto error; > + if (!(str = qemuBuildSoundDevStr(sound))) > + goto error; > + > + ADD_ARG(str); > + } > + } > + } else { > + int size = 100; > + char *modstr; > + if (VIR_ALLOC_N(modstr, size+1) < 0) > + goto no_memory; > + > + for (i = 0 ; i < def->nsounds && size > 0 ; i++) { > + virDomainSoundDefPtr sound = def->sounds[i]; > + const char *model = virDomainSoundModelTypeToString(sound->model); > + if (!model) { > + VIR_FREE(modstr); > + qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, > + "%s", _("invalid sound model")); > + goto error; > + } > + strncat(modstr, model, size); > + size -= strlen(model); > + if (i < (def->nsounds - 1)) > + strncat(modstr, ",", size--); > } > - strncat(modstr, model, size); > - size -= strlen(model); > - if (i < (def->nsounds - 1)) > - strncat(modstr, ",", size--); > + ADD_ARG_LIT("-soundhw"); > + ADD_ARG(modstr); > } > - ADD_ARG_LIT("-soundhw"); > - ADD_ARG(modstr); > } > > /* Add watchdog hardware */ > diff --git a/tests/qemuxml2argvdata/qemuxml2argv-sound-device.args b/tests/qemuxml2argvdata/qemuxml2argv-sound-device.args > new file mode 100644 > index 0000000..31ac0ee > --- /dev/null > +++ b/tests/qemuxml2argvdata/qemuxml2argv-sound-device.args > @@ -0,0 +1 @@ > +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefaults -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -usb -soundhw pcspk -device ES1370,id=sound1 -device sb16,id=sound2 -device AC97,id=sound3 > diff --git a/tests/qemuxml2argvdata/qemuxml2argv-sound-device.xml b/tests/qemuxml2argvdata/qemuxml2argv-sound-device.xml > new file mode 100644 > index 0000000..8c33e6c > --- /dev/null > +++ b/tests/qemuxml2argvdata/qemuxml2argv-sound-device.xml > @@ -0,0 +1,26 @@ > +<domain type='qemu'> > + <name>QEMUGuest1</name> > + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> > + <memory>219200</memory> > + <currentMemory>219200</currentMemory> > + <vcpu>1</vcpu> > + <os> > + <type arch='i686' machine='pc'>hvm</type> > + <boot dev='hd'/> > + </os> > + <clock offset='utc'/> > + <on_poweroff>destroy</on_poweroff> > + <on_reboot>restart</on_reboot> > + <on_crash>destroy</on_crash> > + <devices> > + <emulator>/usr/bin/qemu</emulator> > + <disk type='block' device='disk'> > + <source dev='/dev/HostVG/QEMUGuest1'/> > + <target dev='hda' bus='ide'/> > + </disk> > + <sound model='pcspk'/> > + <sound model='es1370'/> > + <sound model='sb16'/> > + <sound model='ac97'/> > + </devices> > +</domain> > diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c > index 6bfc217..55e7d58 100644 > --- a/tests/qemuxml2argvtest.c > +++ b/tests/qemuxml2argvtest.c > @@ -293,6 +293,7 @@ mymain(int argc, char **argv) > DO_TEST("watchdog", 0); > DO_TEST("watchdog-device", QEMUD_CMD_FLAG_DEVICE); > DO_TEST("sound", 0); > + DO_TEST("sound-device", QEMUD_CMD_FLAG_DEVICE); > > DO_TEST("hostdev-usb-product", 0); > DO_TEST("hostdev-usb-address", 0); ACK Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list