From: Marc-André Lureau <[email protected]> Migrate the OSS audio backend from the legacy driver init/fini callbacks to proper QOM realize method.
The oss_audio_init() function is replaced with audio_oss_realize(), which performs the same device accessibility check before delegating to the parent class realize method. The empty oss_audio_fini() is removed. Access to the Audiodev is now through hw->s->dev instead of the drv_opaque pointer. Reviewed-by: Mark Cave-Ayland <[email protected]> Reviewed-by: Akihiko Odaki <[email protected]> Signed-off-by: Marc-André Lureau <[email protected]> --- audio/ossaudio.c | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/audio/ossaudio.c b/audio/ossaudio.c index f64c564e345..fedd2bbd722 100644 --- a/audio/ossaudio.c +++ b/audio/ossaudio.c @@ -23,6 +23,7 @@ */ #include "qemu/osdep.h" +#include "qapi-types-audio.h" #include <sys/ioctl.h> #include <sys/soundcard.h> #include "qemu/main-loop.h" @@ -39,19 +40,14 @@ #define TYPE_AUDIO_OSS "audio-oss" OBJECT_DECLARE_SIMPLE_TYPE(AudioOss, AUDIO_OSS) +static AudioBackendClass *audio_oss_parent_class; + 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 @@ -505,7 +501,7 @@ static int oss_init_out(HWVoiceOut *hw, struct audsettings *as, int err; int fd; struct audsettings obt_as; - Audiodev *dev = drv_opaque; + Audiodev *dev = hw->s->dev; AudiodevOssOptions *oopts = &dev->u.oss; oss->fd = -1; @@ -636,7 +632,7 @@ static int oss_init_in(HWVoiceIn *hw, struct audsettings *as, void *drv_opaque) int err; int fd; struct audsettings obt_as; - Audiodev *dev = drv_opaque; + Audiodev *dev = hw->s->dev; oss->fd = -1; @@ -737,7 +733,8 @@ static void oss_init_per_direction(AudiodevOssPerDirectionOptions *opdo) } } -static void *oss_audio_init(Audiodev *dev, Error **errp) +static bool +audio_oss_realize(AudioBackend *abe, Audiodev *dev, Error **errp) { AudiodevOssOptions *oopts; assert(dev->driver == AUDIODEV_DRIVER_OSS); @@ -748,17 +745,16 @@ static void *oss_audio_init(Audiodev *dev, Error **errp) if (access(oopts->in->dev ?: "/dev/dsp", R_OK | W_OK) < 0) { error_setg_errno(errp, errno, "%s not accessible", oopts->in->dev ?: "/dev/dsp"); - return NULL; + qapi_free_Audiodev(dev); + return false; } if (access(oopts->out->dev ?: "/dev/dsp", R_OK | W_OK) < 0) { error_setg_errno(errp, errno, "%s not accessible", oopts->out->dev ?: "/dev/dsp"); - return NULL; + qapi_free_Audiodev(dev); + return false; } - return dev; -} -static void oss_audio_fini (void *opaque) -{ + return audio_oss_parent_class->realize(abe, dev, errp); } static struct audio_pcm_ops oss_pcm_ops = { @@ -780,8 +776,6 @@ static struct audio_pcm_ops oss_pcm_ops = { static struct audio_driver oss_audio_driver = { .name = "oss", - .init = oss_audio_init, - .fini = oss_audio_fini, .pcm_ops = &oss_pcm_ops, .max_voices_out = INT_MAX, .max_voices_in = INT_MAX, @@ -789,6 +783,17 @@ static struct audio_driver oss_audio_driver = { .voice_size_in = sizeof (OSSVoiceIn) }; +static void audio_oss_class_init(ObjectClass *klass, const void *data) +{ + AudioBackendClass *b = AUDIO_BACKEND_CLASS(klass); + AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass); + + audio_oss_parent_class = AUDIO_BACKEND_CLASS(object_class_get_parent(klass)); + + b->realize = audio_oss_realize; + k->driver = &oss_audio_driver; +} + static const TypeInfo audio_types[] = { { .name = TYPE_AUDIO_OSS, -- 2.53.0
