昆山做网站费用,软件著作权申请流程,营销型网站的定义,邢台推广网站建设电话ALPHA I.MX6U 开发板支持音频#xff0c;板上搭载了音频编解码芯片 WM8960#xff0c;支持播放以及录音功能#xff01;本章我们来学习 Linux 下的音频应用编程#xff0c;音频应用编程相比于前面几个章节所介绍的内容、其难度有所上升#xff0c;但是笔者仅向大家介绍 Li…ALPHA I.MX6U 开发板支持音频板上搭载了音频编解码芯片 WM8960支持播放以及录音功能本章我们来学习 Linux 下的音频应用编程音频应用编程相比于前面几个章节所介绍的内容、其难度有所上升但是笔者仅向大家介绍 Linux 音频应用编程中的基础知识而更多细节、更加深入的内容需要大家自己去学习。
本章将会讨论如下主题内容。
⚫ Linux 下 ALSA 框架概述
⚫ alsa-lib 库介绍
⚫ alsa-lib 库移植
⚫ alsa-lib 库的使用
⚫ 音频应用编程之播放
⚫ 音频应用编程之录音。 ALSA 概述 ALSA 是 Advanced Linux Sound Architecture高级的 Linux 声音体系的缩写目前已经成为了 linux下的主流音频体系架构提供了音频和 MIDI 的支持替代了原先旧版本中的 OSS开发声音系统学习过 Linux 音频驱动开发的读者肯定知道这个事实上ALSA 是 Linux 系统下一套标准的、先进的音频驱动框架那么这套框架的设计本身是比较复杂的采用分离、分层思想设计而成具体的细节便不给大家介绍了作为音频应用编程我们不用去研究这个。 在应用层ALSA 为我们提供了一套标准的 API应用程序只需要调用这些 API 就可完成对底层音频硬件设备的控制譬如播放、录音等这一套 API 称为 alsa-lib。如下图所示 alsa-lib 简介 如上所述alsa-lib 是一套 Linux 应用层的 C 语言函数库为音频应用程序开发提供了一套统一、标准的接口应用程序只需调用这一套 API 即可完成对底层声卡设备的操控譬如播放与录音。 用户空间的 alsa-lib 对应用程序提供了统一的 API 接口这样可以隐藏驱动层的实现细节简化了应用程序的实现难度、无需应用程序开发人员直接去读写音频设备节点。所以本章对于我们来说学习音频应用编程其实就是学习 alsa-lib 库函数的使用、如何基于 alsa-lib 库函数开发音频应用程序。 ALSA 提供了关于 alsa-lib 的使用说明文档其链接地址为https://www.alsa-project.org/alsa-doc/alsa-lib/ 进入到该链接地址后如下所示 alsa-lib 库支持功能比较多提供了丰富的 API 接口供应用程序开发人员调用根据函数的功能、作用将这些 API 进行了分类可以点击上图中 Modules 按钮查看其模块划分如下所示 一个分类就是一个模块module有些模块下可能该包含了子模块譬如上图中模块名称前面有三角箭头的表示该模块包含有子模块。 ⚫ Global defines and functions包括一些全局的定义譬如函数、宏等 ⚫ Constants for Digital Audio Interfaces数字音频接口相关的常量 ⚫ Input Interface输入接口 ⚫ Output Interface输出接口 ⚫ Error handling错误处理相关接口 ⚫ Configuration Interface配置接口 ⚫ Control Interface控制接口 ⚫ PCM InterfacePCM 设备接口 ⚫ RawMidi InterfaceRawMidi 接口 ⚫ Timer Interface定时器接口 ⚫ Hardware Dependant Interface硬件相关接口 ⚫ MIDI SequencerMIDI 音序器 ⚫ External PCM plugin SDK外部 PCM 插件 SDK ⚫ External Control Plugin SDK外部控制插件 SDK ⚫ Mixer Interface混音器接口 ⚫ Use Case Interface用例接口 ⚫ Topology Interface拓扑接口。 可以看到alsa-lib 提供的接口确实非常多、模块很多以上所列举出来的这些模块很多模块笔者也不是很清楚它们的具体功能、作用但是本章我们仅涉及到三个模块下的 API 函数包括PCM Interface、Error Interface 以及 Mixer Interface。 PCM Interface PCM Interface提供了 PCM 设备相关的操作接口譬如打开/关闭 PCM 设备、配置 PCM 设备硬件或软件参数、控制 PCM 设备启动、暂停、恢复、写入/读取数据该模块下还包含了一些子模块如下所示 点击模块名称可以查看到该模块提供的API接口有哪些以及相应的函数说明这里就不给大家演示了 Error Interface 该模块提供了关于错误处理相关的接口譬如函数调用发生错误时可调用该模块下提供的函数打印错误描述信息。 Mixer Interface 提供了关于混音器相关的一系列操作接口譬如音量、声道控制、增益等等。 sound 设备节点 在 Linux 内核设备驱动层、基于 ALSA 音频驱动框架注册的 sound 设备会在/dev/snd 目录下生成相应的设备节点文件譬如 ALPHA I.MX6U 开发板出厂系统/dev/snd 目录下有如下文件 Tips注意Mini I.MX6U 开发板出厂系统/dev/snd 目录下是没有这些文件的因为 Mini 板不支持音频、没有板载音频编解码芯片所以本章实验例程无法在 Mini 板上进行测试请悉知 从上图可以看到有如下设备文件 ⚫ controlC0用于声卡控制的设备节点譬如通道选择、混音器、麦克风的控制等C0 表示声卡 0card0 ⚫ pcmC0D0c用于录音的 PCM 设备节点。其中 C0 表示 card0也就是声卡 0而 D0 表示 device0也就是设备 0最后一个字母 c 是 capture 的缩写表示录音所以 pcmC0D0c 便是系统的声卡0 中的录音设备 0 ⚫ pcmC0D0p用于播放或叫放音、回放的 PCM 设备节点。其中 C0 表示 card0也就是声卡 0而 D0 表示 device 0也就是设备 0最后一个字母 p 是 playback 的缩写表示播放所以 pcmC0D0p便是系统的声卡 0 中的播放设备 0 ⚫ pcmC0D1c用于录音的 PCM 设备节点。对应系统的声卡 0 中的录音设备 1 ⚫ pcmC0D1p用于播放的 PCM 设备节点。对应系统的声卡 0 中的播放设备 1。 ⚫ timer定时器。 本章我们编写的应用程序虽然是调用 alsa-lib 库函数去控制底层音频硬件但最终也是落实到对 sound设备节点的 I/O 操作只不过 alsa-lib 已经帮我们封装好了。在 Linux 系统的/proc/asound 目录下有很多的文件这些文件记录了系统中声卡相关的信息如下所示 cards 通过cat /proc/asound/cards命令、查看 cards 文件的内容可列出系统中可用的、注册的声卡如下所示 cat /proc/asound/cards 我们的阿尔法板子上只有一个声卡WM8960 音频编解码器所以它的编号为 0也就是 card0。系统中注册的所有声卡都会在/proc/asound/目录下存在一个相应的目录该目录的命名方式为 cardXX 表示 声卡的编号譬如图 28.3.2 中的 card0card0 目录下记录了声卡 0 相关的信息譬如声卡的名字以及声卡注册的 PCM 设备如下所示 devices 列出系统中所有声卡注册的设备包括 control、pcm、timer、seq 等等。如下所示 cat /proc/asound/devices pcm 列出系统中的所有 PCM 设备包括 playback 和 capture cat /proc/asound/pcm alsa-lib 移植 因为 alsa-lib 是 ALSA 提供的一套 Linux 下的 C 语言函数库需要将 alsa-lib 移植到开发板上这样基于 alsa-lib 编写的应用程序才能成功运行除了移植 alsa-lib 库之外通常还需要移植 alsa-utilsalsa-utils 包含了一些用于测试、配置声卡的工具。 事实上ALPHA I.MX6U 开发板出厂系统中已经移植了 alsa-lib 和 alsa-utils本章我们直接使用出厂系统移植好的 alsa-lib 和 alsa-utils 进行测试笔者也就不再介绍移植过程了。其实它们的移植方法也非常简单如果你想自己尝试移植网上有很多参考大家可以自己去看看。 alsa-utils 提供了一些用于测试、配置声卡的工具譬如 aplay、arecord、alsactl、alsaloop、alsamixer、amixer 等在开发板出厂系统上可以直接使用这些工具这些应用程序也都是基于 alsa-lib 编写的。 aplay aplay 是一个用于测试音频播放功能程序可以使用 aplay 播放 wav 格式的音频文件如下所示 程序运行之后就会开始播放音乐因为 ALPHA 开发板支持喇叭和耳机自动切换如果不插耳机默认从喇叭播放音乐插上耳机以后喇叭就会停止播放切换为耳机播放音乐这个大家可以自己进行测试。 需要注意的是aplay 工具只能解析 wav 格式音频文件不支持 mp3 格式解码所以无法使用 aplay 工具播放 mp3 音频文件。稍后笔者会向大家介绍如何基于 alsa-lib 编写一个简单地音乐播放器实现与 aplay相同的效果。 更多命令参考正电原子应用开发手册即可。 暂略。 编写一个简单的alsa-lib应用程序 本小节开始我们来学习如何基于 alsa-lib 编写音频应用程序alsa-lib 提供的库函数也别多笔者肯定不会全部给大家介绍只介绍基础的使用方法关于更加深入、更加详细的使用方法需要大家自己去研究、学习。 对于 alsa-lib 库的使用ALSA 提供了一些参考资料来帮助应用程序开发人员快速上手 alsa-lib、基于alsa-lib 进行应用编程以下笔者给出了链接 https://users.suse.com/~mana/alsa090_howto.html https://www.alsa-project.org/alsa-doc/alsa-lib/examples.html 第一份文档向用户介绍了如何使用 alsa-lib 编写简单的音频应用程序包括 PCM 播放音频、PCM 录音等笔者也是参考了这份文档来编写本章教程对应初学者建议大家看一看。 第二个链接地址是 ALSA 提供的一些示例代码如下所示 点击对应源文件即可查看源代码。 以上便是 ALSA 提供的帮助文档以及参考代码链接地址已经给出了大家有兴趣可以看一下。 本小节笔者将向大家介绍如何基于 alsa-lib 编写一个简单地音频应用程序譬如播放音乐、录音等但在此之前首先我们需要先来了解一些基本的概念为后面的学习打下一个坚实的基础 一些基本概念 主要是与音频相关的基本概念因为在 alsa-lib 应用编程中会涉及到这些概念所以先给大家进行一个简单地介绍。 样本长度Sample 样本是记录音频数据最基本的单元样本长度就是采样位数也称为位深度Bit Depth、Sample Size、Sample Width。是指计算机在采集和播放声音文件时所使用数字声音信号的二进制位数或者说每个采样样本所包含的位数计算机对每个通道采样量化时数字比特位数通常有 8bit、16bit、24bit 等。 声道数channel 分为单声道(Mono)和双声道/立体声(Stereo)。1 表示单声道、2 表示立体声。 帧frame 帧记录了一个声音单元其长度为样本长度与声道数的乘积一段音频数据就是由苦干帧组成的。 把所有声道中的数据加在一起叫做一帧对于单声道一帧 样本长度 * 1双声道一帧 样本长度 * 2。譬如对于样本长度为 16bit 的双声道来说一帧的大小等于16 * 2 / 8 4 个字节。 更多命令参考正电原子应用开发手册即可。 暂略。 关于音频先了解吧。 后面如果要接触再来深入学习。 补充 什么是PCM设备 脉冲编码调制Pulse Code Modulation简称PCM是一种将模拟信号转换为数字信号的技术。这种转换过程是通过测量模拟信号的特征点例如电压或电流并将其编码为二进制数字数据来实现的。 在通信系统中PCM设备的作用主要体现在以下几个方面 低速业务转换PCM设备可以将各种低速业务转换成数字信号并装入64kbit/s通道。这些低速业务包括但不限于语音电话、热线电话、磁石电话等以及2W/4W模拟音频、RS-232、RS-422、RS-485、V.35、G.703同向64kbit/s以太网等。 多路复用PCM设备具有将30路64kbit/s通道复接成2Mbit/s的能力从而实现了多路复用的功能。这意味着在同一条物理线路上可以同时传输多路信号提高了线路的利用率和通信效率。 信号传输在光纤通信系统中PCM设备发挥着重要作用。光纤中传输的二进制光脉冲“0”码和“1”码就是由二进制数字信号对光源进行通断调制产生的而数字信号正是通过对连续变化的模拟信号进行抽样、量化和编码得到的这就是PCM的过程。 接口类型多样PCM设备的接口类型丰富多样包括环路中继接口、用户线接口、二线音频接口、四线音频接口、异步RS232/V.24接口、同步RS232、RS422接口、RS485接口、V.35接口、G.703 64Kb/s同向数据接口等。 总的来说PCM设备在现代通信系统中扮演着重要角色它不仅能够实现模拟信号到数字信号的转换还能够通过多路复用技术提高通信效率满足不同用户对数据传输速率的需求。