前言:
当App需要播放声音时,首先需要明确声音的类型,即流类型(stream type)。由于存在多种声音类型,因此需要确定一个播放策略(strategy)来区分它们。基于这个策略,系统将决定使用哪种设备来播放声音,可能是喇叭、耳机或蓝牙等(device)。进一步地,根据所选设备及其配置(如采样率、通道数等),系统会确定一个输出(output),这个输出代表了一组具有相同参数的设备。最后,系统会基于这个输出来选择对应的播放线程(playback thread)进行声音播放。
常见流类型:
序号 | 流类型名称 | 值 | 描述 |
---|---|---|---|
1 | AUDIO_STREAM_DEFAULT | -1 | 默认音频流 |
2 | AUDIO_STREAM_MIN | 0 | 最小音频流(与AUDIO_STREAM_VOICE_CALL相同) |
3 | AUDIO_STREAM_VOICE_CALL | 0 | 语音通话音频流 |
4 | AUDIO_STREAM_SYSTEM | 1 | 系统音频流 |
5 | AUDIO_STREAM_RING | 2 | 铃声音频流 |
6 | AUDIO_STREAM_MUSIC | 3 | 音乐音频流 |
7 | AUDIO_STREAM_ALARM | 4 | 闹钟音频流 |
8 | AUDIO_STREAM_NOTIFICATION | 5 | 通知音频流 |
9 | AUDIO_STREAM_BLUETOOTH_SCO | 6 | 蓝牙SCO音频流 |
10 | AUDIO_STREAM_ENFORCED_AUDIBLE | 7 | 用户无法静音的音频流,必须输出到扬声器 |
11 | AUDIO_STREAM_DTMF | 8 | DTMF(双音多频)音频流 |
12 | AUDIO_STREAM_TTS | 9 | 透过扬声器传输的音频流(仅扬声器播放,其他设备无声) |
13 | AUDIO_STREAM_ACCESSIBILITY | 10 | 辅助功能语音提示音频流 |
14 | AUDIO_STREAM_REROUTING | 11 | 用于动态策略输出混音的音频流 |
15 | AUDIO_STREAM_PATCH | 12 | 用于内部音频flinger轨道的音频流(固定音量) |
16 | AUDIO_STREAM_PUBLIC_CNT | AUDIO_STREAM_TTS + 1 | 公共音频流计数(动态值,基于AUDIO_STREAM_TTS) |
17 | AUDIO_STREAM_CNT | AUDIO_STREAM_PATCH + 1 | 总音频流计数(动态值,基于AUDIO_STREAM_PATCH) |
常见设备的定义:
/system/media/audio/include/system/audio-base.h
输出:
标识符 | 值 (十六进制) | 描述 |
---|---|---|
AUDIO_DEVICE_NONE | 0x0u | 无音频设备 |
AUDIO_DEVICE_BIT_IN | 0x80000000u | 输入设备位掩码 |
AUDIO_DEVICE_BIT_DEFAULT | 0x40000000u | 默认设备位掩码 |
AUDIO_DEVICE_OUT_EARPIECE | 0x1u | 听筒 |
AUDIO_DEVICE_OUT_SPEAKER | 0x2u | 扬声器 |
AUDIO_DEVICE_OUT_WIRED_HEADSET | 0x4u | 有线耳机 |
AUDIO_DEVICE_OUT_WIRED_HEADPHONE | 0x8u | 有线头戴耳机 |
AUDIO_DEVICE_OUT_BLUETOOTH_SCO | 0x10u | 蓝牙SCO耳机 |
AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET | 0x20u | 蓝牙SCO耳机套件 |
AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT | 0x40u | 蓝牙SCO车载套件 |
AUDIO_DEVICE_OUT_BLUETOOTH_A2DP | 0x80u | 蓝牙A2DP |
AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | 0x100u | 蓝牙A2DP头戴耳机 |
AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER | 0x200u | 蓝牙A2DP扬声器 |
AUDIO_DEVICE_OUT_AUX_DIGITAL | 0x400u | 辅助数字输出(与HDMI相同) |
AUDIO_DEVICE_OUT_HDMI | 0x400u | HDMI输出(与AUX_DIGITAL相同) |
AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET | 0x800u | 模拟基座耳机 |
AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET | 0x1000u | 数字基座耳机 |
AUDIO_DEVICE_OUT_USB_ACCESSORY | 0x2000u | USB配件输出 |
AUDIO_DEVICE_OUT_USB_DEVICE | 0x4000u | USB设备输出 |
AUDIO_DEVICE_OUT_REMOTE_SUBMIX | 0x8000u | 远程子混音输出 |
AUDIO_DEVICE_OUT_TELEPHONY_TX | 0x10000u | 电话传输输出 |
AUDIO_DEVICE_OUT_LINE | 0x20000u | 线路输出 |
AUDIO_DEVICE_OUT_HDMI_ARC | 0x40000u | HDMI ARC输出 |
AUDIO_DEVICE_OUT_SPDIF | 0x80000u | SPDIF输出 |
AUDIO_DEVICE_OUT_FM | 0x100000u | FM输出 |
AUDIO_DEVICE_OUT_AUX_LINE | 0x200000u | 辅助线路输出 |
AUDIO_DEVICE_OUT_SPEAKER_SAFE | 0x400000u | 安全扬声器输出 |
AUDIO_DEVICE_OUT_IP | 0x800000u | IP输出 |
AUDIO_DEVICE_OUT_BUS | 0x1000000u | 总线输出 |
AUDIO_DEVICE_OUT_PROXY | 0x2000000u | 代理输出 |
AUDIO_DEVICE_OUT_USB_HEADSET | 0x4000000u | USB耳机输出 |
AUDIO_DEVICE_OUT_HEARING_AID | 0x8000000u | 助听器输出 |
AUDIO_DEVICE_OUT_ECHO_CANCELLER | 0x10000000u | 回声消除器 |
AUDIO_DEVICE_OUT_DEFAULT | 0x40000000u | 默认输出设备(与BIT_DEFAULT相同) |
输入:
标识符 | 值 (十六进制) | 描述 |
---|---|---|
AUDIO_DEVICE_IN_COMMUNICATION | 0x80000001u | 通信输入设备 |
AUDIO_DEVICE_IN_AMBIENT | 0x80000002u | 环境声音输入设备 |
AUDIO_DEVICE_IN_BUILTIN_MIC | 0x80000004u | 内置麦克风 |
AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET | 0x80000008u | 蓝牙SCO耳机输入设备 |
AUDIO_DEVICE_IN_WIRED_HEADSET | 0x80000010u | 有线耳机输入设备 |
AUDIO_DEVICE_IN_AUX_DIGITAL | 0x80000020u | 辅助数字输入设备 |
AUDIO_DEVICE_IN_HDMI | 0x80000020u | HDMI输入设备(与AUDIO_DEVICE_IN_AUX_DIGITAL 重复) |
AUDIO_DEVICE_IN_VOICE_CALL | 0x80000040u | 语音通话输入设备 |
AUDIO_DEVICE_IN_TELEPHONY_RX | 0x80000040u | 电话接收输入设备(与AUDIO_DEVICE_IN_VOICE_CALL 重复) |
AUDIO_DEVICE_IN_BACK_MIC | 0x80000080u | 后置麦克风输入设备 |
AUDIO_DEVICE_IN_REMOTE_SUBMIX | 0x80000100u | 远程子混音输入设备 |
AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET | 0x80000200u | 模拟基座耳机输入设备 |
AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET | 0x80000400u | 数字基座耳机输入设备 |
AUDIO_DEVICE_IN_USB_ACCESSORY | 0x80000800u | USB配件输入设备 |
AUDIO_DEVICE_IN_USB_DEVICE | 0x80001000u | USB设备输入设备 |
AUDIO_DEVICE_IN_FM_TUNER | 0x80002000u | FM收音机输入设备 |
AUDIO_DEVICE_IN_TV_TUNER | 0x80004000u | 电视调谐器输入设备 |
AUDIO_DEVICE_IN_LINE | 0x80008000u | 线路输入设备 |
AUDIO_DEVICE_IN_SPDIF | 0x80010000u | SPDIF输入设备 |
AUDIO_DEVICE_IN_BLUETOOTH_A2DP | 0x80020000u | 蓝牙A2DP输入设备 |
AUDIO_DEVICE_IN_LOOPBACK | 0x80040000u | 环回输入设备 |
AUDIO_DEVICE_IN_IP | 0x80080000u | IP输入设备 |
AUDIO_DEVICE_IN_BUS | 0x80100000u | 总线输入设备 |
AUDIO_DEVICE_IN_PROXY | 0x81000000u | 代理输入设备 |
AUDIO_DEVICE_IN_USB_HEADSET | 0x82000000u | USB耳机输入设备 |
AUDIO_DEVICE_IN_BLUETOOTH_BLE | 0x84000000u | 蓝牙BLE输入设备 |
AUDIO_DEVICE_IN_DEFAULT | 0xC0000000u | 默认输入设备 |
AUDIO_SOURCE
通常是一个枚举(enum)类型,用于标识音频数据的来源或类型。在音频处理、录制、播放或混合等上下文中,AUDIO_SOURCE
用于确定音频数据是从哪里来的,以便系统或应用程序可以适当地处理它。
枚举名称 | 枚举值 | 描述 |
---|---|---|
AUDIO_SOURCE_DEFAULT | 0 | 默认音频源 |
AUDIO_SOURCE_MIC | 1 | 麦克风音频源 |
AUDIO_SOURCE_VOICE_UPLINK | 2 | 语音上行链路音频源 |
AUDIO_SOURCE_VOICE_DOWNLINK | 3 | 语音下行链路音频源 |
AUDIO_SOURCE_VOICE_CALL | 4 | 语音通话音频源 |
AUDIO_SOURCE_CAMCORDER | 5 | 摄像机录音音频源 |
AUDIO_SOURCE_VOICE_RECOGNITION | 6 | 语音识别音频源 |
AUDIO_SOURCE_VOICE_COMMUNICATION | 7 | 语音通信音频源 |
AUDIO_SOURCE_REMOTE_SUBMIX | 8 | 远程呈现的混音音频源(如WiFi显示在电视上) |
AUDIO_SOURCE_CNT | - | 音频源计数值(注意:此值未在枚举中直接指定) |
AUDIO_SOURCE_MAX | - | 音频源最大值(AUDIO_SOURCE_CNT - 1) |
AUDIO_SOURCE_FM_TUNER | 1998 | FM调谐器音频源 |
AUDIO_SOURCE_HOTWORD | 1999 | 低优先级、可抢占的音频源,用于背景软件热词检测(仅用于框架内部,不在音频HAL中暴露) |
应用audio模式设置setmode:
常量名称 | 值 | 描述 |
---|---|---|
AUDIO_MODE_INVALID | -2 | 无效模式 |
AUDIO_MODE_CURRENT | -1 | 当前模式 |
AUDIO_MODE_NORMAL | 0 | 正常模式 |
AUDIO_MODE_RINGTONE | 1 | 铃声模式 |
AUDIO_MODE_IN_CALL | 2 | 通话中模式 |
AUDIO_MODE_IN_COMMUNICATION | 3 | 通信中模式(如VoIP通话) |
AUDIO_MODE_FM | 4 | FM收音机模式 |
AUDIO_MODE_EARPIECE | 5 | 听筒模式 |
AUDIO_MODE_CNT | 未指定 | 常量计数(非实际模式) |
AUDIO_MODE_MAX | AUDIO_MODE_CNT - 1 | 最大模式值(非实际模式) |
AudioTrack Native API 输出标识:
AUDIO_OUTPUT_FLAG | Description |
---|---|
AUDIO_OUTPUT_FLAG_DIRECT | 表示音频流直接输出到音频设备,不需要软件混音,一般用于 HDMI 设备声音输出 |
AUDIO_OUTPUT_FLAG_PRIMARY | 表示音频流需要输出到主输出设备,一般用于铃声类声音 |
AUDIO_OUTPUT_FLAG_FAST | 表示音频流需要快速输出到音频设备,一般用于按键音、游戏背景音等对时延要求高的场景 |
AUDIO_OUTPUT_FLAG_DEEP_BUFFER | 表示音频流输出可以接受较大的时延,一般用于音乐、视频播放等对时延要求不高的场景 |
AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD | 表示音频流没有经过软件解码,需要输出到硬件解码器,由硬件解码器进行解码 |
从 Audio HAL 中,我们通常看到如下 4 种输出流设备,分别对应着不同的Usecase播放场景:
Usecase播放场景 | 输出流设备类型 | 标识 | 音频流特性 | 回放线程实例 |
---|---|---|---|---|
primaryout | 主输出流设备 | AUDIO_OUTPUT_FLAG_PRIMARY | 铃声类声音输出 | MixerThread |
lowlatency | 低延迟输出流设备 | AUDIO_OUTPUT_FLAG_FAST | 按键音、游戏背景音等 | MixerThread |
deepbuffer | 音乐音轨输出流设备 | AUDIO_OUTPUT_FLAG_DEEP_BUFFER | 音乐等对时延要求不高的声音输出 | MixerThread |
compressoffload | 硬解输出流设备 | AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD | 需要硬件解码的数据输出 | OffloadThread |