xbmc接受遥控键值并生成 XBMC_Event的过程
来源:互联网 发布:淘宝直播视频教程 编辑:程序博客网 时间:2024/05/19 23:54
/*xbmc/android/Android_main.cpp*/extern void android_main(struct android_app* state){ { app_dummy(); state->inputPollSource.process = process_input; CEventLoop eventLoop(state); CXBMCApp xbmcApp(state->activity); if (xbmcApp.isValid()) { IInputHandler inputHandler; eventLoop.run(xbmcApp, inputHandler); } ... } exit(0);}static void process_input(struct android_app* app, struct android_poll_source* source) { AInputEvent* event = NULL; int processed = 0; while (AInputQueue_getEvent(app->inputQueue, &event) >= 0) { if (AInputQueue_preDispatchEvent(app->inputQueue, event)) { continue; } int32_t handled = 0; if (app->onInputEvent != NULL) handled = app->onInputEvent(app, event); AInputQueue_finishEvent(app->inputQueue, event, handled); processed = 1; } ...}
//xbmc/android/activity/EventLoop.cppint32_t CEventLoop::inputCallback(android_app* application, AInputEvent* event){ if (application == NULL || application->userData == NULL || event == NULL) return 0; CEventLoop& eventLoop = *((CEventLoop*)application->userData); return eventLoop.processInput(event);}int32_t CEventLoop::processInput(AInputEvent* event){ int32_t type = AInputEvent_getType(event); int32_t source = AInputEvent_getSource(event); switch(type) { case AINPUT_EVENT_TYPE_KEY: if (source & AINPUT_SOURCE_GAMEPAD || source & AINPUT_SOURCE_JOYSTICK) { if (m_inputHandler->onJoyStickKeyEvent(event)) return true; } rtn = m_inputHandler->onKeyboardEvent(event); break; case... } return rtn;}
//xbmc/android/activity/AndroidKey.cpptypedef struct { int32_t nativeKey; int16_t xbmcKey;} KeyMap;static KeyMap keyMap[] = { { AKEYCODE_VOLUME_UP , XBMCK_PLUS },};bool CAndroidKey::onKeyboardEvent(AInputEvent *event){ int32_t flags = AKeyEvent_getFlags(event); int32_t state = AKeyEvent_getMetaState(event); int32_t action = AKeyEvent_getAction(event); int32_t repeat = AKeyEvent_getRepeatCount(event); int32_t keycode = AKeyEvent_getKeyCode(event); int32_t deviceId = AInputEvent_getDeviceId(event); CJNIKeyCharacterMap map = CJNIKeyCharacterMap::load(deviceId); uint16_t unicode = map.get(keycode, state); // Check if we got some special key uint16_t sym = XBMCK_UNKNOWN; for (unsigned int index = 0; index < sizeof(keyMap) / sizeof(KeyMap); index++) { if (keycode == keyMap[index].nativeKey) { sym = keyMap[index].xbmcKey; break; } } switch (action) { case AKEY_EVENT_ACTION_DOWN: CXBMCApp::android_printf("CAndroidKey: key down (code: %d; repeat: %d; flags: 0x%0X; alt: %s; shift: %s; sym: %s)", keycode, repeat, flags, (state & AMETA_ALT_ON) ? "yes" : "no", (state & AMETA_SHIFT_ON) ? "yes" : "no", (state & AMETA_SYM_ON) ? "yes" : "no"); XBMC_Key((uint8_t)keycode, sym, modifiers, unicode, false); return true; ... }}
我们得弄明白keyMap[index].nativeKey的值在哪儿定义的这句话
/*tools/depends/target/android-sources-ics/android-source/frameworks/base/native/include/android/keycodes.h*/enum { AKEYCODE_VOLUME_UP = 24, ...}
接下来就是把android键盘打包为xbmc内部的XBMC_Event,扔到消息队列中
void CAndroidKey::XBMC_Key(uint8_t code, uint16_t key, uint16_t modifiers, uint16_t unicode, bool up){ XBMC_Event newEvent; memset(&newEvent, 0, sizeof(newEvent)); unsigned char type = up ? XBMC_KEYUP : XBMC_KEYDOWN; newEvent.type = type; newEvent.key.type = type; newEvent.key.keysym.scancode = code; newEvent.key.keysym.sym = (XBMCKey)key; newEvent.key.keysym.unicode = unicode; newEvent.key.keysym.mod = (XBMCMod)modifiers; //CXBMCApp::android_printf("XBMC_Key(%u, %u, 0x%04X, %d)", code, key, modifiers, up); CWinEvents::MessagePush(&newEvent);}
0 0
- xbmc接受遥控键值并生成 XBMC_Event的过程
- xbmc遥控音量加处理过程总结
- 遥控键值读取器
- 用红外遥控器遥控树莓派(XBMC)
- ubuntu安装XBMC 过程
- xbmc从onKey到onAction创建CAction对象的过程
- xbmc从onEvent到onkey创建CKey对象的过程
- IP包的接受过程
- Spark Streaming 数据接受 导入到内存 生成Block的过程
- java程序生成jar,并生成bat的详细过程
- Hadoop 键值对的mapreduce过程剖析
- Hadoop 键值对的MapReduce过程剖析
- Hadoop 键值对的mapreduce过程剖析
- XBMC
- eCos 网卡数据的发送、接受过程
- openfire 接受消息处理的过程
- openfire 接受消息处理的过程
- 编译xbmc遇到的问题
- oozie
- IOS CoreText --- 支持图片及链接的点击
- 程序员经典语录
- 自定义View实现图片上传进度显示
- SQL语句大全(一)
- xbmc接受遥控键值并生成 XBMC_Event的过程
- Oracle备份dmp文件批处理
- 数据库连接池的作用
- @MappedSuperclass的用法
- AEAI CRM客户关系管理V1.0.3版发版说明
- 使用ViewPager实现高仿launcher拖动效果
- 连接oracle数据库出现oracle ORA-12526: TNS: 监听程序: 所有适用例程都处于受限
- CSS两列布局
- k fold cross validation