0

我一直在尝试通过 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”,或者只是“unmute”,这些都不起作用。(如果省略音量百分比,则显示“无效命令!”,否则,设置音量,但忽略开启/取消静音)

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

4

2 回答 2

0

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

是的,这可能会禁用 ALSA for android,这就是它不再干预混音器设置的原因。

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

于 2013-02-11T10:18:13.703 回答
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);
}
于 2013-05-23T21:16:37.090 回答