1、PCM

脉冲编码调制(PCM)是一种用于数字表示采样模拟信号的方法。它是数字音频在计算机、光盘、数字电话和其他数字音频应用中的标准形式。在PCM流中,模拟信号的振幅以均匀的间隔进行有规律的采样,并在数字步长的范围内将每个采样量子化到最接近的值。线性脉码调制(LPCM)是一种特定类型的PCM,其量化电平是线性均匀的。这与PCM编码量化水平不同振幅的函数(如 A-law算法或μ-law算法)。尽管PCM是一个更通用的术语,但它通常用于描述被编码为LPCM的数据。

pcm设备,通过阅读tinyalsa的代码和查看Android下的音频设备节点,可知在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 )。

rk3288:/ # ls -l dev/snd/
total 0
crw-rw---- 1 system audio 116,   2 1970-01-01 00:00 controlC0
crw-rw---- 1 system audio 116,  10 1970-01-01 00:00 controlC1
crw-rw---- 1 system audio 116,   4 1970-01-01 00:00 pcmC0D0c
crw-rw---- 1 system audio 116,   3 1970-01-01 00:00 pcmC0D0p
crw-rw---- 1 system audio 116,   6 1970-01-01 00:00 pcmC0D1c
crw-rw---- 1 system audio 116,   5 1970-01-01 00:00 pcmC0D1p
crw-rw---- 1 system audio 116,   8 1970-01-01 00:00 pcmC0D2c
crw-rw---- 1 system audio 116,   7 1970-01-01 00:00 pcmC0D2p
crw-rw---- 1 system audio 116,   9 1970-01-01 00:00 pcmC0D3p
crw-rw---- 1 system audio 116,  11 1970-01-01 00:00 pcmC1D0p
crw-rw---- 1 system audio 116,  33 1970-01-01 00:00 timer

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

3、tinyalsa的对外提供的头文件是"asoundlib.h",提供最基础的pcm和mixer操作。实现文件为pcm.c(实现pcm api)和mixer.c(实现mixer api)。根据asoundlib.h编写了四个小工具tinypcminfo tinyplay tinycap tinymix,这四个小工具作为系统命令存放在系统中,可以很方便的使用。

代码目录:external/tinyalsa/

tinypcminfo的实现文件tinypcminfo.c (查看pcm设备的功能和信息)
tinyplay的实现文件tinyplay.c(使用pcm设备播放wav格式的音频文件)
tinycap的实现文件tinycap.c(使用pcm设备采集pcm格式的码流,并保存为wav格式的文件)
tinymix的实现文件tinymix.c(对pcm设备的控制,包括音量调节、设备切换等)

这几个命令使用时可以先使用tinypcminfo查看pcm设备的功能和信息,否则当我们使用其他三个命令时使用了不合理的配置参数会出现parameter invalid的错误。

3.1编译tinyalsa命令:
Android很多默认是没有编译出tinyplay,tinycap,tinymix,tinypcminfo的,需要手动局部编译,编译出来文件,push到系统system/bin/目录

mmm external/tinyalsa/

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

tinymix
tinyplay
tinycap
tinypcminfo

tinypcminfo 用于查看pcm通道相关的信息 (tinypcminfo -D /proc/asound/cards)
tinymix 可以得到音频通路相关的各项配置参数。也可以通过添加参数修改其中的配置
tinyplay是一个简易的音乐播放器,一般用于播放测试。
tinycap是一个简易的录音软件,一般用于录音测试。

4、说一下四个小工具(tinypcminfo tinyplay tinycap tinymix)的使用【以下都是在rk3288 Android7.1 kernel4.4平台下的操作】

4.1 tinypcminfo

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

rk3288:/ # tinypcminfo -D /proc/asound/cards
Info for card 0, device 0:PCM out:Access:   0x000009Format[0]:   0x000045Format[1]:   00000000Format Name:   S8, S16_LE, S24_LESubformat:   0x000001Rate:   min=8000Hz      max=96000HzChannels:   min=2           max=2Sample bits:   min=8           max=32Period size:   min=32          max=131072
Period count:   min=2           max=8192PCM in:Access:   0x000009Format[0]:   0x000045Format[1]:   00000000Format Name:   S8, S16_LE, S24_LESubformat:   0x000001Rate:   min=8000Hz      max=96000HzChannels:   min=2           max=2Sample bits:   min=8           max=32Period size:   min=32          max=131072
Period count:   min=2           max=8192

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

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

查看当前声卡设备可以使用cat /proc/asound/cards

rk3288:/ # cat /proc/asound/cards                                              0 [realtekrt5651co]: realtekrt5651co - realtekrt5651codec_hdmiinrealtekrt5651codec_hdmiin1 [SPDIF          ]: SPDIF - SPDIFSPDIF

