tinyalsa 终极详解

2023-05-16

1.tinyalsa 背景

1、tinyalsa位于 Android源码的 external/ tinyalsa 位置。

关于 tinyalsa,tinyalsa是Google在Android 4.0之后推的 基于 alsa内核的用户层音频接口

tinyalsa中主要的 头文件 数据结构 如下,通过 ioctrl 和内核的 alsa驱动 交互。

alsa-lib 的库 过于复杂  繁琐大部分功能 在Android平台 没有实际实用意义 却依然占 用屈指可数的内存空间。

driver 文件: 

在Android中 一个pcm设备最多可有一个mixer设备 "/dev/snd/controlC%u"(一般是controlC0)和32个/dev/snd/pcmC%uD%uc(一般是pcmC0D0c)、/dev/snd/pcmC%uD%u%p(一般是pcmC0D0p),pcm设备中的C代表card,D代表device,c代表capture,p代表playback。当我们新增一个pcm声卡C的值会+1,D还是从0开始,可能只有c(pcmC1D0c 例如麦克风),可能只有p(pcmC1D0p 例如音响),可能同时存在c和p(pcmC1D0c  pcmC1D0p )。

tinyalsa 的对外提供的头文件就我上图提到的一个"asoundlib.h",提供最基础的 pcm mixer 操作。实现文件为pcm.c(实现 声卡原始数据 操作 api)mixer.c(音频设备相关的操作 api)。

根据 asoundlib.h 编写了四个小工具 tinypcminfo  tinyplay  tinycap  tinymix,这四个小工具作为系统命令存放在系统中,可以很方便的使用。tinyasla作为精简版的alsa-lib可能会有人想把它移植到Linux使用,tinyasla依赖的库有libcutils && libutils,如果能把依赖的这两个库的一些方法使用Linux接口实现那么剩下的问题应该不大了吧。

2.音频小工具总结

tinypcminfo的 实现文件  tinypcminfo.c (查看 pcm设备 能力)

tinyplay的实现文件  tinyplay.c( 使用pcm设备播放 wav格式 的音频文件)

tinycap的实现文件  tinycap.c( 使用pcm设备采集pcm格式的码流,并保存为wav格式的文件)

tinymix的实现文件  tinymix.c( 对pcm设备的控制,包括音量调节、设备切换)

查看当前声卡

cat /proc/asound/cards  

2、 tinymix

 tinymix -h  -crontrol s

  2.1 mix使用说明。
    
    2.1.1 打开mixer设备
    struct mixer *mixer = mixer_open(card); 
    card是一个整型的变量。是声卡的控制器的编号。mixer_open会打开controlCX,card就是对应X的数值。
    我们在/dev/snd/目录下用ls命令就可以看到相关的声卡设备。


    2.1.2 mixer的读写
    首先获得mixer_ctl的指针。
    mixer_ctl ctl =mixer_get_ctl_by_name(mixer, name);
    参数name就是control的名称,就是要和我们前面介绍的snd_kcontrol_new结构中name相匹配。
    也可以通过id来得到mixer_ctl的指针。
    mixer_ctl ctl =mixer_get_ctl(mixer, id);
    这个id和驱动中添加control的顺序是一样的,例如第一个control的id是0,第二个是1...


    设置control的值。
    mixer_ctl_set_value(ctl, index, value);
    前面讲过control的名称相同,则通过index来区分,这个index就是和snd_kcontrol_new结构中index相匹配的。如果没有同名的control,那么index就直接设为0。value为要设置的值。


    读control的值
    mixer_ctl_get_value(ctl, index);
 

3、 tinyplay

tinyplay 是一个 简易的音乐播放器, 一般用于播放测试。 tinyplay 只能播放wav原始格式的音乐不能进行Mp3等格式的解码,支持44.1kHz,48kHz采样率的wav音乐。在调用tinyplay播放音乐之前需要先使用 tinymix 切换好音频通路,设置音量

4,  tinycap

tinycap是一个简易的录音软件,一般用于录音测试。

在调用tinycap录音之前需要先使用 tinymix调整好音频通路

[objc] view plain copy

  1. tinymix 14 30           //mic1 volume  
  2. tinymix 19 1            //mic1 boost on  
  3. tinymix 26 1            //adc1 -> mic1  
  4. tinymix 50 ADC1         //i2sR out -> adc1  
  5. tinymix 51 ADC1     //i2sL out -> adc2  
  6. echo "0xfb 0x01" >  /sys/devices/platform/comip_codec/lc1160_reg     //bias poweron  
  7. echo "0xad 0x08" >  /sys/devices/platform/comip_codec/lc1160_reg //adc1 enable  
  8. echo "0xac 0x01" >  /sys/devices/platform/comip_codec/lc1160_reg     //mic1 pga enable  
  9. echo "0x3b 0xcc" >  /sys/devices/platform/comip_codec/lc1160_reg     //ldo  
  10. echo 2 > /sys/bus/i2c/drivers/fm2018/0-0060/mode     //bypass 外部的回声消除音频芯片(M730x项目特有)  
  11.   
  12. tinycap /sdcard/Music/l.wav  

