问题标签 [libalsa]

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 投票
0 回答
19 浏览

audio - 如何在需要时加快音频速度,然后在 ALSA 下恢复正常速度?

我在启用了 ALSA 的 Linux 上有一个嵌入式软件——它只是一个 WIFI 扬声器。我用ALSA做声音控制。

现在我想实现一些逻辑如下,但我不确定我是否可以在 ALSA 中解决它或需要一些其他框架。

  1. 手机使用WIFI连接WIFI音箱成功。
  2. 手机播放一些音乐,会通过WIFI传输数据,让WIFI音箱播放出来。
  3. 理想情况下网络稳定,WIFI音箱播放的音乐稳定。
  4. 突然网络不稳定,假设数据停了1秒。但请注意,手机仍在向 WIFI 扬声器发送数据(这是手机中 WIFI 扬声器应用程序的默认行为,作为缓冲)。所以在这1秒内,数据缓存在手机中,WIFI音箱没有收到任何数据。所以WIFI音箱没有声音。
  5. 1秒后,一切恢复正常,手机将“1秒”数据加上“现在”数据发送到WIFI音箱。
  6. WIFI音箱可以接收到步骤5中的所有数据,并按时间顺序播放。
  7. 这会带来一个问题,WIFI音箱总是落后手机1秒。
  8. 我想要什么 - 在这种情况下(从 #4 到 #7),我想加快“1 秒”数据的速度以进行追赶,然后进行正常的速度播放。

现在确定如何实现这一点,所以任何建议都将不胜感激!再次感谢!

0 投票
0 回答
566 浏览

alsa - ALSA lib pcm_hw.c:1829:(_snd_pcm_hw_open) 卡的值无效

我目前正在尝试使用 ALSA 库来发出声音。但是,我收到以下错误:

我想我确实有一张声卡,如下所示:

那么有一个 是什么意思invalid value for the card?有没有办法可以编辑它以使值有效?

我不确定以下内容是否相关,但很多 stackOverflow 帖子建议 OPs run aplay -l。我的结果是

0 投票
0 回答
24 浏览

c - 在现代内核版本中注册 Midi 设备

我目前正在编写一个 Linux 内核模块,该模块将创建一个虚拟 Midi 设备,以便用户空间程序可以将 midi 信号发送到任何类似 DAW 的软件。我发现了一个很棒的功能来帮助我完成我的任务:int register_sound_midi(const struct file_operations * fops, int dev). 问题是这个函数在 Kernel Version 4.15 之后就不再存在了。从V15V16,注册和取消注册功能就消失了。我现在对如何在 4.15 之后的版本中从内核注册一个假的 midi 设备感到目瞪口呆。如何在 Kernel post 4.15 版本中注册 midi 设备?是否可以使模块向后兼容旧内核版本?

当前代码:

0 投票
0 回答
162 浏览

audio - PCM 通道映射到物理扬声器/麦克风(ALSA 库)

我的要求是:

  • 在播放界面读取通道数
  • 读取每个捕获接口中的通道数
  • 将 WAV 通道映射到特定的扬声器输入/输出

对于扬声器,可以通过检查 alsa-info 命令的输出来实现:

正如我所理解的,这是 PCI Express 之间的映射,它的名称由声卡驱动程序提供商提供。以下输出可以说明:

  • 声卡中的 IO 数量
  • 播放 IO 的数量(这是通过检查其名称以搜索“麦克风”)

有什么办法可以参考:

/devices/pci0000:00/0000:00:1b.0/sound/card2/input13

...直接通过播放一个单声道WAV进去吗?

一般来说,我希望能够列出所有声音接口并收集允许我通过 SDL 播放到任何物理扬声器并从任何物理麦克风在特定 WAV 通道上录制的参数。我设法通过以下方式部分实现了这一目标:

  1. 确定 aplay -l 将使用的设备。在我的例子中:
  1. 确定回放捕获通道的数量(到目前为止,通过检查物理设备 - 有一个 Line-In 和一个 MIC)但是输出cat /proc/asound/card0/stream0给了我:

捕获:状态:停止接口 2 Altset 1 格式:S16_LE 通道:2 端点:5 IN (ASYNC) 速率:44100、48000 位:16

所以它告诉我我有一个带有 2 个通道的捕获接口(但我希望有 2 个捕获 - 一个用于线路输入,第二个用于立体声麦克风)

  1. 所以我知道如果麦克风连接到接口,那么我应该期待 2 通道 WAV,每个通道对应一个麦克风通​​道

非常相似的故事是播放界面。这是cat /proc/asound/card0/stream0播放:

在那种情况下,我有用于 7.1 扬声器设置 + 耳机的物理连接器输入。所以我希望控制超过 10 个频道,但我有超过 8 个(耳机总是重复的,就像有 2.1 一样)有没有办法单独访问这些频道?还有一个 SPDIF 输入/输出物理接口。我是否应该期望在每个物理接口上都有重复的 PCM,或者有什么方法可以分离这些流?我想从这辆有声汽车中挤出尽可能多的 I/O :)

0 投票
0 回答
35 浏览

c++ - 在树莓派零中编译 ALSA 项目的 pcm.c 示例时出现问题

我正在使用带有最新树莓派操作系统的树莓派零 W

我已经安装了 libasound2 和 libasound2-dev,并且我从树莓派论坛上下载的用于测试 alsa 库的代码编译并正确运行:

我正在尝试在此处编译 ALSA 项目网站中提供的正弦波生成示例代码:https ://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2pcm_8c-example.html

这在他们的示例页面中列为 pcm.c

我已将此代码保存在 main.cpp 中,并且我已更改#include "../include/asoundlib.h"(这会导致编译时找不到文件错误)为#include <alsa/asoundlib.h>

我使用gcc main.cpp -o main -lasound -fpermissive. 我收到一系列警告,但最后for (format = 0; format < SND_PCM_FORMAT_LAST; format++) {在它说有的行出现错误,no match for operator++并且operand type is 'snd_pcm_format_t' {aka '_snd_pcm_format'}). 但是根据他们的文档format已被声明为static snd_pcm_format_t format = SND_PCM_FORMAT_S16;并且snd_pcm_format_t是一个枚举。

我需要做什么才能编译这个基本示例?或者是否有一个更简单的示例展示如何使用 C++ 在 ALSA 中生成正弦音,或者有一些博客或教程解释了 ALSA 的这个示例代码是如何工作的?