电子产业一站式赋能平台

PCB联盟网

搜索
查看: 1723|回复: 1
收起左侧

应用层控制音频的基本原理与实现

[复制链接]

556

主题

928

帖子

4829

积分

四级会员

Rank: 4

积分
4829
发表于 2022-7-16 10:48:54 | 显示全部楼层 |阅读模式
开发板上支持音频,板子上搭载了音频编码芯片WM8960,支持播放以及录音功能。Linux下音频应用编程,难度有点高,需要大家花费更多的时间去学习。
应用层控制音频的基本原理与实现-1.jpg
第一:ALSA基本简介     ALSA是高级的Linux声音体系,目前已经成为主流音频体系框架。ALSA 是 Linux 系统下一套标准的、先进的音频驱动框架,那么这套框架的设计本身是比较复杂的,采用分离、分层思想设计而成。       在应用层,ALSA提供了一套标准的API,应用程序只需要调用这些API就可完成对底层音频硬件设备的控制,譬如播放、录音等

应用层控制音频的基本原理与实现-2.jpg


第二:alsa-lib库函数的基本简介    在alsa-lib中提供了一套Linux应用层的C语言函数库,为音频应用程序开发提供一套统一,标准的接口,应用程序只需调用这一套 API 即可完成对底层声卡设备的操控,譬如播放与录音。    用户空间的alsa-lib 对应用程序提供了统一的 API 接口,这样可以隐藏驱动层的实现细节,简化了应用程序的实现难度、无需应用程序开发人员直接去读写音频设备节点。这次实现的过程中,涉及到三个模块对应的API函数,包括:PCM Interface 、 Error Interface以及Mixer Interface

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

应用层控制音频的基本原理与实现-3.jpg

controlC0:用于声卡控制的设备节点,譬如通道选择,混音器,麦克风的控制等。pcmC0D0c:用于录音的PCM设备节点。
     当一个声卡处于工作状态时,环形缓冲区buffer中的数据总是连续在音频设备和应用程序缓存区间传输,效果如图所示:

应用层控制音频的基本原理与实现-4.jpg

第四:简易的音乐播放器代码实现
    编写一个简单音乐播放器,可以播放WAV音频文件,代码实现如下:
应用层控制音频的基本原理与实现-5.jpg
应用层控制音频的基本原理与实现-6.jpg
应用层控制音频的基本原理与实现-7.jpg
应用层控制音频的基本原理与实现-8.jpg
应用层控制音频的基本原理与实现-9.jpg
应用层控制音频的基本原理与实现-10.jpg
应用层控制音频的基本原理与实现-11.jpg
代码分析:在 main()函数中,首先对参数进行了校验,执行测试程序需要用户传入一个参数,这个参数用于指定一个需要播放的 WAV 音频文件。接着调用自定义函数 open_wav_file()对 WAV 文件进行解析,其实也就是对它的头部数据进行校验、解析,获取音频格式信息以及音频数据的位置偏移量。接着调用自定义函数 snd_pcm_init()对 PCM 设备进行初始化,在 snd_pcm_init()函数中,首先调用 alsalib 库函数 snd_pcm_open()打开 PCM 播放设备,接着对 PCM 设备硬件参数进行设置,包括:访问类型、数据格式、采样率、声道数、周期大小以及 buffer 的大小。
总结:利用系统中的应用层也可以实现对音频的基本控制,掌握其中的原理,才能走的更远。
回复

使用道具 举报

0

主题

111

帖子

368

积分

一级会员

Rank: 1

积分
368
发表于 2022-8-3 09:45:40 | 显示全部楼层
写的不错,支持一下!
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条


联系客服 关注微信 下载APP 返回顶部 返回列表