audioservice.java_插入拔掉耳机流程 audio headset | 学步园

本文详细介绍了Android系统中处理耳机插入和拔出的流程,从AudioService的BroadcastReceiver监听ACTION_HEADSET_PLUG,经过AudioSystem到AudioPolicyManager,再到AudioFlinger和硬件接口的交互,涉及到设备状态管理和音频通路切换。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值