【TinyALSA全解析(一)】TinyALSA简介

TinyALSA简介

  • 一、TinyALSA概述
    • 1.1 TinyALSA背景和用途
    • 1.2 TinyALSA主要内容
    • 1.3 TinyALSA与ALSA的关系
  • 二、TinyALSA具体有哪些内容
    • 2.1 libtinyalsa.so 库
    • 2.2 一组工具
  • 三、tinyalsa完整目录分析
  • 四、tinyalsa的编译方法和使用方法
    • 4.1 tinyalsa编译方法
      • 4.1.1 TinyALSA全编译方法
      • 4.1.2 针对某个工具进行编译
    • 4.2 tinyalsa使用方法
      • 4.2.1 使用tinyalsa特别注意事项
      • 4.2.2 tinyplay使用方法
      • 4.2.3 tinycap的使用方法

/*****************************************************************************************************************/

声明: 本博客内容均由https://blog.csdn.net/weixin_47702410原创,转载or引用请注明出处,谢谢!

创作不易,如果文章对你有帮助,麻烦点赞 收藏支持~感谢

/*****************************************************************************************************************/

一、TinyALSA概述

1.1 TinyALSA背景和用途

TinyALSA是针对Linux操作系统的音频硬件抽象层(ALSA)的简化版本,主要提供比ALSA库更小、更精简的接口。同时,TinyALSA采用BSD许可,而ALSA用的是GPL许可,对比之下,TinyALSA许可更为宽松,允许了闭源商业使用。

1.2 TinyALSA主要内容

TinyALSA包括两个主要的组件:

  • 一个库,提供了一组API用于直接与ALSA驱动进行交互
  • 一组工具,包括用来播放和录制音频的命令行工具。

TinyALSA的主要优势在于其代码非常精简,易于阅读和理解。这使得它在资源有限的嵌入式系统中是一种理想的音频解决方案,例如Android设备会广泛使用tinyalsa。

1.3 TinyALSA与ALSA的关系

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具体有哪些内容

2.1 libtinyalsa.so 库

这个库提供了与音频硬件进行交互的功能。具体文件包括以下:

  • pcm.c和pcm.h:这些文件提供了PCM(脉冲编码调制)的操作,包括录音和播放。PCM是一种常见的数字音频格式。加载这些文件将提供类似于打开、关闭、读写PCM设备的基本功能。
  • mixer.c和mixer.h:这些文件为ALSA混音器提供支持。混音器用来控制音频设备上各个音频通道的音量和路由。加载这些文件将提供控制混音器的功能。

2.2 一组工具

这些工具包括了在命令行环境中使用TinyALSA的最基本用法。主要且常用的文件包括以下:

  • tinycap:这是个从音频设备中捕获音频的工具。它的源代码是tinycap.c。
  • tinyplay:这是个播放音频的工具。它的源代码是tinyplay.c。
  • tinymix:这是个修改混音器设置的工具。它的源代码是tinymix.c。

三、tinyalsa完整目录分析

以安卓12为例,tinyalsa的目录可见:
安卓官方代码库

其包含的文件如下:

Files and Directoriesinclude/
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

可以将上面的这些文件分成三个类别:

  • 核心库

    • pcm.c,pcm_hw.c:这些文件都包含了处理PCM(脉冲编码调制)音频数据的逻辑。
    • mixer.c,mixer_hw.c:这些文件都包含了处理混音器的逻辑。
  • 命令行工具

    • tinycap.c:用于从音频设备录音。
    • tinyplay.c:用于将音频播放到音频设备。
    • tinymix.c:用于修改混音器的设置。

    • 上面三个工具是常用的,注意这三个工具是可以直接用cmd进行操作的,其可以绕过Android HAL层和Android Framework层次,直接对Kernel进行操作
      如果在HAL层有相关的算法存在,为了检测与HAL交互的数据,一般使用这些工具进行读取或者播放数据。
      另外一般为了解决Android APP层不能播放声音或者不能录音的问题,一般也用这些工具检测底层的驱动是否已经正确。
  • 其它

    • Android.bp:Android构建系统的配置文件
    • METADATA, MODULE_LICENSE_BSD, NOTICE, OWNERS, README:这些文件通常用于描述项目信息、版权通知、许可证信息等。
    • pcm_io.h,mixer_io.h,和 snd_utils.h 是头文件,在那些C源文件中被include。

四、tinyalsa的编译方法和使用方法

4.1 tinyalsa编译方法

