Message ID | 20230929085112.983957-9-pbonzini@redhat.com |
---|---|
State | New |
Headers | show |
Series | Cleanup deprecated audio features, take 2 | expand |
Am 29. September 2023 08:51:01 UTC schrieb Paolo Bonzini <pbonzini@redhat.com>: >From: Martin Kletzander <mkletzan@redhat.com> > >Many machine types have default audio devices with no way to set the underlying >audiodev. Instead of adding an option for each and every one of them, this new >property can be used as a default during machine initialisation when creating >such devices. > >Signed-off-by: Martin Kletzander <mkletzan@redhat.com> >[Make the property optional, instead of including it in all machines. - Paolo] >Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> >--- > hw/core/machine.c | 33 +++++++++++++++++++++++++++++++++ > include/hw/boards.h | 9 +++++++++ > 2 files changed, 42 insertions(+) > >diff --git a/hw/core/machine.c b/hw/core/machine.c >index cb38b8cf4cb..6aa49c8d4f1 100644 >--- a/hw/core/machine.c >+++ b/hw/core/machine.c >@@ -39,6 +39,7 @@ > #include "hw/virtio/virtio.h" > #include "hw/virtio/virtio-pci.h" > #include "hw/virtio/virtio-net.h" >+#include "audio/audio.h" > > GlobalProperty hw_compat_8_1[] = {}; > const size_t hw_compat_8_1_len = G_N_ELEMENTS(hw_compat_8_1); >@@ -686,6 +687,26 @@ bool device_type_is_dynamic_sysbus(MachineClass *mc, const char *type) > return allowed; > } > >+static char *machine_get_audiodev(Object *obj, Error **errp) >+{ >+ MachineState *ms = MACHINE(obj); >+ >+ return g_strdup(ms->audiodev); >+} >+ >+static void machine_set_audiodev(Object *obj, const char *value, >+ Error **errp) >+{ >+ MachineState *ms = MACHINE(obj); >+ >+ if (!audio_state_by_name(value, errp)) { >+ return; >+ } >+ >+ g_free(ms->audiodev); >+ ms->audiodev = g_strdup(value); >+} >+ > HotpluggableCPUList *machine_query_hotpluggable_cpus(MachineState *machine) > { > int i; >@@ -931,6 +952,17 @@ out_free: > qapi_free_BootConfiguration(config); > } > >+void machine_add_audiodev_property(MachineClass *mc) >+{ >+ ObjectClass *oc = OBJECT_CLASS(mc); >+ >+ object_class_property_add_str(oc, "audiodev", >+ machine_get_audiodev, >+ machine_set_audiodev); >+ object_class_property_set_description(oc, "audiodev", >+ "Audiodev to use for default machine devices"); >+} >+ > static void machine_class_init(ObjectClass *oc, void *data) > { > MachineClass *mc = MACHINE_CLASS(oc); >@@ -1136,6 +1168,7 @@ static void machine_finalize(Object *obj) > g_free(ms->device_memory); > g_free(ms->nvdimms_state); > g_free(ms->numa_state); >+ g_free(ms->audiodev); > } > > bool machine_usb(MachineState *machine) >diff --git a/include/hw/boards.h b/include/hw/boards.h >index 6c67af196a3..55a64a13fdf 100644 >--- a/include/hw/boards.h >+++ b/include/hw/boards.h >@@ -24,6 +24,7 @@ OBJECT_DECLARE_TYPE(MachineState, MachineClass, MACHINE) > > extern MachineState *current_machine; > >+void machine_add_audiodev_property(MachineClass *mc); I'm a bit late now since the code is already in master but I wonder if this function should've been named machine_*class_*add_audiodev_property(). At least similar functions in this header suggest so. Best regards, Bernhard > void machine_run_board_init(MachineState *machine, const char *mem_path, Error **errp); > bool machine_usb(MachineState *machine); > int machine_phandle_start(MachineState *machine); >@@ -358,6 +359,14 @@ struct MachineState { > MemoryRegion *ram; > DeviceMemoryState *device_memory; > >+ /* >+ * Included in MachineState for simplicity, but not supported >+ * unless machine_add_audiodev_property is called. Boards >+ * that have embedded audio devices can call it from the >+ * machine init function and forward the property to the device. >+ */ >+ char *audiodev; >+ > ram_addr_t ram_size; > ram_addr_t maxram_size; > uint64_t ram_slots;
diff --git a/hw/core/machine.c b/hw/core/machine.c index cb38b8cf4cb..6aa49c8d4f1 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -39,6 +39,7 @@ #include "hw/virtio/virtio.h" #include "hw/virtio/virtio-pci.h" #include "hw/virtio/virtio-net.h" +#include "audio/audio.h" GlobalProperty hw_compat_8_1[] = {}; const size_t hw_compat_8_1_len = G_N_ELEMENTS(hw_compat_8_1); @@ -686,6 +687,26 @@ bool device_type_is_dynamic_sysbus(MachineClass *mc, const char *type) return allowed; } +static char *machine_get_audiodev(Object *obj, Error **errp) +{ + MachineState *ms = MACHINE(obj); + + return g_strdup(ms->audiodev); +} + +static void machine_set_audiodev(Object *obj, const char *value, + Error **errp) +{ + MachineState *ms = MACHINE(obj); + + if (!audio_state_by_name(value, errp)) { + return; + } + + g_free(ms->audiodev); + ms->audiodev = g_strdup(value); +} + HotpluggableCPUList *machine_query_hotpluggable_cpus(MachineState *machine) { int i; @@ -931,6 +952,17 @@ out_free: qapi_free_BootConfiguration(config); } +void machine_add_audiodev_property(MachineClass *mc) +{ + ObjectClass *oc = OBJECT_CLASS(mc); + + object_class_property_add_str(oc, "audiodev", + machine_get_audiodev, + machine_set_audiodev); + object_class_property_set_description(oc, "audiodev", + "Audiodev to use for default machine devices"); +} + static void machine_class_init(ObjectClass *oc, void *data) { MachineClass *mc = MACHINE_CLASS(oc); @@ -1136,6 +1168,7 @@ static void machine_finalize(Object *obj) g_free(ms->device_memory); g_free(ms->nvdimms_state); g_free(ms->numa_state); + g_free(ms->audiodev); } bool machine_usb(MachineState *machine) diff --git a/include/hw/boards.h b/include/hw/boards.h index 6c67af196a3..55a64a13fdf 100644 --- a/include/hw/boards.h +++ b/include/hw/boards.h @@ -24,6 +24,7 @@ OBJECT_DECLARE_TYPE(MachineState, MachineClass, MACHINE) extern MachineState *current_machine; +void machine_add_audiodev_property(MachineClass *mc); void machine_run_board_init(MachineState *machine, const char *mem_path, Error **errp); bool machine_usb(MachineState *machine); int machine_phandle_start(MachineState *machine); @@ -358,6 +359,14 @@ struct MachineState { MemoryRegion *ram; DeviceMemoryState *device_memory; + /* + * Included in MachineState for simplicity, but not supported + * unless machine_add_audiodev_property is called. Boards + * that have embedded audio devices can call it from the + * machine init function and forward the property to the device. + */ + char *audiodev; + ram_addr_t ram_size; ram_addr_t maxram_size; uint64_t ram_slots;