3、tinyalsa

+-- Android.mk +-- include | +-- tinyalsa | +-- asoundlib.h +--

mixer.c ## 类alsa-lib的control,作用音频部件开关、音量调节等 +--

pcm.c ##类alsa-lib的pcm,作用音频pcm数据回放录制 +-- README +--

tinycap.c  ##类alsa_arecord

+-- tinymix.c  ##类alsa_amixer

+-- tinyplay.c  ##类alsa_aplay

录音结束通过ctrl+C强行退出即可,之后在/sdcard/Music/路径下查看到l.wav音频文件 有源码包

4.音频框架总结

(1). ALSA 是  kernel 里面管理  audio 的核心,我们的  audio driver
    部分一般会调用 snd_soc_register_card(),  将我们在 软件层面抽象出来的声卡注册进audio核心
(2). 在用户空间android同样给我们提供了tinyalsa方便   我们操作我们的driver
(3).audio的 hal层,这部分也是和具体的厂商有关,
(4).mediaservice,图中的media是在init.rc里面启动的native进程
    在我们所用的android版本中这个service其实还启动了camera
    service,这里只讲解与audio相关的AudioFlinger
    AudioPolicyService
(5).在 mediaservice 启动之后会zygote进程,zygote紧接着会启动
    android的核心进程systemserver进程。在systemserver进程
    里面会注册AudioService,其实这里AudioService虽然叫做
    service,其实他是通过调用AudioSystem间接地获得
    AudioFlinger的代理到具体的audio,之所以service是由于
    我们一般在应用程序中又是通过获得AudioService的代理
    操作的,可见虽然android的binder进程间通讯功能强大
    但是效率可能并没有其他的进程间通讯机制高效。
    比如我们一般在应用程序中通过 AudioManager 操作得到当前
    的音量会首先通过binder机制先获得 AudioService 代理,然后
    AudioService在通过AudioSystem获得AudioFlinger的代理才
    能操作到实际的实现部分会发现这里一次调用却用了两次
    binder通信,显然没有普通的进程间通信机制高效,优点确实功能很强大。
(6).应用程序中有 AudioTrack,AudioRecoder, AudioManager,
    MediaPlayer
等接口实际操作我们的audio的。

