路由策略

        流类型(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)。