Android音频底层调试-基于tinyalsa

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android音频底层调试-基于tinyalsa相关的知识,希望对你有一定的参考价值。

参考技术A

因为android中默认并没有使用标准alsa,而是使用的是tinyalsa。所以就算基于命令行的测试也要使用libtinyalsa。Android系统在上层Audio千变万化的时候,能够能这些个工具实时查看到,比方音频通道的切换等等。

编译完后会产生tinyplay、tinymix、tinycap等工具。

tinymix用法:

相应解释:

Playback Path:

例:将输出切换到扬声器

关于tinymix小结:

通过观察发现,Android系统的声音音量的调节并没有直接使用tinyalsa,而基于上层软件实现。由于不管上层音量怎么改变,这里看到的都是24(以我使用的设备为例)。

通道的切换是真正使用了tinyalsa,当通过不同通道播放音乐的时候能够实时观察到通道的切换。在某个站点上看到Android在没有声音播放的3秒后会关闭alsa,这里也得到了证实,我曾经觉得Android系统会永久占用音频设备。

当通过蓝牙播放音乐的时候,已经不经过alsa了,tinymix查看到都处理关闭状态。由于Android4.2的蓝牙协议所有在用户层实现了,直接走uart通道。

一般播放1khz 0db正弦波,然后在codec输出端示波器简单测量是否失真,杂音,然后再使用音频分析仪测试指标。

tinyalsa源码
原文: https://www.cnblogs.com/yxwkf/p/5344068.html

linux驱动由浅入深系列:tinyalsa(tinymix/tinycap/tinyplay/tinypcminfo)音频子系统之一

本文转载自:http://blog.csdn.net/radianceblau/article/details/64125411

目前linux中主流的音频体系结构是ALSA(Advanced Linux Sound Architecture),ALSA在内核驱动层提供了alsa-driver,在应用层提供了alsa-lib,应用程序只需要调用alsa-lib提供的API就可以完成对底层硬件的操作。说的这么好,但是Android中没有使用标准的ALSA,而是一个ALSA的简化版叫做tinyalsa。Android中使用tinyalsa控制管理所有模式的音频通路,我们也可以使用tinyalsa提供的工具进行查看、调试。

编译tinyalsa后生成四个小工具:

 

[objc] view plain copy
 
  1. tinymix  
  2. tinyplay  
  3. tinycap  
  4. tinypcminfo  

 

编译命令:

[objc] view plain copy
 
  1. mmm external/tinyalsa/  

技术分享

下面依次演示一下四个小工具的使用:(以下使用联芯科技的LC1860平台配合LC1160电源+音频芯片,截图及演示效果均来自M7301P5测试机)

1,  tinypcminfo

tinypcminfo用于查看pcm通道的相关信息

输入:

 

[objc] view plain copy
 
  1. tinypcminfo -D /proc/asound/cards  

 

结果如下:

技术分享

从上面获得的信息中可以知道PCM的采样率,通道个数,采样点数等信息。

其中 –D 后边跟的参数为声卡文件,一般位于/proc/asound/cards。可以使用

 

[objc] view plain copy
 
  1. cat /proc/asound/cards  

查看当前声卡
技术分享

 

 

2,  tinymix

如下图所示,直接输入tinymix可以得到音频通路相关的各项配置参数。也可以通过添加参数修改其中的配置,如希望提高ADC1 Gain值到110,输入tinymix 12 110即可。

技术分享

 

单独查看上述信息比较难以梳理,配合音频通路图会更加清晰。

技术分享

 

上图中红色字体标明了LC1160与麦克风、耳机等硬件设备的连接关系。(注:M73xx项目由于内部ClassD不满足要求,喇叭连在了AUX通路上)

各个通路上的增益调节部分使用绿色字体标出了与tinymix中选项的对应关系。

图中加号与Mux是通路选择开关,对应tinymix中的其它的选项,用于在各种模式下切换音频通道。此部分比较多没有在图中一一标出,但根据已知的通路名是比较容易对应的。

图中黄色箭头标出的是通话时下行音频数据流,从PCM接口进入到LC1160,然后经过MonoDAC进行数模转化后送到听筒。

图中紫色箭头标出的是通话时上行音频数据流,从主MIC采集声音后,经过ADC1进行模数转换后由PMC的DO线送出

3,  tinyplay

 

tinyplay是一个简易的音乐播放器,一般用于播放测试。tinyplay只能播放wav原始格式的音乐,不能进行Mp3等格式的解码,支持44.1kHz,48kHz采样率的wav音乐。

在调用tinyplay播放音乐之前需要先使用tinymix切换好音频通路:

 

[objc] view plain copy
 
  1. tinymix 0 I2SR      //选择Stereo DACR的音源为i2s  
  2. tinymix 1 I2SL      //选择Stereo DACL的音源为i2s  
  3. tinymix 0       //将Stereo DAC左右声道的mute关闭  
  4. tinymix 21        //开启喇叭的外部PA芯片  
  5. tinymix 41        //将Stereo DACR的声音路由到AUX口输出(因为实验机器喇叭挂载AUX接口上)  
  6. tinymix 41        //将Stereo DACR的声音路由到AUX口输出(因为实验机器喇叭挂载AUX接口上)  
  7. tinyplay z.wav  

技术分享

 

4,  tinycap

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

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

 

[objc] view plain copy
 
  1. tinymix 130           //mic1 volume  
  2. tinymix 11            //mic1 boost on  
  3. tinymix 21            //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  

 

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

技术分享

使用adb pull到本地电脑中,使用goldwave播放、查看。

[objc] view plain copy
 
  1. adb pull /sdcard/Music/l.wav d:\  


技术分享

另外:

LC1160的寄存器是分页的,即同一个地址上存在两个不同含义的寄存器,通过控制0xFC寄存器中的值来切换到第二功能页

 

[objc] view plain copy
 
    1. echo "0xfc 0x01" >  /sys/devices/platform/comip_codec/lc1160_reg   
    2. cat /sys/devices/platform/comip_codec/lc1160_reg  
    3. echo "0xfc 0x00" >  /sys/devices/platform/comip_codec/lc1160_reg  

以上是关于Android音频底层调试-基于tinyalsa的主要内容,如果未能解决你的问题,请参考以下文章

RK3588平台开发系列讲解(AUDIO篇)Android音频调试--tiny-alsa 工具

Linux内存管理之mmap详解 (可用于android底层内存调试)

Android 音频(Audio)架构

Linux/安卓驱动入门视频

20172327 2017-2018-2 《第一行代码Android》第一章学习总结

基于点击事件android录制和保存音频