static void cui_onInputQueueCreated(ANativeActivity* activity, AInputQueue* queue) { CUI_DEBUG("cui_onInputQueueCreated\n"); if ((activity == NULL) || (queue == NULL)) { CUI_DEBUG("InputQueueCreated param error\n"); return; } struct cui_app * this_app = NULL; this_app = (struct cui_app *)activity->instance; pthread_mutex_lock(&this_app->mutex_lock); if(this_app == NULL) { CUI_DEBUG("this app is not init\n"); return; } if (this_app->input_queue != NULL) { AInputQueue_detachLooper(this_app->input_queue); } this_app->input_queue = queue; if (this_app->input_queue != NULL) { CUI_DEBUG("Attaching input queue to looper"); AInputQueue_attachLooper(this_app->input_queue, this_app->looper, 1, looper_callback, this_app); } pthread_mutex_unlock(&this_app->mutex_lock); }
void message_dispatcher::attach_queue(AInputQueue *q) { m_iqueue = q; if (m_looper) { LOGI("%s:%d> attaching looper %p to queue %p\n", __FILE__, __LINE__, m_looper, m_iqueue); AInputQueue_attachLooper(m_iqueue, m_looper, MSG_ID_INPUT, NULL, NULL); } }
void android_app_pre_exec_cmd(struct android_app* android_app, int8_t cmd) { switch (cmd) { case APP_CMD_INPUT_CHANGED: LOGV("APP_CMD_INPUT_CHANGED\n"); pthread_mutex_lock(&android_app->mutex); if (android_app->inputQueue != NULL) { AInputQueue_detachLooper(android_app->inputQueue); } android_app->inputQueue = android_app->pendingInputQueue; if (android_app->inputQueue != NULL) { LOGV("Attaching input queue to looper"); AInputQueue_attachLooper(android_app->inputQueue, android_app->looper, LOOPER_ID_INPUT, NULL, &android_app->inputPollSource); } pthread_cond_broadcast(&android_app->cond); pthread_mutex_unlock(&android_app->mutex); break; case APP_CMD_INIT_WINDOW: LOGV("APP_CMD_INIT_WINDOW\n"); pthread_mutex_lock(&android_app->mutex); android_app->window = android_app->pendingWindow; pthread_cond_broadcast(&android_app->cond); pthread_mutex_unlock(&android_app->mutex); break; case APP_CMD_TERM_WINDOW: LOGV("APP_CMD_TERM_WINDOW\n"); pthread_cond_broadcast(&android_app->cond); break; case APP_CMD_RESUME: case APP_CMD_START: case APP_CMD_PAUSE: case APP_CMD_STOP: LOGV("activityState=%d\n", cmd); pthread_mutex_lock(&android_app->mutex); android_app->activityState = cmd; pthread_cond_broadcast(&android_app->cond); pthread_mutex_unlock(&android_app->mutex); break; case APP_CMD_CONFIG_CHANGED: LOGV("APP_CMD_CONFIG_CHANGED\n"); AConfiguration_fromAssetManager(android_app->config, android_app->activity->assetManager); print_cur_config(android_app); break; case APP_CMD_DESTROY: LOGV("APP_CMD_DESTROY\n"); android_app->destroyRequested = 1; break; } }
static void onInputQueueCreated(ANativeActivity* activity, AInputQueue* queue) { // Retrieve our activity states from the activity instance sf::priv::ActivityStates* states = sf::priv::retrieveStates(activity); // Attach the input queue { sf::Lock lock(states->mutex); AInputQueue_attachLooper(queue, states->looper, 1, states->processEvent, NULL); states->inputQueue = queue; } }
void cxAndroid::cxAndroidPreExec(cxAndroid *app, int8_t cmd) { switch (cmd) { case APP_CMD_INPUT_CHANGED:{ pthread_mutex_lock(&app->mutex); if (app->inputQueue != NULL) { AInputQueue_detachLooper(app->inputQueue); } app->inputQueue = app->pendingInputQueue; if (app->inputQueue != NULL) { AInputQueue_attachLooper(app->inputQueue,app->looper, LOOPER_ID_INPUT, NULL,&app->input); } pthread_cond_broadcast(&app->cond); pthread_mutex_unlock(&app->mutex); break; } case APP_CMD_INIT_WINDOW:{ pthread_mutex_lock(&app->mutex); app->window = app->pendingWindow; pthread_cond_broadcast(&app->cond); pthread_mutex_unlock(&app->mutex); break; } case APP_CMD_TERM_WINDOW:{ pthread_cond_broadcast(&app->cond); break; } case APP_CMD_RESUME: case APP_CMD_START: case APP_CMD_PAUSE: case APP_CMD_STOP:{ pthread_mutex_lock(&app->mutex); app->activityState = cmd; pthread_cond_broadcast(&app->cond); pthread_mutex_unlock(&app->mutex); break; } case APP_CMD_CONFIG_CHANGED:{ AConfiguration_fromAssetManager(app->config,app->activity->assetManager); break; } case APP_CMD_DESTROY:{ app->destroyReq = true; break; } } }
void engine_handle_cmd(void *data) { struct android_app *android_app = (struct android_app*)g_android; int8_t cmd; if (read(android_app->msgread, &cmd, sizeof(cmd)) != sizeof(cmd)) cmd = -1; switch (cmd) { case APP_CMD_INPUT_CHANGED: slock_lock(android_app->mutex); if (android_app->inputQueue) AInputQueue_detachLooper(android_app->inputQueue); android_app->inputQueue = android_app->pendingInputQueue; if (android_app->inputQueue) { RARCH_LOG("Attaching input queue to looper"); AInputQueue_attachLooper(android_app->inputQueue, android_app->looper, LOOPER_ID_INPUT, NULL, NULL); } scond_broadcast(android_app->cond); slock_unlock(android_app->mutex); break; case APP_CMD_INIT_WINDOW: slock_lock(android_app->mutex); android_app->window = android_app->pendingWindow; scond_broadcast(android_app->cond); slock_unlock(android_app->mutex); if (g_extern.is_paused) rarch_reinit_drivers(); break; case APP_CMD_RESUME: slock_lock(android_app->mutex); android_app->activityState = cmd; scond_broadcast(android_app->cond); slock_unlock(android_app->mutex); break; case APP_CMD_START: slock_lock(android_app->mutex); android_app->activityState = cmd; scond_broadcast(android_app->cond); slock_unlock(android_app->mutex); break; case APP_CMD_PAUSE: slock_lock(android_app->mutex); android_app->activityState = cmd; scond_broadcast(android_app->cond); slock_unlock(android_app->mutex); if (!g_extern.system.shutdown) { RARCH_LOG("Pausing RetroArch.\n"); g_extern.is_paused = true; } break; case APP_CMD_STOP: slock_lock(android_app->mutex); android_app->activityState = cmd; scond_broadcast(android_app->cond); slock_unlock(android_app->mutex); break; case APP_CMD_CONFIG_CHANGED: break; case APP_CMD_TERM_WINDOW: slock_lock(android_app->mutex); /* The window is being hidden or closed, clean it up. */ /* terminate display/EGL context here */ //RARCH_WARN("Window is terminated outside PAUSED state.\n"); android_app->window = NULL; scond_broadcast(android_app->cond); slock_unlock(android_app->mutex); break; case APP_CMD_GAINED_FOCUS: g_extern.is_paused = false; if ((android_app->sensor_state_mask & (1ULL << RETRO_SENSOR_ACCELEROMETER_ENABLE)) && android_app->accelerometerSensor == NULL && driver.input_data) android_input_set_sensor_state(driver.input_data, 0, RETRO_SENSOR_ACCELEROMETER_ENABLE, android_app->accelerometer_event_rate); break; case APP_CMD_LOST_FOCUS: // Avoid draining battery while app is not being used if ((android_app->sensor_state_mask & (1ULL << RETRO_SENSOR_ACCELEROMETER_ENABLE)) && android_app->accelerometerSensor != NULL && driver.input_data) android_input_set_sensor_state(driver.input_data, 0, RETRO_SENSOR_ACCELEROMETER_DISABLE, android_app->accelerometer_event_rate); break; case APP_CMD_DESTROY: g_extern.system.shutdown = true; break; } }
void StAndroidGlue::processCommand() { int8_t aCmd = -1; if(::read(myMsgRead, &aCmd, sizeof(aCmd)) == sizeof(aCmd)) { switch(aCmd) { case CommandId_SaveState: freeSavedState(); break; } } else { ST_ERROR_LOG("No data on command pipe!"); return; } // preprocessing switch(aCmd) { case CommandId_InputChanged: { pthread_mutex_lock(&myMutex); if(myInputQueue != NULL) { AInputQueue_detachLooper(myInputQueue); } myInputQueue = myInputQueuePending; if(myInputQueue != NULL) { AInputQueue_attachLooper(myInputQueue, myLooper, LooperId_INPUT, NULL, &myInputPollSource); } pthread_cond_broadcast(&myCond); pthread_mutex_unlock(&myMutex); break; } case CommandId_WindowChanged: case CommandId_WindowInit: { pthread_mutex_lock(&myMutex); myWindow = myWindowPending; pthread_cond_broadcast(&myCond); pthread_mutex_unlock(&myMutex); break; } case CommandId_WindowTerm: { pthread_cond_broadcast(&myCond); break; } case CommandId_Resume: case CommandId_Start: case CommandId_Pause: case CommandId_Stop: { pthread_mutex_lock(&myMutex); myActivityState = aCmd; pthread_cond_broadcast(&myCond); pthread_mutex_unlock(&myMutex); break; } case CommandId_ConfigChanged: { AConfiguration_fromAssetManager(myConfig, myActivity->assetManager); updateMonitors(); printConfig(); break; } case CommandId_Destroy: { myToDestroy = true; break; } } signals.onAppCmd(aCmd); // post-processing switch(aCmd) { case CommandId_WindowTerm: { pthread_mutex_lock(&myMutex); myWindow = NULL; pthread_cond_broadcast(&myCond); pthread_mutex_unlock(&myMutex); break; } case CommandId_WindowChanged: { pthread_mutex_lock(&myMutex); myWindowPending = NULL; pthread_cond_broadcast(&myCond); pthread_mutex_unlock(&myMutex); break; } case CommandId_SaveState: { pthread_mutex_lock(&myMutex); myIsStateSaved = true; pthread_cond_broadcast(&myCond); pthread_mutex_unlock(&myMutex); break; } case CommandId_Resume: { freeSavedState(); break; } } }
void android_app_pre_exec_cmd(struct android_app* android_app, int8_t cmd) { switch (cmd) { case APP_CMD_INPUT_CHANGED: LOGI("APP_CMD_INPUT_CHANGED\n"); pthread_mutex_lock(&android_app->mutex); if (android_app->inputQueue != NULL) { AInputQueue_detachLooper(android_app->inputQueue); } android_app->inputQueue = android_app->pendingInputQueue; if (android_app->inputQueue != NULL) { LOGI("Attaching input queue to looper"); AInputQueue_attachLooper(android_app->inputQueue, android_app->looper, LOOPER_ID_INPUT, NULL, &android_app->inputPollSource); } pthread_cond_broadcast(&android_app->cond); pthread_mutex_unlock(&android_app->mutex); break; case APP_CMD_INIT_WINDOW: LOGI("APP_CMD_INIT_WINDOW\n"); pthread_mutex_lock(&android_app->mutex); android_app->window = android_app->pendingWindow; if (android_app->window && ANativeWindow_getWidth(android_app->window) && ANativeWindow_getHeight(android_app->window)) { android_app->lifecycleFlags |= NV_APP_STATUS_HAS_REAL_SURFACE; } else { android_app->lifecycleFlags &= ~NV_APP_STATUS_HAS_REAL_SURFACE; } pthread_cond_broadcast(&android_app->cond); pthread_mutex_unlock(&android_app->mutex); break; case APP_CMD_TERM_WINDOW: LOGI("APP_CMD_TERM_WINDOW\n"); android_app->lifecycleFlags &= ~NV_APP_STATUS_HAS_REAL_SURFACE; pthread_cond_broadcast(&android_app->cond); break; case APP_CMD_WINDOW_RESIZED: LOGI("APP_CMD_WINDOW_RESIZED\n"); pthread_mutex_lock(&android_app->mutex); if (android_app->window && ANativeWindow_getWidth(android_app->window) && ANativeWindow_getHeight(android_app->window)) { android_app->lifecycleFlags |= NV_APP_STATUS_HAS_REAL_SURFACE; } else { android_app->lifecycleFlags &= ~NV_APP_STATUS_HAS_REAL_SURFACE; } pthread_cond_broadcast(&android_app->cond); pthread_mutex_unlock(&android_app->mutex); break; case APP_CMD_GAINED_FOCUS: LOGI("APP_CMD_GAINED_FOCUS\n"); pthread_mutex_lock(&android_app->mutex); android_app->lifecycleFlags |= NV_APP_STATUS_FOCUSED; pthread_cond_broadcast(&android_app->cond); pthread_mutex_unlock(&android_app->mutex); break; case APP_CMD_LOST_FOCUS: LOGI("APP_CMD_LOST_FOCUS\n"); pthread_mutex_lock(&android_app->mutex); android_app->lifecycleFlags &= ~NV_APP_STATUS_FOCUSED; pthread_cond_broadcast(&android_app->cond); pthread_mutex_unlock(&android_app->mutex); break; case APP_CMD_RESUME: LOGI("activityState=%d\n", cmd); pthread_mutex_lock(&android_app->mutex); android_app->lifecycleFlags |= NV_APP_STATUS_ACTIVE; android_app->activityState = cmd; pthread_cond_broadcast(&android_app->cond); pthread_mutex_unlock(&android_app->mutex); break; case APP_CMD_START: LOGI("activityState=%d\n", cmd); pthread_mutex_lock(&android_app->mutex); android_app->activityState = cmd; pthread_cond_broadcast(&android_app->cond); pthread_mutex_unlock(&android_app->mutex); break; case APP_CMD_PAUSE: LOGI("activityState=%d\n", cmd); pthread_mutex_lock(&android_app->mutex); android_app->lifecycleFlags &= ~NV_APP_STATUS_ACTIVE; android_app->activityState = cmd; pthread_cond_broadcast(&android_app->cond); pthread_mutex_unlock(&android_app->mutex); break; case APP_CMD_STOP: LOGI("activityState=%d\n", cmd); pthread_mutex_lock(&android_app->mutex); android_app->activityState = cmd; pthread_cond_broadcast(&android_app->cond); pthread_mutex_unlock(&android_app->mutex); break; case APP_CMD_CONFIG_CHANGED: LOGI("APP_CMD_CONFIG_CHANGED\n"); AConfiguration_fromAssetManager(android_app->config, android_app->activity->assetManager); print_cur_config(android_app); break; case APP_CMD_DESTROY: LOGI("APP_CMD_DESTROY\n"); android_app->lifecycleFlags &= ~NV_APP_STATUS_RUNNING; break; } }