【问题标题】:Audio capturing using ALSA library - snd_pcm_open => No such file or directory使用 ALSA 库捕获音频 - snd_pcm_open => 没有这样的文件或目录
【发布时间】:2016-01-11 13:14:14
【问题描述】:

我正在尝试使用 ALSA 库在 SoC 上实现音频捕获。 我有一个预编译的 libasound.so.2.0.0 和一个 asoundlib.h 以及其他头文件。

现在我有

int returnCode;
snd_pcm_t *pcm_Handle;
char *pcm_device_name = "hw:0,0";

returnCode = snd_pcm_open(&pcm_Handle, pcm_device_name, SND_PCM_STREAM_CAPTURE, 0);

返回snd_strerror(returnCode) of No such file or directory

这是否表明捕获设备未正确安装(例如驱动程序或其他东西)?

我怎样才能找出问题/遗漏的地方?

我可以列出是否安装了任何 alsa 可访问的声音设备吗?

更新:

我通过以下方式了解了如何扫描设备:Finding available sound cards on Linux programmatically

snd_card_next 找到一个 cardNum : 0,但我仍然在 snd_ctl_open(&cardHandle, "hw:0", 0)snd_pcm_open(&pcm_Handle, "hw:0,0", SND_PCM_STREAM_CAPTURE, 0)No such file or directory 上失败。这是否表明声音设备未正确安装?

更新::

我在http://www.tldp.org/HOWTO/Alsa-sound-4.html上找到了更多信息

"4.6 准备设备驱动目录中有一个脚本 这将在您的 /dev 目录中安装 ALSA-sound-devices。类型 ./snddevices 来自驱动程序目录。应该有一个 /dev/snd 现在子目录(测试它是否存在。如果你不熟悉 即使是“ls”命令,请考虑先阅读其他 HOWTO。 您应该具备一些基本的 Linux 知识来安装这些驱动程序)。 现在您已准备好插入驱动程序,所以请翻到下一个 段。”

我记得我运行了一个随 SoC alsa 版本提供的 snddevices 脚本,但我不确定它是否成功,或者它是否只是没有显示错误。但是链接说我之后必须安装驱动程序?很遗憾,明天之前我无法测试。

更新:

来自 CL。和http://www.tldp.org/HOWTO/Alsa-sound-6.html 我测试了以下内容: dev/snd/ 具有以下条目:

crw-rw----    1 root     audio     116,   0 Mar 11 04:44 controlC0
crw-rw----    1 root     audio     116,  24 Mar 11 04:44 pcmC0D0c
crw-rw----    1 root     audio     116,  16 Mar 11 04:44 pcmC0D0p
crw-rw----    1 root     audio     116,  25 Mar 11 04:44 pcmC0D1c
crw-rw----    1 root     audio     116,  26 Mar 11 04:44 pcmC0D2c
crw-rw----    1 root     audio     116,  27 Mar 11 04:44 pcmC0D3c
crw-rw----    1 root     audio     116,  28 Mar 11 04:44 pcmC0D4c

其中cat controlC0 cat pcmC0D0ccat pcmC0D1c 返回cat: read error: File descriptor in bad state 而其他返回如cat: can't open 'pcmC0D2c': No such device

虽然cat /proc/asound/cards 给了

 0 [VPL_AUDIO      ]: VPL AUDIO - VPL Audio TW2866 Driver
                      VPL Audio Codec Driver, TW2866.
 1 [Mozart_SSM2603 ]: I2S - I2S driver
                      I2S driver

这里有更多信息。由于我对音频没有任何经验,我不知道它们是否重要或有帮助......

cat /proc/asound/pcm
00-00: tw2866#0 : VPL Audio TW2866 Driver : capture 1
00-01: tw2866#1 : VPL Audio TW2866 Driver : playback 1 : capture 1
01-00: I2S AIC23 PCM : I2S driver : playback 1 : capture 1

【问题讨论】:

  • 在任何现代发行版上都不需要 snddevices 脚本。您可以访问/dev/snd/ 中的文件吗?
  • @CL。谢谢你的兴趣。关于发行版是否“现代”,我无话可说。由于它是片上系统,因此操作系统仅限于绝对必要的部分,并且确实可能​​缺少一些东西。我之前在视频捕获中遇到了类似的问题,其中一些节点丢失了。在/dev/snd/ 中有条目controlC0 pcmC0D0c pcmC0D0p pcmC0D1c pcmC0D2c pcmC0D3c pcmC0D4c,每个条目的大小为116。如果我尝试cat pcmC0D0c,它会告诉我File descriptor in bad state,pcmC0D1c 和controlC0 相同,而其他返回No such device
  • “116”不是尺寸。无论如何,你是如何安装其他需要的 alsa-lib 文件的?
  • 我刚刚拥有该硬件平台的预编译库和二进制文件。在该平台上安装操作系统的人可能已经添加了一些驱动程序。所以基本上我必须找出当前系统状态中缺少哪些安装步骤,如果可能的话。
  • 我刚刚编辑了问题以添加更多/proc/asound/cards的信息

标签: c++ audio capture alsa


【解决方案1】:

您的问题是alsa-lib 软件包未正确安装(看起来好像没有适用于您的硬件的软件包)。

要找出您需要的文件,请获取alsa-lib 源包,对其进行编译,然后将其安装到一个临时目录中

make install DESTDIR=/tmp/test

然后查看/tmp/test/;如果您没有使用正确的交叉编译器,编译的库文件本身 (libasound.so*) 将无法使用,但其他文件是适用于任何架构的文本文件。

【讨论】:

  • 刚刚看到我的交叉编译器和 ALSA 源代码存在一个 makefile。使用交叉编译器将创建 4 个文件夹:binincludelibshare。我的假设是否正确,我应该复制 share 文件夹的内容(带有子文件夹 alsa and aclocal) to my SoC usr/share` 文件夹?我必须重新启动它还是……?
  • 可以,但您不需要aclocal。您无需重新启动。
【解决方案2】:

我有不同版本的 snddevices 脚本。我必须在正确的目录中使用正确的脚本才能让snd_pcm_open 工作。我不得不将脚本复制到 SoC 的驱动程序目录中。

我将.conf 文件复制到与参考实现相同的目录中。

如果没有捕获设备正在运行,则似乎存在错误的文件描述符错误消息。捕获到现在仍然无法正常工作。

【讨论】:

  • 我刚刚遇到了与No such file or directory 相同的问题。您能否详细解释一下您是如何追踪这个问题的?
  • 抱歉,我找不到捕获音频的解决方案,所以我取消了这个项目,它还没有获得任何新的优先级。另外,我不记得细节了:-(
猜你喜欢
  • 2019-12-23
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多