介绍一下TinyALSA全编译方法和针对某个工具进行编译的方法
区别在于全编译方法会编译整个TinyALSA,包括库和各种工具都会编译到,但是缺点也很明显,就是编译时间会比较长

而针对某个工具的编译方法,编译时间比较短,针对性强,推荐修改了某个文件后,用这种方法,而在修改较多的情况下用TinyALSA全编译方法。

4.1.1 TinyALSA全编译方法

  • 先配置编译环境
先配置编译环境:
source build/envsetup.sh && export OUT_DIR=out && lunch xxx
或者
source ./build/envsetup.sh && lunch xxx
具体是什么命令,跟你设备的编译环境有很大关系再使用 mmm 命令进行编译:
mmm external/tinyalsa
  • 使用ADB push文件编译产物到设备中
(如是64位系统则目录为:/system/lib64/)
adb push libtinyalsa.so /system/lib/ 
adb push tinyplay /system/bin/
adb push tinycap /system/bin/
adb push tinymix /system/bin/

4.1.2 针对某个工具进行编译

以编译tinyplay为例:

./prebuilts/build-tools/linux-x86/bin/ninja -f out/combined*.ninja tinyplay

4.2 tinyalsa使用方法

4.2.1 使用tinyalsa特别注意事项

1、在安卓12中,tinyplay只能播放.wav格式的音乐,tinycap录音出来的文件格式是.wav格式

2、如果有用到DAPM去控制电源开关,需要先使用tinymix操作相关控件后再进行tinycap or tinyplay

3、Tip:查看音频节点的方法:cat /proc/asound/pcm

4.2.2 tinyplay使用方法

用法: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

4.2.3 tinycap的使用方法

用法: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:采样率,它可以指定音频的采样率,常见值包括4410048000等。
-b:位深度,这个参数可以指定每一个样本的位数,通常有162432等。
-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 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/174393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JVM系列】- 穿插·对象的实例化与直接内存

对象的实例化与直接内存 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🌝分享学习心得,欢迎指正,大家一起学习成长! 文章目录…

SpringCloud系列文章目录(总纲篇)

文章目录 前言正文一、原理性文章1.1 OpenFeign篇 二、实战性文章1.1 注册中心、配置中心篇1.2 网关篇1.3 OpenFeign篇 前言 SpringCloud系列文章,有些文章上下文存在联系。 并且,它们数量巨多,有涉及原理的,有涉及实战的。 本文…

域名邮箱与企业邮箱的区别:功能、应用与优势

根据使用者的不同需求,电子邮件分为域名邮箱和企业邮箱两种类型。那么这两种邮箱之间究竟存在哪些区别呢?本文将从定义、优势和劣势三个方面进行详细解析。 什么是域名邮箱? 域名邮箱,顾名思义是以域名作为后缀的电子邮箱。域名邮…

【UGUI】制作用户注册UI界面

这里面主要的操作思想就是 1.打组 同一个事情里面包含两个UI元素都应该打组便于管理和查找 2.设置锚点位置 每次创建一个UI都应该设置他的锚点以便于跟随画布控制自己的:相对位置 3. 设置尺寸(像素大小) 每一次UI元素哪怕是作为父物体的…

我叫:归并排序【JAVA】

