@samitouri / QOSamiQemu / commits / b47ed8a5c9

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,