问题标签 [libasound]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - pcm_plug.c:67: snd_pcm_plug_close: 断言 `plug->gen.slave == plug->req_slave' 失败
我第一次使用 ALSA 并看到错误:
pcm_plug.c:67: snd_pcm_plug_close: 断言 `plug->gen.slave == plug->req_slave' 失败。
当我尝试关闭 PCM 时会发生这种情况:
什么可能导致此错误?
c++ - gcc:交叉编译时找不到-lasound
我尝试将这个小程序交叉编译到我的手臂设备,但得到错误:
然后我在我的目标设备中找到了 libasound 文件并已复制到我的文件夹 /usr/lib 但仍然没有效果。我使用命令:
我已经在我的 Ubuntu 14.04 x64 上安装了libasound2-dev包,并且能够在我的本机计算机上编译该程序而没有任何错误。
使用解决方案更新
正如 Marc 和 John 在下面所说的,我应该使用-L
flag 来设置我的库路径。所以我的命令行应该是:
linux - ALSA 配置 如何在 asound.conf 中结合 MMAP 仿真和 Ladspa 插件
我使用 rpi dac 在 Raspberry Pi 计算模块 ( Linux ) 上有一个工作正常的 PCM 输出和良好的声音。'aplay -l' 命令输出显示如下:
为了让音频完全正常工作,我必须将我的 /etc/asound.conf 文件更改为如下所示:
当我播放 .wav 文件时,输出听起来很棒,但它有点安静,而且 alsamixer 不允许使用此驱动程序控制音量。
我想获得更多的音量,所以我研究了 Ladspa 项目软件放大器插件。以下示例代码提高了普通 Pi 上 3.5 毫米插孔的音量:
我一直在阅读这里的文档:http: //alsa.opensrc.org/Asoundrc,但我正在努力理解如何结合 2 - 我想要 MMAP 仿真和放大。我怎样才能做到这一点?谢谢你。
c++ - 嵌入式系统上的 ALSA - readi - 输入/输出错误和冻结
我仍然面临在嵌入式系统上使用 ALSA 捕获的问题。
snddevices
使用脚本后,我现在可以从库中打开设备。但是应用程序在每次调用大约 10 秒后返回错误消息Input/output error
( EIO
) 。readi
尝试停止设备后,整个系统冻结并需要硬重置。
我无法判断系统上是否正确安装了 ALSA。在启动时,会提到 ALSA 驱动程序。是version 1.0.18.rc3
。如何测试 ALSA 和/或设备是否安装正确?
这是我的测试代码,请告诉我里面是否有错误。我不确定sizeframe
和period
ist 设置是否正确(我对音频处理了解不多)以及我是否必须使用interleaved
或non-interleaved
捕获或者是否无关紧要。
产生这个输出:
之后就结冰了……
如果我在打印之前添加另一个参数化块capture
(取自参考实现):
我最终收到消息:
但没有冻结。那么,如果设备正在“运行”,为什么它会冻结呢?
有什么建议可以使该设备/代码正常工作吗?
抱歉所有代码,我不确定是否需要所有参数。如果太难阅读,请告诉我是否最好封装整个 init 部分以提高可读性。
c - ALSA 捕获导致高 CPU 使用率
我编写了一个全双工 ALSA 程序并在基于 linux 的嵌入式系统上运行它。它的声音配置是:
- 采样率:16Hz
- 频道:1(单声道)
- 格式:S16_LE
- 最小可用性:160(帧)
对于实时应用,我需要每 10 毫秒捕获一次声音,所以我将最小可用性设置为 160。
我的问题是:程序运行时,CPU 使用率非常高,可能为 99.9%(通过 top 命令)。有时 CPU 负载很低,但一旦达到 99.9%,就无法回到低 CPU 使用率。
我发现这可能是配置问题。在 asound.conf 文件中(参见后面的代码),我创建了一个名为“asym0”的 asym 类型卡,用于选择两个不同的从卡进行播放和捕获。
最初,我使用“主要”作为捕获设备,但它会导致 CPU 使用率很高。然后我创建了一个名为“rate0”的费率类型卡,并将其设置为捕获设备。CPU 使用率变低,在 20%~60% 之间浮动,但捕获的声音听起来很糟糕。如果我测试麦克风(捕获),我会在我的声音中听到一些“po po po”。
所以...
- 如果我选择“primary”,CPU使用率很高,但没有“po po po”的声音。
- 如果我选择“rate0”,CPU使用率较低,但有“po po po”的声音。
与“type hw”和“type rate”有什么不同?
是中断频率不同造成的影响吗?
asound.conf 文件:
pcm.primary { type hw card mycard } pcm.rate0 { type rate slave { pcm "primary" rate 16000 } } pcm.asym0 { type asym playback.pcm "primary" capture.pcm "primary" or "rate0" }
请任何人帮助我解决这个问题。谢谢!!!
linux - 无法使用 libasound 在 USB 声卡中播放声音。(C++)
我目前正在学习使用 alsa API (libasound) 进行开发。我想将 PCM 声音发送到我的 USB 声卡。
我运行这段代码:
注意:buf是在 HelloPi.h 中声明的包含声波的数组。
当我将snd_pcm_open(&playback_handle, "hw:1,0", SND_PCM_STREAM_PLAYBACK,0)与hw:0,0一起使用时,我的笔记本电脑的内部声卡可以正常工作。但是,如果我使用hw:1,0来使用 USB 声卡,则什么也没有发生(甚至没有错误!)。
如果我在终端中运行:
我有以下结果:
你好
我知道 USB 卡没问题,因为我有声音:
我不知道为什么我的代码用 hw:1,0 发出声音...
我希望你们中的一些人会帮助我!谢谢,
马克西姆。
c - ALSA:snd_pcm_hw_params_free() 导致内存错误
我正在修改一些现有的声音代码,并注意到当它完成将配置数据写入硬件时,代码不会调用snd_pcm_hw_params_free()
. 由于遗留原因,该应用程序会为其播放的每个声音打开和关闭声音硬件。这一定会导致内存泄漏,因为snd_pcm_hw_params_t *
它永远不会被释放。所以我添加了对 `snd_pcm_hw_params_free() 的调用,现在得到以下错误:
下面的测试程序显示了这个问题。这是否表明我的安装libasound
在某种程度上被破坏了?
linux - 将字节流式传输到 ALSA 播放设备
我在使用libasound
. 最终,我的目标是能够通过网络路由播放流并在远程设备上播放。
此问题中提供的代码将WAV 文件读入内存并将其写入驱动程序并通过snd_pcm_writei
它工作。然而,这段代码所做的事情和我正在尝试做的事情之间的一个关键区别是,我没有立即获得所有可用的数据。我希望在数据可用时对其进行流式传输。
调整上面的示例代码以满足我的需要,我最终得到了这个:
这段代码可以用gcc playback.c -o playback -lasound
. 我正在使用的 WAV 文件可以在这里找到。
bufsize
当我运行此代码片段时,我根据块大小在播放中重复的音频片段对传入数据进行分块。大块大小比小块大小产生更少的重复。结合音频听起来,我相信每个块末尾的一个小片段正在重复。
我使用的参数是:
- 采样率:44100
- 频道:2
为什么一次性发送整个 WAV 文件有效,而发送部分文件无效?如何向驱动程序发送音频数据块并使其正常播放?
linux - 我下载了libasound2-dev,但是找不到源文件
我正在使用 Linux OS (Ubuntu),我需要一些来自麦克风的录音文件。我打字了sudo apt-get install libasound2-dev
。然后,我可以在 中找到头文件/usr/include/alsa
,但我找不到 c 文件。我认为这是“未定义对' snd_pcm_open
'的引用”的问题。我能做些什么?
audio - ALSA - 检索音频缓冲区时间戳
我有一个使用 ALSA API 播放音频的简单 C 程序,我想知道音频缓冲区的精确时间。
我正在尝试使用 ALSA 的snd_pcm_htimestamp功能从音频驱动程序中检索时间戳,该功能返回两个值 - 时间戳和帧计数。
但是,从 ALSA 返回的时间戳未设置(零值)。第二个返回的变量,“获取时间戳时的可用帧数”,看起来设置正确。有没有人知道为什么时间戳似乎未设置?
我正在配置要在我的设置中激活的时间戳,如下所示:
我验证它是否已设置:
然后在程序的主 while 循环中,在我使用 向 ALSA 提供样本后snd_pcm_writei
,我尝试获取该缓冲区的时间戳,如下所示:
但是,虽然avail
似乎已设置,但ts
始终为 0.000000000。
我在运行带有 ADA1475 音频接口的 Raspbian 的 Raspberry Pi 上。
在此先感谢,安迪