From: Marc-AndrĂ© Lureau <[email protected]>

As we will allow other kind of AudioBackend objects to be instantiated,
move the object allocation to a dedicated function.

Signed-off-by: Marc-AndrĂ© Lureau <[email protected]>
---
 audio/audio.c | 44 ++++++++++++++++++++++----------------------
 1 file changed, 22 insertions(+), 22 deletions(-)

diff --git a/audio/audio.c b/audio/audio.c
index 7b978e862c..fab6024207 100644
--- a/audio/audio.c
+++ b/audio/audio.c
@@ -1563,19 +1563,23 @@ size_t audio_generic_read(HWVoiceIn *hw, void *buf, 
size_t size)
     return total;
 }
 
-static bool audio_driver_do_init(AudioDriver *d, Error **errp)
+static AudioBackend *audio_be_new(Audiodev *dev, Error **errp)
 {
-    const char *drvname = AudiodevDriver_str(d->dev->driver);
+    const char *drvname = AudiodevDriver_str(dev->driver);
     struct audio_driver *drv = audio_driver_lookup(drvname);
 
     if (!drv) {
         error_setg(errp, "Unknown audio driver `%s'", drvname);
-        return false;
+        return NULL;
     }
 
+    AudioDriver *d = AUDIO_DRIVER(object_new(TYPE_AUDIO_DRIVER));
+    d->dev = dev;
+
     d->drv_opaque = drv->init(d->dev, errp);
     if (!d->drv_opaque) {
-        return false;
+        object_unref(OBJECT(d));
+        return NULL;
     }
 
     if (!drv->pcm_ops->get_buffer_in) {
@@ -1597,7 +1601,7 @@ static bool audio_driver_do_init(AudioDriver *d, Error 
**errp)
         d->period_ticks = d->dev->timer_period * (int64_t)SCALE_US;
     }
 
-    return true;
+    return AUDIO_BACKEND(d);
 }
 
 static void audio_vm_change_state_handler (void *opaque, bool running,
@@ -1795,13 +1799,12 @@ void audio_create_default_audiodevs(void)
  */
 static AudioBackend *audio_init(Audiodev *dev, Error **errp)
 {
-    AudioDriver *d;
+    AudioBackend *be;
 
-    d = AUDIO_DRIVER(object_new(TYPE_AUDIO_DRIVER));
-    d->dev = dev;
-    if (d->dev) {
-        if (!audio_driver_do_init(d, errp)) {
-            goto out;
+    if (dev) {
+        be = audio_be_new(dev, errp);
+        if (!be) {
+            return NULL;
         }
     } else {
         assert(!default_audio_be);
@@ -1809,27 +1812,24 @@ static AudioBackend *audio_init(Audiodev *dev, Error 
**errp)
             AudiodevListEntry *e = QSIMPLEQ_FIRST(&default_audiodevs);
             if (!e) {
                 error_setg(errp, "no default audio driver available");
-                goto out;
+                return NULL;
             }
-            d->dev = e->dev;
             QSIMPLEQ_REMOVE_HEAD(&default_audiodevs, next);
+            be = audio_be_new(e->dev, NULL);
             g_free(e);
-            if (audio_driver_do_init(d, NULL)) {
+            if (be) {
                 break;
             }
         }
     }
 
     if (!object_property_try_add_child(get_audiodevs_root(),
-                                       d->dev->id, OBJECT(d), errp)) {
-        goto out;
+                                       audio_be_get_id(be), OBJECT(be), errp)) 
{
+        object_unref(be);
+        return NULL;
     }
-    object_unref(d);
-    return AUDIO_BACKEND(d);
-
-out:
-    object_unref(d);
-    return NULL;
+    object_unref(be);
+    return be;
 }
 
 AudioBackend *audio_get_default_audio_be(Error **errp)
-- 
2.51.1


Reply via email to