This will allow to use QOM and the dynamic object module loading.
The changes are done systematically, introducing an empty instance
structure that will later be filled by state with further refactoring.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>
Reviewed-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
#include "qemu/main-loop.h"
#include "qemu/module.h"
#include "qemu/audio.h"
+#include "qom/object.h"
#include "trace.h"
#pragma GCC diagnostic ignored "-Waddress"
#define DEBUG_ALSA 0
+#define TYPE_AUDIO_ALSA "audio-alsa"
+OBJECT_DECLARE_SIMPLE_TYPE(AudioALSA, AUDIO_ALSA)
+
+struct AudioALSA {
+ AudioMixengBackend parent_obj;
+};
+
+static struct audio_driver alsa_audio_driver;
+
+static void audio_alsa_class_init(ObjectClass *klass, const void *data)
+{
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
+
+ k->driver = &alsa_audio_driver;
+}
+
struct pollhlp {
snd_pcm_t *handle;
struct pollfd *pfds;
.voice_size_in = sizeof (ALSAVoiceIn)
};
+static const TypeInfo audio_alsa_info = {
+ .name = TYPE_AUDIO_ALSA,
+ .parent = TYPE_AUDIO_MIXENG_BACKEND,
+ .instance_size = sizeof(AudioALSA),
+ .class_init = audio_alsa_class_init,
+};
+
+
static void register_audio_alsa(void)
{
audio_driver_register(&alsa_audio_driver);
+ type_register_static(&audio_alsa_info);
}
type_init(register_audio_alsa);
+module_obj(TYPE_AUDIO_ALSA);
struct AudioMixengBackendClass {
AudioBackendClass parent_class;
+
+ audio_driver *driver;
};
struct AudioMixengBackend {
#include "qemu/main-loop.h"
#include "qemu/module.h"
#include "qemu/audio.h"
+#include "qom/object.h"
#define AUDIO_CAP "coreaudio"
#include "audio_int.h"
+#define TYPE_AUDIO_COREAUDIO "audio-coreaudio"
+OBJECT_DECLARE_SIMPLE_TYPE(AudioCoreaudio, AUDIO_COREAUDIO)
+
+struct AudioCoreaudio {
+ AudioMixengBackend parent_obj;
+};
+
+static struct audio_driver coreaudio_audio_driver;
+
+static void audio_coreaudio_class_init(ObjectClass *klass, const void *data)
+{
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
+
+ k->driver = &coreaudio_audio_driver;
+}
+
typedef struct coreaudioVoiceOut {
HWVoiceOut hw;
pthread_mutex_t buf_mutex;
.voice_size_in = 0
};
+static const TypeInfo audio_coreaudio_info = {
+ .name = TYPE_AUDIO_COREAUDIO,
+ .parent = TYPE_AUDIO_MIXENG_BACKEND,
+ .instance_size = sizeof(AudioCoreaudio),
+ .class_init = audio_coreaudio_class_init,
+};
+
static void register_audio_coreaudio(void)
{
audio_driver_register(&coreaudio_audio_driver);
+ type_register_static(&audio_coreaudio_info);
}
type_init(register_audio_coreaudio);
+module_obj(TYPE_AUDIO_COREAUDIO);
#include "qemu/error-report.h"
#include "qemu/module.h"
#include "qemu/dbus.h"
+#include "qom/object.h"
#ifdef G_OS_UNIX
#include <gio/gunixfdlist.h>
#define DBUS_DEFAULT_AUDIO_NSAMPLES 480
+#define TYPE_AUDIO_DBUS "audio-dbus"
+OBJECT_DECLARE_SIMPLE_TYPE(AudioDbus, AUDIO_DBUS)
+
+struct AudioDbus {
+ AudioMixengBackend parent_obj;
+};
+
+static struct audio_driver dbus_audio_driver;
+
+static void audio_dbus_class_init(ObjectClass *klass, const void *data)
+{
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
+
+ k->driver = &dbus_audio_driver;
+}
+
typedef struct DBusAudio {
Audiodev *dev;
GDBusObjectManagerServer *server;
.voice_size_in = sizeof(DBusVoiceIn)
};
+static const TypeInfo audio_dbus_info = {
+ .name = TYPE_AUDIO_DBUS,
+ .parent = TYPE_AUDIO_MIXENG_BACKEND,
+ .instance_size = sizeof(AudioDbus),
+ .class_init = audio_dbus_class_init,
+};
+
static void register_audio_dbus(void)
{
audio_driver_register(&dbus_audio_driver);
+ type_register_static(&audio_dbus_info);
}
type_init(register_audio_dbus);
module_dep("ui-dbus")
+module_obj(TYPE_AUDIO_DBUS)
#include "audio_int.h"
#include "qemu/module.h"
#include "qapi/error.h"
+#include "qom/object.h"
#include <windows.h>
#include <mmsystem.h>
#include "audio_win_int.h"
+#define TYPE_AUDIO_DSOUND "audio-dsound"
+OBJECT_DECLARE_SIMPLE_TYPE(AudioDsound, AUDIO_DSOUND)
+
+struct AudioDsound {
+ AudioMixengBackend parent_obj;
+};
+
+static struct audio_driver dsound_audio_driver;
+
+static void audio_dsound_class_init(ObjectClass *klass, const void *data)
+{
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
+
+ k->driver = &dsound_audio_driver;
+}
+
/* #define DEBUG_DSOUND */
typedef struct {
.voice_size_in = sizeof (DSoundVoiceIn)
};
+static const TypeInfo audio_dsound_info = {
+ .name = TYPE_AUDIO_DSOUND,
+ .parent = TYPE_AUDIO_MIXENG_BACKEND,
+ .instance_size = sizeof(AudioDsound),
+ .class_init = audio_dsound_class_init,
+};
+
static void register_audio_dsound(void)
{
audio_driver_register(&dsound_audio_driver);
+ type_register_static(&audio_dsound_info);
}
type_init(register_audio_dsound);
+module_obj(TYPE_AUDIO_DSOUND);
#include "qemu/atomic.h"
#include "qemu/main-loop.h"
#include "qemu/audio.h"
+#include "qom/object.h"
#define AUDIO_CAP "jack"
#include "audio_int.h"
#include <jack/jack.h>
#include <jack/thread.h>
+#define TYPE_AUDIO_JACK "audio-jack"
+OBJECT_DECLARE_SIMPLE_TYPE(AudioJack, AUDIO_JACK)
+
+struct AudioJack {
+ AudioMixengBackend parent_obj;
+};
+
+static struct audio_driver jack_driver;
+
+static void audio_jack_class_init(ObjectClass *klass, const void *data)
+{
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
+
+ k->driver = &jack_driver;
+}
+
struct QJack;
typedef enum QJackState {
dolog("I: %s\n", msg);
}
+static const TypeInfo audio_jack_info = {
+ .name = TYPE_AUDIO_JACK,
+ .parent = TYPE_AUDIO_MIXENG_BACKEND,
+ .instance_size = sizeof(AudioJack),
+ .class_init = audio_jack_class_init,
+};
+
static void register_audio_jack(void)
{
qemu_mutex_init(&qjack_shutdown_lock);
audio_driver_register(&jack_driver);
+ type_register_static(&audio_jack_info);
#if !defined(WIN32) && defined(CONFIG_PTHREAD_SETNAME_NP_W_TID)
jack_set_thread_creator(qjack_thread_creator);
#endif
jack_set_info_function(qjack_info);
}
type_init(register_audio_jack);
+module_obj(TYPE_AUDIO_JACK);
#include "qemu/osdep.h"
#include "qemu/module.h"
#include "qemu/audio.h"
+#include "qom/object.h"
#define AUDIO_CAP "noaudio"
#include "audio_int.h"
+#define TYPE_AUDIO_NONE "audio-none"
+OBJECT_DECLARE_SIMPLE_TYPE(AudioNone, AUDIO_NONE)
+
+struct AudioNone {
+ AudioMixengBackend parent_obj;
+};
+
+static struct audio_driver no_audio_driver;
+
+static void audio_none_class_init(ObjectClass *klass, const void *data)
+{
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
+
+ k->driver = &no_audio_driver;
+}
+
typedef struct NoVoiceOut {
HWVoiceOut hw;
RateCtl rate;
.voice_size_in = sizeof (NoVoiceIn)
};
+static const TypeInfo audio_none_info = {
+ .name = TYPE_AUDIO_NONE,
+ .parent = TYPE_AUDIO_MIXENG_BACKEND,
+ .instance_size = sizeof(AudioNone),
+ .class_init = audio_none_class_init,
+};
+
static void register_audio_none(void)
{
audio_driver_register(&no_audio_driver);
+ type_register_static(&audio_none_info);
}
type_init(register_audio_none);
+module_obj(TYPE_AUDIO_NONE);
#include "qemu/host-utils.h"
#include "qapi/error.h"
#include "qemu/audio.h"
+#include "qom/object.h"
#include "trace.h"
#define AUDIO_CAP "oss"
#include "audio_int.h"
+#define TYPE_AUDIO_OSS "audio-oss"
+OBJECT_DECLARE_SIMPLE_TYPE(AudioOss, AUDIO_OSS)
+
+struct AudioOss {
+ AudioMixengBackend parent_obj;
+};
+
+static struct audio_driver oss_audio_driver;
+
+static void audio_oss_class_init(ObjectClass *klass, const void *data)
+{
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
+
+ k->driver = &oss_audio_driver;
+}
+
#if defined OSS_GETVERSION && defined SNDCTL_DSP_POLICY
#define USE_DSP_POLICY
#endif
.voice_size_in = sizeof (OSSVoiceIn)
};
+static const TypeInfo audio_oss_info = {
+ .name = TYPE_AUDIO_OSS,
+ .parent = TYPE_AUDIO_MIXENG_BACKEND,
+ .instance_size = sizeof(AudioOss),
+ .class_init = audio_oss_class_init,
+};
+
static void register_audio_oss(void)
{
audio_driver_register(&oss_audio_driver);
+ type_register_static(&audio_oss_info);
}
type_init(register_audio_oss);
+module_obj(TYPE_AUDIO_OSS);
#include "qemu/module.h"
#include "qemu/audio.h"
#include "qapi/error.h"
+#include "qom/object.h"
#include <pulse/pulseaudio.h>
#define AUDIO_CAP "pulseaudio"
#include "audio_int.h"
+#define TYPE_AUDIO_PA "audio-pa"
+OBJECT_DECLARE_SIMPLE_TYPE(AudioPa, AUDIO_PA)
+
+struct AudioPa {
+ AudioMixengBackend parent_obj;
+};
+
+static struct audio_driver pa_audio_driver;
+
+static void audio_pa_class_init(ObjectClass *klass, const void *data)
+{
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
+
+ k->driver = &pa_audio_driver;
+}
+
typedef struct PAConnection {
char *server;
int refcount;
.voice_size_in = sizeof (PAVoiceIn),
};
+static const TypeInfo audio_pa_info = {
+ .name = TYPE_AUDIO_PA,
+ .parent = TYPE_AUDIO_MIXENG_BACKEND,
+ .instance_size = sizeof(AudioPa),
+ .class_init = audio_pa_class_init,
+};
+
static void register_audio_pa(void)
{
audio_driver_register(&pa_audio_driver);
+ type_register_static(&audio_pa_info);
}
type_init(register_audio_pa);
+module_obj(TYPE_AUDIO_PA);
#include "qemu/audio.h"
#include "qemu/error-report.h"
#include "qapi/error.h"
+#include "qom/object.h"
#include <spa/param/audio/format-utils.h>
#include <spa/utils/ringbuffer.h>
#include <spa/utils/result.h>
#include "audio_int.h"
+#define TYPE_AUDIO_PW "audio-pipewire"
+OBJECT_DECLARE_SIMPLE_TYPE(AudioPw, AUDIO_PW)
+
+struct AudioPw {
+ AudioMixengBackend parent_obj;
+};
+
+static struct audio_driver pw_audio_driver;
+
+static void audio_pw_class_init(ObjectClass *klass, const void *data)
+{
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
+
+ k->driver = &pw_audio_driver;
+}
+
typedef struct pwvolume {
uint32_t channels;
float values[SPA_AUDIO_MAX_CHANNELS];
.voice_size_in = sizeof(PWVoiceIn),
};
+static const TypeInfo audio_pw_info = {
+ .name = TYPE_AUDIO_PW,
+ .parent = TYPE_AUDIO_MIXENG_BACKEND,
+ .instance_size = sizeof(AudioPw),
+ .class_init = audio_pw_class_init,
+};
+
static void
register_audio_pw(void)
{
audio_driver_register(&pw_audio_driver);
+ type_register_static(&audio_pw_info);
}
type_init(register_audio_pw);
+module_obj(TYPE_AUDIO_PW);
#include "qemu/module.h"
#include "qapi/error.h"
#include "qemu/audio.h"
+#include "qom/object.h"
#ifndef _WIN32
#ifdef __sun__
#define AUDIO_CAP "sdl"
#include "audio_int.h"
+#define TYPE_AUDIO_SDL "audio-sdl"
+OBJECT_DECLARE_SIMPLE_TYPE(AudioSdl, AUDIO_SDL)
+
+struct AudioSdl {
+ AudioMixengBackend parent_obj;
+};
+
+static struct audio_driver sdl_audio_driver;
+
+static void audio_sdl_class_init(ObjectClass *klass, const void *data)
+{
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
+
+ k->driver = &sdl_audio_driver;
+}
+
typedef struct SDLVoiceOut {
HWVoiceOut hw;
int exit;
.voice_size_in = sizeof(SDLVoiceIn),
};
+static const TypeInfo audio_sdl_info = {
+ .name = TYPE_AUDIO_SDL,
+ .parent = TYPE_AUDIO_MIXENG_BACKEND,
+ .instance_size = sizeof(AudioSdl),
+ .class_init = audio_sdl_class_init,
+};
+
static void register_audio_sdl(void)
{
audio_driver_register(&sdl_audio_driver);
+ type_register_static(&audio_sdl_info);
}
type_init(register_audio_sdl);
+module_obj(TYPE_AUDIO_SDL);
#include "qemu/main-loop.h"
#include "qemu/audio.h"
#include "trace.h"
+#include "qom/object.h"
#define AUDIO_CAP "sndio"
#include "audio_int.h"
+#define TYPE_AUDIO_SNDIO "audio-sndio"
+OBJECT_DECLARE_SIMPLE_TYPE(AudioSndio, AUDIO_SNDIO)
+
+struct AudioSndio {
+ AudioMixengBackend parent_obj;
+};
+
+static struct audio_driver sndio_audio_driver;
+
+static void audio_sndio_class_init(ObjectClass *klass, const void *data)
+{
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
+
+ k->driver = &sndio_audio_driver;
+}
+
/* default latency in microseconds if no option is set */
#define SNDIO_LATENCY_US 50000
.voice_size_in = sizeof(SndioVoice)
};
+static const TypeInfo audio_sndio_info = {
+ .name = TYPE_AUDIO_SNDIO,
+ .parent = TYPE_AUDIO_MIXENG_BACKEND,
+ .instance_size = sizeof(AudioSndio),
+ .class_init = audio_sndio_class_init,
+};
+
static void register_audio_sndio(void)
{
audio_driver_register(&sndio_audio_driver);
+ type_register_static(&audio_sndio_info);
}
type_init(register_audio_sndio);
+module_obj(TYPE_AUDIO_SNDIO);
#include "qemu/timer.h"
#include "qapi/error.h"
#include "ui/qemu-spice.h"
+#include "qom/object.h"
#define AUDIO_CAP "spice"
#include "qemu/audio.h"
#include "audio_int.h"
+#define TYPE_AUDIO_SPICE "audio-spice"
+OBJECT_DECLARE_SIMPLE_TYPE(AudioSpice, AUDIO_SPICE)
+
+struct AudioSpice {
+ AudioMixengBackend parent_obj;
+};
+
+static struct audio_driver spice_audio_driver;
+
+static void audio_spice_class_init(ObjectClass *klass, const void *data)
+{
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
+
+ k->driver = &spice_audio_driver;
+}
+
#if SPICE_INTERFACE_PLAYBACK_MAJOR > 1 || SPICE_INTERFACE_PLAYBACK_MINOR >= 3
#define LINE_OUT_SAMPLES (480 * 4)
#else
.voice_size_in = sizeof (SpiceVoiceIn),
};
+static const TypeInfo audio_spice_info = {
+ .name = TYPE_AUDIO_SPICE,
+ .parent = TYPE_AUDIO_MIXENG_BACKEND,
+ .instance_size = sizeof(AudioSpice),
+ .class_init = audio_spice_class_init,
+};
+
static void register_audio_spice(void)
{
audio_driver_register(&spice_audio_driver);
+ type_register_static(&audio_spice_info);
}
type_init(register_audio_spice);
+module_obj(TYPE_AUDIO_SPICE);
module_dep("ui-spice-core");
#include "qemu/osdep.h"
#include "qemu/module.h"
#include "qemu/audio.h"
+#include "qom/object.h"
#define AUDIO_CAP "wav"
#include "audio_int.h"
+#define TYPE_AUDIO_WAV "audio-wav"
+OBJECT_DECLARE_SIMPLE_TYPE(AudioWav, AUDIO_WAV)
+
+struct AudioWav {
+ AudioMixengBackend parent_obj;
+};
+
+static struct audio_driver wav_audio_driver;
+
+static void audio_wav_class_init(ObjectClass *klass, const void *data)
+{
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
+
+ k->driver = &wav_audio_driver;
+}
+
typedef struct WAVVoiceOut {
HWVoiceOut hw;
FILE *f;
.voice_size_in = 0
};
+static const TypeInfo audio_wav_info = {
+ .name = TYPE_AUDIO_WAV,
+ .parent = TYPE_AUDIO_MIXENG_BACKEND,
+ .instance_size = sizeof(AudioWav),
+ .class_init = audio_wav_class_init,
+};
+
static void register_audio_wav(void)
{
audio_driver_register(&wav_audio_driver);
+ type_register_static(&audio_wav_info);
}
type_init(register_audio_wav);
+module_obj(TYPE_AUDIO_WAV);