audio: lookup "audio-" object types, and realize them
Now "audio_driver" is a detail implementation of AudioMixengBackend and not required to implement an AudioBackend. Reviewed-by: Mark Cave-Ayland <mark.caveayland@nutanix.com> Reviewed-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Marc-André Lureau committed
Oct 17, 2025 at 17:34 UTC
b47ed8a5c9fff2bc4d608c5f6cd463202785d709
2 files changed
+27
-14
audio/audio.c
+26
-14
@@ -1562,24 +1562,16 @@ size_t audio_generic_read(HWVoiceIn *hw, void *buf, size_t size)
1562
return total;
1563
}
1564
1565
-static AudioBackend *audio_be_new(Audiodev *dev, Error **errp)
1565
+static bool audio_mixeng_backend_realize(AudioBackend *abe,
1566
+ Audiodev *dev, Error **errp)
1567
{
1567
- const char *drvname = AudiodevDriver_str(dev->driver);
1568
- struct audio_driver *drv = audio_driver_lookup(drvname);
1568
+ AudioMixengBackend *be = AUDIO_MIXENG_BACKEND(abe);
1569
+ audio_driver *drv = AUDIO_MIXENG_BACKEND_GET_CLASS(be)->driver;
1570
1570
- if (!drv) {
1571
- error_setg(errp, "Unknown audio driver `%s'", drvname);
1572
- qapi_free_Audiodev(dev);
1573
- return NULL;
1574
- }
1575
-
1576
- AudioMixengBackend *be = AUDIO_MIXENG_BACKEND(object_new(TYPE_AUDIO_MIXENG_BACKEND));
1571
be->dev = dev;
1578
-
1572
be->drv_opaque = drv->init(be->dev, errp);
1573
if (!be->drv_opaque) {
1581
- object_unref(OBJECT(be));
1582
- return NULL;
1574
+ return false;
1575
}
1576
1577
if (!drv->pcm_ops->get_buffer_in) {
@@ -1601,7 +1593,26 @@ static AudioBackend *audio_be_new(Audiodev *dev, Error **errp)
1593
be->period_ticks = be->dev->timer_period * (int64_t)SCALE_US;
1594
}
1595
1604
- return AUDIO_BACKEND(be);
1596
+ return true;
1597
+}
1598
+
1599
+static AudioBackend *audio_be_new(Audiodev *dev, Error **errp)
1600
+{
1601
+ const char *drvname = AudiodevDriver_str(dev->driver);
1602
+ g_autofree char *type = g_strconcat("audio-", drvname, NULL);
1603
+ AudioBackend *be = AUDIO_BACKEND(object_new(type));
1604
+
1605
+ if (!be) {
1606
+ error_setg(errp, "Unknown audio driver `%s'", drvname);
1607
+ return NULL;
1608
+ }
1609
+
1610
+ if (!AUDIO_BACKEND_GET_CLASS(be)->realize(be, dev, errp)) {
1611
+ object_unref(OBJECT(be));
1612
+ return NULL;
1613
+ }
1614
+
1615
+ return be;
1616
}
1617
1618
static void audio_vm_change_state_handler (void *opaque, bool running,
@@ -1644,6 +1655,7 @@ static void audio_mixeng_backend_class_init(ObjectClass *klass, const void *data
1655
{
1656
AudioBackendClass *be = AUDIO_BACKEND_CLASS(klass);
1657
1658
+ be->realize = audio_mixeng_backend_realize;
1659
be->get_id = audio_mixeng_backend_get_id;
1660
}
1661
include/qemu/audio.h
+1
@@ -51,6 +51,7 @@ typedef struct AudioBackend {
51
typedef struct AudioBackendClass {
52
ObjectClass parent_class;
53
54
+ bool (*realize)(AudioBackend *be, Audiodev *dev, Error **errp);
55
const char *(*get_id)(AudioBackend *be);
56
#ifdef CONFIG_GIO
57
bool (*set_dbus_server)(AudioBackend *be,