audio: simplify audio_init()
Factorize looking up the driver in audio_driver_init() 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:37 UTC
4879e3936c409f71e4d3023be6d320a7baefd010
1 file changed
+29
-37
audio/audio.c
+29
-37
@@ -1562,11 +1562,18 @@ 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 *s, struct audio_driver *drv,
1566
- Audiodev *dev, Error **errp)
1565
+static bool audio_driver_do_init(AudioMixengBackend *d, Error **errp)
1566
{
1568
- s->drv_opaque = drv->init(dev, errp);
1569
- if (!s->drv_opaque) {
1567
+ const char *drvname = AudiodevDriver_str(d->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;
1573
+ }
1574
+
1575
+ d->drv_opaque = drv->init(d->dev, errp);
1576
+ if (!d->drv_opaque) {
1577
return false;
1578
}
1579
@@ -1579,14 +1586,14 @@ static bool audio_driver_do_init(AudioMixengBackend *s, struct audio_driver *drv
1586
drv->pcm_ops->put_buffer_out = audio_generic_put_buffer_out;
1587
}
1588
1582
- audio_init_nb_voices_out(s, drv, 1);
1583
- audio_init_nb_voices_in(s, drv, 0);
1584
- s->drv = drv;
1589
+ audio_init_nb_voices_out(d, drv, 1);
1590
+ audio_init_nb_voices_in(d, drv, 0);
1591
+ d->drv = drv;
1592
1586
- if (dev->timer_period <= 0) {
1587
- s->period_ticks = 1;
1593
+ if (d->dev->timer_period <= 0) {
1594
+ d->period_ticks = 1;
1595
} else {
1589
- s->period_ticks = dev->timer_period * (int64_t)SCALE_US;
1596
+ d->period_ticks = d->dev->timer_period * (int64_t)SCALE_US;
1597
}
1598
1599
return true;
@@ -1786,24 +1793,12 @@ void audio_create_default_audiodevs(void)
1793
*/
1794
static AudioBackend *audio_init(Audiodev *dev, Error **errp)
1795
{
1789
- int done = 0;
1790
- const char *drvname;
1791
- AudioMixengBackend *s;
1792
- struct audio_driver *driver;
1796
+ AudioMixengBackend *d;
1797
1794
- s = AUDIO_MIXENG_BACKEND(object_new(TYPE_AUDIO_MIXENG_BACKEND));
1795
-
1796
- if (dev) {
1797
- /* -audiodev option */
1798
- s->dev = dev;
1799
- drvname = AudiodevDriver_str(dev->driver);
1800
- driver = audio_driver_lookup(drvname);
1801
- if (driver) {
1802
- done = audio_driver_do_init(s, driver, dev, errp);
1803
- } else {
1804
- error_setg(errp, "Unknown audio driver `%s'", drvname);
1805
- }
1806
- if (!done) {
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
}
1804
} else {
@@ -1814,27 +1809,24 @@ static AudioBackend *audio_init(Audiodev *dev, Error **errp)
1809
error_setg(errp, "no default audio driver available");
1810
goto out;
1811
}
1817
- s->dev = dev = e->dev;
1812
+ d->dev = e->dev;
1813
QSIMPLEQ_REMOVE_HEAD(&default_audiodevs, next);
1814
g_free(e);
1820
- drvname = AudiodevDriver_str(dev->driver);
1821
- driver = audio_driver_lookup(drvname);
1822
- if (audio_driver_do_init(s, driver, dev, NULL)) {
1815
+ if (audio_driver_do_init(d, NULL)) {
1816
break;
1817
}
1825
- qapi_free_Audiodev(dev);
1826
- s->dev = NULL;
1818
}
1819
}
1820
1830
- if (!object_property_try_add_child(get_audiodevs_root(), dev->id, OBJECT(s), errp)) {
1821
+ if (!object_property_try_add_child(get_audiodevs_root(),
1822
+ d->dev->id, OBJECT(d), errp)) {
1823
goto out;
1824
}
1833
- object_unref(s);
1834
- return AUDIO_BACKEND(s);
1825
+ object_unref(d);
1826
+ return AUDIO_BACKEND(d);
1827
1828
out:
1837
- object_unref(s);
1829
+ object_unref(d);
1830
return NULL;
1831
}
1832