FROM:http://www.bobbog.com/archives/147

============================

一、架构图



二、MediaServer初始化

所有的media服务都在进程mediaserver里。其代码在framework/base/media/mediaserver/main_mediaserver.cpp中。初始化过程如下。

1. 先初始化AudioFlinger

其初始化通过AudioFlinger的父类BindService创建唯一的AudioFlinger实例。

2. 然后初始化MediaPlayerService和CameraService

3. 最后初始化AudioPolicyService

三、 AudioFlinger分析

AudioFlinger负责管理每个音轨AudioTrack及RecordTrack,主音量控制,每种声音流的属性设置,设备控制,音效控制。

四、 AudioPolicyService分析

AudioPolicyService用于声音策略管理

客户端代码在framework/base/media/libmedia/AudioSystem.cpp中,其实该客户端只是监测AudioPolicyService是否死亡(binderDied)。真正的客户端为BpAudioPolicyService类,在framework/base/media/libmedia/IAudioPolicyService.cpp中。

接口

adjustVolumeadjustSuggestedStreamVolumeadjustStreamVolumesetStreamVolumesetStreamSolosetStreamMutegetStreamVolumegetStreamMaxVolumesetRingerModegetRingerModesetVibrateSettinggetVibrateSettingshouldVibratesetModegetModeplaySoundEffectplaySoundEffectVolumeloadSoundEffectsunloadSoundEffectsreloadAudioSettingssetSpeakerphoneOnisSpeakerphoneOnsetBluetoothScoOnisBluetoothScoOnrequestAudioFocusabandonAudioFocusunregisterAudioFocusClientregisterMediaButtonEventReceiverunregisterMediaButtonEventReceiverstartBluetoothScostopBluetoothSco

服务端代码在framework/base/services/audioflinger/AudioPolicyService.cpp中,实现了AudioPolicyService本地代码及服务内部使用的AudioPolicyClientInterface接口,该接口被AudioPolicyManager调用。

openOutputopenDuplicateOutputcloseOutputsuspendOutputrestoreOutputopenInputloseInputsetStreamVolumesetStreamOutputsetParametersgetParametersstartTonestopTonesetVoiceVolumemoveEffects

AudioPolicyService会启动两个AudioCommandThread类的线程mTonePlaybackThread和mAudioCommandThread,然后构造AudioPolicyManager的实例mpPolicyManager。基本上所有的服务接口都会在检查权限后调用mpPolicyManager的相应实现。

mTonePlaybackThread用户播放通话中的通知音

mAudioCommandThread用于设置AudioFlinger的一些设置(为什么使用AudioCommandThread,然后调用AudioSystem中接口控制AudioFlinger?)

五、 AudioManager分析

1. 音频焦点转

requestAudioFocus 请求焦点abandonAudioFocus     放弃焦点

requestAudioFocus的第一参数是Listener,可以是下面枚举的后三个值

第二个参数是当前流类型

最后一个参数可以是以下的前三个值

AUDIOFOCUS_GAIN 1AUDIOFOCUS_GAIN_TRANSIENT 2AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK = 3;AUDIOFOCUS_LOSS = -1 * AUDIOFOCUS_GAIN;AUDIOFOCUS_LOSS_TRANSIENT = -1 * AUDIOFOCUS_GAIN_TRANSIENT;AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK = -1 * AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK;

六、 AudioPolicyManager分析

流类型stream_type(在 AudioSystem中定义)

TYPE VALUE STRATEGYDEFAULT(->MUSIC) -1 STRATEGY_MEDIA(0)VOICE_CALL 0 STRATEGY_PHONE(1)SYSTEM 1  STRATEGY_MEDIA(0)RING 2 STRATEGY_SONIFICATION(2)MUSIC 3   STRATEGY_MEDIA(0)ALARM 4 STRATEGY_SONIFICATION(2)NOTIFICATION 5 STRATEGY_SONIFICATION(2)BLUETOOTH_SCO 6 STRATEGY_PHONE(1)// Sounds that cannot be muted by user and must be routed to speakerENFORCED_AUDIBLE 7 STRATEGY_SONIFICATION(2)DTMF 8 STRATEGY_DTMF(3)TTS 9  STRATEGY_MEDIA(0)HDMI 10 MV的自定义类型 STRATEGY_MEDIA(0)FM 11 MV的自定义类型 STRATEGY_MEDIA(0)

