Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
}