All pastes #979619 Raw Edit

Stuff

public text v1 · immutable
·published 2008-04-10 14:03 UTC
rendered paste body
Index: gstalsamixertrack.c
===================================================================
RCS file: /cvs/gstreamer/gst-plugins-base/ext/alsa/gstalsamixertrack.c,v
retrieving revision 1.18
diff -u -p -r1.18 gstalsamixertrack.c
--- gstalsamixertrack.c	3 Mar 2008 06:03:44 -0000	1.18
+++ gstalsamixertrack.c	10 Apr 2008 14:01:46 -0000
@@ -75,28 +75,40 @@ gst_alsa_mixer_track_update_alsa_capabil
   alsa_track->alsa_flags = 0;
   alsa_track->capture_group = -1;
 
+  /* common flags */
   if (snd_mixer_selem_has_common_volume (alsa_track->element))
     alsa_track->alsa_flags |= GST_ALSA_MIXER_TRACK_VOLUME;
 
-  if (snd_mixer_selem_has_playback_volume (alsa_track->element))
-    alsa_track->alsa_flags |= GST_ALSA_MIXER_TRACK_PVOLUME;
-
-  if (snd_mixer_selem_has_capture_volume (alsa_track->element))
-    alsa_track->alsa_flags |= GST_ALSA_MIXER_TRACK_CVOLUME;
-
   if (snd_mixer_selem_has_common_switch (alsa_track->element))
     alsa_track->alsa_flags |= GST_ALSA_MIXER_TRACK_SWITCH;
 
-  if (snd_mixer_selem_has_playback_switch (alsa_track->element))
-    alsa_track->alsa_flags |= GST_ALSA_MIXER_TRACK_PSWITCH;
-
-  if (snd_mixer_selem_has_capture_switch (alsa_track->element)) {
-    alsa_track->alsa_flags |= GST_ALSA_MIXER_TRACK_CSWITCH;
-
-    if (snd_mixer_selem_has_capture_switch_exclusive (alsa_track->element)) {
-      alsa_track->alsa_flags |= GST_ALSA_MIXER_TRACK_CSWITCH_EXCL;
-      alsa_track->capture_group =
-          snd_mixer_selem_get_capture_group (alsa_track->element);
+  /* Since we create two separate mixer track objects for alsa elements that
+   * support both playback and capture, we're going to 'hide' the alsa flags
+   * that don't pertain to this mixer track from alsa_flags, otherwise
+   * gst_alsa_mixer_track_update() is going to do things we don't want */
+
+  /* playback flags */
+  if ((GST_MIXER_TRACK (alsa_track)->flags & GST_MIXER_TRACK_OUTPUT)) {
+    if (snd_mixer_selem_has_playback_volume (alsa_track->element))
+      alsa_track->alsa_flags |= GST_ALSA_MIXER_TRACK_PVOLUME;
+
+    if (snd_mixer_selem_has_playback_switch (alsa_track->element))
+      alsa_track->alsa_flags |= GST_ALSA_MIXER_TRACK_PSWITCH;
+  }
+
+  /* capture flags */
+  if ((GST_MIXER_TRACK (alsa_track)->flags & GST_MIXER_TRACK_INPUT)) {
+    if (snd_mixer_selem_has_capture_volume (alsa_track->element))
+      alsa_track->alsa_flags |= GST_ALSA_MIXER_TRACK_CVOLUME;
+
+    if (snd_mixer_selem_has_capture_switch (alsa_track->element)) {
+      alsa_track->alsa_flags |= GST_ALSA_MIXER_TRACK_CSWITCH;
+
+      if (snd_mixer_selem_has_capture_switch_exclusive (alsa_track->element)) {
+        alsa_track->alsa_flags |= GST_ALSA_MIXER_TRACK_CSWITCH_EXCL;
+        alsa_track->capture_group =
+            snd_mixer_selem_get_capture_group (alsa_track->element);
+      }
     }
   }