插入拔掉耳机流程 audio headset

来源:互联网 发布:派尔高网络摄像机价格 编辑:程序博客网 时间:2024/06/10 05:34

headset->AudioService->AudioSystem->AudioPolicyManager->AudioFlinger->AudioHWInterface->Driver

AudioService.java    AudioServiceBroadcastReceive()->onReceive()->Intent.ACTION_HEADSET_PLUG->AudioSystem.setDeviceConnectionState()
AudioSystem.java     setDeviceConnectionState()
Android_media_AudioSystem.cpp  android_media_AudioSystem_setDeviceConnectionState()
AudioSystem.cpp     setDeviceConnectionState()
AudioPolicyService.cpp   setDeviceConnectionState()
AudioPolicyManagerBase.cpp   setDeviceConnectionState()->getDeviceForStrategy()->setOutputDevice() 

1.systemserver.java
2.android_server_SystemServer_init1.cpp 
3.System_init.cpp 
4.systemserver.java
新建线程
class ServerThread extends Thread 
…… 
public void run() 
…… 
try { 
Log.i(TAG, "Headset Observer"); 
// Listen for wired headset changes 
headset = new HeadsetObserver(context); // new a thread to observer headset status 
} catch (Throwable e) { 
Log.e(TAG, "Failure starting HeadsetObserver", e); 

5.启动服务并广播:HeadsetObserver.java 
class HeadsetObserver extends UeventObserver 
…… 
public HeadsetObserver(Context context) 
…… 
startObserving(HEADSET_UEVENT_MATCH); 
init(); // set initial status 

6.AudioService.java中将接收广播
private class AudioServiceBroadcastReceiver extends BroadcastReceiver 
public void onReceive(Context context, Intent intent) 
…… 
else if (action.equals(Intent.ACTION_HEADSET_PLUG)) 
…… 
//if you first insert headset, will implement fellow code 
AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_WIRED_HEADSET,AudioSystem.DEVICE_STATE_AVAILABLE,""); 

7.设置设备连接1:状态android_media_AudioSystem.cpp
static JNINativeMethod gMethods[] = { 
"setDeviceConnectionState","(IILjava/lang/String;)I",(void*)android_media_AudioSystem_setDeviceConnectionState}, 
}; 

8.设置连接状态2:AudioSystem.cpp
status_t AudioSystem::setDeviceConnectionState(audio_devices device, 
device_connection_state state, const char *device_address) 
const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); 
if (aps == 0) return PERMISSION_DENIED; 
return aps->setDeviceConnectionState(device, state, device_address); 
9.设置连接状态3:AudioPolicyManager.cpp
status_t
AudioPolicyManager::setDeviceConnectionState(AudioSystem::audio_devices device, 
AudioSystem::device_connection_state state, const char *device_address) 
…… 
// handle output devices 
if (AudioSystem::isOutputDevice(device)) 
switch (state) 
case AudioSystem::DEVICE_STATE_AVAILABLE: 
…… 
if (AudioSystem::isBluetoothScoDevice(device)) 
…… 
else if (device == AudioSystem::DEVICE_OUT_WIRED_HEADSET || 
device == AudioSystem::DEVICE_OUT_WIRED_HEADPHONE) 
if (getDeviceForStrategy(STRATEGY_PHONE) == device && 
(mPhoneState == AudioSystem::MODE_IN_CALL || 
mOutputs.valueFor(mHardwareOutput)->isUsedByStrategy(STRATEGY_PHONE))) 
newDevice = device; 
else if ((getDeviceForStrategy(STRATEGY_SONIFICATION) & device) && 
mOutputs.valueFor(mHardwareOutput)->isUsedByStrategy(STRATEGY_SONIFICATION)) 
newDevice = getDeviceForStrategy(STRATEGY_SONIFICATION); 
else if ((getDeviceForStrategy(STRATEGY_MEDIA) == device) && 
mOutputs.valueFor(mHardwareOutput)->isUsedByStrategy(STRATEGY_MEDIA)) 
newDevice = device; 
else if (getDeviceForStrategy(STRATEGY_DTMF) == device && 
mOutputs.valueFor(mHardwareOutput)->isUsedByStrategy(STRATEGY_DTMF)) 
newDevice = device; 

10.确定输出设备AudioPolicyManager.cpp
setOutputDevice(mHardwareOutput, newDevice); 

11.最后通过alsa切换通路输出
alsa_default.cpp