使用 ALSA 库捕获音频 - snd_pcm_open => 没有这样的文件或目录
Audio capturing using ALSA library - snd_pcm_open => No such file or directory
我正在尝试使用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);
返回No such file or directory
的snd_strerror(returnCode)
这是否表明捕获设备没有正确安装(例如驱动程序或其他东西)?
我怎样才能发现什么是错的/丢失的?
我可以列出是否安装了任何可访问的声音设备吗?
更新:
我发现了如何扫描设备:查找可用的声卡在Linux上编程
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准备设备driver目录下有一个脚本它将在/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 pcmC0D0c
和cat 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
您的问题是alsa-lib
包没有正确安装(看起来好像没有适合您的硬件的包)。
要找到需要的文件,获取alsa-lib
源包,编译它,并将其安装到一个临时目录中,使用
make install DESTDIR=/tmp/test
然后查看/tmp/test/
;如果没有使用正确的交叉编译器,编译后的库文件本身(libasound.so*
)就不能使用,但其他文件是适用于任何体系结构的文本文件。
我有不同版本的snddevices
脚本。我必须在正确的目录下使用正确的脚本才能使snd_pcm_open
工作。我必须将脚本复制到SoC的驱动程序目录。
我将.conf
文件复制到与参考实现相同的目录中。
如果没有捕获设备正在运行,则似乎存在错误的文件描述符错误消息。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将内容数组写入文本文件?
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到