我一直在尝试通过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没有打开/关闭,我试过了;))
答案 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);
}