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: 0x000009

Format[0]: 0x000045

Format[1]: 00000000

Format Name: S8, S16_LE, S24_LE

Subformat: 0x000001

Rate: min=8000Hz max=96000Hz

Channels: min=2 max=2

Sample bits: min=8 max=32

Period size: min=32 max=131072

Period count: min=2 max=8192

PCM in:

Access: 0x000009

Format[0]: 0x000045

Format[1]: 00000000

Format Name: S8, S16_LE, S24_LE

Subformat: 0x000001

Rate: min=8000Hz max=96000Hz

Channels: min=2 max=2

Sample bits: min=8 max=32

Period 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_hdmiin

realtekrt5651codec_hdmiin

1 [SPDIF ]: SPDIF - SPDIF

SPDIF

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音频文件。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. Oracle导出表(即DMP文件)的两种方法
  2. java calendar赋值_Java常用日期操作
  3. Fix an “Unapproved Caller” SecurityAgent Message in Mac OS X
  4. Git初学札记(六)————在远程新建本地Branch与在本地新建远程Branch
  5. leetcode 190 python
  6. NumPy Cookbook 带注释源码 十、Scikit 中的乐趣
  7. Sword 内核队列一
  8. 怎样用计算机算屋面的坡度,屋顶坡度要怎么算,一般是多少?
  9. 弱鸡儿长乐爆零旅Day1
  10. 2019年最吸引攻击炮火的 Web 框架:WordPress 和 Apache Struts
  11. IEEE2019_A Survey of Event Extraction from Text
  12. Ubuntu20安装搜狗拼音输入法
  13. Python画樱花树~
  14. Tbase 源码 (二)
  15. java调用考勤机_怎样把考勤机上的数据用java程序得到?
  16. 平安京因服务器升级维护什么意思,阴阳师4月27日维护更新公告 堀江由衣猫掌柜降临平安京...
  17. 基于机智云的智能花盆1.0
  18. ppt矩形里面的图片怎么放大缩小_如何使用PPT调节图片的大小
  19. php自由脱式组件,脱式计算.26×3+451314×(603-596)3000-830×31738÷(45÷5)
  20. Python爬虫-BeautifulSoup

热门文章

  1. 什么叫做pythonic_Pythonic到底是什么玩意儿?
  2. 模型预测控制算法基础与车辆纵向控制仿真分析
  3. MediShares(MDS)宣布参与EOS超级节点竞选
  4. mPEG2000-DMG,160743-62-4,DMG-PEG2000,mPEG2000- 二肉豆蔻酰基-外消旋-甘油
  5. rem 前端字体_前端浏览器字体小于12px的解决办法
  6. KdPrint使用方法
  7. 【leetcode-python-22】874. 模拟行走机器人
  8. 基于java Springmvc+mybatis 电影院售票管理系统设计和实现以及文档
  9. Yarn调度器和调度算法(From 尚硅谷)
  10. 深入浅出Java开发!java工程师短期培训