问题标签 [alsa]

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 回答
2883 浏览

linux - Alsa 异步回调

我正在尝试使用 ALSA 的异步回调功能,以便可以在应用程序级别提供暂停和恢复功能。但是该函数async_add_pcm_handler()返回一个错误(更具体地返回 -38)。

以上是我正在使用的一段代码,并定义了函数 MyCallback。你能指出我可能的错误吗?

0 投票
1 回答
2707 浏览

java - 通过 Java SoundSystem 使用 ALSA pcm 输出

我有一个带有多个输出的声卡,并使用 ALSA 将它们映射到 2 个独立的立体声通道。配置工作正常,并允许我,例如使用扬声器测试在它们上播放音频。

我现在想在 Java 程序中使用这两个立体声输出,使用 AudioSystem API。但是,stereo1 和 stereo2 不会使用 MixerInfo 显示。

我真的不明白 Java 如何决定使用 AudioSystem API 公开哪些“设备”。我目前正在 Ubuntu 11.10 系统上对此进行测试。

这是使用的 asound.conf:

这是我用来显示可用输入和输出的代码:

0 投票
1 回答
2438 浏览

c - ALSA PCM 回调有哪些限制?

我正在 Linux 下编写一个程序,该程序使用 ALSA(连接到自定义设备)同时利用播放和记录。我想使用异步回调架构来读取和写入数据。

但是,我无法获得有关我在回调中被允许执行的操作的限制的任何信息。具体来说,我必须是异步安全的吗?如果是这样,这似乎严重限制了可以做的事情,因为除其他外,我不应该引用任何全局变量,这使得例如从执行主线程填充的缓冲区读取或写入变得相当困难到一个缓冲区,该缓冲区随后被保存到回调之外的文件中。

我可以在 ALSA 回调中使用任何 C 并发构造来协调全局变量与主线程的使用吗?例如,我可以使用 POSIX 信号量吗?我是否可以保证 ALSA 回调相对于主线程是原子的(我知道它对其他 ALSA 回调不是原子的)?

非常感谢人们对此提出的任何见解。

0 投票
1 回答
482 浏览

c - 在 VirtualBox 上的 linux fedora 13 或 14 中编译 alsa + c + armv5tel

我有一个项目,我必须编写一个程序,在这个程序上获取麦克风输入的音量和一些分贝参数,我们有兴趣修改条目,以便生成的输出(扬声器)更低或更高取决于几个因素,例如环境噪声、微级音频等。

我知道我的意思不止一个听起来像中文,我可以检查一下我所说的“堆”很酷,你有一个 ARM 架构并且是 armv5tel 子架构,在 linux 下使用,但我的大障碍 = 大问题, 是像典型的那样编译一个 C 程序来这样做 gcc file.co ficheroOut 已经解决了。

但是通过使用 linux 音频库,在这种情况下,我认为这些库是特定于 linux armv5tel 的,而不是如何编译,对于典型的 linux 音频程序,我们将他放在 -lasound 中,他将成为一个不同的架构英特尔,因为不怎么样。

有没有人同时使用过这种架构、语言 C 和音频?我可以指出它是如何编译的吗?

原则上,我找到了一个用 arm-gp2x-linux-gcc 或 arm-none-linux-gcc 编译的解决方案,因为我为任何已经编译的文件创建了一个 li 文件,但不像他们那样做,而且一如既往我没有要求 xDD 那混蛋和宽恕的信息,我给出以下信息

文件文件

ELF 32 位 LSB 可执行文件,ARM,版本 1,静态链接,未剥离

有关更多信息,请使用 arquitetura armv5tel 进行 uname,但使用未知的 xDD linux,为什么?

谢谢,如果有人能给我澄清或减轻我的这种不好的感觉,因为我有几个星期我没有得到很多,通过谷歌搜索。

附言

它必须使用 QEMU(该特定架构的仿真器??),我正在使用带有 fedora 13 的虚拟机,其中有一个编辑器 Kate,前 arm gcc 并发表了评论,但我无法正确编译

0 投票
1 回答
948 浏览

c++ - 采样率偏差和声音播放位置

例如,当您将声卡速率设置为 44100 时,您不能保证实际速率等于 44100。在我的情况下,应用程序和 ALSA 之间的流量测量(以样本/秒为单位)给了我 44066...44084 的值。

这不应该与重采样问题有关:即使只有 48000 硬件也必须在“44100”模式下以 44100 速率“吃掉”数据。

当我在播放此波形时尝试在波形上绘制光标时会出现问题。我使用从 WAV 文件(22050、...、44100、...、48000)读取的“理想”采样率和播放开始后花费的毫秒数计算光标位置,使用以下 C++ 函数:

QTimer 用于为光标动画生成帧,但我不依赖于 QTimer 精度,因为我通过 getCurrentTimeMs() 询问时间(假设它足够精确)每帧,所以我可以使用不同的帧速率。

播放 2-3 分钟后,我发现我听到的和看到的有点不同 - 光标位置比播放位置大 1/20 秒左右。

