@samitouri / QOSamiQemu / commits / 480e6bac92

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