static void gst_alsa_mixer_update (GstAlsaMixer * mixer, snd_mixer_elem_t * elem) { GList *item; g_return_if_fail (mixer != NULL); g_static_rec_mutex_lock (mixer->rec_mutex); for (item = mixer->tracklist; item != NULL; item = item->next) { if (GST_IS_ALSA_MIXER_TRACK (item->data)) { if (elem && (GST_ALSA_MIXER_TRACK (item->data)->element != elem)) continue; gst_alsa_mixer_update_track (mixer, GST_ALSA_MIXER_TRACK (item->data)); } else if (GST_IS_ALSA_MIXER_OPTIONS (item->data)) { if (elem && (GST_ALSA_MIXER_OPTIONS (item->data)->element != elem)) continue; gst_alsa_mixer_update_option (mixer, GST_ALSA_MIXER_OPTIONS (item->data)); } } g_static_rec_mutex_unlock (mixer->rec_mutex); }
void gst_alsa_mixer_set_record (GstAlsaMixer * mixer, GstMixerTrack * track, gboolean record) { GstAlsaMixerTrack *alsa_track = GST_ALSA_MIXER_TRACK (track); g_return_if_fail (mixer->handle != NULL); g_static_rec_mutex_lock (mixer->rec_mutex); gst_alsa_mixer_track_update (alsa_track); if (!!(record) == !!(track->flags & GST_MIXER_TRACK_RECORD)) { g_static_rec_mutex_unlock (mixer->rec_mutex); return; } if (record) { track->flags |= GST_MIXER_TRACK_RECORD; } else { track->flags &= ~GST_MIXER_TRACK_RECORD; } if (alsa_track->alsa_flags & GST_ALSA_MIXER_TRACK_CSWITCH) { snd_mixer_selem_set_capture_switch_all (alsa_track->element, record ? 1 : 0); /* update all tracks in same exlusive cswitch group */ if (alsa_track->alsa_flags & GST_ALSA_MIXER_TRACK_CSWITCH_EXCL) { GList *item; for (item = mixer->tracklist; item != NULL; item = item->next) { if (GST_IS_ALSA_MIXER_TRACK (item->data)) { GstAlsaMixerTrack *item_alsa_track = GST_ALSA_MIXER_TRACK (item->data); if (item_alsa_track->alsa_flags & GST_ALSA_MIXER_TRACK_CSWITCH_EXCL && item_alsa_track->capture_group == alsa_track->capture_group) { gst_alsa_mixer_track_update (item_alsa_track); } } } } } else { gint i; for (i = 0; i < track->num_channels; i++) { long vol = record ? alsa_track->volumes[i] : track->min_volume; snd_mixer_selem_set_capture_volume (alsa_track->element, i, vol); } } g_static_rec_mutex_unlock (mixer->rec_mutex); }