首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Alsa混频器和GtkVolumeButton

Alsa混频器和GtkVolumeButton
EN

Stack Overflow用户
提问于 2013-01-29 18:26:59
回答 1查看 852关注 0票数 0

我编写代码来获取和设置alsa混音器音量:

代码语言:javascript
复制
snd_mixer_elem_t *elem = NULL;
long alsa_min, alsa_max, alsa_vol;

int alsa_get_volume( void )
{
    long val;
    assert (elem);

    if (snd_mixer_selem_is_playback_mono(elem)) {
        snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_MONO, &val);
        return val;
    } else {
        int c, n = 0;
        long sum = 0;
        for (c = 0; c <= SND_MIXER_SCHN_LAST; c++) {
                if (snd_mixer_selem_has_playback_channel(elem, c)) {
                        snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_FRONT_LEFT, &val);
                        sum += val;
                        n++;
                }
        }
        if (! n) {
                return 0;
        }
        val = sum / n;
        sum = (long)((double)(alsa_vol * (alsa_max - alsa_min)) / 100. + 0.5);
        if (sum != val) {
           alsa_vol = (long)(((val * 100.) / (alsa_max - alsa_min)) + 0.5);
        }
        return alsa_vol;
    }
}

int alsa_set_volume( int percentdiff )
{
    long volume;

    alsa_get_volume();

    alsa_vol += percentdiff;
    if( alsa_vol > 100 ) alsa_vol = 100;
    if( alsa_vol < 0 ) alsa_vol = 0;

    volume = (long)((alsa_vol * (alsa_max - alsa_min) / 100.) + 0.5);

    snd_mixer_selem_set_playback_volume_all(elem, volume + alsa_min);
    snd_mixer_selem_set_playback_switch_all(elem, 1);
    muted = 0;
    mutecount = 0;

    return alsa_vol;
}

我不会使alsa混音器的音量由GtkVolumeButton改变。尝试过,但当gtk按钮的值向上或向下更改时,alsa混音器总是跳到100%:

代码语言:javascript
复制
int gtk_volume_button_get_value (GtkWidget *button)
{
    return (int) (gtk_scale_button_get_value(GTK_SCALE_BUTTON(button)) * 100);
}

void gtk_volume_button_set_value (GtkWidget *button, int value)
{
    gtk_scale_button_set_value(GTK_SCALE_BUTTON(button), (gdouble) value / 100);
}

void volume_value_changed_cb(GtkVolumeButton *button, gpointer user_data)
{
    int vol = (int)(gtk_volume_button_get_value(volume_button) + 0.5);

    alsa_set_volume(vol);
}

请帮我写一个GtkVolumeButton的纠错代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-29 23:02:20

您的问题与GtkVolume无关。事实上,它来自于你使用两种不同的方法来处理音量。alsa_get_volume为您提供了一个绝对音量,它是一个整数。可以预期alsa_set_volume会接受相同的值范围。这就是如何在volume_value_changed_cb中使用它:«获取音量控件的音量级别,介于0和100之间,并将其设置为当前音量。»。

然而,实现是完全不同的。它的实现方式就像你想告诉它“增加或减少当前音量的x%”一样。你得到当前的音量水平并加上这个百分比,因此你计算的是一个相对的声音水平,而不是一个绝对的声音水平。所以,如果你的初始音量是50%,而你又想把它降到45%,你应该会打电话给alsa_set_volume (45)。但目前,调用alsa_set_volume (45)会将alsa_vol设置为50 + 45 = 95%。

所以你需要使用绝对体积,而不是相对体积。

代码语言:javascript
复制
/* newvol: Desired volume level in the [0;100] range */
int alsa_set_volume (int newvol)
{
    long volume;

    alsa_vol = CLAMP(absvol, 0, 100);

    volume = (long)((alsa_vol * (alsa_max - alsa_min) / 100.) + alsa_min);

    snd_mixer_selem_set_playback_volume_all(elem, volume);
    snd_mixer_selem_set_playback_switch_all(elem, 1);
    muted = 0;
    mutecount = 0;

    return alsa_vol;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14580720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档