我似乎无法在我的机器上以dB为单位设置音量。
我在VirtualBox中运行Ubuntu 13.04系统(用于开发)。
我按照这些说明将音量设置为标量,并控制静音状态 ,一切正常。
但是,当我尝试使用此function以dB为单位进行设置时
snd_mixer_selem_set_playback_dB_all(elem,音量,0)
或与该function
snd_mixer_selem_set_playback_dB(elem,chn,音量,0)
它总是失败,错误代码-22 (无效的参数)
在问你之前:我已经试过了很多的音量设置(从-20000到20000),我也把最后一个参数改成了三个定义的值[-1,0,1]
这里是我现在testing的完整代码:
#include <alsa/asoundlib.h> #include <stdbool.h> #include <stdlib.h> void SetAlsaMasterVolume(long volume) { long min, max; snd_mixer_t *handle; snd_mixer_selem_id_t *sid; const char *card = "default"; const char *selem_name = "Master"; int x, mute_state; long i; snd_mixer_open(&handle, 0); snd_mixer_attach(handle, card); snd_mixer_selem_register(handle, NULL, NULL); snd_mixer_load(handle); snd_mixer_selem_id_alloca(&sid); snd_mixer_selem_id_set_index(sid, 0); snd_mixer_selem_id_set_name(sid, selem_name); snd_mixer_elem_t* elem = snd_mixer_find_selem(handle, sid); //snd_mixer_selem_get_playback_volume_range(elem, &min, &max); //snd_mixer_selem_set_playback_volume_all(elem, volume * max / 100); snd_mixer_selem_get_playback_dB_range(elem, &min, &max); printf("min: %ld, max: %ld\n", min, max); snd_mixer_selem_channel_id_t chn; for (chn = 0; chn < 32; chn++) { for (i = -1000; i <= 1000; i++) if (x = snd_mixer_selem_set_playback_dB(elem, chn, i, 0)) { ;//printf("%d: %d %s\n", chn, x, snd_strerror(x)); } else { printf("Volume successfully set in dB!\n"); } } if (snd_mixer_selem_has_playback_switch(elem)) { snd_mixer_selem_set_playback_switch_all(elem, true); snd_mixer_selem_get_playback_switch(elem, 0, &mute_state); if (!mute_state) { printf("System Muted.\n"); } else { printf("System unmuted.\n"); } } snd_mixer_close(handle); } int main() { SetAlsaMasterVolume(100); return 0; }
正如你所看到的,在这个例子中,我尝试着自己设置每个通道,这和“snd_mixer_selem_set_playback_dB_all”是一样的,但是我想试试看是否得到不同的结果。
这个例子的输出如下所示:
分钟:15774463,最大:191
系统取消静音。
贝福我扩大了我testing的dB值的范围输出是:
分钟:1,最大:191
也许我在这里失去了一些东西…我希望你能帮助我!
编辑:
要编译这个脚本,我使用下面的命令:
gcc test.c -lasound -otesting
我遇到了类似的问题。 原因似乎是来自pulseaudio的干扰。 尽管如此,杀死有点困难。 一旦我跑了
mkdir -p ~/.pulse echo autospawn=no > ~/.pulse/client.conf killall pulseaudio
pulseaudio死了,并保持死亡,我写的ALSA程序能够从调音台获得dB信息。
或者,你可以通过直接与卡交谈来完成周围的音频信号。 更改
const char *card = "default";
至
const char *card = "hw:0";
看看你做了什么