插入拔掉耳机流程 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
- 插入拔掉耳机流程 audio headset
- iOS 如何监听出插入耳机 拔掉耳机事件?
- iOS 如何监听出插入耳机 拔掉耳机事件?
- iOS 如何监听出插入耳机 拔掉耳机事件?
- iOS 如何监听出插入耳机 拔掉耳机事件?
- iOS 如何监听出插入耳机 拔掉耳机事件?
- iOS 如何监听出插入耳机 拔掉耳机事件?
- iOS 如何监听出插入耳机 拔掉耳机事件?
- android动态注册判断耳机(headset)是否插入
- [headset]怎样定位插入耳机无法识别的问题
- [headset]怎样解决插入耳机后等待2s时间才显示图标或者检测到耳机MIC类型
- ios耳机拔掉侦听事件
- 【Audio】耳机错误/频繁插入造成的无法识别
- android耳机插入\拔出事件上报流程
- android 4.4的耳机插入检测流程
- android 4.4的耳机插入检测流程
- 耳机插入上层处理流程分析
- 【audio】耳机插拔/线控按键识别流程
- 线程与内核对象的同步
- 简易任务调度实现--可用于windows服务/asp.net网站执行后台计算
- php调用C++扩展库出现段错误 (core dumped)
- [QTP] Retrieves the value of the cell in the specified row of the parameter in the run-time Data Tab
- json格式的传输问题
- 插入拔掉耳机流程 audio headset
- vc 命令行下运行
- JavaScript常见的编码陷阱
- 大型网站架构分析系列技术文档合集一
- 展讯软件开发的一般流程
- Eclipse Rcp 使用Open flash chart的两种数据加载方式
- maxQ的使用
- ADC To DMA
- LAMP网站架构方案分析[转]