From: Peter Krempa Date: Tue, 5 Oct 2021 16:35:36 +0000 (+0200) Subject: qemuBuildSoundCommandLine: Generate via JSON X-Git-Tag: v7.9.0-rc1~134 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e79e862a6c9f0aad1f98d49106210a449009a321;p=thirdparty%2Flibvirt.git qemuBuildSoundCommandLine: Generate via JSON The sound devices have only the 'audiodev' property which is a string. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 579ecbf690..e802f02e5b 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4462,15 +4462,16 @@ qemuGetAudioIDString(const virDomainDef *def, int id) return g_strdup_printf("audio%d", audio->id); } -static char * -qemuBuildSoundDevStr(const virDomainDef *def, +static int +qemuBuildSoundDevCmd(virCommand *cmd, + const virDomainDef *def, virDomainSoundDef *sound, virQEMUCaps *qemuCaps) { - g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; + g_autoptr(virJSONValue) props = NULL; const char *model = NULL; + g_autofree char *audioid = NULL; - /* Hack for devices with different names in QEMU and libvirt */ switch (sound->model) { case VIR_DOMAIN_SOUND_MODEL_ES1370: model = "ES1370"; @@ -4493,21 +4494,29 @@ qemuBuildSoundDevStr(const virDomainDef *def, case VIR_DOMAIN_SOUND_MODEL_PCSPK: /* pc-speaker is handled separately */ case VIR_DOMAIN_SOUND_MODEL_ICH7: case VIR_DOMAIN_SOUND_MODEL_LAST: - return NULL; + return -1; } - virBufferAsprintf(&buf, "%s,id=%s", model, sound->info.alias); if (!virDomainSoundModelSupportsCodecs(sound) && virQEMUCapsGet(qemuCaps, QEMU_CAPS_AUDIODEV)) { - g_autofree char *audioid = qemuGetAudioIDString(def, sound->audioId); - if (!audioid) - return NULL; - virBufferAsprintf(&buf, ",audiodev=%s", audioid); + if (!(audioid = qemuGetAudioIDString(def, sound->audioId))) + return -1; } - if (qemuBuildDeviceAddressStr(&buf, def, &sound->info) < 0) - return NULL; - return virBufferContentAndReset(&buf); + if (virJSONValueObjectCreate(&props, + "s:driver", model, + "s:id", sound->info.alias, + "S:audiodev", audioid, + NULL) < 0) + return -1; + + if (qemuBuildDeviceAddressProps(props, def, &sound->info) < 0) + return -1; + + if (qemuBuildDeviceCommandlineFromJSON(cmd, props, qemuCaps) < 0) + return -1; + + return 0; } @@ -4547,7 +4556,6 @@ qemuBuildSoundCommandLine(virCommand *cmd, for (i = 0; i < def->nsounds; i++) { virDomainSoundDef *sound = def->sounds[i]; - g_autofree 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 @@ -4558,11 +4566,9 @@ qemuBuildSoundCommandLine(virCommand *cmd, if (qemuCommandAddExtDevice(cmd, &sound->info, qemuCaps) < 0) return -1; - virCommandAddArg(cmd, "-device"); - if (!(str = qemuBuildSoundDevStr(def, sound, qemuCaps))) + if (qemuBuildSoundDevCmd(cmd, def, sound, qemuCaps) < 0) return -1; - virCommandAddArg(cmd, str); if (virDomainSoundModelSupportsCodecs(sound)) { for (j = 0; j < sound->ncodecs; j++) { g_autofree char *codecstr = NULL;