audio/sdl: convert to QOM lifecycle methods
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. 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
Jan 16, 2026 at 18:28 UTC
480e6bac92e6e38f42457226387f6634bb20a5a3
1 file changed
+23
-17
audio/sdlaudio.c
+23
-17
@@ -44,19 +44,14 @@
44
#define TYPE_AUDIO_SDL "audio-sdl"
45
OBJECT_DECLARE_SIMPLE_TYPE(AudioSdl, AUDIO_SDL)
46
47
+static AudioBackendClass *audio_sdl_parent_class;
48
+
49
struct AudioSdl {
50
AudioMixengBackend parent_obj;
51
};
52
53
static struct audio_driver sdl_audio_driver;
54
53
-static void audio_sdl_class_init(ObjectClass *klass, const void *data)
54
-{
55
- AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
56
-
57
- k->driver = &sdl_audio_driver;
58
-}
59
-
55
typedef struct SDLVoiceOut {
56
HWVoiceOut hw;
57
int exit;
@@ -356,7 +351,7 @@ static int sdl_init_out(HWVoiceOut *hw, struct audsettings *as,
351
SDLVoiceOut *sdl = (SDLVoiceOut *)hw;
352
SDL_AudioSpec req, obt;
353
int err;
359
- Audiodev *dev = drv_opaque;
354
+ Audiodev *dev = hw->s->dev;
355
AudiodevSdlPerDirectionOptions *spdo = dev->u.sdl.out;
356
struct audsettings obt_as;
357
@@ -412,7 +407,7 @@ static int sdl_init_in(HWVoiceIn *hw, audsettings *as, void *drv_opaque)
407
SDLVoiceIn *sdl = (SDLVoiceIn *)hw;
408
SDL_AudioSpec req, obt;
409
int err;
415
- Audiodev *dev = drv_opaque;
410
+ Audiodev *dev = hw->s->dev;
411
AudiodevSdlPerDirectionOptions *spdo = dev->u.sdl.in;
412
struct audsettings obt_as;
413
@@ -459,19 +454,20 @@ static void sdl_enable_in(HWVoiceIn *hw, bool enable)
454
SDL_PauseAudioDevice(sdl->devid, !enable);
455
}
456
462
-static void *sdl_audio_init(Audiodev *dev, Error **errp)
457
+static bool audio_sdl_realize(AudioBackend *abe, Audiodev *dev, Error **errp)
458
{
464
- if (SDL_InitSubSystem (SDL_INIT_AUDIO)) {
459
+ if (SDL_InitSubSystem(SDL_INIT_AUDIO)) {
460
error_setg(errp, "SDL failed to initialize audio subsystem");
466
- return NULL;
461
+ qapi_free_Audiodev(dev);
462
+ return false;
463
}
464
469
- return dev;
465
+ return audio_sdl_parent_class->realize(abe, dev, errp);
466
}
467
472
-static void sdl_audio_fini (void *opaque)
468
+static void audio_sdl_finalize(Object *obj)
469
{
474
- SDL_QuitSubSystem (SDL_INIT_AUDIO);
470
+ SDL_QuitSubSystem(SDL_INIT_AUDIO);
471
}
472
473
static struct audio_pcm_ops sdl_pcm_ops = {
@@ -499,8 +495,6 @@ static struct audio_pcm_ops sdl_pcm_ops = {
495
496
static struct audio_driver sdl_audio_driver = {
497
.name = "sdl",
502
- .init = sdl_audio_init,
503
- .fini = sdl_audio_fini,
498
.pcm_ops = &sdl_pcm_ops,
499
.max_voices_out = INT_MAX,
500
.max_voices_in = INT_MAX,
@@ -508,12 +502,24 @@ static struct audio_driver sdl_audio_driver = {
502
.voice_size_in = sizeof(SDLVoiceIn),
503
};
504
505
+static void audio_sdl_class_init(ObjectClass *klass, const void *data)
506
+{
507
+ AudioBackendClass *b = AUDIO_BACKEND_CLASS(klass);
508
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
509
+
510
+ audio_sdl_parent_class = AUDIO_BACKEND_CLASS(object_class_get_parent(klass));
511
+
512
+ b->realize = audio_sdl_realize;
513
+ k->driver = &sdl_audio_driver;
514
+}
515
+
516
static const TypeInfo audio_types[] = {
517
{
518
.name = TYPE_AUDIO_SDL,
519
.parent = TYPE_AUDIO_MIXENG_BACKEND,
520
.instance_size = sizeof(AudioSdl),
521
.class_init = audio_sdl_class_init,
522
+ .instance_finalize = audio_sdl_finalize,
523
},
524
};
525