Message ID | 20230928073705.871327-9-pbonzini@redhat.com |
---|---|
State | New |
Headers | show |
Series | Cleanup deprecated audio features, take 2 | expand |
On Thu, 28 Sep 2023, Paolo Bonzini wrote: > 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 | 7 +++++++ > 2 files changed, 40 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..b5153f5f85b 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,12 @@ struct MachineState { > MemoryRegion *ram; > DeviceMemoryState *device_memory; > > + /* > + * Included in MachineState for simplicity, but not supported > + * unless machine_add_audiodev_property is called. > + */ Maybe this comment could be improved saying something like: Only used by machines that have default audio parts in which case machine init should call machine_add_audiodev_property(). Regards, BALATON Zoltan > + 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..b5153f5f85b 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,12 @@ struct MachineState { MemoryRegion *ram; DeviceMemoryState *device_memory; + /* + * Included in MachineState for simplicity, but not supported + * unless machine_add_audiodev_property is called. + */ + char *audiodev; + ram_addr_t ram_size; ram_addr_t maxram_size; uint64_t ram_slots;