/* Gets mixer volume with given type, if left and right channel volume differ, * then gives the larger one. * In case of an error returns "-1". */ void get_vol(snd_mixer_elem_t* elem, enum Volume_type volume_type, long int* vol) { long int l, r; if (volume_type == hardware) { // TODO: check return value (int) for errors snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_FRONT_LEFT, &l); snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_FRONT_RIGHT, &r); } else if (volume_type == decibels) { // TODO: check return value (int) for errors snd_mixer_selem_get_playback_dB(elem, SND_MIXER_SCHN_FRONT_LEFT, &l); snd_mixer_selem_get_playback_dB(elem, SND_MIXER_SCHN_FRONT_RIGHT, &r); } else if (volume_type == alsa_percentage) { double l_norm = get_normalized_playback_volume(elem, SND_MIXER_SCHN_FRONT_LEFT); double r_norm = get_normalized_playback_volume(elem, SND_MIXER_SCHN_FRONT_RIGHT); PD_M("Got alsa_percentage volumes: %g, %g\n", l_norm, r_norm); l = lround(l_norm*100); r = lround(r_norm*100); } else if (volume_type == hardware_percentage) { long int min, max; snd_mixer_selem_get_playback_volume_range(elem, &min, &max); snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_FRONT_LEFT, &l); snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_FRONT_RIGHT, &r); long int vol_to_percentage = l >= r ? l : r; change_range(&vol_to_percentage, min, max, 0, 100, false); *vol = vol_to_percentage; return; } else { // Error l = -1; r = -1; } *vol = l >= r ? l : r; PD_M("get_vol returns: %li\n", *vol); }
/* Set volume with given volume_type. * round_direction: >0 to round up, <0 to round down, 0 to use default lrint * rounding direction (see fsetround(3)).*/ void set_vol( snd_mixer_elem_t* elem, enum Volume_type volume_type, long int new_vol, int round_direction) { // TODO: possibly add new_vol range check int err = 0; if (volume_type == hardware) { err = snd_mixer_selem_set_playback_volume_all(elem, new_vol); } else if (volume_type == decibels) { err = snd_mixer_selem_set_playback_dB_all(elem, new_vol, round_direction); } else if (volume_type == alsa_percentage) { double new_vol_norm = (double) new_vol / 100; PD_M("Setting alsa_percentage volume: %g\n", new_vol_norm); err = set_normalized_playback_volume(elem, SND_MIXER_SCHN_FRONT_LEFT, new_vol_norm, round_direction); if (err == 0) { err = set_normalized_playback_volume(elem, SND_MIXER_SCHN_FRONT_RIGHT, new_vol_norm, round_direction); } } else if (volume_type == hardware_percentage) { long int min, max; snd_mixer_selem_get_playback_volume_range(elem, &min, &max); change_range(&new_vol, 0, 100, min, max, false); err = snd_mixer_selem_set_playback_volume_all(elem, new_vol); } else { fprintf(stderr, "avolt ERROR: set_vol: Unknown volume_type '%i'.\n", volume_type); err = -1; } if (err != 0) { fprintf(stderr, "avolt ERROR: snd mixer set playback volume failed with new vol '%li' and volume type '%i'.\n", new_vol, volume_type); } }
void MGSBRepVecTP::change_range( bool along_u, //the objective range is along u parameter or v. const MGInterval& prange ){ change_range(along_u,prange[0].value(), prange[1].value()); }