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; } }