[vlc-commits] ALSA: clean up device change a little bit

Rémi Denis-Courmont git at videolan.org
Sun Jul 22 18:03:06 CEST 2012


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Jul 22 19:01:26 2012 +0300| [e18813789fb739ba1b5840bb3704ca087c740d0c] | committer: Rémi Denis-Courmont

ALSA: clean up device change a little bit

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=e18813789fb739ba1b5840bb3704ca087c740d0c
---

 modules/audio_output/alsa.c |   46 ++++++++++++++++++++-----------------------
 1 file changed, 21 insertions(+), 25 deletions(-)

diff --git a/modules/audio_output/alsa.c b/modules/audio_output/alsa.c
index 3c56cec..68dabb4 100644
--- a/modules/audio_output/alsa.c
+++ b/modules/audio_output/alsa.c
@@ -149,23 +149,17 @@ static void DumpDeviceStatus (vlc_object_t *obj, snd_pcm_t *pcm)
 }
 #define DumpDeviceStatus(o, p) DumpDeviceStatus(VLC_OBJECT(o), p)
 
-/**
- * Initializes list of devices.
- */
-static void Probe (vlc_object_t *obj, const char *dev)
+static int DeviceChanged (vlc_object_t *obj, const char *varname,
+                          vlc_value_t prev, vlc_value_t cur, void *data)
 {
-    vlc_value_t text;
-
-    var_Create (obj, "audio-device", VLC_VAR_STRING | VLC_VAR_HASCHOICE);
-    text.psz_string = _("Audio Device");
-    var_Change (obj, "audio-device", VLC_VAR_SETTEXT, &text, NULL);
-
-    GetDevices (obj, NULL, dev);
+    aout_ChannelsRestart (obj, varname, prev, cur, data);
 
-    var_AddCallback (obj, "audio-device", aout_ChannelsRestart, NULL);
+    if (!var_Type (obj, "alsa-audio-device"))
+        var_Create (obj, "alsa-audio-device", VLC_VAR_STRING);
+    var_SetString (obj, "alsa-audio-device", cur.psz_string);
+    return VLC_SUCCESS;
 }
 
-
 static void Play  (audio_output_t *, block_t *);
 static void Pause (audio_output_t *, bool, mtime_t);
 static void PauseDummy (audio_output_t *, bool, mtime_t);
@@ -546,7 +540,18 @@ static int Open (vlc_object_t *obj)
     }
     aout->pf_flush = Flush;
 
-    Probe (obj, device);
+    /* Setup audio-device choices */
+    {
+        vlc_value_t text;
+
+        var_Create (obj, "audio-device", VLC_VAR_STRING | VLC_VAR_HASCHOICE);
+        text.psz_string = _("Audio Device");
+        var_Change (obj, "audio-device", VLC_VAR_SETTEXT, &text, NULL);
+
+        GetDevices (obj, NULL, device);
+    }
+    var_AddCallback (obj, "audio-device", DeviceChanged, NULL);
+
     free (device);
     return 0;
 
@@ -686,18 +691,9 @@ static void Close (vlc_object_t *obj)
     aout_sys_t *sys = aout->sys;
     snd_pcm_t *pcm = aout->sys->pcm;
 
-    /* FIXME: ugly hack so selected ALSA device survives restart */
-    char *device = var_InheritString (obj, "audio-device");
-    if (device != NULL)
-    {
-        if (!var_Type (obj, "alsa-audio-device"))
-            var_Create (obj, "alsa-audio-device", VLC_VAR_STRING);
-        var_SetString (obj, "alsa-audio-device", device);
-        free (device);
-    }
-
-    var_DelCallback (obj, "audio-device", aout_ChannelsRestart, NULL);
+    var_DelCallback (obj, "audio-device", DeviceChanged, NULL);
     var_Destroy (obj, "audio-device");
+
     snd_pcm_drop (pcm);
     snd_pcm_close (pcm);
     free (sys);



More information about the vlc-commits mailing list