ext/alsa/gstalsamixer.c: Fix for cases where we fail to attach to a mixer.
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>
Sun, 16 May 2004 20:46:12 +0000 (20:46 +0000)
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>
Sun, 16 May 2004 20:46:12 +0000 (20:46 +0000)
Original commit message from CVS:
* ext/alsa/gstalsamixer.c: (gst_alsa_mixer_open),
(gst_alsa_mixer_close), (gst_alsa_mixer_supported),
(gst_alsa_mixer_build_list), (gst_alsa_mixer_free_list),
(gst_alsa_mixer_change_state), (gst_alsa_mixer_list_tracks),
(gst_alsa_mixer_get_volume), (gst_alsa_mixer_set_volume),
(gst_alsa_mixer_set_mute), (gst_alsa_mixer_set_record):
Fix for cases where we fail to attach to a mixer.

ChangeLog
ext/alsa/gstalsamixer.c

index ddcab1f..929e7e4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2004-05-16  Ronald Bultje  <rbultje@ronald.bitfreak.net>
 
+       * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_open),
+       (gst_alsa_mixer_close), (gst_alsa_mixer_supported),
+       (gst_alsa_mixer_build_list), (gst_alsa_mixer_free_list),
+       (gst_alsa_mixer_change_state), (gst_alsa_mixer_list_tracks),
+       (gst_alsa_mixer_get_volume), (gst_alsa_mixer_set_volume),
+       (gst_alsa_mixer_set_mute), (gst_alsa_mixer_set_record):
+         Fix for cases where we fail to attach to a mixer.
+
+2004-05-16  Ronald Bultje  <rbultje@ronald.bitfreak.net>
+
        * gst-libs/gst/riff/riff-read.c: (gst_riff_read_seek):
          Don't touch events after not owning them anymore.
        * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init),
index b18a728..12f6769 100644 (file)
@@ -132,19 +132,25 @@ gst_alsa_mixer_open (GstAlsaMixer * mixer)
 {
   gint err, device;
   GstAlsa *alsa = GST_ALSA (mixer);
-  gchar *nocomma;
+  gchar *nocomma = NULL;
 
-  mixer->mixer_handle = (snd_mixer_t *) - 1;
+  mixer->mixer_handle = NULL;
 
   /* open and initialize the mixer device */
   err = snd_mixer_open (&mixer->mixer_handle, 0);
   if (err < 0 || mixer->mixer_handle == NULL) {
     GST_ERROR_OBJECT (GST_OBJECT (mixer), "Cannot open mixer device.");
-    mixer->mixer_handle = (snd_mixer_t *) - 1;
+    mixer->mixer_handle = NULL;
     return FALSE;
   }
 
-  nocomma = g_strdup (alsa->device);
+  if (!strncmp (alsa->device, "hw:", 3))
+    nocomma = g_strdup (alsa->device);
+  else if (!strncmp (alsa->device, "plughw:", 7))
+    nocomma = g_strdup (alsa->device + 4);
+  else
+    goto error;
+
   if (strchr (nocomma, ','))
     strchr (nocomma, ',')[0] = '\0';
 
@@ -179,7 +185,7 @@ gst_alsa_mixer_open (GstAlsaMixer * mixer)
 
 error:
   snd_mixer_close (mixer->mixer_handle);
-  mixer->mixer_handle = (snd_mixer_t *) - 1;
+  mixer->mixer_handle = NULL;
   g_free (nocomma);
   return FALSE;
 }
@@ -189,7 +195,7 @@ gst_alsa_mixer_close (GstAlsaMixer * mixer)
 {
   GstAlsa *alsa = GST_ALSA (mixer);
 
-  if (((gint) mixer->mixer_handle) == -1)
+  if (mixer->mixer_handle == NULL)
     return;
 
   if (alsa->cardname) {
@@ -197,7 +203,7 @@ gst_alsa_mixer_close (GstAlsaMixer * mixer)
     alsa->cardname = NULL;
   }
   snd_mixer_close (mixer->mixer_handle);
-  mixer->mixer_handle = (snd_mixer_t *) - 1;
+  mixer->mixer_handle = NULL;
 }
 
 static void
@@ -224,7 +230,7 @@ gst_alsa_mixer_supported (GstImplementsInterface * iface, GType iface_type)
 {
   g_assert (iface_type == GST_TYPE_MIXER);
 
-  return (((gint) GST_ALSA_MIXER (iface)->mixer_handle) != -1);
+  return (GST_ALSA_MIXER (iface)->mixer_handle != NULL);
 }
 
 static void
