From: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
audio/audio.h | 9 +++++++++
audio/audio_int.h | 5 ++++-
audio/audio.c | 17 +++++++++++++++++
audio/dbusaudio.c | 9 +++++++--
ui/dbus.c | 8 +-------
5 files changed, 38 insertions(+), 10 deletions(-)
diff --git a/audio/audio.h b/audio/audio.h
index fdbc33ae0c..78c27462ba 100644
--- a/audio/audio.h
+++ b/audio/audio.h
@@ -28,6 +28,9 @@
#include "qemu/queue.h"
#include "qapi/qapi-types-audio.h"
#include "hw/qdev-properties-system.h"
+#ifdef CONFIG_GIO
+#include "gio/gio.h"
+#endif
typedef void (*audio_callback_fn) (void *opaque, int avail);
@@ -161,6 +164,12 @@ void audio_help(void);
AudioBackend *audio_be_by_name(const char *name, Error **errp);
AudioBackend *audio_get_default_audio_be(Error **errp);
const char *audio_be_get_id(AudioBackend *be);
+#ifdef CONFIG_GIO
+bool audio_be_set_dbus_server(AudioBackend *be,
+ GDBusObjectManagerServer *server,
+ bool p2p,
+ Error **errp);
+#endif
#define DEFINE_AUDIO_PROPERTIES(_s, _f) \
DEFINE_PROP_AUDIODEV("audiodev", _s, _f)
diff --git a/audio/audio_int.h b/audio/audio_int.h
index c4453b3a29..d66f7aac32 100644
--- a/audio/audio_int.h
+++ b/audio/audio_int.h
@@ -148,7 +148,10 @@ struct audio_driver {
void *(*init) (Audiodev *, Error **);
void (*fini) (void *);
#ifdef CONFIG_GIO
- void (*set_dbus_server)(AudioBackend *s, GDBusObjectManagerServer *manager, bool p2p);
+ bool (*set_dbus_server)(AudioBackend *be,
+ GDBusObjectManagerServer *manager,
+ bool p2p,
+ Error **errp);
#endif
struct audio_pcm_ops *pcm_ops;
int max_voices_out;
diff --git a/audio/audio.c b/audio/audio.c
index 46282f86d6..ab33b7f9a7 100644
--- a/audio/audio.c
+++ b/audio/audio.c
@@ -2223,6 +2223,23 @@ AudioBackend *audio_be_by_name(const char *name, Error **errp)
}
}
+#ifdef CONFIG_GIO
+bool audio_be_set_dbus_server(AudioBackend *be,
+ GDBusObjectManagerServer *server,
+ bool p2p,
+ Error **errp)
+{
+ assert(be != NULL);
+
+ if (!be->drv->set_dbus_server) {
+ error_setg(errp, "Audiodev '%s' is not compatible with DBus", be->dev->id);
+ return false;
+ }
+
+ return be->drv->set_dbus_server(be, server, p2p, errp);
+}
+#endif
+
const char *audio_be_get_id(AudioBackend *be)
{
if (be) {
diff --git a/audio/dbusaudio.c b/audio/dbusaudio.c
index 49cef38e3e..c97c34b486 100644
--- a/audio/dbusaudio.c
+++ b/audio/dbusaudio.c
@@ -645,8 +645,11 @@ dbus_audio_register_in_listener(AudioBackend *s,
arg_listener, false);
}
-static void
-dbus_audio_set_server(AudioBackend *s, GDBusObjectManagerServer *server, bool p2p)
+static bool
+dbus_audio_set_server(AudioBackend *s,
+ GDBusObjectManagerServer *server,
+ bool p2p,
+ Error **errp)
{
DBusAudio *da = s->drv_opaque;
@@ -669,6 +672,8 @@ dbus_audio_set_server(AudioBackend *s, GDBusObjectManagerServer *server, bool p2
g_dbus_object_skeleton_add_interface(G_DBUS_OBJECT_SKELETON(da->audio),
G_DBUS_INTERFACE_SKELETON(da->iface));
g_dbus_object_manager_server_export(da->server, da->audio);
+
+ return true;
}
static struct audio_pcm_ops dbus_pcm_ops = {
diff --git a/ui/dbus.c b/ui/dbus.c
index 84cff47ec7..fbe108af1e 100644
--- a/ui/dbus.c
+++ b/ui/dbus.c
@@ -221,15 +221,9 @@ dbus_display_complete(UserCreatable *uc, Error **errp)
if (dd->audiodev && *dd->audiodev) {
AudioBackend *audio_be = audio_be_by_name(dd->audiodev, errp);
- if (!audio_be) {
+ if (!audio_be || !audio_be_set_dbus_server(audio_be, dd->server, dd->p2p, errp)) {
return;
}
- if (!g_str_equal(audio_be->drv->name, "dbus")) {
- error_setg(errp, "Audiodev '%s' is not compatible with DBus",
- dd->audiodev);
- return;
- }
- audio_be->drv->set_dbus_server(audio_be, dd->server, dd->p2p);
}
consoles = g_array_new(FALSE, FALSE, sizeof(guint32));
--
2.51.0