4.2 tinymix
直接输入tinymix可以得到音频通路相关的各项配置参数。也可以使用tinymix通过添加参数修改其中的配置,如希望提高ADC Capture Volume值到110,输入tinymix 9 110即可。

rk3288:/ # tinymix
Mixer name: 'realtekrt5651codec_hdmiin'
Number of controls: 93
ctl     type    num     name                                     value
0       INT     2       HP Playback Volume                       31 31
1       INT     2       OUT Playback Volume                      24 24
2       BOOL    2       DAC2 Playback Switch                     On On
3       INT     2       DAC1 Playback Volume                     175 175
4       INT     2       Mono DAC Playback Volume                 175 175
5       INT     1       IN1 Boost                                0
6       INT     1       IN2 Boost                                0
7       INT     2       IN Capture Volume                        23 23
8       BOOL    2       ADC Capture Switch                       On On
9       INT     2       ADC Capture Volume                       47 47
10      INT     2       Mono ADC Capture Volume                  47 47
11      INT     2       ADC Boost Gain                           0 0
12      ENUM    1       RT5651 ASRC Switch                       Enable
13      BOOL    1       IF1 ASRC Switch                          Off
14      BOOL    1       IF2 ASRC Switch                          On
15      BOOL    1       DMIC ASRC Switch                         Off
16      ENUM    1       ADC IF2 Data Switch                      Normal
17      ENUM    1       DAC IF2 Data Switch                      Normal
18      BYTE    128     ELD                                     00000000000000000000000000000000
19      INT     1       AUDIO MODE                               0
20      BOOL    1       Headphones Switch                        On
21      BOOL    1       Lineout Switch                           On
22      BOOL    1       Headset Mic Switch                       On
23      BOOL    1       Int Mic Switch                           On
24      BOOL    1       RECMIXL INL1 Switch                      Off
25      BOOL    1       RECMIXL BST3 Switch                      Off
26      BOOL    1       RECMIXL BST2 Switch                      Off
27      BOOL    1       RECMIXL BST1 Switch                      Off
28      BOOL    1       RECMIXR INR1 Switch                      Off
29      BOOL    1       RECMIXR BST3 Switch                      Off
30      BOOL    1       RECMIXR BST2 Switch                      Off
31      BOOL    1       RECMIXR BST1 Switch                      Off
32      ENUM    1       Stereo1 ADC L2 Mux                       DD MIX
33      ENUM    1       Stereo1 ADC R2 Mux                       DD MIX
34      ENUM    1       Stereo1 ADC L1 Mux                       ADC
35      ENUM    1       Stereo1 ADC R1 Mux                       ADC
36      ENUM    1       Stereo2 ADC L2 Mux                       DD MIXL
37      ENUM    1       Stereo2 ADC L1 Mux                       ADCL
38      ENUM    1       Stereo2 ADC R1 Mux                       DD MIXR
39      ENUM    1       Stereo2 ADC R2 Mux                       DMIC R
40      BOOL    1       Stereo1 ADC MIXL ADC1 Switch             Off
41      BOOL    1       Stereo1 ADC MIXL ADC2 Switch             Off
42      BOOL    1       Stereo1 ADC MIXR ADC1 Switch             Off
43      BOOL    1       Stereo1 ADC MIXR ADC2 Switch             Off
44      BOOL    1       Stereo2 ADC MIXL ADC1 Switch             Off
45      BOOL    1       Stereo2 ADC MIXL ADC2 Switch             Off
46      BOOL    1       Stereo2 ADC MIXR ADC1 Switch             Off
47      BOOL    1       Stereo2 ADC MIXR ADC2 Switch             Off
48      ENUM    1       IF2 ADC                                  IF1 ADC1
49      ENUM    1       PDM L Mux                                DD MIX
50      ENUM    1       PDM R Mux                                DD MIX
51      BOOL    1       DAC MIXL Stereo ADC Switch               Off
52      BOOL    1       DAC MIXL INF1 Switch                     On
53      BOOL    1       DAC MIXR Stereo ADC Switch               Off
54      BOOL    1       DAC MIXR INF1 Switch                     On
55      ENUM    1       DAC L2 Mux                               IF2
56      ENUM    1       DAC R2 Mux                               IF2
57      BOOL    1       Stereo DAC MIXL DAC L1 Switch            On
58      BOOL    1       Stereo DAC MIXL DAC L2 Switch            Off
59      BOOL    1       Stereo DAC MIXL DAC R1 Switch            Off
60      BOOL    1       Stereo DAC MIXR DAC R1 Switch            On
61      BOOL    1       Stereo DAC MIXR DAC R2 Switch            Off
62      BOOL    1       Stereo DAC MIXR DAC L1 Switch            Off
63      BOOL    1       DD MIXL DAC L1 Switch                    Off
64      BOOL    1       DD MIXL DAC L2 Switch                    Off
65      BOOL    1       DD MIXL DAC R2 Switch                    Off
66      BOOL    1       DD MIXR DAC R1 Switch                    Off
67      BOOL    1       DD MIXR DAC R2 Switch                    Off
68      BOOL    1       DD MIXR DAC L2 Switch                    Off
69      BOOL    1       OUT MIXL BST1 Switch                     Off
70      BOOL    1       OUT MIXL BST2 Switch                     Off
71      BOOL    1       OUT MIXL INL1 Switch                     Off
72      BOOL    1       OUT MIXL REC MIXL Switch                 Off
73      BOOL    1       OUT MIXL DAC L1 Switch                   On
74      BOOL    1       OUT MIXR BST2 Switch                     Off
75      BOOL    1       OUT MIXR BST1 Switch                     Off
76      BOOL    1       OUT MIXR INR1 Switch                     Off
77      BOOL    1       OUT MIXR REC MIXR Switch                 Off
78      BOOL    1       OUT MIXR DAC R1 Switch                   On
79      BOOL    1       OUTVOL L Switch                          On
80      BOOL    1       OUTVOL R Switch                          On
81      BOOL    1       HPOVOL L Switch                          On
82      BOOL    1       HPOVOL R Switch                          On
83      BOOL    1       HPO MIX DAC1 Switch                      Off
84      BOOL    1       HPO MIX HPVOL Switch                     On
85      BOOL    1       LOUT MIX DAC L1 Switch                   Off
86      BOOL    1       LOUT MIX DAC R1 Switch                   Off
87      BOOL    1       LOUT MIX OUTVOL L Switch                 On
88      BOOL    1       LOUT MIX OUTVOL R Switch                 On
89      BOOL    1       HPO L Playback Switch                    On
90      BOOL    1       HPO R Playback Switch                    On
91      BOOL    1       LOUT L Playback Switch                   On
92      BOOL    1       LOUT R Playback Switch                   On

