【音频应用】Linux之ALSA音频应用编程

这篇具有很好参考价值的文章主要介绍了【音频应用】Linux之ALSA音频应用编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上文: 【音频驱动】Linux之ALSA声卡、WAV文件相关概念

Linux之ALSA音频应用编程

使用alsa-libs和alsa-utils实现.wav格式文件的播放与录制,了解Linux中声卡的应用层设备节点。介绍了使用alsa-libs应用编程步骤。

一、ALSA架构

高级Linux声音体系结构(ALSA)为Linux操作系统提供音频和MIDI功能。

ALSA具有以下显著特征:

  • 高效支持所有类型的音频接口,从消费类声卡到专业多通道音频接口。

  • 完全模块化的声音驱动程序。

  • SMP和线程安全设计。

  • 用户空间库(alsa-lib),以简化应用程序编程并提供高级功能。

  • 支持旧的开放声音系统(OSS) API,为大多数OSS程序提供二进制兼容性。

ALSA系统包括7个子项目:

  • 驱动包alsa-driver

  • 开发包alsa-libs

  • 开发包插件alsa-libplugins

  • 设置管理工具包alsa-utils

  • OSS接口兼容模拟层工具alsa-oss

  • 特殊音频固件支持包alsa-finnware

  • 其他声音相关处理小程序包alsa-tools

linux 音频alsa,Linux应用,linux,音视频,运维,单片机

​ alsa-libs 为一套 Linux 应用层的 C 语言函数库, 为音频应用程序开发提供了一套统一、标准
的接口,应用程序只需调用这一套 API 即可完成对底层声卡设备的操控 。

二、alsa-libs移植

首先需要在ALSA的官网上下载官网http://www.alsa-project.org下载alsa-lib和alsa-utils。

linux 音频alsa,Linux应用,linux,音视频,运维,单片机

具体步骤参考:

alsa-lib和alsa-utils移植_移植alsa-utils库_风雨兼程8023的博客-CSDN博客

三、ALSA设备文件结构

/dev/snd

在 Linux 内核设备驱动层、基于 ALSA 音频驱动框架注册的 sound 设备会在/dev/snd 目录下生成相应的
设备节点文件 。

linux 音频alsa,Linux应用,linux,音视频,运维,单片机

我们可以看到以下设备文件:

  • controlC0 :用于声卡的控制,例如通道选择,混音,麦克风的控制等
  • midiC0D0 :用于播放midi音频
  • pcmC0D0c :用于录音的pcm设备
  • pcmC0D0p :用于播放的pcm设备
  • pcmC0D1p :用于播放的pcm设备
  • seq :音序器
  • timer :定时器

C0D0代表的是声卡0中的设备0, pcmC0D0c最后一个c代表capture, pcmC0D0p最后一个p代表
playback,这些都是alsa-driver中的命名规则。 从上面的列表可以看出,我的声卡下挂了7个设备,根据声卡的实际能力,驱动实际上可以挂上更多种类的设备,在include/sound/core.h中,定义了以下设备类型

linux 音频alsa,Linux应用,linux,音视频,运维,单片机

通常,我们更关心的是pcm和control这两种设备。

/proc/asound

在 Linux 系统的/proc/asound 目录下,有很多的文件,这些文件记录了系统中声卡相关的信息

linux 音频alsa,Linux应用,linux,音视频,运维,单片机

  • cards : 查看 cards 文件的内容,可列出系统中可用的、注册的声卡

  • devices : 列出系统中所有声卡注册的设备,

  • pcm : 列出系统中的所有 PCM 设备

  • timers : 定时器设备选型

  • version : ALSA驱动版本

  • card0 :记录了声卡 0 相关的信息,譬如声卡的名字以及声卡注册的 PCM 设备

四、alsa-utils的测试工具

alsa-utils的测试工具

  • aplay

  • arecord

  • alsamixer

  • amixer

  • alsactl

  • alsaloop

aplay
aplay 是一个用于测试音频播放功能程序,可以使用 aplay 播放 wav 格式的音频文件。

