ALSA - 取消静音设备?

时间:2013-02-07 17:54:33

标签: android linux audio alsa

我一直在尝试通过adb shell在Android设备上运行的原生linux程序中捕获音频。

因为我似乎只得到(非常安静)噪音,即没有实际信号(有趣的是,类似的Android / Java程序确实表明该输入上有信号), 我执行了alsa_amixer,它有一个看起来像右边的条目:

Simple mixer control 'Capture',0
  Capabilities: cvolume cswitch penum
  Capture channels: Front Left - Front Right
  Limits: Capture 0 - 63
  Front Left: Capture 31 [49%] [0.00dB] [off]
  Front Right: Capture 31 [49%] [0.00dB] [off]

“关”。这可以解释噪音。 所以我查找了如何使用alsa_amixer来取消静音通道的示例,我找到了对“49%on”或“49%unmute”等参数的不同建议,或者只是“取消静音”没有一个有效。 (如果省略了音量%,则显示“无效命令!”,否则,音量设置,但忽略开启/取消静音)

我还搜索了如何以编程方式执行此操作(我最终需要这样做,尽管手动方法现在会有所帮助),但在那里并不太幸运。 我找到的唯一一个ALSA lib命令听起来像它可以做的那样是“snd_mixer_selem_set_capture_switch_all”,但文档不是参数的日子(1/0没有打开/关闭,我试过了;))

2 个答案:

答案 0 :(得分:0)

通过alsa_amixer设置这些东西的手动方法确实有效 - 但是只有在修改了'BoardConfigCommon.mk'的情况下修改了android,在条目:BOARD_USES_ALSA_AUDIO:= false,而不是true。

是的,这可能会禁用Android的ALSA,这就是为什么它不再干扰混音器设置了。

对于你那里的android程序员,请注意,这当然是一个非常小众的用例,正如我原来的帖子所期望的那样。 这不是大多数人想要做的。 我碰巧在这里以不寻常的方式修补了一个Android设备; - )

答案 1 :(得分:0)

只是将代码发布为问题提供者建议,也不喜欢外部链接。

#include <alsa/asoundlib.h>


int main()
{
    snd_mixer_t *handle;
    snd_mixer_selem_id_t *sid;

    snd_mixer_open(&handle, 0);
    snd_mixer_attach(handle, "default");
    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, "Capture");
    snd_mixer_elem_t* elem = snd_mixer_find_selem(handle, sid);

    snd_mixer_selem_set_capture_switch_all(elem, 0);
    snd_mixer_selem_set_capture_dB_all(elem, 0, 0);

    snd_mixer_close(handle);
}