@samitouri / QOSamiQemu / commits / 1618bea984

audio: introduce AudioMixengBackend

Introduce a sub-class for current "audio_driver" based implementations. Future AudioBackend implementations can do without it. Next cleanup will actually remove "audio_driver" struct altogether and make the subclass proper QOM objects. Public APIs still rely on backend being an AudioMixeng. They will assert() if not. This will be addressed later to allow other backends. Note that the initial naming proposed for this object was AudioDriver, however the semantics for "driver" is already overloaded and leads to confusion, in particular with the QAPI AudiodevDriver. The defining characteristic is of using QEMU's software mixing engine, so AudioMixengBackend. 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 22, 2025 at 16:25 UTC 1618bea984945fa09d5548fa92982c88ed1b71d4
9 files changed +143 -64
audio/alsaaudio.c
+1 -1
@@ -41,7 +41,7 @@ struct pollhlp {
41 struct pollfd *pfds;
42 int count;
43 int mask;
44 - AudioBackend *s;
44 + AudioMixengBackend *s;
45 };
46
47 typedef struct ALSAVoiceOut {
audio/audio.c
+93 -30
@@ -37,6 +37,7 @@
37 #include "qemu/log.h"
38 #include "qemu/module.h"
39 #include "qemu/help_option.h"
40 +#include "qom/object.h"
41 #include "system/system.h"
42 #include "system/replay.h"
43 #include "system/runstate.h"
@@ -384,7 +385,7 @@ void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int len)
385 /*
386 * Capture
387 */
387 -static CaptureVoiceOut *audio_pcm_capture_find_specific(AudioBackend *s,
388 +static CaptureVoiceOut *audio_pcm_capture_find_specific(AudioMixengBackend *s,
389 struct audsettings *as)
390 {
391 CaptureVoiceOut *cap;
@@ -464,7 +465,7 @@ static void audio_detach_capture (HWVoiceOut *hw)
465
466 static int audio_attach_capture (HWVoiceOut *hw)
467 {
467 - AudioBackend *s = hw->s;
468 + AudioMixengBackend *s = hw->s;
469 CaptureVoiceOut *cap;
470
471 audio_detach_capture (hw);
@@ -802,7 +803,7 @@ static void audio_pcm_print_info (const char *cap, struct audio_pcm_info *info)
803 /*
804 * Timer
805 */
805 -static int audio_is_timer_needed(AudioBackend *s)
806 +static int audio_is_timer_needed(AudioMixengBackend *s)
807 {
808 HWVoiceIn *hwi = NULL;
809 HWVoiceOut *hwo = NULL;
@@ -820,7 +821,7 @@ static int audio_is_timer_needed(AudioBackend *s)
821 return 0;
822 }
823
823 -static void audio_reset_timer(AudioBackend *s)
824 +static void audio_reset_timer(AudioMixengBackend *s)
825 {
826 if (audio_is_timer_needed(s)) {
827 timer_mod_anticipate_ns(s->ts,
@@ -842,7 +843,7 @@ static void audio_reset_timer(AudioBackend *s)
843 static void audio_timer (void *opaque)
844 {
845 int64_t now, diff;
845 - AudioBackend *s = opaque;
846 + AudioMixengBackend *s = opaque;
847
848 now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
849 diff = now - s->timer_last;
@@ -925,7 +926,7 @@ void AUD_set_active_out(SWVoiceOut *sw, bool on)
926
927 hw = sw->hw;
928 if (sw->active != on) {
928 - AudioBackend *s = sw->s;
929 + AudioMixengBackend *s = sw->s;
930 SWVoiceOut *temp_sw;
931 SWVoiceCap *sc;
932
@@ -973,7 +974,7 @@ void AUD_set_active_in(SWVoiceIn *sw, bool on)
974
975 hw = sw->hw;
976 if (sw->active != on) {
976 - AudioBackend *s = sw->s;
977 + AudioMixengBackend *s = sw->s;
978 SWVoiceIn *temp_sw;
979
980 if (on) {
@@ -1141,7 +1142,7 @@ static size_t audio_pcm_hw_run_out(HWVoiceOut *hw, size_t live)
1142 return clipped;
1143 }
1144
1144 -static void audio_run_out(AudioBackend *s)
1145 +static void audio_run_out(AudioMixengBackend *s)
1146 {
1147 HWVoiceOut *hw = NULL;
1148 SWVoiceOut *sw;
@@ -1294,7 +1295,7 @@ static size_t audio_pcm_hw_run_in(HWVoiceIn *hw, size_t samples)
1295 return conv;
1296 }
1297
1297 -static void audio_run_in(AudioBackend *s)
1298 +static void audio_run_in(AudioMixengBackend *s)
1299 {
1300 HWVoiceIn *hw = NULL;
1301
@@ -1341,7 +1342,7 @@ static void audio_run_in(AudioBackend *s)
1342 }
1343 }
1344
1344 -static void audio_run_capture(AudioBackend *s)
1345 +static void audio_run_capture(AudioMixengBackend *s)
1346 {
1347 CaptureVoiceOut *cap;
1348
@@ -1388,7 +1389,7 @@ static void audio_run_capture(AudioBackend *s)
1389 }
1390 }
1391
1391 -void audio_run(AudioBackend *s, const char *msg)
1392 +void audio_run(AudioMixengBackend *s, const char *msg)
1393 {
1394 audio_run_out(s);
1395 audio_run_in(s);
@@ -1561,8 +1562,8 @@ size_t audio_generic_read(HWVoiceIn *hw, void *buf, size_t size)
1562 return total;
1563 }
1564
1564 -static bool audio_driver_init(AudioBackend *s, struct audio_driver *drv,
1565 - Audiodev *dev, Error **errp)
1565 +static bool audio_driver_do_init(AudioMixengBackend *s, struct audio_driver *drv,
1566 + Audiodev *dev, Error **errp)
1567 {
1568 s->drv_opaque = drv->init(dev, errp);
1569 if (!s->drv_opaque) {
@@ -1594,7 +1595,7 @@ static bool audio_driver_init(AudioBackend *s, struct audio_driver *drv,
1595 static void audio_vm_change_state_handler (void *opaque, bool running,
1596 RunState state)
1597 {
1597 - AudioBackend *s = opaque;
1598 + AudioMixengBackend *s = opaque;
1599 HWVoiceOut *hwo = NULL;
1600 HWVoiceIn *hwi = NULL;
1601
@@ -1616,7 +1617,47 @@ static const VMStateDescription vmstate_audio;
1617
1618 static void audio_be_init(Object *obj)
1619 {
1619 - AudioBackend *s = AUDIO_BACKEND(obj);
1620 +}
1621 +
1622 +static void audio_be_finalize(Object *obj)
1623 +{
1624 +}
1625 +
1626 +static const char *audio_mixeng_backend_get_id(AudioBackend *be)
1627 +{
1628 + return AUDIO_MIXENG_BACKEND(be)->dev->id;
1629 +}
1630 +
1631 +#ifdef CONFIG_GIO
1632 +static bool audio_mixeng_backend_set_dbus_server(AudioBackend *be,
1633 + GDBusObjectManagerServer *manager,
1634 + bool p2p,
1635 + Error **errp)
1636 +{
1637 + AudioMixengBackend *d = AUDIO_MIXENG_BACKEND(be);
1638 +
1639 + if (!d->drv->set_dbus_server) {
1640 + return false;
1641 + }
1642 +
1643 + return d->drv->set_dbus_server(be, manager, p2p, errp);
1644 +}
1645 +
1646 +#endif
1647 +
1648 +static void audio_mixeng_backend_class_init(ObjectClass *klass, const void *data)
1649 +{
1650 + AudioBackendClass *be = AUDIO_BACKEND_CLASS(klass);
1651 +
1652 + be->get_id = audio_mixeng_backend_get_id;
1653 +#ifdef CONFIG_GIO
1654 + be->set_dbus_server = audio_mixeng_backend_set_dbus_server;
1655 +#endif
1656 +}
1657 +
1658 +static void audio_mixeng_backend_init(Object *obj)
1659 +{
1660 + AudioMixengBackend *s = AUDIO_MIXENG_BACKEND(obj);
1661
1662 QLIST_INIT(&s->hw_head_out);
1663 QLIST_INIT(&s->hw_head_in);
@@ -1629,9 +1670,9 @@ static void audio_be_init(Object *obj)
1670 vmstate_register_any(NULL, &vmstate_audio, s);
1671 }
1672
1632 -static void audio_be_finalize(Object *obj)
1673 +static void audio_mixeng_backend_finalize(Object *obj)
1674 {
1634 - AudioBackend *s = AUDIO_BACKEND(obj);
1675 + AudioMixengBackend *s = AUDIO_MIXENG_BACKEND(obj);
1676 HWVoiceOut *hwo, *hwon;
1677 HWVoiceIn *hwi, *hwin;
1678
@@ -1747,10 +1788,10 @@ static AudioBackend *audio_init(Audiodev *dev, Error **errp)
1788 {
1789 int done = 0;
1790 const char *drvname;
1750 - AudioBackend *s;
1791 + AudioMixengBackend *s;
1792 struct audio_driver *driver;
1793
1753 - s = AUDIO_BACKEND(object_new(TYPE_AUDIO_BACKEND));
1794 + s = AUDIO_MIXENG_BACKEND(object_new(TYPE_AUDIO_MIXENG_BACKEND));
1795
1796 if (dev) {
1797 /* -audiodev option */
@@ -1758,7 +1799,7 @@ static AudioBackend *audio_init(Audiodev *dev, Error **errp)
1799 drvname = AudiodevDriver_str(dev->driver);
1800 driver = audio_driver_lookup(drvname);
1801 if (driver) {
1761 - done = audio_driver_init(s, driver, dev, errp);
1802 + done = audio_driver_do_init(s, driver, dev, errp);
1803 } else {
1804 error_setg(errp, "Unknown audio driver `%s'", drvname);
1805 }
@@ -1778,7 +1819,7 @@ static AudioBackend *audio_init(Audiodev *dev, Error **errp)
1819 g_free(e);
1820 drvname = AudiodevDriver_str(dev->driver);
1821 driver = audio_driver_lookup(drvname);
1781 - if (audio_driver_init(s, driver, dev, NULL)) {
1822 + if (audio_driver_do_init(s, driver, dev, NULL)) {
1823 break;
1824 }
1825 qapi_free_Audiodev(dev);
@@ -1790,7 +1831,7 @@ static AudioBackend *audio_init(Audiodev *dev, Error **errp)
1831 goto out;
1832 }
1833 object_unref(s);
1793 - return s;
1834 + return AUDIO_BACKEND(s);
1835
1836 out:
1837 object_unref(s);
@@ -1829,12 +1870,13 @@ bool AUD_backend_check(AudioBackend **be, Error **errp)
1870 static struct audio_pcm_ops capture_pcm_ops;
1871
1872 CaptureVoiceOut *AUD_add_capture(
1832 - AudioBackend *s,
1873 + AudioBackend *be,
1874 struct audsettings *as,
1875 struct audio_capture_ops *ops,
1876 void *cb_opaque
1877 )
1878 {
1879 + AudioMixengBackend *s = AUDIO_MIXENG_BACKEND(be);
1880 CaptureVoiceOut *cap;
1881 struct capture_callback *cb;
1882
@@ -2225,27 +2267,37 @@ AudioBackend *audio_be_by_name(const char *name, Error **errp)
2267 }
2268
2269 #ifdef CONFIG_GIO
2270 +bool audio_be_can_set_dbus_server(AudioBackend *be)
2271 +{
2272 + /*
2273 + * TODO:
2274 + * AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
2275 + * return klass->set_dbus_server != NULL;
2276 + */
2277 + return AUDIO_MIXENG_BACKEND(be)->drv->set_dbus_server != NULL;
2278 +}
2279 +
2280 bool audio_be_set_dbus_server(AudioBackend *be,
2281 GDBusObjectManagerServer *server,
2282 bool p2p,
2283 Error **errp)
2284 {
2233 - assert(be != NULL);
2285 + AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
2286
2235 - if (!be->drv->set_dbus_server) {
2236 - error_setg(errp, "Audiodev '%s' is not compatible with DBus", be->dev->id);
2287 + if (!audio_be_can_set_dbus_server(be)) {
2288 + error_setg(errp, "Audiodev '%s' is not compatible with DBus",
2289 + audio_be_get_id(be));
2290 return false;
2291 }
2292
2240 - return be->drv->set_dbus_server(be, server, p2p, errp);
2293 + return klass->set_dbus_server(be, server, p2p, errp);
2294 }
2295 #endif
2296
2297 const char *audio_be_get_id(AudioBackend *be)
2298 {
2299 if (be) {
2247 - assert(be->dev);
2248 - return be->dev->id;
2300 + return AUDIO_BACKEND_GET_CLASS(be)->get_id(be);
2301 } else {
2302 return "";
2303 }
@@ -2320,13 +2372,24 @@ static const TypeInfo audio_be_info = {
2372 .instance_size = sizeof(AudioBackend),
2373 .instance_init = audio_be_init,
2374 .instance_finalize = audio_be_finalize,
2323 - .abstract = false, /* TODO: subclass drivers and make it abstract */
2375 + .abstract = true,
2376 .class_size = sizeof(AudioBackendClass),
2377 };
2378
2379 +static const TypeInfo audio_mixeng_backend_info = {
2380 + .name = TYPE_AUDIO_MIXENG_BACKEND,
2381 + .parent = TYPE_AUDIO_BACKEND,
2382 + .instance_size = sizeof(AudioMixengBackend),
2383 + .instance_init = audio_mixeng_backend_init,
2384 + .instance_finalize = audio_mixeng_backend_finalize,
2385 + .class_size = sizeof(AudioMixengBackendClass),
2386 + .class_init = audio_mixeng_backend_class_init,
2387 +};
2388 +
2389 static void register_types(void)
2390 {
2391 type_register_static(&audio_be_info);
2392 + type_register_static(&audio_mixeng_backend_info);
2393 }
2394
2395 type_init(register_types);
audio/audio_int.h
+16 -9
@@ -61,7 +61,7 @@ struct audio_pcm_info {
61 int swap_endianness;
62 };
63
64 -typedef struct AudioBackend AudioBackend;
64 +typedef struct AudioMixengBackend AudioMixengBackend;
65 typedef struct SWVoiceCap SWVoiceCap;
66
67 typedef struct STSampleBuffer {
@@ -70,7 +70,7 @@ typedef struct STSampleBuffer {
70 } STSampleBuffer;
71
72 typedef struct HWVoiceOut {
73 - AudioBackend *s;
73 + AudioMixengBackend *s;
74 bool enabled;
75 int poll_mode;
76 bool pending_disable;
@@ -90,7 +90,7 @@ typedef struct HWVoiceOut {
90 } HWVoiceOut;
91
92 typedef struct HWVoiceIn {
93 - AudioBackend *s;
93 + AudioMixengBackend *s;
94 bool enabled;
95 int poll_mode;
96 struct audio_pcm_info info;
@@ -110,7 +110,7 @@ typedef struct HWVoiceIn {
110 } HWVoiceIn;
111
112 struct SWVoiceOut {
113 - AudioBackend *s;
113 + AudioMixengBackend *s;
114 struct audio_pcm_info info;
115 t_sample *conv;
116 STSampleBuffer resample_buf;
@@ -126,7 +126,7 @@ struct SWVoiceOut {
126 };
127
128 struct SWVoiceIn {
129 - AudioBackend *s;
129 + AudioMixengBackend *s;
130 bool active;
131 struct audio_pcm_info info;
132 void *rate;
@@ -239,8 +239,12 @@ struct SWVoiceCap {
239 QLIST_ENTRY (SWVoiceCap) entries;
240 };
241
242 -typedef struct AudioBackend {
243 - Object parent;
242 +struct AudioMixengBackendClass {
243 + AudioBackendClass parent_class;
244 +};
245 +
246 +struct AudioMixengBackend {
247 + AudioBackend parent_obj;
248
249 struct audio_driver *drv;
250 Audiodev *dev;
@@ -257,7 +261,7 @@ typedef struct AudioBackend {
261 bool timer_running;
262 uint64_t timer_last;
263 VMChangeStateEntry *vmse;
260 -} AudioBackend;
264 +};
265
266 extern const struct mixeng_volume nominal_volume;
267
@@ -270,7 +274,7 @@ void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int len);
274
275 int audio_bug (const char *funcname, int cond);
276
273 -void audio_run(AudioBackend *s, const char *msg);
277 +void audio_run(AudioMixengBackend *s, const char *msg);
278
279 const char *audio_application_name(void);
280
@@ -323,4 +327,7 @@ void audio_create_pdos(Audiodev *dev);
327 AudiodevPerDirectionOptions *audio_get_pdo_in(Audiodev *dev);
328 AudiodevPerDirectionOptions *audio_get_pdo_out(Audiodev *dev);
329
330 +#define TYPE_AUDIO_MIXENG_BACKEND "audio-mixeng-backend"
331 +OBJECT_DECLARE_TYPE(AudioMixengBackend, AudioMixengBackendClass, AUDIO_MIXENG_BACKEND)
332 +
333 #endif /* QEMU_AUDIO_INT_H */
audio/audio_template.h
+9 -9
@@ -36,7 +36,7 @@
36 #define HWBUF hw->conv_buf
37 #endif
38
39 -static void glue(audio_init_nb_voices_, TYPE)(AudioBackend *s,
39 +static void glue(audio_init_nb_voices_, TYPE)(AudioMixengBackend *s,
40 struct audio_driver *drv, int min_voices)
41 {
42 int max_voices = glue (drv->max_voices_, TYPE);
@@ -221,7 +221,7 @@ static void glue (audio_pcm_hw_del_sw_, TYPE) (SW *sw)
221 static void glue (audio_pcm_hw_gc_, TYPE) (HW **hwp)
222 {
223 HW *hw = *hwp;
224 - AudioBackend *s = hw->s;
224 + AudioMixengBackend *s = hw->s;
225
226 if (!hw->sw_head.lh_first) {
227 #ifdef DAC
@@ -236,12 +236,12 @@ static void glue (audio_pcm_hw_gc_, TYPE) (HW **hwp)
236 }
237 }
238
239 -static HW *glue(audio_pcm_hw_find_any_, TYPE)(AudioBackend *s, HW *hw)
239 +static HW *glue(audio_pcm_hw_find_any_, TYPE)(AudioMixengBackend *s, HW *hw)
240 {
241 return hw ? hw->entries.le_next : glue (s->hw_head_, TYPE).lh_first;
242 }
243
244 -static HW *glue(audio_pcm_hw_find_any_enabled_, TYPE)(AudioBackend *s, HW *hw)
244 +static HW *glue(audio_pcm_hw_find_any_enabled_, TYPE)(AudioMixengBackend *s, HW *hw)
245 {
246 while ((hw = glue(audio_pcm_hw_find_any_, TYPE)(s, hw))) {
247 if (hw->enabled) {
@@ -251,7 +251,7 @@ static HW *glue(audio_pcm_hw_find_any_enabled_, TYPE)(AudioBackend *s, HW *hw)
251 return NULL;
252 }
253
254 -static HW *glue(audio_pcm_hw_find_specific_, TYPE)(AudioBackend *s, HW *hw,
254 +static HW *glue(audio_pcm_hw_find_specific_, TYPE)(AudioMixengBackend *s, HW *hw,
255 struct audsettings *as)
256 {
257 while ((hw = glue(audio_pcm_hw_find_any_, TYPE)(s, hw))) {
@@ -262,7 +262,7 @@ static HW *glue(audio_pcm_hw_find_specific_, TYPE)(AudioBackend *s, HW *hw,
262 return NULL;
263 }
264
265 -static HW *glue(audio_pcm_hw_add_new_, TYPE)(AudioBackend *s,
265 +static HW *glue(audio_pcm_hw_add_new_, TYPE)(AudioMixengBackend *s,
266 struct audsettings *as)
267 {
268 HW *hw;
@@ -398,7 +398,7 @@ AudiodevPerDirectionOptions *glue(audio_get_pdo_, TYPE)(Audiodev *dev)
398 abort();
399 }
400
401 -static HW *glue(audio_pcm_hw_add_, TYPE)(AudioBackend *s, struct audsettings *as)
401 +static HW *glue(audio_pcm_hw_add_, TYPE)(AudioMixengBackend *s, struct audsettings *as)
402 {
403 HW *hw;
404 AudiodevPerDirectionOptions *pdo = glue(audio_get_pdo_, TYPE)(s->dev);
@@ -424,7 +424,7 @@ static HW *glue(audio_pcm_hw_add_, TYPE)(AudioBackend *s, struct audsettings *as
424 }
425
426 static SW *glue(audio_pcm_create_voice_pair_, TYPE)(
427 - AudioBackend *s,
427 + AudioMixengBackend *s,
428 const char *sw_name,
429 const struct audsettings *as
430 )
@@ -494,7 +494,7 @@ SW *glue (AUD_open_, TYPE) (
494 const struct audsettings *as
495 )
496 {
497 - AudioBackend *s = be;
497 + AudioMixengBackend *s = AUDIO_MIXENG_BACKEND(be);
498 AudiodevPerDirectionOptions *pdo;
499
500 if (audio_bug(__func__, !be || !name || !callback_fn || !as)) {
audio/dbusaudio.c
+4 -4
@@ -464,7 +464,7 @@ listener_in_vanished_cb(GDBusConnection *connection,
464 }
465
466 static gboolean
467 -dbus_audio_register_listener(AudioBackend *s,
467 +dbus_audio_register_listener(AudioMixengBackend *s,
468 GDBusMethodInvocation *invocation,
469 #ifdef G_OS_UNIX
470 GUnixFDList *fd_list,
@@ -621,7 +621,7 @@ dbus_audio_register_listener(AudioBackend *s,
621 }
622
623 static gboolean
624 -dbus_audio_register_out_listener(AudioBackend *s,
624 +dbus_audio_register_out_listener(AudioMixengBackend *s,
625 GDBusMethodInvocation *invocation,
626 #ifdef G_OS_UNIX
627 GUnixFDList *fd_list,
@@ -637,7 +637,7 @@ dbus_audio_register_out_listener(AudioBackend *s,
637 }
638
639 static gboolean
640 -dbus_audio_register_in_listener(AudioBackend *s,
640 +dbus_audio_register_in_listener(AudioMixengBackend *s,
641 GDBusMethodInvocation *invocation,
642 #ifdef G_OS_UNIX
643 GUnixFDList *fd_list,
@@ -657,7 +657,7 @@ dbus_audio_set_server(AudioBackend *s,
657 bool p2p,
658 Error **errp)
659 {
660 - DBusAudio *da = s->drv_opaque;
660 + DBusAudio *da = AUDIO_MIXENG_BACKEND(s)->drv_opaque;
661
662 g_assert(da);
663 g_assert(!da->server);
audio/ossaudio.c
+2 -2
@@ -107,13 +107,13 @@ static void oss_anal_close (int *fdp)
107
108 static void oss_helper_poll_out (void *opaque)
109 {
110 - AudioBackend *s = opaque;
110 + AudioMixengBackend *s = opaque;
111 audio_run(s, "oss_poll_out");
112 }
113
114 static void oss_helper_poll_in (void *opaque)
115 {
116 - AudioBackend *s = opaque;
116 + AudioMixengBackend *s = opaque;
117 audio_run(s, "oss_poll_in");
118 }
119
include/qemu/audio.h
+14 -3
@@ -44,11 +44,21 @@ typedef struct audsettings {
44 typedef struct SWVoiceOut SWVoiceOut;
45 typedef struct SWVoiceIn SWVoiceIn;
46
47 -struct AudioBackendClass {
47 +typedef struct AudioBackend {
48 + Object parent_obj;
49 +} AudioBackend;
50 +
51 +typedef struct AudioBackendClass {
52 ObjectClass parent_class;
49 -};
53
51 -typedef struct AudioBackend AudioBackend;
54 + const char *(*get_id)(AudioBackend *be);
55 +#ifdef CONFIG_GIO
56 + bool (*set_dbus_server)(AudioBackend *be,
57 + GDBusObjectManagerServer *manager,
58 + bool p2p,
59 + Error **errp);
60 +#endif
61 +} AudioBackendClass;
62
63 bool AUD_backend_check(AudioBackend **be, Error **errp);
64
@@ -125,6 +135,7 @@ AudioBackend *audio_be_by_name(const char *name, Error **errp);
135 AudioBackend *audio_get_default_audio_be(Error **errp);
136 const char *audio_be_get_id(AudioBackend *be);
137 #ifdef CONFIG_GIO
138 +bool audio_be_can_set_dbus_server(AudioBackend *be);
139 bool audio_be_set_dbus_server(AudioBackend *be,
140 GDBusObjectManagerServer *server,
141 bool p2p,
tests/audio/test-audio.c
+2 -2
@@ -170,7 +170,7 @@ static void test_audio_out_sine_wave(void)
170 */
171 start_time = g_get_monotonic_time();
172 while (state.frames_written < state.total_frames) {
173 - audio_run(state.be, "test");
173 + audio_run(AUDIO_MIXENG_BACKEND(state.be), "test");
174 main_loop_wait(true);
175
176 elapsed_ms = (g_get_monotonic_time() - start_time) / 1000;
@@ -432,7 +432,7 @@ static void test_audio_capture(void)
432 start_time = g_get_monotonic_time();
433 while (sine_state.frames_written < sine_state.total_frames ||
434 state.captured_bytes < CAPTURE_BUFFER_SIZE) {
435 - audio_run(be, "test-capture");
435 + audio_run(AUDIO_MIXENG_BACKEND(be), "test-capture");
436 main_loop_wait(true);
437
438 elapsed_ms = (g_get_monotonic_time() - start_time) / 1000;
ui/dbus.c
+2 -4
@@ -221,8 +221,7 @@ dbus_display_complete(UserCreatable *uc, Error **errp)
221
222 {
223 AudioBackend *audio_be = audio_get_default_audio_be(NULL);
224 -
225 - if (audio_be && !g_str_equal(audio_be->drv->name, "dbus")) {
224 + if (audio_be && !audio_be_can_set_dbus_server(audio_be)) {
225 audio_be = NULL;
226 }
227 if (dd->audiodev && *dd->audiodev) {
@@ -231,8 +230,7 @@ dbus_display_complete(UserCreatable *uc, Error **errp)
230 return;
231 }
232 }
234 - if (audio_be &&
235 - !audio_be_set_dbus_server(audio_be, dd->server, dd->p2p, errp)) {
233 + if (audio_be && !audio_be_set_dbus_server(audio_be, dd->server, dd->p2p, errp)) {
234 return;
235 }
236 }