插入拔掉耳机流程 audio headset

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值