常用命令:

aplay xxx.wav 

arecord

arecord 工具是一个用于录音测试的应用程序

常用命令:

arecord -r 20000 -f S16_LE -c 1 -d 10 -D hw:0,1 6.wav

-r 表示采样频率(最小为8000);

-f 表示采样格式,这里指 16 bit little endian(一般为S16_LE、S32_LE);

-c 表示通道数量(1或2);

-d 表示录音时间;

-D 表示使用哪个录音设备(hw:0,1:hw插件,第一个参数表示声卡号,第二个参数表示设备号);

采样频率越高,声音越清晰,.wav文件越大

linux 音频alsa,Linux应用,linux,音视频,运维,单片机

alsaloop

alsaloop用于回环测试,边录音边播放。

常用命令:

alsaloop -C hw:0,1 -t 100

五、编写ALSA应用程序

基于alsa-lib编写

API和例子参考官网 ALSA project - the C library reference: Index, Preamble and License (alsa-project.org)

1、打开PCM设备

int snd_pcm_open(snd_pcm_t **pcmp, const char *name, snd_pcm_stream_t stream, int mode)

2、设置硬件参数

实例化 snd_pcm_hw_params_t 对象

int snd_pcm_hw_params_malloc(snd_pcm_hw_params_t **ptr);

初始化 snd_pcm_hw_params_t 对象

int snd_pcm_hw_params_any(snd_pcm_t *pcm, snd_pcm_hw_params_t *params);

设置 access 访问类型

int snd_pcm_hw_params_set_access(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t _access);

设置数据格式

int snd_pcm_hw_params_set_format(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t val);

设置声道数

int snd_pcm_hw_params_set_channels(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val);

设置采样率大小

int snd_pcm_hw_params_set_rate(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir);

设置周期大小

int snd_pcm_hw_params_set_period_size(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t val, int dir);

设置 buffer 大小

int snd_pcm_hw_params_set_buffer_size(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t val);int snd_pcm_hw_params_set_periods(snd_pcm_t *pcm, snd_pcm_hw_params_t *params,unsigned int val,int dir)

安装/加载硬件配置参数

int snd_pcm_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t *params);

3、读/写数据

snd_pcm_sframes_t snd_pcm_writei(snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size);

snd_pcm_sframes_t snd_pcm_readi(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t size);

4、释放资源

int snd_pcm_close(snd_pcm_t *pcm);

void snd_pcm_hw_params_free(snd_pcm_hw_params_t *obj)

5、异步接口

int snd_async_add_pcm_handler(snd_async_handler_t **handler, snd_pcm_t *pcm, 
			      snd_async_callback_t callback, void *private_data);

int snd_pcm_poll_descriptors(snd_pcm_t *pcm,struct pollfd *pfds,unsigned int space);

参考资料

正点原子文档
ALSA project - the C library reference: Index, Preamble and License (alsa-project.org)文章来源地址https://www.toymoban.com/news/detail-751321.html

