对于Android音频系统学习时可能会出现许多名词,这些词光看字面意思可能无法直接理解,为了更好的对Android系统进行学习,特开一章对Android音频系统会出现的名词进行解释,欢迎大家补充。

一、名词解释

stream type

app要播放声音, 要指定声音类型: stream type

Android SoundPool 导致没有声音_android

strategy
将各类型的声音中具有相同行为的声音类型聚在一起分为一个类,叫做strategy。

相同行为:播放的设备(device)一样、优先级一样等

有那么多的类型, 来来来, 先看它属于哪一类(策略): 使用getStrategy()函数获知声音属于strategy,如下图,每一个红框就是一类(strategy)。

Android SoundPool 导致没有声音_音频编码解码_02

声卡:
声卡 (Sound Card)也叫音频卡(港台称之为声效卡),是计算机多媒体系统中最基本的组成部分,是实现声波/数字信号相互转换的一种硬件。

一个声卡包含多个device(喇叭、耳机还是蓝牙)

设备结点
用户空间和内核空间的通信节点

用户进程与内核下的硬件进行通信需要建立一个设备节点,设备节点使得用户可以与内核进行硬件的沟通,读写设备以及其他的操作。

在linux里面设备就像是普通文件一样的存在,访问一个设备就好像是访问一个文件一样。

主设备号代表着一类设备,次设备号代表着同一类设备的不同个体。

Linux声卡设备节点:下面每一行代表一个设备节点

Android SoundPool 导致没有声音_经验分享_03

一个设备结点包含多个device

device(硬件):

根据strategy确定要用什么设备播放: device, 喇叭、耳机还是蓝牙?

Android系统里使用hardware module来访问硬件, 比如声卡,声卡上有喇叭、耳机等等,称为device。

Android SoundPool 导致没有声音_音频编码解码_04

更详细的看哪些是device可看这篇文章:输出、输入设备

output(硬件):
配置,用于描述现在可以支持哪些device,以及该output的采样率、通道数等。

为了便于管理, 把一个设备上具有相同参数(采样率等)的一组device称为output。 *:这组device在同一硬件的不同端口。

profile
配置,用于描述output本可以支持哪些device,以及该output的采样率、通道数等。
output和profile异同:

output描述现在,profile描述本可以,如profile配置里output本可以支持耳机,但现在耳机没插,因此output中就没有耳机。

module:
是一个硬件操作库。

Android系统里使用hardware module(硬件操作库)来访问硬件(包括output、device), 比如声卡

module产生了三个问题? 1、Android系统会根据module的名字打开对于的.so文件,那么系统如何知道module名字? 2、一个module能支持哪些output? 3、一个output能支持哪些device,具体参数是什么?

为了这三个问题,Android系统提供了/audio_policy.conf 使用配置文件/system/etc/audio_policy.conf来描述上面的三个问题

playbackthread
PlaybackThread:回放线程基类,同由 ThreadBase 派生

根据device确定output,进而知道对应的playbackthread,把声音数据传给这个thread 对于录制还有,RecordThread:录制线程类,由 ThreadBase 派生

policy

一个stream如何最终选择到一个device,这些stream type如何互相影响(一个高优先级的声音会使得其他声音静音),等等等, 统称为policy (政策)

out flag
一个输出的flag标识符

比如对于某个专业APP, 它只从HDMI播放声音, 这时就可以指定out flag为AUDIO_OUTPUT_FLAG_DIRECT,这会导致最终的声音无需混音即直接输出到对应的device

Android SoundPool 导致没有声音_移动开发_05