当我测量通过 ALSA 回调的流量时,我得到的平均值为 44083.7 个样本/秒。然后我在屏幕绘图函数中使用这个值作为实际速率。现在问题消失了。该程序是跨平台的,所以我稍后会在 Windows 和另一个声卡上测试这个测量值。

但是有没有更好的方法来同步声音和屏幕?例如,是否有一些不太消耗 CPU 的方式来向声卡询问实际播放的样本数?

0 投票
0 回答
478 浏览

c++ - 回调执行期间ALSA重新进入回调

我的应用程序使用带有回调功能的 ALSA 来播放选定的一段声音。有时它只是挂起。我调试了不到 2 天,终于发现 ALSA 的回调函数已经在执行时被调用了。我抓住了这个使用:

当我打印序列“11”时,应用程序挂起。“121212 ...”在控制台上,而应用程序处于活动状态并且正在播放声音。

这怎么可能发生?

0 投票
1 回答
1718 浏览

c - 如何提高 cmuSphinx 的准确率?

我想用 pocketShpinx 做一些语音到文本的单词。我已经安装了 sphinxbase 和 pocketSphinx。并下载声学模型/语言模型/词典。然后我测试示例代码如下:

DBG如果定义了DEBUG,它只是一个打印错误消息的宏。


然后我写了一些代码来记录麦克风使用 alsa。如下:

所以,我记录了一个原始文件。然后对该文件进行语音测试。但是准确性非常差。就像helloorgo home会给我hotelorMHM MHM等等。那么这些代码有什么问题呢?我已阅读常见问题解答,是否应该使用声学模型自适应来提高准确性?

PS。我将立体声更改为单声道。而且声音很奇怪。我无法理解我所说的。那么,它有什么问题呢?这是原始文件test.raw

0 投票
1 回答
897 浏览

c++ - ALSA 回调(SIGIO 处理程序)有时会在 boost::posix_time::microsec_clock::local_time() 的某个地方挂起

我在带有回调的异步模式下使用 ALSA (snd_async_add_pcm_handler())。每个 ALSA 的回调都是从 SIGIO 信号处理程序调用的。每个回调都调用我的函数getCurrentTimeMs()

  • 可以在前一个处理程序完成之前调用信号处理程序;
  • 我需要以毫秒为单位的当前时间来测量精确的采样率。

    如果我评论#define Z,则使用提升。在“增强模式”下,应用程序在音频播放开始后经过不可预测的时间后挂起。strace显示应用程序挂起:

    但是0xb68dba4c在所有跟踪日志中只出现了 2...3 次。futex(0xb68dba4c ...不是每次 getCurrentTimeMs() 调用都会发生的事情。但是当它发生时,一切都会挂起,并且仅在gettimeofday之后发生;我在控制台上看到“+.”,然后发生了futex。但在此之前,应用程序可以播放大量声音,在每个回调中每秒调用getCurrentTimeMs() 50 次。真是个谜……

    使用#define Z我的代码。在这种情况下,应用程序运行良好 - 播放千兆字节的 WAV 文件没有挂起。

    该应用程序有 2 个线程通过 boost::threadpool 运行,并且都使用getCurrentTimeMs();假设我有一些死锁错误;但我不知道#define Z会如何影响它。

    编辑: 我的问题是这样回答的,我接受这个答案:
    1)http://permalink.gmane.org/gmane.linux.alsa.devel/96282
    2)http://answerpot.com/showthread.php? 3448138-ALSA+异步+回调+重新输入+和+死锁

  • 0 投票
    1 回答
    1046 浏览

    audio - 无法播放已被操纵的音频数据(无符号字符)

    在处理音频数据后,我无法播放它们。我使用的唯一 API 是 C 语言中 Linux (Ubuntu) 上的 alsa lib API。我使用 read() 从无符号字符数组(称为 buffer1)中的 16 位整数波形文件中获取数据,并且可以正确播放 buffer1。我希望将数据传递给另一个相同大小的无符号字符数组(称为 buffer2)。如果我只是用 buffer2[i] = buffer1[i] 做一个循环,它就可以工作:buffer2 可以正常播放。但为了操作数据,我将其转换为浮点数组,然后再转换回 unsigned char(直到现在我不操作音频数据;我只是将它们转换为 float,然后再转换回 unsigned char 以测试它是如何工作的)。但是现在 buffer2 没有发出声音,尽管它的所有值都与 buffer1 的值完全相同(我制作了 buffer1 和 buffer2 的许多值的 printf;

    请问有什么问题吗?

    胜利者

    0 投票
    1 回答
    1306 浏览

    audio - 在不同情况下播放多声道音频时出错?

    我正在尝试播放 2 个通道,其中一个通道中的音频和另一个通道中的静音正在播放。

    10 秒后,我想在第一个频道播放静音,在第二个频道播放一些音频。

    这可以在 PC 端完成,同时在两个不同的终端中播放这些管道或让其中一个在后台运行。但是当我在 am335x 板上播放一个管道并尝试播放另一个时,它是这样的:

    当我们签入 gstalsasink.c 时,它以非阻塞模式调用 snd_pcm_open 。

    那为什么它会阻止其他事件来使用音频设备呢?

    任何人都可以建议我为目标端做什么,因为 PC 端 alsasink 是完美的。