コード例 #1
0
ファイル: volume_change.c プロジェクト: wor/avolt
/* 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);
}
コード例 #2
0
ファイル: volume_change.c プロジェクト: wor/avolt
/* 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);
    }
}
コード例 #3
0
ファイル: MGSBRepVecTP.cpp プロジェクト: zephyrer/mgcl
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());
}