问题标签 [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.

0 投票
1 回答
366 浏览

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 时会发生这种情况:

什么可能导致此错误?

0 投票
0 回答
3661 浏览

c++ - gcc:交叉编译时找不到-lasound

我尝试将这个小程序交叉编译到我的手臂设备,但得到错误:

然后我在我的目标设备中找到了 libasound 文件并已复制到我的文件夹 /usr/lib 但仍然没有效果。我使用命令:

我已经在我的 Ubuntu 14.04 x64 上安装了libasound2-dev包,并且能够在我的本机计算机上编译该程序而没有任何错误。

使用解决方案更新
正如 Marc 和 John 在下面所说的,我应该使用-Lflag 来设置我的库路径。所以我的命令行应该是:

0 投票
1 回答
1551 浏览

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 仿真和放大。我怎样才能做到这一点?谢谢你。

0 投票
1 回答
3033 浏览

c++ - 嵌入式系统上的 ALSA - readi - 输入/输出错误和冻结

我仍然面临在嵌入式系统上使用 ALSA 捕获的问题。

snddevices使用脚本后,我现在可以从库中打开设备。但是应用程序在每次调用大约 10 秒后返回错误消息Input/output error( EIO) 。readi尝试停止设备后,整个系统冻结并需要硬重置。

我无法判断系统上是否正确安装了 ALSA。在启动时,会提到 ALSA 驱动程序。是version 1.0.18.rc3。如何测试 ALSA 和/或设备是否安装正确?

这是我的测试代码,请告诉我里面是否有错误。我不确定sizeframeperiodist 设置是否正确(我对音频处理了解不多)以及我是否必须使用interleavednon-interleaved捕获或者是否无关紧要。

产生这个输出:

之后就结冰了……

如果我在打印之前添加另一个参数化块capture(取自参考实现):

我最终收到消息:

但没有冻结。那么,如果设备正在“运行”,为什么它会冻结呢?

有什么建议可以使该设备/代码正常工作吗?

抱歉所有代码,我不确定是否需要所有参数。如果太难阅读,请告诉我是否最好封装整个 init 部分以提高可读性。

0 投票
1 回答
798 浏览

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" }

请任何人帮助我解决这个问题。谢谢!!!

0 投票
1 回答
198 浏览

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 发出声音...

我希望你们中的一些人会帮助我!谢谢,

马克西姆。

0 投票
1 回答
1239 浏览

c - ALSA:snd_pcm_hw_params_free() 导致内存错误

我正在修改一些现有的声音代码,并注意到当它完成将配置数据写入硬件时,代码不会调用snd_pcm_hw_params_free(). 由于遗留原因,该应用程序会为其播放的每个声音打开和关闭声音硬件。这一定会导致内存泄漏,因为snd_pcm_hw_params_t *它永远不会被释放。所以我添加了对 `snd_pcm_hw_params_free() 的调用,现在得到以下错误:

下面的测试程序显示了这个问题。这是否表明我的安装libasound在某种程度上被破坏了?

0 投票
1 回答
1249 浏览

linux - 将字节流式传输到 ALSA 播放设备

我在使用libasound. 最终,我的目标是能够通过网络路由播放流并在远程设备上播放。

此问题中提供的代码将WAV 文件读入内存并将其写入驱动程序并通过snd_pcm_writei它工作。然而,这段代码所做的事情和我正在尝试做的事情之间的一个关键区别是,我没有立即获得所有可用的数据。我希望在数据可用时对其进行流式传输。

调整上面的示例代码以满足我的需要,我最终得到了这个:

这段代码可以用gcc playback.c -o playback -lasound. 我正在使用的 WAV 文件可以在这里找到。

bufsize当我运行此代码片段时,我根据块大小在播放中重复的音频片段对传入数据进行分块。大块大小比小块大小产生更少的重复。结合音频听起来,我相信每个块末尾的一个小片段正在重复。

我使用的参数是:

  • 采样率:44100
  • 频道:2

为什么一次性发送整个 WAV 文件有效,而发送部分文件无效?如何向驱动程序发送音频数据块并使其正常播放?

0 投票
1 回答
1124 浏览

linux - 我下载了libasound2-dev,但是找不到源文件

我正在使用 Linux OS (Ubuntu),我需要一些来自麦克风的录音文件。我打字了sudo apt-get install libasound2-dev。然后,我可以在 中找到头文件/usr/include/alsa,但我找不到 c 文件。我认为这是“未定义对' snd_pcm_open'的引用”的问题。我能做些什么?

0 投票
0 回答
524 浏览

audio - ALSA - 检索音频缓冲区时间戳

我有一个使用 ALSA API 播放音频的简单 C 程序,我想知道音频缓冲区的精确时间。

我正在尝试使用 ALSA 的snd_pcm_htimestamp功能从音频驱动程序中检索时间戳,该功能返回两个值 - 时间戳和帧计数。

但是,从 ALSA 返回的时间戳未设置(零值)。第二个返回的变量,“获取时间戳时的可用帧数”,看起来设置正确。有没有人知道为什么时间戳似乎未设置?

我正在配置要在我的设置中激活的时间戳,如下所示:

我验证它是否已设置:

然后在程序的主 while 循环中,在我使用 向 ALSA 提供样本后snd_pcm_writei,我尝试获取该缓冲区的时间戳,如下所示:

但是,虽然avail似乎已设置,但ts始终为 0.000000000。

我在运行带有 ADA1475 音频接口的 Raspbian 的 Raspberry Pi 上。

在此先感谢,安迪