Am 29. September 2023 08:51:01 UTC schrieb Paolo Bonzini <pbonz...@redhat.com>:
>From: Martin Kletzander <mklet...@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 <mklet...@redhat.com>
>[Make the property optional, instead of including it in all machines. - Paolo]
>Signed-off-by: Paolo Bonzini <pbonz...@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;

Reply via email to