【问题标题】:ALSA - unmuting devices?ALSA - 取消静音设备?
【发布时间】:2013-01-23 08:10:57
【问题描述】:

我一直在尝试通过 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 不是开/关,我试过了;))

【问题讨论】:

  • 这一切都适用于常规 Linux。也许 Android 有一个残废的 alsa 版本。
  • ...set_capture_switch_all ?我将其称为“Capture”,值为 1。程序崩溃,我将其作为控制台输出:ALSA lib external/alsa-lib/src/conf.c:4487:(parse_args) Unknown parameter 1, ALSA lib external/ alsa-lib/src/conf.c:4620:(snd_config_expand) Parse arguments error: No such file or directory, ALSA lib external/alsa-lib/src/control/control.c:902(snd_ctl_open_noupdate) Invalid CTL hw:0 ,0
  • This here program 为我工作。
  • 啊,谢谢!如果我设置为 1,它现在是 [on],当使用“默认”设备时,“hw:0,0”会导致崩溃,为什么?显然仍然没有得到有意义的输入,所以搜索继续......好吧,因为标题是关于取消静音设备的,所以它已经回答了 - 我应该回答自己发布您的代码,以便能够将此问题标记为“已回答”吗?
  • 顺便说一句,我不能使用“默认”设备进行录制 - 它只会让我设置 POT + 帧大小的缓冲区大小,例如而不是 16384,我只会得到 16386,而播放通道则相反,但我需要两者相同。这是一个相当奇怪的驱动程序......

标签: android linux audio alsa


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    只是按照提问者的建议发布代码,也不喜欢外部链接。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-13
      • 2023-03-21
      • 2012-04-30
      • 2021-10-29
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多