@@ -236,7 +242,7 @@ gst_alsa_mixer_build_list (GstAlsaMixer * mixer)
   const GList *templates;
   GstPadDirection dir = GST_PAD_UNKNOWN;
 
-  g_return_if_fail (((gint) mixer->mixer_handle) != -1);
+  g_return_if_fail (mixer->mixer_handle != NULL);
 
   /* find direction */
   templates =
@@ -291,7 +297,7 @@ gst_alsa_mixer_build_list (GstAlsaMixer * mixer)
 static void
 gst_alsa_mixer_free_list (GstAlsaMixer * mixer)
 {
-  g_return_if_fail (((gint) mixer->mixer_handle) != -1);
+  g_return_if_fail (mixer->mixer_handle != NULL);
 
   g_list_foreach (mixer->tracklist, (GFunc) g_object_unref, NULL);
   g_list_free (mixer->tracklist);
@@ -310,13 +316,14 @@ gst_alsa_mixer_change_state (GstElement * element)
 
   switch (GST_STATE_TRANSITION (element)) {
     case GST_STATE_NULL_TO_READY:
-      if (!gst_alsa_mixer_open (this))
-        return GST_STATE_FAILURE;
-      gst_alsa_mixer_build_list (this);
+      if (gst_alsa_mixer_open (this))
+        gst_alsa_mixer_build_list (this);
       break;
     case GST_STATE_READY_TO_NULL:
-      gst_alsa_mixer_free_list (this);
-      gst_alsa_mixer_close (this);
+      if (this->mixer_handle != NULL) {
+        gst_alsa_mixer_free_list (this);
+        gst_alsa_mixer_close (this);
+      }
       break;
     default:
       break;
@@ -335,7 +342,8 @@ gst_alsa_mixer_list_tracks (GstMixer * mixer)
 {
   GstAlsaMixer *alsa_mixer = GST_ALSA_MIXER (mixer);
 
-  g_return_val_if_fail (((gint) alsa_mixer->mixer_handle) != -1, NULL);
+  if (!alsa_mixer->mixer_handle)
+    return NULL;
 
   return (const GList *) alsa_mixer->tracklist;
 }
@@ -348,7 +356,7 @@ gst_alsa_mixer_get_volume (GstMixer * mixer,
   GstAlsaMixer *alsa_mixer = GST_ALSA_MIXER (mixer);
   GstAlsaMixerTrack *alsa_track = (GstAlsaMixerTrack *) track;
 
-  g_return_if_fail (((gint) alsa_mixer->mixer_handle) != -1);
+  g_return_if_fail (alsa_mixer->mixer_handle != NULL);
 
   if (track->flags & GST_MIXER_TRACK_MUTE) {
     for (i = 0; i < track->num_channels; i++)
@@ -376,7 +384,7 @@ gst_alsa_mixer_set_volume (GstMixer * mixer,
   GstAlsaMixer *alsa_mixer = GST_ALSA_MIXER (mixer);
   GstAlsaMixerTrack *alsa_track = (GstAlsaMixerTrack *) track;
 
-  g_return_if_fail (((gint) alsa_mixer->mixer_handle) != -1);
+  g_return_if_fail (alsa_mixer->mixer_handle != NULL);
 
   /* only set the volume with ALSA lib if the track isn't muted. */
   if (!(track->flags & GST_MIXER_TRACK_MUTE)) {
@@ -401,7 +409,7 @@ gst_alsa_mixer_set_mute (GstMixer * mixer, GstMixerTrack * track, gboolean mute)
   GstAlsaMixer *alsa_mixer = GST_ALSA_MIXER (mixer);
   GstAlsaMixerTrack *alsa_track = (GstAlsaMixerTrack *) track;
 
-  g_return_if_fail (((gint) alsa_mixer->mixer_handle) != -1);
+  g_return_if_fail (alsa_mixer->mixer_handle != NULL);
 
   if (mute) {
     track->flags |= GST_MIXER_TRACK_MUTE;
@@ -432,7 +440,7 @@ gst_alsa_mixer_set_record (GstMixer * mixer,
 {
   GstAlsaMixer *alsa_mixer = GST_ALSA_MIXER (mixer);
 
-  g_return_if_fail (((gint) alsa_mixer->mixer_handle) != -1);
+  g_return_if_fail (alsa_mixer->mixer_handle != NULL);
 
   if (record) {
     track->flags |= GST_MIXER_TRACK_RECORD;