2013-02-07 75 views
0

我一直在通过adb外壳在Android设备上运行的本机linux程序中捕获音频。因为我似乎只得到(非常安静)的噪音,即没有实际的信号(有趣的是,一个类似的Android/Java程序没有显示有输入信号),我执行了alsa_amixer,它有一个条目看起来像是正确的:ALSA - 取消静音设备?

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] 

“off”。这将解释噪音。 因此,我查找了如何使用alsa_amixer取消静音通道的示例,我发现了诸如“49%上”或“49%取消静音”等参数的不同建议,或者只是“取消静音”,其中任何一个都不起作用。 (如果音量%被省略,则表示“无效的命令!”,否则,音量被设置,但开启/取消静音被忽略)

我还搜索了如何以编程方式做到这一点需要做,虽然手动方法现在会有所帮助),但在那里并不算太幸运。 我发现这听起来像这样的唯一的ALSA lib命令是“snd_mixer_selem_set_capture_switch_all”,但文档没有一天参数(1/0不打开/关闭,我试过;))

+0

这都适用于普通的Linux。也许Android有一个残缺的alsa构建。 –

+0

... set_capture_switch_all? 我把它叫做“Capture”,其值为1. 程序崩溃了,我把它作为控制台输出: ALSA lib external/alsa-lib/src/conf.c:4487:(parse_args)未知参数1,ALSA lib external/alsa-lib/src/conf.c:4620:(snd_config_expand)解析参数错误:无此文件或目录, ALSA lib external/alsa-lib/src/control/control.c:902(snd_ctl_open_noupdate ) CTL hw无效:0,0 – user1847129

+0

[This here program](http://pastebin.com/index/9HZFC9dJ)适用于我。 –

回答

0

通过alsa_amixer设置这些东西的手动方法确实有效 - 但只有当android是使用'BoardConfigCommon.mk'修改的,在条目:BOARD_USES_ALSA_AUDIO:= false而不是true时才生成。

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

给你的android程序员在那里,请注意,这是一个非常利基的用例,当然,这是我的原始文章的预期开始。 这不是大多数人想要做的。 我只是碰巧用不寻常的方式在这里的Android设备;-)

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