From: Marc-André Lureau <marcandre.lureau@redhat.com>
Migrate the SDL audio backend from the legacy driver init/fini
callbacks to proper QOM realize and finalize methods.
The sdl_audio_init() function is replaced with audio_sdl_realize(),
which initializes the SDL audio subsystem before delegating to the
parent class realize method. The sdl_audio_fini() is replaced with
audio_sdl_finalize() to properly clean up the SDL audio subsystem.
Access to the Audiodev is now through hw->s->dev instead of the
drv_opaque pointer.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
audio/sdlaudio.c | 40 +++++++++++++++++++++++-----------------
1 file changed, 23 insertions(+), 17 deletions(-)
diff --git a/audio/sdlaudio.c b/audio/sdlaudio.c
index 1a5e3f8a969..aa3c0922199 100644
--- a/audio/sdlaudio.c
+++ b/audio/sdlaudio.c
@@ -44,19 +44,14 @@
#define TYPE_AUDIO_SDL "audio-sdl"
OBJECT_DECLARE_SIMPLE_TYPE(AudioSdl, AUDIO_SDL)
+static AudioBackendClass *audio_sdl_parent_class;
+
struct AudioSdl {
AudioMixengBackend parent;
};
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;
@@ -356,7 +351,7 @@ static int sdl_init_out(HWVoiceOut *hw, struct audsettings *as,
SDLVoiceOut *sdl = (SDLVoiceOut *)hw;
SDL_AudioSpec req, obt;
int err;
- Audiodev *dev = drv_opaque;
+ Audiodev *dev = hw->s->dev;
AudiodevSdlPerDirectionOptions *spdo = dev->u.sdl.out;
struct audsettings obt_as;
@@ -412,7 +407,7 @@ static int sdl_init_in(HWVoiceIn *hw, audsettings *as, void *drv_opaque)
SDLVoiceIn *sdl = (SDLVoiceIn *)hw;
SDL_AudioSpec req, obt;
int err;
- Audiodev *dev = drv_opaque;
+ Audiodev *dev = hw->s->dev;
AudiodevSdlPerDirectionOptions *spdo = dev->u.sdl.in;
struct audsettings obt_as;
@@ -459,19 +454,20 @@ static void sdl_enable_in(HWVoiceIn *hw, bool enable)
SDL_PauseAudioDevice(sdl->devid, !enable);
}
-static void *sdl_audio_init(Audiodev *dev, Error **errp)
+static bool audio_sdl_realize(AudioBackend *abe, Audiodev *dev, Error **errp)
{
- if (SDL_InitSubSystem (SDL_INIT_AUDIO)) {
+ if (SDL_InitSubSystem(SDL_INIT_AUDIO)) {
error_setg(errp, "SDL failed to initialize audio subsystem");
- return NULL;
+ qapi_free_Audiodev(dev);
+ return false;
}
- return dev;
+ return audio_sdl_parent_class->realize(abe, dev, errp);
}
-static void sdl_audio_fini (void *opaque)
+static void audio_sdl_finalize(Object *obj)
{
- SDL_QuitSubSystem (SDL_INIT_AUDIO);
+ SDL_QuitSubSystem(SDL_INIT_AUDIO);
}
static struct audio_pcm_ops sdl_pcm_ops = {
@@ -499,8 +495,6 @@ static struct audio_pcm_ops sdl_pcm_ops = {
static struct audio_driver sdl_audio_driver = {
.name = "sdl",
- .init = sdl_audio_init,
- .fini = sdl_audio_fini,
.pcm_ops = &sdl_pcm_ops,
.max_voices_out = INT_MAX,
.max_voices_in = INT_MAX,
@@ -508,11 +502,23 @@ static struct audio_driver sdl_audio_driver = {
.voice_size_in = sizeof(SDLVoiceIn),
};
+static void audio_sdl_class_init(ObjectClass *klass, const void *data)
+{
+ AudioBackendClass *b = AUDIO_BACKEND_CLASS(klass);
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
+
+ audio_sdl_parent_class = AUDIO_BACKEND_CLASS(object_class_get_parent(klass));
+
+ b->realize = audio_sdl_realize;
+ k->driver = &sdl_audio_driver;
+}
+
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,
+ .instance_finalize = audio_sdl_finalize,
};
static void register_audio_sdl(void)
--
2.52.0