前言:

当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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