目前技术经理 提供成长学习星球 加V 13106543984 (299 48小时内可退)
提供程序员成长学习地图 提供成长学习通道 减少自我摸索的过程 
专职提供服务 
Android Linux C C++ 初级程序员入行
Android Linux C C++ 中级程序员进阶
Android Linux C C++ 高级程序员成型
技术转管理进阶 带团队解决问题
简历打造  跳槽时机 工作指导 职场发展 解惑答疑 项目探讨等
对于刚要入行初级程序员 初级程序升中级 有极大收益 
中级升高级 高级升管理 有较大收益...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tinyalsa 终极详解 的相关文章

  • ROS导航——配置机器人的导航功能(move_base包)

    中间部分是整个导航的核心部分 xff0c 由move base功能包提供 配置如下 xff1a lt launch gt lt node pkg 61 34 move base 34 type 61 34 move base 34 resp
  • 基于docker安装tensorflow

    最近在自学机器学习 xff0c 大热的Tensorflow自然不能错过 xff0c 所以首先解决安装问题 xff0c 为了不影响本地环境 xff0c 所以本文基于Docker来安装Tensorflow xff0c 我的环境是Ubuntu16
  • okHttpUtil工具类

    pom文件 lt dependency gt lt groupId gt com squareup okhttp3 lt groupId gt lt artifactId gt okhttp lt artifactId gt lt vers
  • 基于采样的RRT/RRT*/RRT_connect算法笔记及C++实现

    本文记录常见的基于采样的RRT算法及相关改进算法 xff08 RRT xff0c RRT connect xff09 的原理和代码实现效果 与上一章介绍A 算法的文章不同 xff0c 本文会先给出几种算法之间的效果对比 xff0c 先有个直
  • STM32F103ZE驱动PMW3901光流模块

    本文将会简单的介绍如何使用STM32F103ZE驱动PMW3901光流模块 xff0c 使用标准库 所用材料如下 一块 STM32F103最小系统板以及一个 PMW3901光流模块 通过查阅PMW3901的数据手册可以得知 xff0c 该芯
  • 计算两圆相交面积

    转自 xff1a 模板 求两圆相交面积 xff08 模板 xff09 两圆相交分如下集中情况 xff1a 相离 相切 相交 包含 设两圆圆心分别是O1和O2 xff0c 半径分别是r1和r2 xff0c 设d为两圆心距离 又因为两圆有大有小
  • 深蓝学院-移动机器人运动规划重点笔记

    移动机器人运动规划笔记 xff0c 转载自https blog csdn net wqwqqwqw1231 article details 107310965 感谢原作者的总结 xff01
  • TFmini Plus在Arduino上的开发例程(二)

    本例程以Arduino Uno板为例 xff0c 通过Arduino实现TFmini Plus相关指令的写入 xff0c 上行数据的读取 判断和测量数据的获取打印 xff0c 主要帮助客户快速熟悉我公司雷达 xff0c 减少产品的研发周期
  • Linux命令发送Http GET/POST请求

    Linux命令发送Http GET POST请求 Get请求 1 使用curl命令 xff1a curl span class token string 34 http www baidu com 34 span 如果这里的URL指向的是一
  • VSCode 常用设置项

    代码编辑工具VSCode 常用设置项 span class token punctuation span span class token comment VScode主题配置 span span class token string 34
  • 机器人运动控制-上位机通讯

    机器人 xff0c 无论是工业机器人还是服务机器人等多种类机器人 xff0c 都有自己的控制器 在他们的控制面板上 xff0c 我们可以通过简单的操作和程序指令 xff0c 让机器人自行运动 为了让机器人更加智能 xff0c 我们需要在机器
  • Imu误差模型、零偏、零偏稳定性

    原文链接 零偏 xff0c 零偏稳定性和零偏重复性 xff0c IMU误差模型 什么是零偏 xff08 Bias xff09 在陀螺静止时 xff0c 陀螺仪仍会 xff0c 以规定时间内测得的输出量平均值相应的等效输入角速率表示 xff0
  • 海思3516a实现OSD叠加水印

    文章目录 前言一 三个文件的编译二 海思SDK使用步骤1 创建叠加字符2 添加叠加区域到视频通道 总结 前言 两天的努力终于实现了 xff0c 激动 xff01 在网上查阅了各种资料 xff0c 只是有零散的信息 xff0c 海思3516a
  • 结合下图,说明UART的工作原理

    结合下图 xff0c 说明UART的工作原理 UART提供三个独立的异步串行I O口 xff0c 他们可以运行于中断模式或者DMA模式 xff0c 也就是说UART可以产生中断请求或者DMA请求 xff0c 以便在CPU和UART之间传输数
  • 深入理解计算机系统 -- 大端与小端字节序

    一 大端字节序 vs 小端字节序 字节序指一个多字节对象在内存中存储的方式 xff0c 小端字节序机器在存储多字节对象时采用低地址存低有效字节的策略 xff0c 大端则恰恰相反 字节序由CPU架构决定 xff0c 与操作系统无直接关系 像常
  • TCP连接建立

    TCP 一种面向来连接的 可靠的 基于字节流的传输层通信协议 面向连接 xff1a 数据在发送之前必须在两端建立连接 xff0c 方法就是我们熟知的三次握手连接 可靠传输 xff1a 通过多种机制来保证数据的正确传输 xff0c 比如序列号
  • UDP接收端收不到广播的消息问题排查

    网络调试助手可以互相发送 xff0c 而你的UDP广播代码却不行 你是广播 是不会被路由器转发的 但是在同一个交换机下 是可以收到广播的 还有就是 电脑的虚拟网卡会拦截广播操作 xff0c 因为你没有指定一个地址 xff0c 所以代码正确的
  • STM32带FIFO的DMA传输应用示例

    STM32系列芯片都内置DMA外设 xff0c 其中很多系列的DMA配备了FIFO 这里以STM32F429芯片及开发板为例 xff0c 演示一下带FIFO的DMA传输实现过程 大致情况是这样的 xff0c 我用TIMER1通道1的比较事件
  • 两种方式判断内存的大小端存储方式

    1 目的 xff1a 判断ubuntu操作系统的内存属于大端还是小端存储 2 源代码 两种方法判断大小端 xff08 处理器取值时的字节序 xff09 xff1a 1 字符指针 2 联合体 法1 if 1 include lt stdio
  • 字符串:求str1在str2中首次出现的位置。

    span class token macro property span class token directive keyword include span span class token string lt stdio h gt sp

随机推荐