mstar android-supernva key处理流程

xiaoxiao2021-02-28  119

Mstar 6A638平台MHL按键KEY发送流程

分类: Mstar_MHL  |  标签: Mstar MHL  |  作者: kevinx_xu  相关  |  发布日期 : 2015-09-23  |  热度 : 393° 2015年9月18日  Android 部分 RootActivity android/device/mstar/common/apps/MTvPlayer/src/com/mstar/tv/tvplayer/ui/RootActivity.java 2185 public boolean onKeyDown(int keyCode, KeyEvent event) { //此处对MHL进行检测,看是否有MHL 的设备接入,如果没有,则不进行下发,如果有,则继续发送 2232 if (mTvMhlManager.CbusStatus() == true && mTvMhlManager.IsMhlPortInUse() == true) { //调用mTvMhlManager 中的IRKeyProcess 进行key 的发送 2233 if (mTvMhlManager.IRKeyProcess(keyCode, false) == true) { 2234 SystemClock.sleep(140); 2235 return true; 2236 } 2237 } ... TvMhlManager android/device/mstar/common/libraries/tv2/java/com/mstar/android/tv/TvMhlManager.java 129 public boolean IRKeyProcess(int keycode, boolean bIsRelease) { 130 ITvMhl service = getService(); 131 try { //只是转去调用TvMhlService.java 中的IRKeyProcess 132 return service.IRKeyProcess(keycode, bIsRelease); 133 } catch (RemoteException e) { 134 e.printStackTrace(); 135 } 136 return false; 137 } 138 TvMhlService android/device/mstar/common/libraries/tv2/MTvService/src/com/mstar/tv/service/TvMhlService.java 103 public boolean IRKeyProcess(int keycode, boolean isRelease) throws RemoteException { //此处获取MStar tvapi 中的MhlManager.java进行调用 104 return TvManager.getInstance().getMhlManager().IRKeyProcess(keycode, isRelease); 105 } MhlManager android/device/mstar/common/libraries/tvapi/java/com/mstar/android/tvapi/common/MhlManager.java //直接调用JNI 中的函数 147 // native fuc 148 public native final boolean IRKeyProcess(int keycode, boolean bIsRelease); com_mstar_android_tvapi_common_MhlManager android/device/mstar/common/libraries/tvapi/jni/com_mstar_android_tvapi_common_MhlManager.cpp //向android注册此接口 391 {"IRKeyProcess", "(IZ)Z", (void *)com_mstar_android_tvapi_common_MhlManager_IRKeyProcess}, 296 jboolean com_mstar_android_tvapi_common_MhlManager_IRKeyProcess 297 (JNIEnv *env, jobject thiz, jint keycode, jboolean bIsRelease) { 298 ALOGI("IRKeyProcess"); 299 sp<MhlManager> srv = getMhlManager(env, thiz); 300 if (srv == NULL) { 301 jniThrowException(env, "com/mstar/android/tvapi/common/exception/TvIpcException", "can not connect to server"); 302 return 0; 303 } 304 305 jint size = sizeof(astRCPKeyTranslate) / sizeof(android2MufKey); 306 for (jint i = 0; i < size; i++) {     //NOTE:此处对Android 的Key 与 muf 的Key 进行转换,如果发现有哪些Key没发送成功,可以先查下此表是不是有对应的Key 进行转换 307 if (astRCPKeyTranslate[i].androidKeyCode == keycode) { 308 return srv->IRKeyProcess(astRCPKeyTranslate[i].mufKeyCode, bIsRelease);      //对Key值进行转换后,进行本地方法的调用,调用 Supervnoa 中tvos MhlManager 的接口进行发送,此处进行 Supernova 309 } 310 } 311 return false; 312 } 313 Supernova 部分 MhlManager Supernova/projects/tvos/mhlmanager/libmhlmanager/MhlManager.cpp 241 bool MhlManager::IRKeyProcess(int32_t keycode, bool bIsRelease) 242 { 243 ALOGV("IRKeyProcess\n\n"); 244 if(mMhlManager == NULL) 245 { 246 return false; 247 } 248 //调用"mstar.mhlmanager" 的服务MhlManagerService connect 时返回的代理IMhlManager BpMhlManager进行发送 249 return mMhlManager->IRKeyProcess(keycode, bIsRelease); 250 } 251 IMhlManager Supernova/projects/tvos/mhlmanager/libmhlmanager/IMhlManager.cpp 130 bool BpMhlManager::IRKeyProcess(int32_t keycode, bool bIsRelease) 131 { 132 ALOGV("Send MHL_IRKEYPROCESS\n"); 133 Parcel data, reply; 134 data.writeInterfaceToken(IMhlManager::getInterfaceDescriptor()); 135 data.writeInt32(keycode); 136 data.writeInt32(bIsRelease); 137 remote()->transact(MHL_IRKEYPROCESS, data, &reply); //通过Binder来调用服务端进行发送 138 return static_cast<bool>(reply.readInt32()); 139 } 140 178 status_t BnMhlManager::onTransact(uint32_t code, 179 const Parcel& data, 180 Parcel* reply, 181 uint32_t flags) 182 { 183 switch(code) 184 { ... 200 case MHL_IRKEYPROCESS: 201 { 202 ALOGV("Receive MHL_IRKEYPROCESS\n"); 203 CHECK_INTERFACE(IMhlManager, data, reply); 204 int32_t keycode = data.readInt32(); 205 int32_t bIsReleas = data.readInt32();                 //调用 MhlManagerService 中的服务函数来进行调用Msrv 206 reply->writeInt32(IRKeyProcess(keycode, (bool)bIsReleas)); 207 return NO_ERROR; 208 } break; ... MhlManagerService  Supernova/projects/tvos/mhlmanager/libmhlmanagerservice/MhlManagerService.cpp 281 bool MhlManagerService::Client::IRKeyProcess(int32_t u32RCPKey, bool bIsRelease) 282 { 283 #if(RELEASE_BINDER_TEST == 1) 284 TEST_BOOL_SHORT("IRKeyProcess","u32RCPKey",u32RCPKey) ; 285 #endif 286 287 TVOS_API_ESTIMATE_START() 288 TVOS_API_ESTIMATE_START(LOCK) 289 Mutex::Autolock lock(m_FuncLock); 290 TVOS_API_ESTIMATE_END(LOCK) 291 bool ret = false; 292 #if (MHL_ENABLE == 1) 293 ALOGV("IRKeyProcess(callingPid %d, clientPid %d)\n", IPCThreadState::self()->getCallingPid(), m_ClientPid); 294 295 ret = MSrv_Control::GetMSrvMHL()->IRKeyProcess((U32)u32RCPKey, (bool)bIsRelease);           //调用MSrv层的服务 296 #endif 297 TVOS_API_ESTIMATE_END() 298 return ret; 299 } MSrv_MHL Supernova/projects/msrv/common/src/MSrv_MHL.cpp 611 // Key Event 612 MAPI_BOOL MSrv_MHL::IRKeyProcess(U32 u32RCPKey, BOOL bIsRelease) 613 { 614 if(m_pMhl==NULL) 615 { 616 return false; 617 } 618 return m_pMhl->IRKeyProcess(u32RCPKey,bIsRelease); //调用Mapi中的内容进行发送 //m_pMhl = mapi_interface::Get_mapi_mhl(); 619 } mapi_mhl Supernova/MStarSDK/src/devices/mhl/mapi_mhl.cpp 153 MAPI_BOOL mapi_mhl::IRKeyProcess(MAPI_U32 u32RCPKey, MAPI_BOOL bIsRelease) 154 { 155 // mapi_scope_lock(scopeLock, &m_Mutex); 156 157 if(stMapiMHLFun.IRKeyProcess == NULL) 158 { 159 printf("!!!!! Error: Mhl SendRCP PressRelease Cmd = NULL"); 160 return MAPI_FALSE; 161 } 162 163 return(stMapiMHLFun.IRKeyProcess(u32RCPKey,bIsRelease)); //NOTE:此处的Mapi 可以认为是一个傀儡,在device_mhl.cpp 中会实现mapi_mhl 中的接口函数,mapi_mhl 只是将所有的调用接口转给 device_mhl 164 } device_mhl Supernova/projects/devices/mhl/device_mhl.cpp 412 MAPI_BOOL device_mhl::IRKeyProcess( MAPI_U32 u32Keycode, MAPI_BOOL bIsRelease) 413 { 414 MAPI_U8 u8RcpKey, u8Idx;// u8Len; 415 416 //printf("IR Key: 0x%x %x\r\n", static_cast<MAPI_U16>(0xFFFF & (u32Keycode>>16)), static_cast<MAPI_U16>(0xFFFF & u32Keycode)); 417 if(bIsRelease == MAPI_TRUE) 418 { 419 printf("MHL utopia will send RCP Release key after Press key\r\n"); 420 return MAPI_FALSE; 421 } 422 for(u8Idx = 0; u8Idx < LENGTH_TRANSLATION_ARRAY; u8Idx++) 423 { 424 if (astRCPKeyTranslate[u8Idx].u8IRKeyCode == u32Keycode) 425 { 426 u8RcpKey = astRCPKeyTranslate[u8Idx].u8RCPKeyCode;             //此处将muf key 转化为 RCP 的key 即转化为标准的MHL 定义的key 如果发现有哪些Key没发送成功, //可以先查下此表是不是有对应的Key 进行转换 427 printf("RCP Key: 0x%x\r\n", u8RcpKey); 428 break; 429 } 430 } 431 432 if (u8Idx == LENGTH_TRANSLATION_ARRAY) 433 { 434 printf("IR key is not supported by RCP key, AL = %d\r\n", LENGTH_TRANSLATION_ARRAY); 435 return MAPI_FALSE; 436 } 437 else 438 { 439 return mapi_mhl_SendRCPAutoReleaseCmd(u8RcpKey); //调用Mapi 的接口将RCP key发送 //oh, My God. 此处调用的utopia 的接口进行协议发送。已经打包了,看不到了哦,一般不会有问题,有问题只能请MStar进行协助解决了。 440 //return msapi_mhl_SendRCPCmd(u8RcpKey); 441 } 442    以上为Android 到Supernova 中的整个MHL key 的发送过程。 
转载请注明原文地址: https://www.6miu.com/read-96634.html

最新回复(0)