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
- RootActivity
- 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_mhl164 }
- 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
- MhlManager