static void MicrophoneToggle(void) { if (NDS_getFinalUserInput().mic.micButtonPressed) NDS_setMic(false); else NDS_setMic(true); }
void HK_MicrophoneKeyUp(int) { NDS_setMic(0); }
void HK_MicrophoneKeyDown(int, bool justPressed) { NDS_setMic(1); }
void retro_run (void) { struct LayoutData layout; bool updated = false; bool have_touch = false; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated) { check_variables(false); struct retro_system_av_info new_av_info; retro_get_system_av_info(&new_av_info); environ_cb(RETRO_ENVIRONMENT_SET_GEOMETRY, &new_av_info); } poll_cb(); get_layout_params(current_layout, screen_buf, &layout); if(pointer_device != 0) { int16_t analogX = 0; int16_t analogY = 0; float final_acceleration = analog_stick_acceleration * (1.0 + (float)analog_stick_acceleration_modifier / 100.0); if(pointer_device == 1) { analogX = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X) / final_acceleration; analogY = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y) / final_acceleration; } else if(pointer_device == 2) { analogX = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X) / final_acceleration; analogY = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y) / final_acceleration; } else { analogX = 0; analogY = 0; } // Convert cartesian coordinate analog stick to polar coordinates double radius = sqrt(analogX * analogX + analogY * analogY); double angle = atan2(analogY, analogX); double max = (float)0x8000/analog_stick_acceleration; //log_cb(RETRO_LOG_DEBUG, "%d %d.\n", analogX,analogY); //log_cb(RETRO_LOG_DEBUG, "%d %d.\n", radius,analog_stick_deadzone); if (radius > (float)analog_stick_deadzone*max/100) { // Re-scale analog stick range to negate deadzone (makes slow movements possible) radius = (radius - (float)analog_stick_deadzone*max/100)*((float)max/(max - (float)analog_stick_deadzone*max/100)); // Convert back to cartesian coordinates analogX = (int32_t)round(radius * cos(angle)); analogY = (int32_t)round(radius * sin(angle)); } else { analogX = 0; analogY = 0; } //log_cb(RETRO_LOG_DEBUG, "%d %d.\n", GPU_LR_FRAMEBUFFER_NATIVE_WIDTH,GPU_LR_FRAMEBUFFER_NATIVE_HEIGHT); //log_cb(RETRO_LOG_DEBUG, "%d %d.\n", analogX,analogY); have_touch = have_touch || input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2); TouchX = Saturate(0, (GPU_LR_FRAMEBUFFER_NATIVE_WIDTH-1), TouchX + analogX); TouchY = Saturate(0, (GPU_LR_FRAMEBUFFER_NATIVE_HEIGHT-1), TouchY + analogY); FramesWithPointer = (analogX || analogY) ? FramesWithPointerBase : FramesWithPointer; } if(mouse_enable) { // TOUCH: Mouse if(!touchEnabled) { const int16_t mouseX = input_cb(1, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X); const int16_t mouseY = input_cb(1, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y); have_touch = have_touch || input_cb(1, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT); TouchX = Saturate(0, (GPU_LR_FRAMEBUFFER_NATIVE_WIDTH-1), TouchX + mouseX); TouchY = Saturate(0, (GPU_LR_FRAMEBUFFER_NATIVE_HEIGHT-1), TouchY + mouseY); FramesWithPointer = (mouseX || mouseY) ? FramesWithPointerBase : FramesWithPointer; } // TOUCH: Pointer else if(input_cb(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_PRESSED)) { const float X_FACTOR = ((float)layout.width / 65536.0f); const float Y_FACTOR = ((float)layout.height / 65536.0f); float x = (input_cb(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_X) + 32768.0f) * X_FACTOR; float y = (input_cb(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y) + 32768.0f) * Y_FACTOR; if ((x >= layout.touch_x) && (x < layout.touch_x + GPU_LR_FRAMEBUFFER_NATIVE_WIDTH) && (y >= layout.touch_y) && (y < layout.touch_y + GPU_LR_FRAMEBUFFER_NATIVE_HEIGHT)) { have_touch = true; TouchX = x - layout.touch_x; TouchY = y - layout.touch_y; } } } if(have_touch) NDS_setTouchPos(TouchX, TouchY, scale); else NDS_releaseTouch(); // BUTTONS //NDS_beginProcessingInput(); NDS_setPad( input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R), 0, // debug input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L2) //Lid ); if (!microphone_force_enable) { if(input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L3)) NDS_setMic(true); else if(!input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L3)) NDS_setMic(false); } else NDS_setMic(true); if(input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R3) && quick_switch_enable && delay_timer == 0) { switch (current_layout) { case LAYOUT_TOP_ONLY: current_layout = LAYOUT_BOTTOM_ONLY; break; case LAYOUT_BOTTOM_ONLY: current_layout = LAYOUT_TOP_ONLY; break; } delay_timer++; } if(delay_timer != 0) { delay_timer++; if(delay_timer == 30) delay_timer = 0; } NDS_endProcessingInput(); // RUN frameIndex ++; bool skipped = frameIndex <= frameSkip; if (skipped) NDS_SkipNextFrame(); NDS_exec(); SPU_Emulate_user(); if (!skipped) { u16 *screen = GPU->GetCustomFramebuffer(); if (layout.draw_screen1) SwapScreen (layout.dst, screen, layout.pitch); if (layout.draw_screen2) { screen = GPU->GetCustomFramebuffer() + GPU_LR_FRAMEBUFFER_NATIVE_WIDTH * GPU_LR_FRAMEBUFFER_NATIVE_HEIGHT; SwapScreen (layout.dst2, screen, layout.pitch); DrawPointer(layout.dst2, layout.pitch); } } video_cb(skipped ? 0 : screen_buf, layout.width, layout.height, layout.pitch * 2); frameIndex = skipped ? frameIndex : 0; }
static void check_variables(bool first_boot) { struct retro_variable var = {0}; if (first_boot) { var.key = "desmume_internal_resolution"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { char *pch; char str[100]; snprintf(str, sizeof(str), "%s", var.value); pch = strtok(str, "x"); if (pch) GPU_LR_FRAMEBUFFER_NATIVE_WIDTH = strtoul(pch, NULL, 0); pch = strtok(NULL, "x"); if (pch) GPU_LR_FRAMEBUFFER_NATIVE_HEIGHT = strtoul(pch, NULL, 0); switch (GPU_LR_FRAMEBUFFER_NATIVE_WIDTH) { case 256: scale = 1; break; case 512: scale = 2; break; case 768: scale = 3; break; case 1024: scale = 4; break; case 1280: scale = 5; break; case 1536: scale = 6; break; case 1792: scale = 7; break; case 2048: scale = 8; break; case 2304: scale = 9; break; case 2560: scale = 10; break; } } } var.key = "desmume_num_cores"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) CommonSettings.num_cores = var.value ? strtol(var.value, 0, 10) : 1; else CommonSettings.num_cores = 1; var.key = "desmume_cpu_mode"; var.value = 0; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { if (!strcmp(var.value, "jit")) CommonSettings.use_jit = true; else if (!strcmp(var.value, "interpreter")) CommonSettings.use_jit = false; } else { #ifdef HAVE_JIT CommonSettings.use_jit = true; #else CommonSettings.use_jit = false; #endif } #ifdef HAVE_JIT var.key = "desmume_jit_block_size"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) CommonSettings.jit_max_block_size = var.value ? strtol(var.value, 0, 10) : 100; else CommonSettings.jit_max_block_size = 100; #endif var.key = "desmume_screens_layout"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { static int old_layout_id = -1; unsigned new_layout_id = 0; quick_switch_enable = false; if (!strcmp(var.value, "top/bottom")) new_layout_id = LAYOUT_TOP_BOTTOM; else if (!strcmp(var.value, "bottom/top")) new_layout_id = LAYOUT_BOTTOM_TOP; else if (!strcmp(var.value, "left/right")) new_layout_id = LAYOUT_LEFT_RIGHT; else if (!strcmp(var.value, "right/left")) new_layout_id = LAYOUT_RIGHT_LEFT; else if (!strcmp(var.value, "top only")) new_layout_id = LAYOUT_TOP_ONLY; else if (!strcmp(var.value, "bottom only")) new_layout_id = LAYOUT_BOTTOM_ONLY; else if (!strcmp(var.value, "quick switch")) { new_layout_id = LAYOUT_TOP_ONLY; quick_switch_enable = true; } if (old_layout_id != new_layout_id) { old_layout_id = new_layout_id; current_layout = new_layout_id; } } else quick_switch_enable = false; var.key = "desmume_pointer_mouse"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { if (!strcmp(var.value, "enable")) mouse_enable = true; else if (!strcmp(var.value, "disable")) mouse_enable = false; } else mouse_enable = false; var.key = "desmume_pointer_device"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { if (!strcmp(var.value, "l-stick")) pointer_device = 1; else if(!strcmp(var.value, "r-stick")) pointer_device = 2; else pointer_device=0; } else pointer_device=0; var.key = "desmume_pointer_device_deadzone"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) analog_stick_deadzone = (int)(atoi(var.value)); var.key = "desmume_pointer_type"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { touchEnabled = var.value && (!strcmp(var.value, "touch")); } var.key = "desmume_frameskip"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) frameSkip = var.value ? strtol(var.value, 0, 10) : 0; else frameSkip = 0; var.key = "desmume_firmware_language"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { static const struct { const char* name; int id; } languages[] = { { "Auto", -1 }, { "Japanese", 0 }, { "English", 1 }, { "French", 2 }, { "German", 3 }, { "Italian", 4 }, { "Spanish", 5 } }; for (int i = 0; i < 7; i ++) { if (!strcmp(languages[i].name, var.value)) { firmwareLanguage = languages[i].id; if (firmwareLanguage == -1) firmwareLanguage = host_get_language(); break; } } } else firmwareLanguage = 1; var.key = "desmume_gfx_edgemark"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { if (!strcmp(var.value, "enable")) CommonSettings.GFX3D_EdgeMark = true; else if (!strcmp(var.value, "disable")) CommonSettings.GFX3D_EdgeMark = false; } else CommonSettings.GFX3D_EdgeMark = true; var.key = "desmume_gfx_linehack"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { if (!strcmp(var.value, "enable")) CommonSettings.GFX3D_LineHack = true; else if (!strcmp(var.value, "disable")) CommonSettings.GFX3D_LineHack = false; } else CommonSettings.GFX3D_LineHack = true; var.key = "desmume_gfx_txthack"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { if (!strcmp(var.value, "enable")) CommonSettings.GFX3D_TXTHack = true; else if (!strcmp(var.value, "disable")) CommonSettings.GFX3D_TXTHack = false; } else CommonSettings.GFX3D_TXTHack = false; var.key = "desmume_mic_force_enable"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { if (!strcmp(var.value, "yes")) microphone_force_enable = 1; else if(!strcmp(var.value, "no")) microphone_force_enable = 0; } else NDS_setMic(false); var.key = "desmume_mic_mode"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { if (!strcmp(var.value, "internal")) CommonSettings.micMode = TCommonSettings::InternalNoise; else if(!strcmp(var.value, "sample")) CommonSettings.micMode = TCommonSettings::Sample; else if(!strcmp(var.value, "random")) CommonSettings.micMode = TCommonSettings::Random; else if(!strcmp(var.value, "physical")) CommonSettings.micMode = TCommonSettings::Physical; } else CommonSettings.micMode = TCommonSettings::InternalNoise; var.key = "desmume_pointer_device_acceleration_mod"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) analog_stick_acceleration_modifier = atoi(var.value); else analog_stick_acceleration_modifier = 0; var.key = "desmume_pointer_stylus_pressure"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) CommonSettings.StylusPressure = atoi(var.value); else CommonSettings.StylusPressure = 50; var.key = "desmume_pointer_stylus_jitter"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { if (!strcmp(var.value, "enable")) CommonSettings.StylusJitter = true; else if (!strcmp(var.value, "disable")) CommonSettings.StylusJitter = false; } else CommonSettings.StylusJitter = false; var.key = "desmume_load_to_memory"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { if (!strcmp(var.value, "enable")) CommonSettings.loadToMemory = true; else if (!strcmp(var.value, "disable")) CommonSettings.loadToMemory = false; } else CommonSettings.loadToMemory = false; var.key = "desmume_advanced_timing"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { if (!strcmp(var.value, "enable")) CommonSettings.advanced_timing = true; else if (!strcmp(var.value, "disable")) CommonSettings.advanced_timing = false; } else CommonSettings.advanced_timing = true; var.key = "desmume_screens_gap"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { if ((atoi(var.value)) != nds_screen_gap) { nds_screen_gap = atoi(var.value); if (nds_screen_gap > 100) nds_screen_gap = 100; } } }