【问题标题】:Android alsa snd_pcm_open default no such file o directoryAndroid alsa snd_pcm_open default no such file o directory
【发布时间】:2013-10-27 01:42:31
【问题描述】:

我尝试为 Android 实现 baresip,它使用自定义 alsa 模块来控制音频设备。

此模块使用此代码来打开设备处理程序:

err = snd_pcm_open(&st->write, device, SND_PCM_STREAM_PLAYBACK, 0);

我尝试将 'default'、'plug:hw:0,0'、'hw:0,0'、'hw:00,0' 传递给此函数。所有结果都返回错误-2,表示没有这个文件。

我有两个问题。是否有可能将一些字符串传递给此函数以正确处理音频设备?而且一般来说,使用这个功能直接从jni与音频设备交互是真的吗?

谢谢大家!

【问题讨论】:

    标签: android c android-ndk alsa baresip


    【解决方案1】:

    您只能在有根设备的 Android 中使用 ALSA。

    如果您想在现有设备上播放本机代码中的音频,您至少有两种选择:

    1. 使用官方稳定API:OpenSL ES(这需要Android 2.3+版本)
    2. Android 有一个原生的 OpenAL 实现,它使用 JNI 调用 Java AudioTrack: https://github.com/AerialX/openal-soft-android(这将适用于 Android 2.1+ 版本)

    我建议仅在您拥有需要移植到 Android 的现有代码时使用OpenAL,或者由于某种原因您必须支持 Android 2.1 版。在其他情况下,OpenSL ES 是正确的选择。

    【讨论】:

    • 你知道吗,OpenAL 实现中是否有类似 snd_pcm_writei 的函数?
    • 不,OpenAL 不同。查看alBufferData() 和手册:open-activewrl.sourceforge.net/data/OpenAL_PGuide.pdf
    • 在没有 root 权限的版本上使用 Open AL 是真的吗?
    • @busylee:是的。此 OpenAL 实现可在库存设备上运行,从 Android 版本 2.1+ 开始
    【解决方案2】:

    我认为 Android 不支持 ALSA。 ALSA api 不适用于原生 Android 代码 (NDK)

    对于 Android,您应该使用“opensles”模块,它提供 本机接口的音频驱动程序。

    Baresip 支持多种音频驱动程序,例如 Linux 的“alsa”模块 或 Android NDK 的“opensles”。有关opensles的详细信息,请参阅此处 模块:

    http://www.creytiv.com/doxygen/baresip-dox/html/opensles_8c.html

    【讨论】:

    • 我认为你错了。 Android 使用 ALSA 驱动进行音频设备通信,参​​考 source.android.com/devices/audio.html
    • 内部使用它和将其提供给开发人员是完全不同的两件事。区别在于设备文件的权限,以及在较小程度上稳定的版本控制。
    • @busylee "You [Android system manufacturer - V.S.] can choose to use ALSA, OSS, or a custom driver"。这意味着 ALSA 不能保证跨设备工作,尽管它可能在某些设备上工作。
    猜你喜欢
    • 1970-01-01
    • 2018-04-07
    • 2023-04-03
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 2016-11-01
    相关资源
    最近更新 更多