rendered paste bodyIndex: 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);
+ }
}
}