提高ADC Capture Volume值到110,输入tinymix 9 110,得到以下结果

rk3288:/ # tinymix 9 110
rk3288:/ # tinymix
Mixer name: 'realtekrt5651codec_hdmiin'
Number of controls: 93
ctl     type    num     name                                     value
0       INT     2       HP Playback Volume                       31 31
1       INT     2       OUT Playback Volume                      24 24
2       BOOL    2       DAC2 Playback Switch                     On On
3       INT     2       DAC1 Playback Volume                     175 175
4       INT     2       Mono DAC Playback Volume                 175 175
5       INT     1       IN1 Boost                                0
6       INT     1       IN2 Boost                                0
7       INT     2       IN Capture Volume                        23 23
8       BOOL    2       ADC Capture Switch                       On On
9       INT     2       ADC Capture Volume                       110 110
10      INT     2       Mono ADC Capture Volume                  47 47
11      INT     2       ADC Boost Gain                           0 0
12      ENUM    1       RT5651 ASRC Switch                       Enable

当然了,单独查看上述信息比较难以梳理,配合音频通路图会更加清晰,所以我们可以结合硬件原理图一起梳理。

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

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

rk3288:/ # tinyplay
Usage: tinyplay file.wav [-D card] [-d device] [-p period_size] [-n n_periods]
1|rk3288:/ # tinyplay /sdcard/rec.wav -D 0 -d 1 -p 1024 -n 3
Playing sample: 2 ch, 44100 hz, 16 bit
rk3288:/ #注:
-D card 声卡
-d device 设备
-p period_size 一次中断的帧数
-n n_periods 周期数

4.4 tinycap

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

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

rk3288:/ # tinycap /sdcard/rec.wav -D 0 -d 1 -c 2 -r 44100 -b 16 -p 1024 -n 3
Capturing sample: 2 ch, 44100 hz, 16 bit
^CCaptured 463872 frames  //ctrl+C 停止录音注:
-D card 声卡
-d device 设备
-c channels 通道
-r rate 采样率
-b bits pcm 位宽
-p period_size 一次中断的帧数
-n n_periods 周期数

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

