Hi
On Fri, Feb 13, 2026 at 10:58 AM Mark Cave-Ayland
<[email protected]> wrote:
>
> On 27/01/2026 18:24, [email protected] wrote:
>
> > 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.
> >
> > Signed-off-by: Marc-André Lureau <[email protected]>
> > ---
> > audio/ossaudio.c | 37 +++++++++++++++++++++----------------
> > 1 file changed, 21 insertions(+), 16 deletions(-)
> >
> > diff --git a/audio/ossaudio.c b/audio/ossaudio.c
> > index 013958e1344..e745149ca39 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;
> > };
> >
> > 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");
> > + qapi_free_Audiodev(dev);
> > return NULL;
>
> Should this be "return false" instead?
good catch, thanks
>
> > }
> > 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");
> > + qapi_free_Audiodev(dev);
> > return NULL;
>
> And also here?
>
> > }
> > - 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_oss_info = {
> > .name = TYPE_AUDIO_OSS,
> > .parent = TYPE_AUDIO_MIXENG_BACKEND,
>
> Otherwise:
>
> Reviewed-by: Mark Cave-Ayland <[email protected]>
>
>
> ATB,
>
> Mark.
>
>
--
Marc-André Lureau