音频状态audio_mode(在 AudioSystem中定义)

enum audio_mode { MODE_INVALID = -2, MODE_CURRENT = -1, MODE_NORMAL = 0, MODE_RINGTONE, MODE_IN_CALL, MODE_IN_COMMUNICATION, NUM_MODES // not a valid entry, denotes end-of-list };

策略类型routing_strategy:

STRATEGY_MEDIA 0STRATEGY_PHONE 1STRATEGY_SONIFICATION 2STRATEGY_DTMF       3

设备类型audio_devices:

enum audio_devices { // output devices DEVICE_OUT_EARPIECE = 0x1, DEVICE_OUT_SPEAKER = 0x2, DEVICE_OUT_WIRED_HEADSET = 0x4, DEVICE_OUT_WIRED_HEADPHONE = 0x8, DEVICE_OUT_BLUETOOTH_SCO = 0x10, DEVICE_OUT_BLUETOOTH_SCO_HEADSET = 0x20, DEVICE_OUT_BLUETOOTH_SCO_CARKIT = 0x40, DEVICE_OUT_BLUETOOTH_A2DP = 0x80, DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 0x100, DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 0x200, DEVICE_OUT_AUX_DIGITAL = 0x400, DEVICE_OUT_DEFAULT = 0x8000, DEVICE_OUT_ALL = (DEVICE_OUT_EARPIECE | DEVICE_OUT_SPEAKER | DEVICE_OUT_WIRED_HEADSET | DEVICE_OUT_WIRED_HEADPHONE | DEVICE_OUT_BLUETOOTH_SCO | DEVICE_OUT_BLUETOOTH_SCO_HEADSET | DEVICE_OUT_BLUETOOTH_SCO_CARKIT | DEVICE_OUT_BLUETOOTH_A2DP | DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER | DEVICE_OUT_AUX_DIGITAL | DEVICE_OUT_DEFAULT), DEVICE_OUT_ALL_A2DP = (DEVICE_OUT_BLUETOOTH_A2DP | DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER), // input devices DEVICE_IN_COMMUNICATION = 0x10000, DEVICE_IN_AMBIENT = 0x20000, DEVICE_IN_BUILTIN_MIC = 0x40000, DEVICE_IN_BLUETOOTH_SCO_HEADSET = 0x80000, DEVICE_IN_WIRED_HEADSET = 0x100000, DEVICE_IN_AUX_DIGITAL = 0x200000, DEVICE_IN_VOICE_CALL = 0x400000, DEVICE_IN_BACK_MIC = 0x800000, DEVICE_IN_DEFAULT = 0x80000000, DEVICE_IN_ALL = (DEVICE_IN_COMMUNICATION | DEVICE_IN_AMBIENT | DEVICE_IN_BUILTIN_MIC | DEVICE_IN_BLUETOOTH_SCO_HEADSET | DEVICE_IN_WIRED_HEADSET | DEVICE_IN_AUX_DIGITAL | DEVICE_IN_VOICE_CALL | DEVICE_IN_BACK_MIC | DEVICE_IN_DEFAULT) };



七、其它:

1.音量控制

initStreamVolume

setStreamVolumeIndex

setPhoneState

2.播放控制

入口函数

startOutput

getStrategy

getDeviceForStrategy

setOutputDevice

applyStreamVolume

checkAndSetVolume

===================================END===============================

更多相关文章

  1. Android(安卓)Audio 框架简读
  2. 开发问题及解决 java.lang.ClassCastException:android.widget.L
  3. Android中native_handle private_handle_t ANativeWindowBuffer
  4. android知识杂记(一)
  5. Android之——AIDL小结
  6. android之List的空指针问题_List的初始化
  7. android MMI(多媒体)接口--音乐播放器
  8. Java获取文件的类型(扩展名)
  9. Android(安卓)实现微信,微博,微信朋友圈,QQ分享的功能

随机推荐

  1. Android(安卓)历史版本总结
  2. Android(安卓)Touch事件原理加实例分析
  3. 活用Android的Message Queue(2)
  4. Android实现左右滑动效果
  5. Android实现动态改变app图标的示例代码
  6. Activity 的四种加载模式
  7. 在Android(安卓)Studio中使用Android-Pul
  8. [Android]实现静默安装APK的两种方法
  9. Camera服务之--架构浅析
  10. Android内核的简单分析