1.认识我一下 1.归并排序(MERGE-SORT)利用归并的思想实现的排序方法,该算法采用经典的分治策略2.分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之。 2.分合思想 3 分久必合 /*** 合并** param arr …

tp6框架 万级数据入库

用框架自带的saveall方法 当数据超过一千就会出现遗漏的情况 下面是原生sql方法: function saveCourse($newArr, $count) {$sql "replace into edu_wx_school_self_course (study_hour,code,cn_name,en_name,study_score,school_qy) values";for ($a…

(数据结构)顺序表的定义

#include<stdio.h> //顺序表的实现——静态分配 #define MAX 10 //定义最大长度 typedef struct List {int data[MAX]; //用静态的数组存放数据int lenth; //顺序表现在的长度 }List; //顺序表的初始化 void ChuShiHua(List L) {L.lenth 0; //将顺序表的长度初始化…

Tensorflow检测不到GPU解决办法(针对本人4060有效)

目录 前置条件硬件条件当前日期 检查方法解决方法版本列表tensorflow2.10.0CUDA12.1cudnn8.8 结果 前置条件 硬件条件 R5-5600G RTX4060 当前日期 当前时间是2023年11月27日&#xff0c;请注意本文的时效性&#xff0c;保不齐后续出现某个组件的更新能够直接解决这个问题。…

YOLOv8优化策略:自适应改变核大小卷积AKConv,效果优于标准卷积核和DSConv |2023.11月最新成果

🚀🚀🚀本文改进: AKConv 中,通过新的坐标生成算法定义任意大小的卷积核的初始位置。 为了适应目标的变化,引入了偏移量来调整每个位置的样本形状。 此外,我们通过使用具有相同大小和不同初始采样形状的 AKConv 来探索神经网络的效果。 AKConv 通过不规则卷积运算完成…

STM32项目经验分享:常用软件

文章目录 硬件设计软件软件设计软件英文文档阅读 硬件设计软件 Altium Designer&#xff08;在公司用会被维权&#xff09; 3D模型&#xff08;3D contentcentral&#xff09; 嘉立创 先用立创EDA画原理图然后再用AD画PCB,3D模型可以用3D contentcentral下载 软件设计软件 …

【备忘录】软件记录

Anaconda 虚拟环境 创建Python环境 Spyder Python程序编辑 Jupyter Notebook 交互式开发环境

Spring第二课响应的完全,如何理解前后端互联

目录 一、响应 Control,RestController 1.Controller的源码&#xff0c;代表什么意思 2.返回数据 Responsebody 3.返回HTML片段 4.返回JSON 5.那么假如我们使用集合会怎么样呢 设置状态码&#xff0c;虽然不影响展示&#xff0c;但是确实显示起来也就是401的情况。 2.我…

[设计模式] 常见的设计模式

文章目录 设计模式的 6 大设计原则设计模式的三大分类常见的设计模式有哪几种1. 单例模式&#xff1a;保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。&#xff08;连接池&#xff09;1. 饿汉式2. 懒汉式3. 双重检测 2. 工厂模式3. 观察者模式● 推模型● 拉…

自动化横行时代,手工测试如何突破重围?测试之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 自动化测试是每个…

WiseAlign 软件运行中存图功能使用方法

WiseAlign 软件运行中存图功能使用方法 在需要存图的相机图像通道点击鼠标右键 在弹出的菜单中选择“图像操作——保存图像” 选择想要存放图片的文件夹&#xff08;如下图所示&#xff09; 修改文件名称 如果文件夹中已有同名文件会提示xxx.bmp文件已存在&#xff0c;是否需要…

【【Linux开发环境搭建与软件的安装】】

Linux开发环境搭建与软件的安装 下面我们来讲述 Ubuntu 系统搭建 tftp 服务器 TFTP 需要一个文件夹来存放文件&#xff0c;我们在根目录下新建一个/tftpboot 目录做为 TFTP 文件存储目录&#xff0c;之所以使用该目录是因为后面使用的 Petalinux 工具默认使用该目录&#xff0…

Spring Cloud,注册中心,配置中心,原理详解

文章目录 Spring Cloud&#xff0c;注册中心&#xff0c;配置中心&#xff0c;原理详解谈谈我个人对 spring Cloud 的理解 注册中心Eureka&#xff1a;服务搭建小结 Ribbo - 负载均衡1. 负载均衡流程2. 负载均衡策略 nacos注册中心1. 配置集群1. 创建 namespace2. 配置命名空间…

核密度估计法(KDE)的概念,应用,优点,缺点,以及与正态分布(高斯分布)的区别,以及与概率分布的区别联系。看完你就真正捋清这些概念了

文章目录 前言一、核密度估计法&#xff08;KDE&#xff09;是什么&#xff1f;二、核密度估计法的步骤如下&#xff1a;三、核密度的应用&#xff1a;四、核密度估计法的优点&#xff1a;五、核密度估计法的缺点&#xff1a;六、核密度估计法和正态分布的区别在于&#xff1a;…

注解方式优雅的实现Redisson分布式锁

1.前言 随着微服务的快速推进&#xff0c;分布式架构也得到蓬勃的发展&#xff0c;那么如何保证多进程之间的并发则成为需要考虑的问题。因为服务是分布式部署模式&#xff0c;本地锁Reentrantlock和Synchnorized就无法使用了&#xff0c;当然很多同学脱口而出的基于Redis的se…

【机器学习】平滑滤波

平滑滤波技术 平滑滤波&#xff0c;顾名思义就是对信号进行处理使之整体显得更加平滑&#xff0c;降低噪声影响&#xff0c;提高信号质量&#xff0c;它常见于数字信号处理和图像处理&#xff0c;一般意义上的数字信号多体现于一维数据&#xff0c;图像信号多体现于二维数据。…