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


Reply via email to