路由策略
流类型(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)。
本文详细介绍了Android系统中的音频路由策略与音量控制机制。流类型与路由策略的对应关系在AudioPolicyManagerBase::getStrategy()中定义,如VOICE_CALL对应STRATEGY_PHONE。音量策略涉及用户设置的音量等级、音量缩放和设备分类。AudioService将流类型音量转换为替代类型的音量,并同步给audio_policy。每个流类型的音量等级和设备音量等级需要缩放,且audio_policy将设备分为助听器、耳机和音响三类。此外,还讨论了音阶函数配置和DRC支持对音量的影响。当连接耳机时,铃声和通知声的音量会降低。最后,提到了音量设置的实现路径。
2707

被折叠的 条评论
为什么被折叠?



