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