diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 9f04bfc57d..64af0b5ea9 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4478,31 +4478,30 @@ qemuBuildSoundCommandLine(virCommand *cmd, for (i = 0; i < def->nsounds; i++) { virDomainSoundDef *sound = def->sounds[i]; - /* 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) { - virCommandAddArgList(cmd, "-soundhw", "pcspk", NULL); - } else { - if (qemuCommandAddExtDevice(cmd, &sound->info, def, qemuCaps) < 0) - return -1; + /* Sadly pcspk device doesn't use -device syntax. And it + * was handled already in qemuBuildMachineCommandLine(). + */ + if (sound->model == VIR_DOMAIN_SOUND_MODEL_PCSPK) + continue; - if (qemuBuildSoundDevCmd(cmd, def, sound, qemuCaps) < 0) - return -1; + if (qemuCommandAddExtDevice(cmd, &sound->info, def, qemuCaps) < 0) + return -1; - if (virDomainSoundModelSupportsCodecs(sound)) { - for (j = 0; j < sound->ncodecs; j++) { - if (qemuBuildSoundCodecCmd(cmd, def, sound, sound->codecs[j], - qemuCaps) < 0) - return -1; - } + if (qemuBuildSoundDevCmd(cmd, def, sound, qemuCaps) < 0) + return -1; - if (j == 0) { - virDomainSoundCodecDef codec = { VIR_DOMAIN_SOUND_CODEC_TYPE_DUPLEX, 0 }; + if (virDomainSoundModelSupportsCodecs(sound)) { + for (j = 0; j < sound->ncodecs; j++) { + if (qemuBuildSoundCodecCmd(cmd, def, sound, sound->codecs[j], + qemuCaps) < 0) + return -1; + } - if (qemuBuildSoundCodecCmd(cmd, def, sound, &codec, qemuCaps) < 0) - return -1; - } + if (j == 0) { + virDomainSoundCodecDef codec = { VIR_DOMAIN_SOUND_CODEC_TYPE_DUPLEX, 0 }; + + if (qemuBuildSoundCodecCmd(cmd, def, sound, &codec, qemuCaps) < 0) + return -1; } } } @@ -7030,6 +7029,22 @@ qemuBuildMachineCommandLine(virCommand *cmd, } } + /* PC speaker is a bit different than the rest of sound cards + * which are handled in qemuBuildSoundCommandLine(). */ + for (i = 0; i < def->nsounds; i++) { + const virDomainSoundDef *sound = def->sounds[i]; + g_autofree char *audioid = NULL; + + if (sound->model != VIR_DOMAIN_SOUND_MODEL_PCSPK) + continue; + + if (!(audioid = qemuGetAudioIDString(def, sound->audioId))) + return -1; + + virBufferAsprintf(&buf, ",pcspk-audiodev=%s", audioid); + break; + } + qemuBuildMachineACPI(&buf, def, qemuCaps); virCommandAddArgBuffer(cmd, &buf); diff --git a/tests/qemuxml2argvdata/sound-device.x86_64-4.2.0.args b/tests/qemuxml2argvdata/sound-device.x86_64-4.2.0.args index 7d262ce330..4ba1cbc96a 100644 --- a/tests/qemuxml2argvdata/sound-device.x86_64-4.2.0.args +++ b/tests/qemuxml2argvdata/sound-device.x86_64-4.2.0.args @@ -10,7 +10,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ -name guest=QEMUGuest1,debug-threads=on \ -S \ -object secret,id=masterKey0,format=raw,file=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes \ --machine pc-i440fx-4.2,usb=off,dump-guest-core=off \ +-machine pc-i440fx-4.2,usb=off,dump-guest-core=off,pcspk-audiodev=audio1 \ -accel tcg \ -cpu qemu64 \ -m size=219136k \ @@ -28,7 +28,6 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ -boot strict=on \ -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ -audiodev '{"id":"audio1","driver":"none"}' \ --soundhw pcspk \ -device ES1370,id=sound1,audiodev=audio1,bus=pci.0,addr=0x2 \ -device sb16,id=sound2,audiodev=audio1 \ -device AC97,id=sound3,audiodev=audio1,bus=pci.0,addr=0x3 \ diff --git a/tests/qemuxml2argvdata/sound-device.x86_64-latest.args b/tests/qemuxml2argvdata/sound-device.x86_64-latest.args index 2d8e230388..9e40e9b680 100644 --- a/tests/qemuxml2argvdata/sound-device.x86_64-latest.args +++ b/tests/qemuxml2argvdata/sound-device.x86_64-latest.args @@ -10,7 +10,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ -name guest=QEMUGuest1,debug-threads=on \ -S \ -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ --machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,pcspk-audiodev=audio1,acpi=off \ -accel tcg \ -cpu qemu64 \ -m size=219136k \ @@ -28,7 +28,6 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ -boot strict=on \ -device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ -audiodev '{"id":"audio1","driver":"none"}' \ --soundhw pcspk \ -device '{"driver":"ES1370","id":"sound1","audiodev":"audio1","bus":"pci.0","addr":"0x2"}' \ -device '{"driver":"sb16","id":"sound2","audiodev":"audio1"}' \ -device '{"driver":"AC97","id":"sound3","audiodev":"audio1","bus":"pci.0","addr":"0x3"}' \