/*****************************************************************************************************************/
声明: 本博客内容均由https://blog.csdn.net/weixin_47702410原创,转载or引用请注明出处,谢谢!
创作不易,如果文章对你有帮助,麻烦点赞 收藏支持~感谢
/*****************************************************************************************************************/
TinyALSA是针对Linux操作系统的音频硬件抽象层(ALSA)的简化版本,主要提供比ALSA库更小、更精简的接口。同时,TinyALSA采用BSD许可,而ALSA用的是GPL许可,对比之下,TinyALSA许可更为宽松,允许了闭源商业使用。
TinyALSA包括两个主要的组件:
TinyALSA的主要优势在于其代码非常精简,易于阅读和理解。这使得它在资源有限的嵌入式系统中是一种理想的音频解决方案,例如Android设备会广泛使用tinyalsa。
TinyALSA在安卓官方文档的描述:
HAL
HAL 定义了音频服务会调用且您必须实现才能使音频硬件正常运行的标准接口。如需了解详情,请参阅音频 HAL 接口并查看相应 HAL 版本目录的 *.hal 文件中的注释。
内核驱动程序
音频驱动程序用于同您的硬件和 HAL 实现进行交互。您可以使用高级 Linux 声音架构 (ALSA)、开放声音系统 (OSS) 或自定义驱动程序(HAL 与驱动程序无关)。
注意:如果您使用的是 ALSA,建议将 external/tinyalsa 用于驱动程序的用户部分,因为它具有兼容的许可(标准的用户模式库已获得 GPL 许可)。
TinyALSA在安卓系统的层次为HAL层与Linux Kernel的中间交互层。TinyALSA向HAL提供API接口,并向Linux kernel 中调度ALSA的标准库去完成硬件相关操作。
总结:
ALSA是位于Linux Kernel层面的音频系统。
TinyALSA是AOSP(Android Open Source Project)的一部分。
TinyALSA位于ALSA的上层,他们之间的关系是使用关系的关系。
TinyALSA使用 ALSA 提供的接口与 Linux 内核进行交互。
这个库提供了与音频硬件进行交互的功能。具体文件包括以下:
这些工具包括了在命令行环境中使用TinyALSA的最基本用法。主要且常用的文件包括以下:
以安卓12为例,tinyalsa的目录可见:
安卓官方代码库
其包含的文件如下:
Files and Directories
include/
Android.bp
METADATA
MODULE_LICENSE_BSD
NOTICE
OWNERS
README
mixer.c
mixer_hw.c
mixer_io.h
mixer_plugin.c
pcm.c
pcm_hw.c
pcm_io.h
pcm_plugin.c
snd_utils.c
snd_utils.h
tinycap.c
tinyplay.c
tinyhostless.c
tinymix.c
tinypcminfo.c
可以将上面的这些文件分成三个类别:
核心库
命令行工具
其它
介绍一下TinyALSA全编译方法和针对某个工具进行编译的方法
区别在于全编译方法会编译整个TinyALSA,包括库和各种工具都会编译到,但是缺点也很明显,就是编译时间会比较长
而针对某个工具的编译方法,编译时间比较短,针对性强,推荐修改了某个文件后,用这种方法,而在修改较多的情况下用TinyALSA全编译方法。
先配置编译环境:
source build/envsetup.sh && export OUT_DIR=out && lunch xxx
或者
source ./build/envsetup.sh && lunch xxx
具体是什么命令,跟你设备的编译环境有很大关系
再使用 mmm 命令进行编译:
mmm external/tinyalsa
(如是64位系统则目录为:/system/lib64/)
adb push libtinyalsa.so /system/lib/
adb push tinyplay /system/bin/
adb push tinycap /system/bin/
adb push tinymix /system/bin/
以编译tinyplay为例:
./prebuilts/build-tools/linux-x86/bin/ninja -f out/combined*.ninja tinyplay
1、在安卓12中,tinyplay只能播放.wav格式的音乐,tinycap录音出来的文件格式是.wav格式
2、如果有用到DAPM去控制电源开关,需要先使用tinymix操作相关控件后再进行tinycap or tinyplay
3、Tip:查看音频节点的方法:cat /proc/asound/pcm
用法:tinyplay file.wav [-D card] [-d device] [-p period_size] [-n n_periods]
参数说明:
file.wav:你要播放的WAV音频文件的路径。
-D :声卡编号,它可以让你选择要使用哪个声卡进行音频播放。
-d :设备编号,它可以让你选择特定的音频设备进行音频播放。
-P : 周期,在 ALSA 系统中做音频处理(例如,播放或录制)的过程就是将数据从应用程序的缓冲区转移到硬件缓冲区(或相反),并且这个过程都是以周期为单位进行的
-n : 周期数量,定义了硬件缓冲区的大小。如果你选择了更大的周期数量,缓冲区会更大,可以存储更多的数据,这有助于防止缓冲区溢出和音频的中断。但是,更多的周期可能会带来更大的延迟,因为需要更多的时间来填满缓冲区。
通常情况下,-p和-n一般不指定,使用默认参数就可以了。
默认参数见external/tinyalsa/tinyplay.c中main函数的如下内容:
unsigned int period_size = 1024;
unsigned int period_count = 4;
举例:
如果音频节点0-0可以播放,
使用音频设备“0-0”播放sdcard目录下的test.wav文件,命令如下:
tinyplay -D 0 -d 0 /sdcard/test.wav
用法:tinycap file.wav file.wav [-D card] [-d device] [-c channels] [-r rate] [-b bits] [-p period_size] [-n n_periods] [-T capture time]
参数说明:
file.wav:这是你要捕获音频数据并要保存成WAV格式的文件的路径。
-D:声卡编号,它可以让你选择要使用哪个声卡进行音频捕获。
-d:设备编号,它可以让你选择特定的音频设备进行音频捕获。
-c:声道数,它可以指定录音的声道数,通常是1(单声道)或2(立体声)。
-r:采样率,它可以指定音频的采样率,常见值包括44100或48000等。
-b:位深度,这个参数可以指定每一个样本的位数,通常有16、24、32等。
-p:周期大小,即在ALSA系统中,数据从应用程序的缓冲区转移到硬件缓冲区(或相反)的过程是以周期单位进行的。
-n:周期数量,它定义了硬件缓冲区的大小。选择较大的周期数量会有较大的缓冲区,这对于防止缓冲区溢出和音频中断是有益的,但可能会导致更大的延迟,因为需要更多的时间来填满缓冲区。
-T:捕获时间,单位是秒,它定义了你希望录音的时间长度。
通常情况下,-p、-n和-T一般不指定,使用默认参数就可以了,不需要录音的时候,ctrl+C停止录音。
默认参数见external/tinyalsa/tinycap.c中main函数的如下内容:
unsigned int card = 0;
unsigned int device = 0;
unsigned int channels = 2;
unsigned int rate = 44100;
unsigned int bits = 16;
unsigned int frames;
unsigned int period_size = 1024;
unsigned int period_count = 4;
unsigned int cap_time = 0;
举例:
如果音频节点0-1可以录音,
举例使用音频设备“0-1”录音,并保存在sdcard目录下的capture.wav文件,
录音格式为48K 16bit 2ch:
则可用如下的命令录音:
tinycap sdcard/capture.wav -D 0 -d 1 -c 2 -r 48000 -b 16