到了这里,关于【音频应用】Linux之ALSA音频应用编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux ALSA音频工具aplay、arecord、amixer的使用方法

    ALSA 是Advanced Linux Sound Architecture的缩写,先进的Linux音频架构,为Linux操作系统提供音频和MIDI功能。 aplay是播放命令。 -t, 指定输出数据格式,默认是wave格式,还支持raw,voc,au,后两种格式不懂。 -D,指定播放设备,设备名的格式为hw:0,0,表示0号card的0号device。 -c,指定c

    2024年02月06日
    浏览(37)
  • 深入探索RK3588平台开发:解析Linux音频调试与alsa-utils工具

    近期我深入研究了RK3588平台的开发,特别是在音频领域的探索。在这个系列的讲解中,我们将重点关注Linux音频调试,并深入探讨与之相关的alsa-utils工具。通过本文,我将为大家详细介绍如何在RK3588平台上进行高效的音频开发,让我们一同踏入这个令人兴奋的领域。 RK3588是瑞

    2024年01月25日
    浏览(53)
  • Linux音频处理:MP3解码、PCM、播放PCM、ALSA(Advanced Linux Sound Architecture)、MPEG(Moving Picture Experts Group)

    将MP3音频文件中的数字音频数据转换为可以播放或处理的音频信号的过程。MP3(MPEG-1 Audio Layer 3)是一种常见的音频压缩格式,用于将音频文件压缩到较小的文件大小,同时保持相对高的音质。 以下是MP3解码的一般步骤: 读取MP3文件 : 首先,需要读取存储在MP3文件中的音频

    2024年02月03日
    浏览(41)
  • Linux ALSA 之三:简单的 ALSA Driver 实现

    本节主要根据例子来描述撰写简单的 Alsa Driver 实现步骤,其中涉及的 Alsa Api 具体功能基本已经在Linux ALSA 之二:ALSA 声卡与设备中已经描述。 在 dummy.c 中直接 module_init() 入口函数中注册 Platform Device Platform Driver,匹配后进入 platform_driver 的 probe() 函数。 在前面 driver device 匹配

    2023年04月17日
    浏览(27)
  • 音频开发之ALSA框架

    ALSA(Advanced Linux Sound Architecture)是Linux操作系统上用于提供音频和MIDI功能的软件架构。它为Linux系统提供了强大的音频支持,包括音频录制、播放和处理,它设计用于提供高性能、低延迟、高质量的音频处理,并为开发者提供了一组API和工具。 ALSA的涉及本身比较复杂,如果

    2024年01月23日
    浏览(87)
  • alsa框架与音频芯片移植基础

    Alsa是Advanced Linux Sound Architecture的缩写,即高级Linux声音架构,在Linux操作系统上提供了对音频和MIDI的支持。在Linux 2.6的内核版本后,Alsa目前已经成为了linux的主流音频体系结构。 除了 alsa-driver,ALSA 包含在用户空间的 alsa-lib 函数库,具有更加友好的编程接口,并且完全兼容于

    2024年02月09日
    浏览(39)
  • RK3568 alsa 音频 录制与播放

    ALSA是Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构。 在内核设备驱动层,ALSA提供了alsa-driver,同时在应用层,ALSA为咱们提供了alsa-lib,应用程序只要调用alsa-lib提供的API,便可以完成对底层音频硬件的控制。 aplay -l 显示实际声卡序号 查看声卡:

    2024年02月13日
    浏览(41)
  • 零基础入门多媒体音频(6)-alsa(2)

    PCM接口 ALSA的PCM中间层非常有用,每个驱动只需要实现底层的功能来访问硬件。要使用PCM层,你需要先引用 sound/pcm.h头文件。此外,如果你要使用和hw_param相关的函数,sound/pcm_params.h也是必须的。 每个声卡设备最多拥有4个PCM实例。一个PCM实例对应一个PCM设备文件。实例数量的

    2024年04月14日
    浏览(51)
  • IMX8mp alsa音频调试

    1、硬件环境: soc: im8mp bt: cypress CYW43455, 并通过M2接口连接到imx8mp开发板。 2、硬件连接: 3、综述: BT通过M2接口连接到IMX8mp开发板,M2接口中包含了PCM总线、UART、BT_EN引脚。 通话音频播放,BT使用imx8mp默认PCM接口,所以默认情况下无需额外配置,imx8会自动识别并加载音频设备

    2023年04月09日
    浏览(27)
  • alsa音频pcm设备之i2c调试

    i2cdetect 列举 I2C bus i2cdetect -l ls /dev/i2c* 列出I2C bus i2c-7 上面连接的所有设备,并得到i2c设备地址 i2cdetect -y 7 发现i2c设备的位置显示为UU或表示设备地址的数值,UU表示设备在driver中被使用. I2cdump i2c设备大量register的值 i2cdump -y 7 0x40 I2cset设置i2c设备某个register的值 i2cset -y 7 0x40 0x0

    2024年02月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包