@samitouri / QOSamiQemu / commits / dacecaf681

audio: move object creation to audio_driver_init()

As we will allow other kind of AudioBackend objects to be instantiated, move the object allocation to a audio_driver_init() and rename it audio_be_new(). 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 Jan 16, 2026 at 00:38 UTC dacecaf68143195f84e49aa7c42816845eeaa6ed
1 file changed +34 -31
audio/audio.c
+34 -31
@@ -1562,19 +1562,24 @@ size_t audio_generic_read(HWVoiceIn *hw, void *buf, size_t size)
1562 return total;
1563 }
1564
1565 -static bool audio_driver_do_init(AudioMixengBackend *d, Error **errp)
1565 +static AudioBackend *audio_be_new(Audiodev *dev, Error **errp)
1566 {
1567 - const char *drvname = AudiodevDriver_str(d->dev->driver);
1567 + const char *drvname = AudiodevDriver_str(dev->driver);
1568 struct audio_driver *drv = audio_driver_lookup(drvname);
1569
1570 if (!drv) {
1571 error_setg(errp, "Unknown audio driver `%s'", drvname);
1572 - return false;
1572 + qapi_free_Audiodev(dev);
1573 + return NULL;
1574 }
1575
1575 - d->drv_opaque = drv->init(d->dev, errp);
1576 - if (!d->drv_opaque) {
1577 - return false;
1576 + AudioMixengBackend *be = AUDIO_MIXENG_BACKEND(object_new(TYPE_AUDIO_MIXENG_BACKEND));
1577 + be->dev = dev;
1578 +
1579 + be->drv_opaque = drv->init(be->dev, errp);
1580 + if (!be->drv_opaque) {
1581 + object_unref(OBJECT(be));
1582 + return NULL;
1583 }
1584
1585 if (!drv->pcm_ops->get_buffer_in) {
@@ -1586,17 +1591,17 @@ static bool audio_driver_do_init(AudioMixengBackend *d, Error **errp)
1591 drv->pcm_ops->put_buffer_out = audio_generic_put_buffer_out;
1592 }
1593
1589 - audio_init_nb_voices_out(d, drv, 1);
1590 - audio_init_nb_voices_in(d, drv, 0);
1591 - d->drv = drv;
1594 + audio_init_nb_voices_out(be, drv, 1);
1595 + audio_init_nb_voices_in(be, drv, 0);
1596 + be->drv = drv;
1597
1593 - if (d->dev->timer_period <= 0) {
1594 - d->period_ticks = 1;
1598 + if (be->dev->timer_period <= 0) {
1599 + be->period_ticks = 1;
1600 } else {
1596 - d->period_ticks = d->dev->timer_period * (int64_t)SCALE_US;
1601 + be->period_ticks = be->dev->timer_period * (int64_t)SCALE_US;
1602 }
1603
1599 - return true;
1604 + return AUDIO_BACKEND(be);
1605 }
1606
1607 static void audio_vm_change_state_handler (void *opaque, bool running,
@@ -1793,41 +1798,39 @@ void audio_create_default_audiodevs(void)
1798 */
1799 static AudioBackend *audio_init(Audiodev *dev, Error **errp)
1800 {
1796 - AudioMixengBackend *d;
1801 + AudioBackend *be;
1802
1798 - d = AUDIO_MIXENG_BACKEND(object_new(TYPE_AUDIO_MIXENG_BACKEND));
1799 - d->dev = dev;
1800 - if (d->dev) {
1801 - if (!audio_driver_do_init(d, errp)) {
1802 - goto out;
1803 + if (dev) {
1804 + be = audio_be_new(dev, errp);
1805 + if (!be) {
1806 + return NULL;
1807 }
1808 } else {
1809 assert(!default_audio_be);
1810 for (;;) {
1811 AudiodevListEntry *e = QSIMPLEQ_FIRST(&default_audiodevs);
1812 +
1813 if (!e) {
1814 error_setg(errp, "no default audio driver available");
1810 - goto out;
1815 + return NULL;
1816 }
1812 - d->dev = e->dev;
1817 + dev = e->dev;
1818 QSIMPLEQ_REMOVE_HEAD(&default_audiodevs, next);
1819 g_free(e);
1815 - if (audio_driver_do_init(d, NULL)) {
1820 + be = audio_be_new(dev, NULL);
1821 + if (be) {
1822 break;
1823 }
1824 }
1825 }
1826
1827 if (!object_property_try_add_child(get_audiodevs_root(),
1822 - d->dev->id, OBJECT(d), errp)) {
1823 - goto out;
1828 + audio_be_get_id(be), OBJECT(be), errp)) {
1829 + object_unref(be);
1830 + return NULL;
1831 }
1825 - object_unref(d);
1826 - return AUDIO_BACKEND(d);
1827 -
1828 -out:
1829 - object_unref(d);
1830 - return NULL;
1832 + object_unref(be);
1833 + return be;
1834 }
1835
1836 AudioBackend *audio_get_default_audio_be(Error **errp)
@@ -2183,7 +2186,7 @@ void audio_init_audiodevs(void)
2186 AudiodevListEntry *e;
2187
2188 QSIMPLEQ_FOREACH(e, &audiodevs, next) {
2186 - audio_init(e->dev, &error_fatal);
2189 + audio_init(QAPI_CLONE(Audiodev, e->dev), &error_fatal);
2190 }
2191 }
2192