From: Marc-André Lureau <marcandre.lureau@redhat.com>
Code clean-up, to allow building bare abstract class separately.
The original file is MIT-licensed.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
include/qemu/audio.h | 2 +
audio/audio-be.c | 210 ++++++++++++++++++++++++++++++++++++++++++
audio/audio.c | 211 +------------------------------------------
audio/meson.build | 1 +
4 files changed, 215 insertions(+), 209 deletions(-)
create mode 100644 audio/audio-be.c
diff --git a/include/qemu/audio.h b/include/qemu/audio.h
index 4fae48886ba..9f85c6316a8 100644
--- a/include/qemu/audio.h
+++ b/include/qemu/audio.h
@@ -111,6 +111,8 @@ typedef struct AudioBackendClass {
bool AUD_backend_check(AudioBackend **be, Error **errp);
+AudioBackend *audio_be_new(Audiodev *dev, Error **errp);
+
SWVoiceOut *AUD_open_out(
AudioBackend *be,
SWVoiceOut *sw,
diff --git a/audio/audio-be.c b/audio/audio-be.c
new file mode 100644
index 00000000000..8154727dbfb
--- /dev/null
+++ b/audio/audio-be.c
@@ -0,0 +1,210 @@
+/* SPDX-License-Identifier: MIT */
+
+#include "qemu/osdep.h"
+#include "qemu/audio.h"
+#include "qemu/audio-capture.h"
+#include "qapi/error.h"
+
+bool AUD_backend_check(AudioBackend **be, Error **errp)
+{
+ assert(be != NULL);
+
+ if (!*be) {
+ *be = audio_get_default_audio_be(errp);
+ if (!*be) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+SWVoiceIn *AUD_open_in(
+ AudioBackend *be,
+ SWVoiceIn *sw,
+ const char *name,
+ void *callback_opaque,
+ audio_callback_fn callback_fn,
+ const struct audsettings *as)
+{
+ AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
+
+ return klass->open_in(be, sw, name, callback_opaque, callback_fn, as);
+}
+
+SWVoiceOut *AUD_open_out(
+ AudioBackend *be,
+ SWVoiceOut *sw,
+ const char *name,
+ void *callback_opaque,
+ audio_callback_fn callback_fn,
+ const struct audsettings *as)
+{
+ AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
+
+ return klass->open_out(be, sw, name, callback_opaque, callback_fn, as);
+}
+
+void AUD_close_out(AudioBackend *be, SWVoiceOut *sw)
+{
+ AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
+
+ return klass->close_out(be, sw);
+}
+
+void AUD_close_in(AudioBackend *be, SWVoiceIn *sw)
+{
+ AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
+
+ return klass->close_in(be, sw);
+}
+
+bool AUD_is_active_out(AudioBackend *be, SWVoiceOut *sw)
+{
+ AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
+
+ return klass->is_active_out(be, sw);
+}
+
+bool AUD_is_active_in(AudioBackend *be, SWVoiceIn *sw)
+{
+ AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
+
+ return klass->is_active_in(be, sw);
+}
+
+size_t AUD_write(AudioBackend *be, SWVoiceOut *sw, void *buf, size_t size)
+{
+ AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
+
+ return klass->write(be, sw, buf, size);
+}
+
+size_t AUD_read(AudioBackend *be, SWVoiceIn *sw, void *buf, size_t size)
+{
+ AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
+
+ return klass->read(be, sw, buf, size);
+}
+
+int AUD_get_buffer_size_out(AudioBackend *be, SWVoiceOut *sw)
+{
+ AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
+
+ return klass->get_buffer_size_out(be, sw);
+}
+
+void AUD_set_active_out(AudioBackend *be, SWVoiceOut *sw, bool on)
+{
+ AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
+
+ return klass->set_active_out(be, sw, on);
+}
+
+void AUD_set_active_in(AudioBackend *be, SWVoiceIn *sw, bool on)
+{
+ AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
+
+ return klass->set_active_in(be, sw, on);
+}
+
+void AUD_set_volume_out(AudioBackend *be, SWVoiceOut *sw, Volume *vol)
+{
+ AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
+
+ klass->set_volume_out(be, sw, vol);
+}
+
+void AUD_set_volume_in(AudioBackend *be, SWVoiceIn *sw, Volume *vol)
+{
+ AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
+
+ klass->set_volume_in(be, sw, vol);
+}
+
+CaptureVoiceOut *AUD_add_capture(
+ AudioBackend *be,
+ struct audsettings *as,
+ struct audio_capture_ops *ops,
+ void *cb_opaque)
+{
+ AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
+
+ return klass->add_capture(be, as, ops, cb_opaque);
+}
+
+void AUD_del_capture(AudioBackend *be, CaptureVoiceOut *cap, void *cb_opaque)
+{
+ AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
+
+ klass->del_capture(be, cap, cb_opaque);
+}
+
+#ifdef CONFIG_GIO
+bool audio_be_can_set_dbus_server(AudioBackend *be)
+{
+ AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
+
+ return klass->set_dbus_server != NULL;
+}
+
+bool audio_be_set_dbus_server(AudioBackend *be,
+ GDBusObjectManagerServer *server,
+ bool p2p,
+ Error **errp)
+{
+ AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
+
+ if (!audio_be_can_set_dbus_server(be)) {
+ error_setg(errp, "Audiodev '%s' is not compatible with DBus",
+ audio_be_get_id(be));
+ return false;
+ }
+
+ return klass->set_dbus_server(be, server, p2p, errp);
+}
+#endif
+
+const char *audio_be_get_id(AudioBackend *be)
+{
+ if (be) {
+ return AUDIO_BACKEND_GET_CLASS(be)->get_id(be);
+ } else {
+ return "";
+ }
+}
+
+AudioBackend *audio_be_new(Audiodev *dev, Error **errp)
+{
+ const char *drvname = AudiodevDriver_str(dev->driver);
+ g_autofree char *type = g_strconcat("audio-", drvname, NULL);
+ AudioBackend *be = AUDIO_BACKEND(object_new(type));
+
+ if (!be) {
+ error_setg(errp, "Unknown audio driver `%s'", drvname);
+ return NULL;
+ }
+
+ if (!AUDIO_BACKEND_GET_CLASS(be)->realize(be, dev, errp)) {
+ object_unref(OBJECT(be));
+ return NULL;
+ }
+
+ return be;
+}
+
+
+static const TypeInfo audio_be_info = {
+ .name = TYPE_AUDIO_BACKEND,
+ .parent = TYPE_OBJECT,
+ .instance_size = sizeof(AudioBackend),
+ .abstract = true,
+ .class_size = sizeof(AudioBackendClass),
+};
+
+static void register_types(void)
+{
+ type_register_static(&audio_be_info);
+}
+
+type_init(register_types);
diff --git a/audio/audio.c b/audio/audio.c
index 3f09452e300..1d948084e80 100644
--- a/audio/audio.c
+++ b/audio/audio.c
@@ -869,15 +869,8 @@ static size_t audio_mixeng_backend_write(AudioBackend *be, SWVoiceOut *sw,
}
}
-size_t AUD_write(AudioBackend *be, SWVoiceOut *sw, void *buf, size_t size)
-{
- AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
-
- return klass->write(be, sw, buf, size);
-}
-
-static size_t audio_mixeng_backend_read(AudioBackend *be, SWVoiceIn *sw,
- void *buf, size_t size)
+static size_t audio_mixeng_backend_read(AudioBackend *be,
+ SWVoiceIn *sw, void *buf, size_t size)
{
HWVoiceIn *hw;
@@ -900,13 +893,6 @@ static size_t audio_mixeng_backend_read(AudioBackend *be, SWVoiceIn *sw,
}
-size_t AUD_read(AudioBackend *be, SWVoiceIn *sw, void *buf, size_t size)
-{
- AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
-
- return klass->read(be, sw, buf, size);
-}
-
static int audio_mixeng_backend_get_buffer_size_out(AudioBackend *be, SWVoiceOut *sw)
{
if (!sw) {
@@ -920,13 +906,6 @@ static int audio_mixeng_backend_get_buffer_size_out(AudioBackend *be, SWVoiceOut
return sw->hw->samples * sw->hw->info.bytes_per_frame;
}
-int AUD_get_buffer_size_out(AudioBackend *be, SWVoiceOut *sw)
-{
- AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
-
- return klass->get_buffer_size_out(be, sw);
-}
-
static void audio_mixeng_backend_set_active_out(AudioBackend *be, SWVoiceOut *sw,
bool on)
{
@@ -977,13 +956,6 @@ static void audio_mixeng_backend_set_active_out(AudioBackend *be, SWVoiceOut *sw
}
-void AUD_set_active_out(AudioBackend *be, SWVoiceOut *sw, bool on)
-{
- AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
-
- return klass->set_active_out(be, sw, on);
-}
-
static void audio_mixeng_backend_set_active_in(AudioBackend *be, SWVoiceIn *sw, bool on)
{
HWVoiceIn *hw;
@@ -1029,13 +1001,6 @@ static void audio_mixeng_backend_set_active_in(AudioBackend *be, SWVoiceIn *sw,
}
}
-void AUD_set_active_in(AudioBackend *be, SWVoiceIn *sw, bool on)
-{
- AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
-
- return klass->set_active_in(be, sw, on);
-}
-
static size_t audio_get_avail(SWVoiceIn *sw)
{
size_t live;
@@ -1642,25 +1607,6 @@ static bool audio_mixeng_backend_realize(AudioBackend *abe,
return true;
}
-static AudioBackend *audio_be_new(Audiodev *dev, Error **errp)
-{
- const char *drvname = AudiodevDriver_str(dev->driver);
- g_autofree char *type = g_strconcat("audio-", drvname, NULL);
- AudioBackend *be = AUDIO_BACKEND(object_new(type));
-
- if (!be) {
- error_setg(errp, "Unknown audio driver `%s'", drvname);
- return NULL;
- }
-
- if (!AUDIO_BACKEND_GET_CLASS(be)->realize(be, dev, errp)) {
- object_unref(OBJECT(be));
- return NULL;
- }
-
- return be;
-}
-
static void audio_vm_change_state_handler (void *opaque, bool running,
RunState state)
{
@@ -1684,14 +1630,6 @@ static void audio_vm_change_state_handler (void *opaque, bool running,
static const VMStateDescription vmstate_audio;
-static void audio_be_init(Object *obj)
-{
-}
-
-static void audio_be_finalize(Object *obj)
-{
-}
-
static const char *audio_mixeng_backend_get_id(AudioBackend *be)
{
return AUDIO_MIXENG_BACKEND(be)->dev->id;
@@ -1713,60 +1651,6 @@ static void audio_mixeng_backend_set_volume_out(AudioBackend *be, SWVoiceOut *sw
static void audio_mixeng_backend_set_volume_in(AudioBackend *be, SWVoiceIn *sw,
Volume *vol);
-SWVoiceOut *AUD_open_out(
- AudioBackend *be,
- SWVoiceOut *sw,
- const char *name,
- void *callback_opaque,
- audio_callback_fn callback_fn,
- const struct audsettings *as)
-{
- AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
-
- return klass->open_out(be, sw, name, callback_opaque, callback_fn, as);
-}
-
-SWVoiceIn *AUD_open_in(
- AudioBackend *be,
- SWVoiceIn *sw,
- const char *name,
- void *callback_opaque,
- audio_callback_fn callback_fn,
- const struct audsettings *as)
-{
- AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
-
- return klass->open_in(be, sw, name, callback_opaque, callback_fn, as);
-}
-
-void AUD_close_out(AudioBackend *be, SWVoiceOut *sw)
-{
- AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
-
- return klass->close_out(be, sw);
-}
-
-void AUD_close_in(AudioBackend *be, SWVoiceIn *sw)
-{
- AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
-
- return klass->close_in(be, sw);
-}
-
-bool AUD_is_active_out(AudioBackend *be, SWVoiceOut *sw)
-{
- AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
-
- return klass->is_active_out(be, sw);
-}
-
-bool AUD_is_active_in(AudioBackend *be, SWVoiceIn *sw)
-{
- AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
-
- return klass->is_active_in(be, sw);
-}
-
static void audio_mixeng_backend_class_init(ObjectClass *klass, const void *data)
{
AudioBackendClass *be = AUDIO_BACKEND_CLASS(klass);
@@ -1971,20 +1855,6 @@ AudioBackend *audio_get_default_audio_be(Error **errp)
return default_audio_be;
}
-bool AUD_backend_check(AudioBackend **be, Error **errp)
-{
- assert(be != NULL);
-
- if (!*be) {
- *be = audio_get_default_audio_be(errp);
- if (!*be) {
- return false;
- }
- }
-
- return true;
-}
-
static struct audio_pcm_ops capture_pcm_ops;
static CaptureVoiceOut *audio_mixeng_backend_add_capture(
@@ -2061,17 +1931,6 @@ static CaptureVoiceOut *audio_mixeng_backend_add_capture(
return cap;
}
-CaptureVoiceOut *AUD_add_capture(
- AudioBackend *be,
- struct audsettings *as,
- struct audio_capture_ops *ops,
- void *cb_opaque)
-{
- AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
-
- return klass->add_capture(be, as, ops, cb_opaque);
-}
-
static void audio_mixeng_backend_del_capture(
AudioBackend *be,
CaptureVoiceOut *cap,
@@ -2114,13 +1973,6 @@ static void audio_mixeng_backend_del_capture(
}
}
-void AUD_del_capture(AudioBackend *be, CaptureVoiceOut *cap, void *cb_opaque)
-{
- AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
-
- klass->del_capture(be, cap, cb_opaque);
-}
-
static void audio_mixeng_backend_set_volume_out(AudioBackend *be, SWVoiceOut *sw,
Volume *vol)
{
@@ -2138,13 +1990,6 @@ static void audio_mixeng_backend_set_volume_out(AudioBackend *be, SWVoiceOut *sw
}
}
-void AUD_set_volume_out(AudioBackend *be, SWVoiceOut *sw, Volume *vol)
-{
- AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
-
- klass->set_volume_out(be, sw, vol);
-}
-
static void audio_mixeng_backend_set_volume_in(AudioBackend *be, SWVoiceIn *sw,
Volume *vol)
{
@@ -2162,13 +2007,6 @@ static void audio_mixeng_backend_set_volume_in(AudioBackend *be, SWVoiceIn *sw,
}
}
-void AUD_set_volume_in(AudioBackend *be, SWVoiceIn *sw, Volume *vol)
-{
- AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
-
- klass->set_volume_in(be, sw, vol);
-}
-
static void audio_create_pdos(Audiodev *dev)
{
switch (dev->driver) {
@@ -2422,40 +2260,6 @@ AudioBackend *audio_be_by_name(const char *name, Error **errp)
}
}
-#ifdef CONFIG_GIO
-bool audio_be_can_set_dbus_server(AudioBackend *be)
-{
- AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
-
- return klass->set_dbus_server != NULL;
-}
-
-bool audio_be_set_dbus_server(AudioBackend *be,
- GDBusObjectManagerServer *server,
- bool p2p,
- Error **errp)
-{
- AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
-
- if (!audio_be_can_set_dbus_server(be)) {
- error_setg(errp, "Audiodev '%s' is not compatible with DBus",
- audio_be_get_id(be));
- return false;
- }
-
- return klass->set_dbus_server(be, server, p2p, errp);
-}
-#endif
-
-const char *audio_be_get_id(AudioBackend *be)
-{
- if (be) {
- return AUDIO_BACKEND_GET_CLASS(be)->get_id(be);
- } else {
- return "";
- }
-}
-
const char *audio_application_name(void)
{
const char *vm_name;
@@ -2519,16 +2323,6 @@ AudiodevList *qmp_query_audiodevs(Error **errp)
return ret;
}
-static const TypeInfo audio_be_info = {
- .name = TYPE_AUDIO_BACKEND,
- .parent = TYPE_OBJECT,
- .instance_size = sizeof(AudioBackend),
- .instance_init = audio_be_init,
- .instance_finalize = audio_be_finalize,
- .abstract = true,
- .class_size = sizeof(AudioBackendClass),
-};
-
static const TypeInfo audio_mixeng_backend_info = {
.name = TYPE_AUDIO_MIXENG_BACKEND,
.parent = TYPE_AUDIO_BACKEND,
@@ -2542,7 +2336,6 @@ static const TypeInfo audio_mixeng_backend_info = {
static void register_types(void)
{
- type_register_static(&audio_be_info);
type_register_static(&audio_mixeng_backend_info);
}
diff --git a/audio/meson.build b/audio/meson.build
index a5fec14fb3a..417670bd4c7 100644
--- a/audio/meson.build
+++ b/audio/meson.build
@@ -1,6 +1,7 @@
audio_ss = ss.source_set()
audio_ss.add(files(
'audio.c',
+ 'audio-be.c',
'mixeng.c',
'noaudio.c',
'wavaudio.c',
--
2.52.0
On 23/01/2026 07:49, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
>
> Code clean-up, to allow building bare abstract class separately.
>
> The original file is MIT-licensed.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
> include/qemu/audio.h | 2 +
> audio/audio-be.c | 210 ++++++++++++++++++++++++++++++++++++++++++
> audio/audio.c | 211 +------------------------------------------
> audio/meson.build | 1 +
> 4 files changed, 215 insertions(+), 209 deletions(-)
> create mode 100644 audio/audio-be.c
>
> diff --git a/include/qemu/audio.h b/include/qemu/audio.h
> index 4fae48886ba..9f85c6316a8 100644
> --- a/include/qemu/audio.h
> +++ b/include/qemu/audio.h
> @@ -111,6 +111,8 @@ typedef struct AudioBackendClass {
>
> bool AUD_backend_check(AudioBackend **be, Error **errp);
>
> +AudioBackend *audio_be_new(Audiodev *dev, Error **errp);
> +
> SWVoiceOut *AUD_open_out(
> AudioBackend *be,
> SWVoiceOut *sw,
> diff --git a/audio/audio-be.c b/audio/audio-be.c
> new file mode 100644
> index 00000000000..8154727dbfb
> --- /dev/null
> +++ b/audio/audio-be.c
> @@ -0,0 +1,210 @@
> +/* SPDX-License-Identifier: MIT */
> +
> +#include "qemu/osdep.h"
> +#include "qemu/audio.h"
> +#include "qemu/audio-capture.h"
> +#include "qapi/error.h"
> +
> +bool AUD_backend_check(AudioBackend **be, Error **errp)
> +{
> + assert(be != NULL);
> +
> + if (!*be) {
> + *be = audio_get_default_audio_be(errp);
> + if (!*be) {
> + return false;
> + }
> + }
> +
> + return true;
> +}
> +
> +SWVoiceIn *AUD_open_in(
> + AudioBackend *be,
> + SWVoiceIn *sw,
> + const char *name,
> + void *callback_opaque,
> + audio_callback_fn callback_fn,
> + const struct audsettings *as)
> +{
> + AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> +
> + return klass->open_in(be, sw, name, callback_opaque, callback_fn, as);
> +}
> +
> +SWVoiceOut *AUD_open_out(
> + AudioBackend *be,
> + SWVoiceOut *sw,
> + const char *name,
> + void *callback_opaque,
> + audio_callback_fn callback_fn,
> + const struct audsettings *as)
> +{
> + AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> +
> + return klass->open_out(be, sw, name, callback_opaque, callback_fn, as);
> +}
> +
> +void AUD_close_out(AudioBackend *be, SWVoiceOut *sw)
> +{
> + AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> +
> + return klass->close_out(be, sw);
> +}
> +
> +void AUD_close_in(AudioBackend *be, SWVoiceIn *sw)
> +{
> + AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> +
> + return klass->close_in(be, sw);
> +}
> +
> +bool AUD_is_active_out(AudioBackend *be, SWVoiceOut *sw)
> +{
> + AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> +
> + return klass->is_active_out(be, sw);
> +}
> +
> +bool AUD_is_active_in(AudioBackend *be, SWVoiceIn *sw)
> +{
> + AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> +
> + return klass->is_active_in(be, sw);
> +}
> +
> +size_t AUD_write(AudioBackend *be, SWVoiceOut *sw, void *buf, size_t size)
> +{
> + AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> +
> + return klass->write(be, sw, buf, size);
> +}
> +
> +size_t AUD_read(AudioBackend *be, SWVoiceIn *sw, void *buf, size_t size)
> +{
> + AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> +
> + return klass->read(be, sw, buf, size);
> +}
> +
> +int AUD_get_buffer_size_out(AudioBackend *be, SWVoiceOut *sw)
> +{
> + AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> +
> + return klass->get_buffer_size_out(be, sw);
> +}
> +
> +void AUD_set_active_out(AudioBackend *be, SWVoiceOut *sw, bool on)
> +{
> + AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> +
> + return klass->set_active_out(be, sw, on);
> +}
> +
> +void AUD_set_active_in(AudioBackend *be, SWVoiceIn *sw, bool on)
> +{
> + AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> +
> + return klass->set_active_in(be, sw, on);
> +}
> +
> +void AUD_set_volume_out(AudioBackend *be, SWVoiceOut *sw, Volume *vol)
> +{
> + AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> +
> + klass->set_volume_out(be, sw, vol);
> +}
> +
> +void AUD_set_volume_in(AudioBackend *be, SWVoiceIn *sw, Volume *vol)
> +{
> + AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> +
> + klass->set_volume_in(be, sw, vol);
> +}
> +
> +CaptureVoiceOut *AUD_add_capture(
> + AudioBackend *be,
> + struct audsettings *as,
> + struct audio_capture_ops *ops,
> + void *cb_opaque)
> +{
> + AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> +
> + return klass->add_capture(be, as, ops, cb_opaque);
> +}
> +
> +void AUD_del_capture(AudioBackend *be, CaptureVoiceOut *cap, void *cb_opaque)
> +{
> + AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> +
> + klass->del_capture(be, cap, cb_opaque);
> +}
> +
> +#ifdef CONFIG_GIO
> +bool audio_be_can_set_dbus_server(AudioBackend *be)
> +{
> + AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> +
> + return klass->set_dbus_server != NULL;
> +}
> +
> +bool audio_be_set_dbus_server(AudioBackend *be,
> + GDBusObjectManagerServer *server,
> + bool p2p,
> + Error **errp)
> +{
> + AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> +
> + if (!audio_be_can_set_dbus_server(be)) {
> + error_setg(errp, "Audiodev '%s' is not compatible with DBus",
> + audio_be_get_id(be));
> + return false;
> + }
> +
> + return klass->set_dbus_server(be, server, p2p, errp);
> +}
> +#endif
> +
> +const char *audio_be_get_id(AudioBackend *be)
> +{
> + if (be) {
> + return AUDIO_BACKEND_GET_CLASS(be)->get_id(be);
> + } else {
> + return "";
> + }
> +}
> +
> +AudioBackend *audio_be_new(Audiodev *dev, Error **errp)
> +{
> + const char *drvname = AudiodevDriver_str(dev->driver);
> + g_autofree char *type = g_strconcat("audio-", drvname, NULL);
> + AudioBackend *be = AUDIO_BACKEND(object_new(type));
> +
> + if (!be) {
> + error_setg(errp, "Unknown audio driver `%s'", drvname);
> + return NULL;
> + }
> +
> + if (!AUDIO_BACKEND_GET_CLASS(be)->realize(be, dev, errp)) {
> + object_unref(OBJECT(be));
> + return NULL;
> + }
> +
> + return be;
> +}
> +
> +
> +static const TypeInfo audio_be_info = {
> + .name = TYPE_AUDIO_BACKEND,
> + .parent = TYPE_OBJECT,
> + .instance_size = sizeof(AudioBackend),
> + .abstract = true,
> + .class_size = sizeof(AudioBackendClass),
> +};
> +
> +static void register_types(void)
> +{
> + type_register_static(&audio_be_info);
> +}
> +
> +type_init(register_types);
> diff --git a/audio/audio.c b/audio/audio.c
> index 3f09452e300..1d948084e80 100644
> --- a/audio/audio.c
> +++ b/audio/audio.c
> @@ -869,15 +869,8 @@ static size_t audio_mixeng_backend_write(AudioBackend *be, SWVoiceOut *sw,
> }
> }
>
> -size_t AUD_write(AudioBackend *be, SWVoiceOut *sw, void *buf, size_t size)
> -{
> - AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> -
> - return klass->write(be, sw, buf, size);
> -}
> -
> -static size_t audio_mixeng_backend_read(AudioBackend *be, SWVoiceIn *sw,
> - void *buf, size_t size)
> +static size_t audio_mixeng_backend_read(AudioBackend *be,
> + SWVoiceIn *sw, void *buf, size_t size)
> {
> HWVoiceIn *hw;
>
> @@ -900,13 +893,6 @@ static size_t audio_mixeng_backend_read(AudioBackend *be, SWVoiceIn *sw,
>
> }
>
> -size_t AUD_read(AudioBackend *be, SWVoiceIn *sw, void *buf, size_t size)
> -{
> - AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> -
> - return klass->read(be, sw, buf, size);
> -}
> -
> static int audio_mixeng_backend_get_buffer_size_out(AudioBackend *be, SWVoiceOut *sw)
> {
> if (!sw) {
> @@ -920,13 +906,6 @@ static int audio_mixeng_backend_get_buffer_size_out(AudioBackend *be, SWVoiceOut
> return sw->hw->samples * sw->hw->info.bytes_per_frame;
> }
>
> -int AUD_get_buffer_size_out(AudioBackend *be, SWVoiceOut *sw)
> -{
> - AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> -
> - return klass->get_buffer_size_out(be, sw);
> -}
> -
> static void audio_mixeng_backend_set_active_out(AudioBackend *be, SWVoiceOut *sw,
> bool on)
> {
> @@ -977,13 +956,6 @@ static void audio_mixeng_backend_set_active_out(AudioBackend *be, SWVoiceOut *sw
>
> }
>
> -void AUD_set_active_out(AudioBackend *be, SWVoiceOut *sw, bool on)
> -{
> - AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> -
> - return klass->set_active_out(be, sw, on);
> -}
> -
> static void audio_mixeng_backend_set_active_in(AudioBackend *be, SWVoiceIn *sw, bool on)
> {
> HWVoiceIn *hw;
> @@ -1029,13 +1001,6 @@ static void audio_mixeng_backend_set_active_in(AudioBackend *be, SWVoiceIn *sw,
> }
> }
>
> -void AUD_set_active_in(AudioBackend *be, SWVoiceIn *sw, bool on)
> -{
> - AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> -
> - return klass->set_active_in(be, sw, on);
> -}
> -
> static size_t audio_get_avail(SWVoiceIn *sw)
> {
> size_t live;
> @@ -1642,25 +1607,6 @@ static bool audio_mixeng_backend_realize(AudioBackend *abe,
> return true;
> }
>
> -static AudioBackend *audio_be_new(Audiodev *dev, Error **errp)
> -{
> - const char *drvname = AudiodevDriver_str(dev->driver);
> - g_autofree char *type = g_strconcat("audio-", drvname, NULL);
> - AudioBackend *be = AUDIO_BACKEND(object_new(type));
> -
> - if (!be) {
> - error_setg(errp, "Unknown audio driver `%s'", drvname);
> - return NULL;
> - }
> -
> - if (!AUDIO_BACKEND_GET_CLASS(be)->realize(be, dev, errp)) {
> - object_unref(OBJECT(be));
> - return NULL;
> - }
> -
> - return be;
> -}
> -
> static void audio_vm_change_state_handler (void *opaque, bool running,
> RunState state)
> {
> @@ -1684,14 +1630,6 @@ static void audio_vm_change_state_handler (void *opaque, bool running,
>
> static const VMStateDescription vmstate_audio;
>
> -static void audio_be_init(Object *obj)
> -{
> -}
> -
> -static void audio_be_finalize(Object *obj)
> -{
> -}
> -
> static const char *audio_mixeng_backend_get_id(AudioBackend *be)
> {
> return AUDIO_MIXENG_BACKEND(be)->dev->id;
> @@ -1713,60 +1651,6 @@ static void audio_mixeng_backend_set_volume_out(AudioBackend *be, SWVoiceOut *sw
> static void audio_mixeng_backend_set_volume_in(AudioBackend *be, SWVoiceIn *sw,
> Volume *vol);
>
> -SWVoiceOut *AUD_open_out(
> - AudioBackend *be,
> - SWVoiceOut *sw,
> - const char *name,
> - void *callback_opaque,
> - audio_callback_fn callback_fn,
> - const struct audsettings *as)
> -{
> - AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> -
> - return klass->open_out(be, sw, name, callback_opaque, callback_fn, as);
> -}
> -
> -SWVoiceIn *AUD_open_in(
> - AudioBackend *be,
> - SWVoiceIn *sw,
> - const char *name,
> - void *callback_opaque,
> - audio_callback_fn callback_fn,
> - const struct audsettings *as)
> -{
> - AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> -
> - return klass->open_in(be, sw, name, callback_opaque, callback_fn, as);
> -}
> -
> -void AUD_close_out(AudioBackend *be, SWVoiceOut *sw)
> -{
> - AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> -
> - return klass->close_out(be, sw);
> -}
> -
> -void AUD_close_in(AudioBackend *be, SWVoiceIn *sw)
> -{
> - AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> -
> - return klass->close_in(be, sw);
> -}
> -
> -bool AUD_is_active_out(AudioBackend *be, SWVoiceOut *sw)
> -{
> - AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> -
> - return klass->is_active_out(be, sw);
> -}
> -
> -bool AUD_is_active_in(AudioBackend *be, SWVoiceIn *sw)
> -{
> - AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> -
> - return klass->is_active_in(be, sw);
> -}
> -
> static void audio_mixeng_backend_class_init(ObjectClass *klass, const void *data)
> {
> AudioBackendClass *be = AUDIO_BACKEND_CLASS(klass);
> @@ -1971,20 +1855,6 @@ AudioBackend *audio_get_default_audio_be(Error **errp)
> return default_audio_be;
> }
>
> -bool AUD_backend_check(AudioBackend **be, Error **errp)
> -{
> - assert(be != NULL);
> -
> - if (!*be) {
> - *be = audio_get_default_audio_be(errp);
> - if (!*be) {
> - return false;
> - }
> - }
> -
> - return true;
> -}
> -
> static struct audio_pcm_ops capture_pcm_ops;
>
> static CaptureVoiceOut *audio_mixeng_backend_add_capture(
> @@ -2061,17 +1931,6 @@ static CaptureVoiceOut *audio_mixeng_backend_add_capture(
> return cap;
> }
>
> -CaptureVoiceOut *AUD_add_capture(
> - AudioBackend *be,
> - struct audsettings *as,
> - struct audio_capture_ops *ops,
> - void *cb_opaque)
> -{
> - AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> -
> - return klass->add_capture(be, as, ops, cb_opaque);
> -}
> -
> static void audio_mixeng_backend_del_capture(
> AudioBackend *be,
> CaptureVoiceOut *cap,
> @@ -2114,13 +1973,6 @@ static void audio_mixeng_backend_del_capture(
> }
> }
>
> -void AUD_del_capture(AudioBackend *be, CaptureVoiceOut *cap, void *cb_opaque)
> -{
> - AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> -
> - klass->del_capture(be, cap, cb_opaque);
> -}
> -
> static void audio_mixeng_backend_set_volume_out(AudioBackend *be, SWVoiceOut *sw,
> Volume *vol)
> {
> @@ -2138,13 +1990,6 @@ static void audio_mixeng_backend_set_volume_out(AudioBackend *be, SWVoiceOut *sw
> }
> }
>
> -void AUD_set_volume_out(AudioBackend *be, SWVoiceOut *sw, Volume *vol)
> -{
> - AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> -
> - klass->set_volume_out(be, sw, vol);
> -}
> -
> static void audio_mixeng_backend_set_volume_in(AudioBackend *be, SWVoiceIn *sw,
> Volume *vol)
> {
> @@ -2162,13 +2007,6 @@ static void audio_mixeng_backend_set_volume_in(AudioBackend *be, SWVoiceIn *sw,
> }
> }
>
> -void AUD_set_volume_in(AudioBackend *be, SWVoiceIn *sw, Volume *vol)
> -{
> - AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> -
> - klass->set_volume_in(be, sw, vol);
> -}
> -
> static void audio_create_pdos(Audiodev *dev)
> {
> switch (dev->driver) {
> @@ -2422,40 +2260,6 @@ AudioBackend *audio_be_by_name(const char *name, Error **errp)
> }
> }
>
> -#ifdef CONFIG_GIO
> -bool audio_be_can_set_dbus_server(AudioBackend *be)
> -{
> - AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> -
> - return klass->set_dbus_server != NULL;
> -}
> -
> -bool audio_be_set_dbus_server(AudioBackend *be,
> - GDBusObjectManagerServer *server,
> - bool p2p,
> - Error **errp)
> -{
> - AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
> -
> - if (!audio_be_can_set_dbus_server(be)) {
> - error_setg(errp, "Audiodev '%s' is not compatible with DBus",
> - audio_be_get_id(be));
> - return false;
> - }
> -
> - return klass->set_dbus_server(be, server, p2p, errp);
> -}
> -#endif
> -
> -const char *audio_be_get_id(AudioBackend *be)
> -{
> - if (be) {
> - return AUDIO_BACKEND_GET_CLASS(be)->get_id(be);
> - } else {
> - return "";
> - }
> -}
> -
> const char *audio_application_name(void)
> {
> const char *vm_name;
> @@ -2519,16 +2323,6 @@ AudiodevList *qmp_query_audiodevs(Error **errp)
> return ret;
> }
>
> -static const TypeInfo audio_be_info = {
> - .name = TYPE_AUDIO_BACKEND,
> - .parent = TYPE_OBJECT,
> - .instance_size = sizeof(AudioBackend),
> - .instance_init = audio_be_init,
> - .instance_finalize = audio_be_finalize,
> - .abstract = true,
> - .class_size = sizeof(AudioBackendClass),
> -};
> -
> static const TypeInfo audio_mixeng_backend_info = {
> .name = TYPE_AUDIO_MIXENG_BACKEND,
> .parent = TYPE_AUDIO_BACKEND,
> @@ -2542,7 +2336,6 @@ static const TypeInfo audio_mixeng_backend_info = {
>
> static void register_types(void)
> {
> - type_register_static(&audio_be_info);
> type_register_static(&audio_mixeng_backend_info);
> }
>
> diff --git a/audio/meson.build b/audio/meson.build
> index a5fec14fb3a..417670bd4c7 100644
> --- a/audio/meson.build
> +++ b/audio/meson.build
> @@ -1,6 +1,7 @@
> audio_ss = ss.source_set()
> audio_ss.add(files(
> 'audio.c',
> + 'audio-be.c',
> 'mixeng.c',
> 'noaudio.c',
> 'wavaudio.c',
Reviewed-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
ATB,
Mark.
© 2016 - 2026 Red Hat, Inc.