void aptSetStatus(APP_STATUS status) { svcWaitSynchronization(aptStatusMutex, U64_MAX); aptStatus = status; //if(prevstatus != APP_NOTINITIALIZED) //{ if(status == APP_RUNNING || status == APP_EXITING || status == APP_APPLETSTARTED || status == APP_APPLETCLOSED) svcSignalEvent(aptStatusEvent); //} svcReleaseMutex(aptStatusMutex); }
bool ui_push(ui_view* view) { if(view == NULL) { return false; } svcWaitSynchronization(ui_stack_mutex, U64_MAX); bool space = ui_stack_top < MAX_UI_VIEWS - 1; if(space) { ui_stack[++ui_stack_top] = view; } svcReleaseMutex(ui_stack_mutex); return space; }
void OPL_WriteRegister(int reg, int value) { int i; svcWaitSynchronization(musMutex, U64_MAX); OPL_WritePort(OPL_REGISTER_PORT, reg); // For timing, read the register port six times after writing the // register number to cause the appropriate delay for (i = 0; i<6; ++i) { // An oddity of the Doom OPL code: at startup initialization, // the spacing here is performed by reading from the register // port; after initialization, the data port is read, instead. if (init_stage_reg_writes) { OPL_ReadPort(OPL_REGISTER_PORT); } else { OPL_ReadPort(OPL_DATA_PORT); } } OPL_WritePort(OPL_DATA_PORT, value); // Read the register port 24 times after writing the value to // cause the appropriate delay for (i = 0; i<24; ++i) { OPL_ReadStatus(); } svcReleaseMutex(musMutex); }
static void task_capture_cam_thread(void* arg) { capture_cam_data* data = (capture_cam_data*) arg; Handle events[EVENT_COUNT] = {0}; events[EVENT_CANCEL] = data->cancelEvent; Result res = 0; u32 bufferSize = data->width * data->height * sizeof(u16); u16* buffer = (u16*) calloc(1, bufferSize); if(buffer != NULL) { if(R_SUCCEEDED(res = camInit())) { u32 cam = data->camera == CAMERA_OUTER ? SELECT_OUT1 : SELECT_IN1; if(R_SUCCEEDED(res = CAMU_SetSize(cam, SIZE_CTR_TOP_LCD, CONTEXT_A)) && R_SUCCEEDED(res = CAMU_SetOutputFormat(cam, OUTPUT_RGB_565, CONTEXT_A)) && R_SUCCEEDED(res = CAMU_SetFrameRate(cam, FRAME_RATE_30)) && R_SUCCEEDED(res = CAMU_SetNoiseFilter(cam, true)) && R_SUCCEEDED(res = CAMU_SetAutoExposure(cam, true)) && R_SUCCEEDED(res = CAMU_SetAutoWhiteBalance(cam, true)) && R_SUCCEEDED(res = CAMU_Activate(cam))) { u32 transferUnit = 0; if(R_SUCCEEDED(res = CAMU_GetBufferErrorInterruptEvent(&events[EVENT_BUFFER_ERROR], PORT_CAM1)) && R_SUCCEEDED(res = CAMU_SetTrimming(PORT_CAM1, true)) && R_SUCCEEDED(res = CAMU_SetTrimmingParamsCenter(PORT_CAM1, data->width, data->height, 400, 240)) && R_SUCCEEDED(res = CAMU_GetMaxBytes(&transferUnit, data->width, data->height)) && R_SUCCEEDED(res = CAMU_SetTransferBytes(PORT_CAM1, transferUnit, data->width, data->height)) && R_SUCCEEDED(res = CAMU_ClearBuffer(PORT_CAM1)) && R_SUCCEEDED(res = CAMU_SetReceiving(&events[EVENT_RECV], buffer, PORT_CAM1, bufferSize, (s16) transferUnit)) && R_SUCCEEDED(res = CAMU_StartCapture(PORT_CAM1))) { bool cancelRequested = false; while(!task_is_quit_all() && !cancelRequested && R_SUCCEEDED(res)) { svcWaitSynchronization(task_get_pause_event(), U64_MAX); s32 index = 0; if(R_SUCCEEDED(res = svcWaitSynchronizationN(&index, events, EVENT_COUNT, false, U64_MAX))) { switch(index) { case EVENT_CANCEL: cancelRequested = true; break; case EVENT_RECV: svcCloseHandle(events[EVENT_RECV]); events[EVENT_RECV] = 0; svcWaitSynchronization(data->mutex, U64_MAX); memcpy(data->buffer, buffer, bufferSize); GSPGPU_FlushDataCache(data->buffer, bufferSize); svcReleaseMutex(data->mutex); res = CAMU_SetReceiving(&events[EVENT_RECV], buffer, PORT_CAM1, bufferSize, (s16) transferUnit); break; case EVENT_BUFFER_ERROR: svcCloseHandle(events[EVENT_RECV]); events[EVENT_RECV] = 0; if(R_SUCCEEDED(res = CAMU_ClearBuffer(PORT_CAM1)) && R_SUCCEEDED(res = CAMU_SetReceiving(&events[EVENT_RECV], buffer, PORT_CAM1, bufferSize, (s16) transferUnit))) { res = CAMU_StartCapture(PORT_CAM1); } break; default: break; } } } CAMU_StopCapture(PORT_CAM1); bool busy = false; while(R_SUCCEEDED(CAMU_IsBusy(&busy, PORT_CAM1)) && busy) { svcSleepThread(1000000); } CAMU_ClearBuffer(PORT_CAM1); } CAMU_Activate(SELECT_NONE); } camExit(); } free(buffer); } else { res = R_APP_OUT_OF_MEMORY; } for(int i = 0; i < EVENT_COUNT; i++) { if(events[i] != 0) { svcCloseHandle(events[i]); events[i] = 0; } } svcCloseHandle(data->mutex); data->result = res; data->finished = true; }
void aptCloseSession() { svcCloseHandle(aptuHandle); svcReleaseMutex(aptLockHandle); }
void aptSetStatusPower(u32 status) { svcWaitSynchronization(aptStatusMutex, U64_MAX); aptStatusPower = status; svcReleaseMutex(aptStatusMutex); }