Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16367
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-24 23:21
文章分类
文章存档

2015年(5)

我的朋友

分类: LINUX

2015-05-07 10:34:13

原文地址:Alsa音量控制 作者:laoyouji

在alsa编程中,要控制声卡首先要做好初始化工作,简单实例如下:
snd_mixer_t *mixerFd;
snd_mixer_elem_t *elem;
int result;
// 打开混音器
 if ((result = snd_mixer_open( &mixerFd, 0)) < 0)
 {
        qWarning()<<"snd_mixer_open error"<< result;
        mixerFd = NULL;
 }
// Attach an HCTL to an opened mixer
 if ((result = snd_mixer_attach( mixerFd, "default")) < 0)
 {
        qWarning()<<"snd_mixer_attach error"<< result;
        snd_mixer_close(mixerFd);
        mixerFd = NULL;
 }
// 注册混音器
 if ((result = snd_mixer_selem_register( mixerFd, NULL, NULL)) < 0)
{
        qWarning()<<"snd_mixer_selem_register error"<         snd_mixer_close(mixerFd);
        mixerFd = NULL;
}
// 加载混音器
if ((result = snd_mixer_load( mixerFd)) < 0)
{
        qWarning()<<"snd_mixer_load error"<         snd_mixer_close(mixerFd);
        mixerFd = NULL;
}
Ok, 到现在准备工作已经完成. 下面找到具体的混音器元素,就可以控制音量了, Alsa编程的确很简单.
   // 遍历混音器元素
    for(elem=snd_mixer_first_elem(mixerFd); elem; elem=snd_mixer_elem_next(elem))
    {
        if (snd_mixer_elem_get_type(elem) == SND_MIXER_ELEM_SIMPLE &&
             snd_mixer_selem_is_active(elem)) // 找到可以用的, 激活的elem
        {
            if(
QString(snd_mixer_selem_get_name(elem)) == "Master")
            {
                snd_mixer_selem_get_playback_volume_range(elem, &minVolume, &maxVolume);
                snd_mixer_selem_set_playback_volume_all(elem, (long)50); // 设置音量为50
            }
        }
    }
最后,要说明的是,
在音量设置前, 需要检测对应的elem是否具有volume control, 具体方法:snd_mixer_selem_has_playback_volume(), 然后再配合音量设置方法snd_mixer_selem_set_playback_volume_all()进行音量控制, 当音量参数超出其范围时, 音量设置将失败.
阅读(4613) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~