路由策略
流类型(stream_type)与路由策略(routing_strategy)的对应关系。
实现在AudioPolicyManagerBase:: getStrategy()方法中。
stream_type | routing_strategy |
VOICE_CALL | STRATEGY_PHONE |
BLUETOOTH_SCO | |
RING | STRATEGY_SONIFICATION |
ALARM | |
NOTIFICATION | STRATEGY_SONIFICATION_RESPECTFUL |
DTMF | STRATEGY_DTMF |
<default> | STRATEGY_MEDIA |
SYSTEM | |
TTS | |
MUSIC | |
ENFORCED_AUDIBLE | STRATEGY_ENFORCED_AUDIBLE |
音量策略
用户设置的音量等级一般为7~15个。设置的音量有主音量,以及每种流在每个设备上的音量。
AudioService将流类型做二次分类,音量控制以二次分类为单元。当设置一个流类型的音量时,转换为设置其替代类型(Alias)的音量,同时设置所有与其替代类型相同的类型的音量。每种类型音量的等级数(Max)不同,因此在转换音量时需要进行等级缩放。为了保持缩放的精度,内部音量放大10倍数值,同时使用四舍五入的方式处理零头。
AudioService的类型音量的等级数会同步给audio_policy(通过init_stream_volume方法)。
音量默认值和范围:
STREAM_TYPE | DEFAULT | MAX |
VOICE_CALL | 4 | 5 |
SYSTEM | 7 | 7 |
RING | 5 | 7 |
MUSIC | 11 | 15 |
ALARM | 6 | 7 |
NOTIFICATION | 5 | 7 |
BLUETOOTH_SCO | 7 | 15 |
ENFORCED_AUDIBLE | 7 | 7 |
DTMF | 11 | 15 |
TTS | 11 | 15 |
替代流类型:
STREAM_TYPE | ALIAS | ALIAS_NON_VOICE | OPS |
VOICE_CALL | VOICE_CALL | VOICE_CALL | VOICE_VOLUME |
SYSTEM | RING | MUSIC | MEDIA_VOLUME |
RING | RING | RING_VOLUME | |
MUSIC | MUSIC | MUSIC | MEDIA_VOLUME |
ALARM | ALARM | ALARM | ALARM_VOLUME |
NOTIFICATION | RING | RING | NOTIFICATION_VOLUME |
BLUETOOTH_SCO | BLUETOOTH_SCO | BLUETOOTH_SCO | BLUETOOTH_VOLUME |
ENFORCED_AUDIBLE | RING | MUSIC | MEDIA_VOLUME |
DTMF | |||
TTS | MUSIC |
媒体音乐(MUSIC)在数字设备(AUX_DIGITAL、DGTL_DOCK_HEADSET、USB_ACCESSORY、USB_DEVICE)上不是静音,就是最大音量(1.0)。
audio_policy将音量等级转换为实际音量(数值范围0.0~1.0)。
audio_policy将设备分为三类:助听器(EARPIECE)、耳机(HEADSET)、音响(SPEAKER)。每个流类型(StreamDescriptor描述)的每种设备类型(mVolumeCurve数组)有一个音量等级定义(VolumeCurvePoint数组),将100个音量等级定义为3个阶段,每个阶段指定阶段开始等级和dB音量。小于最小等级音量为0,大于最大等级音量为1.0。中间等级先计算分段线性dB音量值,再由公式exp( dB * ln(10) / 20 )计算实际音量。dB在-60到0之间。
流类型的音量等级和设备音量等级个数不一样,需要进行缩放。
每个流类型(StreamDescriptor描述)记录每个设备的当前等级。
设备分类(getDeviceCategory):
Device | Catalog |
EARPIECE | EARPIECE |
SPEAKER | SPEAKER |
WIRED_HEADSET | HEADSET |
WIRED_HEADPHONE | |
BLUETOOTH_SCO | |
BLUETOOTH_SCO_HEADSET | |
BLUETOOTH_SCO_CARKIT | SPEAKER |
BLUETOOTH_A2DP | HEADSET |
BLUETOOTH_A2DP_HEADPHONES | |
BLUETOOTH_A2DP_SPEAKER | SPEAKER |
AUX_DIGITAL | |
ANLG_DOCK_HEADSET | |
DGTL_DOCK_HEADSET | |
USB_ACCESSORY | |
USB_DEVICE | |
REMOTE_SUBMIX |
音阶函数配置(sVolumeProfiles):
DeviceCatalog StreamType | HEADSET | SPEAKER | EARPIECE |
VOICE_CALL | DefaultVoice | SpeakerVoice | DefaultVoice |
SYSTEM | HeadsetSystem | DefaultSystem | DefaultSystem |
RING | Default | SpeakerSonification | Default |
MUSIC | DefaultMedia | SpeakerMedia | DefaultMedia |
ALARM | Default | SpeakerSonification | Default |
NOTIFICATION | Default | SpeakerSonification | Default |
BLUETOOTH_SCO | DefaultVoice | SpeakerVoice | DefaultVoice |
ENFORCED_AUDIBLE | HeadsetSystem | DefaultSystem | DefaultSystem |
DTMF | HeadsetSystem | DefaultSystem | DefaultSystem |
TTS | DefaultMedia | SpeakerMedia | DefaultMedia |
当有DRC(Dynamic Range Compression)支持时,部分音响(SPEAKER)类的音阶函数用Drc音阶代替(音量偏低)。
音阶函数举例(Default音阶):
hardware/libhardware_legacy/audio/AudioPolicyManagerBase.cpp:2859 ------------------------------------------------------------------------- const AudioPolicyManagerBase::VolumeCurvePoint AudioPolicyManagerBase::sDefaultVolumeCurve[ AudioPolicyManagerBase::VOLCNT] = { {1, -49.5f}, {33, -33.5f}, {66, -17.0f}, {100, 0.0f} }; |
媒体音乐(MUSIC)在数字设备(AUX_DIGITAL、DGTL_DOCK_HEADSET、USB_ACCESSORY、USB_DEVICE)上不是静音,就是最大音量(1.0)。
当连接上耳机时,铃声(RING)和通知声(SONIFICATION、SYSTEM、ENFORCED_AUDIBLE)的音量降低一般(-6dB),当同时有音乐(MUSIC)播放时,限制不大于音乐音量,但至少0.016(-36dB)。
MixThread、DirectOutputThread(包括派生类OffloadThread)最终执行音量设置(prepareTracks_l)。