Esempio n. 1
0
static void
gst_alsa_mixer_update_track (GstAlsaMixer * mixer,
    GstAlsaMixerTrack * alsa_track)
{
  GstMixerTrack *track = (GstMixerTrack *) alsa_track;
  gboolean old_mute;
  gboolean old_record;
  gint i, n_channels;
  gint *old_volumes;

  GST_DEBUG ("Updating track %" GST_PTR_FORMAT, alsa_track);

  if (mixer->interface == NULL) {
    GST_WARNING ("Cannot send update notifications, no GstMixer * given");
    return;
  }

  old_mute = !!(GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MUTE));
  old_record = !!(GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_RECORD));
  old_volumes = g_new (gint, track->num_channels);
  n_channels = track->num_channels;
  memcpy (old_volumes, alsa_track->volumes,
      sizeof (gint) * track->num_channels);

  gst_alsa_mixer_track_update (alsa_track);

  if (old_record !=
      !!(GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_RECORD))) {
    gst_mixer_record_toggled (mixer->interface, track,
        !!GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_RECORD));
  }
  if (old_mute != !!(GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MUTE))) {
    gst_mixer_mute_toggled (mixer->interface, track,
        !!GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MUTE));
  }

  n_channels = MIN (n_channels, track->num_channels);
  for (i = 0; i < n_channels; i++) {
    if (old_volumes[i] != alsa_track->volumes[i]) {
      gst_mixer_volume_changed (mixer->interface, track, alsa_track->volumes);
      break;
    }
  }
  g_free (old_volumes);
}
void
gst_sunaudiomixer_ctrl_set_volume (GstSunAudioMixerCtrl * mixer,
    GstMixerTrack * track, gint * volumes)
{
  gint gain;
  gint balance;
  gint l_real_gain;
  gint r_real_gain;
  float ratio;
  struct audio_info audioinfo;
  GstSunAudioMixerTrack *sunaudiotrack = GST_SUNAUDIO_MIXER_TRACK (track);

  l_real_gain = volumes[0];
  r_real_gain = volumes[1];

  if (l_real_gain == r_real_gain) {
    gain = l_real_gain;
    balance = AUDIO_MID_BALANCE;
  } else if (l_real_gain < r_real_gain) {
    gain = r_real_gain;
    ratio = (float) l_real_gain / (float) r_real_gain;
    balance =
        AUDIO_RIGHT_BALANCE - (int) (ratio * (float) AUDIO_MID_BALANCE + 0.5);
  } else {
    gain = l_real_gain;
    ratio = (float) r_real_gain / (float) l_real_gain;
    balance =
        AUDIO_LEFT_BALANCE + (int) (ratio * (float) AUDIO_MID_BALANCE + 0.5);
  }

  sunaudiotrack->gain = gain;
  sunaudiotrack->balance = balance;

  if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MUTE)) {
    if (sunaudiotrack->track_num == GST_SUNAUDIO_TRACK_OUTPUT) {
      return;
    } else if (gain == 0) {
      return;
    } else {
      /*
       * If the volume is set to a non-zero value for LINE_IN
       * or MONITOR, then unset MUTE.
       */
      track->flags &= ~GST_MIXER_TRACK_MUTE;
    }
  }

  /* Set the volume */
  AUDIO_INITINFO (&audioinfo);

  switch (sunaudiotrack->track_num) {
    case GST_SUNAUDIO_TRACK_OUTPUT:
      audioinfo.play.gain = gain;
      audioinfo.play.balance = balance;
      break;
    case GST_SUNAUDIO_TRACK_RECORD:
      audioinfo.record.gain = gain;
      audioinfo.record.balance = balance;
      break;
    case GST_SUNAUDIO_TRACK_MONITOR:
      audioinfo.monitor_gain = gain;
      audioinfo.record.balance = balance;
      break;
    default:
      break;
  }

  g_return_if_fail (mixer->mixer_fd != -1);

  if (ioctl (mixer->mixer_fd, AUDIO_SETINFO, &audioinfo) < 0) {
    g_warning ("Error setting audio device volume");
    return;
  }
}