gpt4 book ai didi

c - 从 C 代码以 dB 为单位设置 ALSA 主音量

转载 作者:太空狗 更新时间:2023-10-29 11:19:28 26 4
gpt4 key购买 nike

我似乎无法在我的机器上以 dB 为单位设置音量。

我在 VirtualBox 中运行 Ubuntu 13.04 系统(用于开发)。

我按照这些说明转到了 set the volume as scalarcontrol the mute state一切正常。

但是当我尝试使用此功能将其设置为 dB 时

snd_mixer_selem_set_playback_dB_all(elem, volume, 0)

或具有该功能

snd_mixer_selem_set_playback_dB(elem, chn, volume, 0)

它总是失败,错误代码为 -22(无效参数)

在你问之前:我已经尝试了多种音量级别来设置(从 -20000 到 20000)并且我还将最后一个参数更改为三个定义值 [-1, 0, 1]

这是我现在用于测试的完整代码:

#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;
}

正如您在本例中看到的,我尝试自己设置每个 channel ,这与“snd_mixer_selem_set_playback_dB_all”所做的相同,但我想尝试一下,看看是否会得到不同的结果。

这个例子的输出是这样的:

min: 15774463, max: 191

System unmuted.

在我扩大 dB 值范围之前,我测试的输出是:

min: 1, max: 191

也许我在这里遗漏了一些东西......我希望你能帮助我!

编辑:

要编译此脚本,我使用以下命令:

gcc test.c -lasound -o test

最佳答案

我遇到了类似的问题。原因似乎是来自 pulseaudio 的干扰。不过杀起来还是有些困难的。一旦我跑了

mkdir -p ~/.pulse
echo autospawn=no > ~/.pulse/client.conf
killall pulseaudio

pulseaudio 死了,一直死了,而我正在编写的 ALSA 程序能够从混音器中获取 dB 信息。

或者,您可以通过直接与卡片对话来结束 pulseaudio。变化

const char *card = "default";

const char *card = "hw:0";

看看这对你有什么帮助。

关于c - 从 C 代码以 dB 为单位设置 ALSA 主音量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19489343/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com