天天看點

audioservice.java_插入拔掉耳機流程 audio headset | 學步園

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

AudioService.javaAudioServiceBroadcastReceive()->onReceive()->Intent.ACTION_HEADSET_PLUG->AudioSystem.setDeviceConnectionState()

AudioSystem.javasetDeviceConnectionState()

Android_media_AudioSystem.cppandroid_media_AudioSystem_setDeviceConnectionState()

AudioSystem.cppsetDeviceConnectionState()

AudioPolicyService.cppsetDeviceConnectionState()

AudioPolicyManagerBase.cppsetDeviceConnectionState()->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& 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