RK3288_Android7.1基于tinyalsa的音频调试说明相关推荐

  1. asrc调试_RK3288_Android7.1基于tinyalsa的音频调试说明

    1.PCM 脉冲编码调制(PCM)是一种用于数字表示采样模拟信号的方法.它是数字音频在计算机.光盘.数字电话和其他数字音频应用中的标准形式.在PCM流中,模拟信号的振幅以均匀的间隔进行有规律的采样,并 ...

  2. 基于傅里叶变换的音频重采样算法 (附完整c代码)

    前面有提到音频采样算法: WebRTC 音频采样算法 附完整C++示例代码 简洁明了的插值音频重采样算法例子 (附完整C代码) 近段时间有不少朋友给我写过邮件,说了一些他们使用的情况和问题. 坦白讲, ...

  3. 【Android 使用tinyalsa测试音频】

    Android 使用tinyalsa测试音频 一.tinyalsa简介 ​ Android 中并没有使用标准的 ALSA,而是使用一个 ALSA 的简化版叫做 tinyalsa.ALSA是Advanc ...

  4. android fm 耳机,Android杂谈:音频调试小计

    经常要搞音频调试,很麻烦,现在记录下. 常用数据结构 /system/media/audio/include/system/audio.h 定义了常用的stream类型,例如3就是音乐的stream. ...

  5. Java生产环境下性能监控与调优详解 第4章 基于Btrace的监控调试

    第4章 基于Btrace的监控调试 4-1 btrace入门 4-2 拦截构造函数.同名函数 4-3 拦截返回值.异常.行号 4-4 拦截复杂参数.坏境变量.正则匹配拦截 4-5 注意事项

  6. 基于 CoreAudio 的音频编解码(二):音频编码

    系列文章目录 基于 CoreAudio 的音频编解码(一):音频解码 基于 CoreAudio 的音频编解码(二):音频编码 前言 在 基于 CoreAudio 的音频编解码(一):音频解码 中,我们 ...

  7. 基于 CoreAudio 的音频编解码(一):音频解码

    系列文章目录 基于 CoreAudio 的音频编解码(一):音频解码 基于 CoreAudio 的音频编解码(二):音频编码 前言 Core Audio 是iOS和MAC系统中的关于数字音频处理的基础 ...

  8. 基于 FFMPEG 的音频编解码(三):音频编码

    音频编码 基于 FFMPEG 的音频编解码(一):Hello FFMPEG,安装与编译 基于 FFMPEG 的音频编解码(二):音频解码 基于 FFMPEG 的音频编解码(三):音频编码 在前面文章中 ...

  9. 基于 FFMPEG 的音频编解码(二):音频解码

    音频解码 基于 FFMPEG 的音频编解码(一):Hello FFMPEG,安装与编译 基于 FFMPEG 的音频编解码(二):音频解码 基于 FFMPEG 的音频编解码(三):音频编码 在 Hell ...

  10. 基于 FFMPEG 的音频编解码(一):Hello FFMPEG,安装与编译

    Hello FFMPEG 基于 FFMPEG 的音频编解码(一):Hello FFMPEG,安装与编译 基于 FFMPEG 的音频编解码(二):音频解码 基于 FFMPEG 的音频编解码(三):音频编 ...

最新文章

  1. python程序在安卓上如何运行-在 android 上运行 python 的方法
  2. MAKEWPARAM 宏 及MAKELONG ,MAKELPARAM,MAKELRESULT
  3. 【qduoj - 夏季学期创新题】C语言课程设计-阶梯问题(dp,高精度大数)
  4. 基于Vitual Box建立虚拟机,虚拟机系统为Linux Ubuntu16.04
  5. 网站随机背景音乐源码
  6. 汇编中bss,data,text,rodata,heap,stack段的作用
  7. Effective C# 原则12:选择变量初始化而不是赋值语句
  8. linux安装jdk详细步骤,需要有一定的语法基础
  9. matlab基本图形处理实验,MATLAB数字图像处理实验讲义(指导书)
  10. 嵩天《Python网络爬虫与信息提取》实例4:股票数据定向爬虫
  11. 解读OOM killer机制输出的日志
  12. php微信开发计数,总结一个微信开发的过程实例
  13. python学习之——假人配对
  14. 结合springboot搭建日志采集系统EFK
  15. oracle数据库恢复aul_ORACLE恢复神器之ODU/AUL/DUL
  16. 怎么把cad做的图分享给别人_怎么将CAD图转换
  17. 无法找到指定DLL库文件“v8.dIl“中的输出命令“Initializev8”
  18. 测试管理知识:如何从业务高手转型为基层管理者
  19. 小学五年级计算机教学论文,小学五年级数学教学论文
  20. Ubuntu / Linux 手动安装Paraview

热门文章

  1. 整合Spring Cloud微服务分布式云架构技术点
  2. Spring Security三种认证
  3. 移动端tap或touch类型事件的点透问题认识
  4. RHEL 7.0系统安装配置图解教程
  5. centos下的mysql安装
  6. 编译使用CEF2623遇到的错误解决办法
  7. 包机项目源码分析笔记
  8. 黑马程序员_Java高新技术
  9. 分享我的iOS app 开发杂谈3
  10. 三色交替的下拉列表框