static void _setRumble(struct GBARumble* rumble, int enable) { UNUSED(rumble); if (!rumbleCallback) { return; } rumbleLevel += enable; if (CircleBufferSize(&rumbleHistory) == RUMBLE_PWM) { int8_t oldLevel; CircleBufferRead8(&rumbleHistory, &oldLevel); rumbleLevel -= oldLevel; } CircleBufferWrite8(&rumbleHistory, enable); rumbleCallback(0, RETRO_RUMBLE_STRONG, rumbleLevel * 0xFFFF / RUMBLE_PWM); }
static void _setRumble(struct mRumble* source, int enable) { struct mSceRumble* rumble = (struct mSceRumble*) source; rumble->current += enable; if (CircleBufferSize(&rumble->history) == RUMBLE_PWM) { int8_t oldLevel; CircleBufferRead8(&rumble->history, &oldLevel); rumble->current -= oldLevel; } CircleBufferWrite8(&rumble->history, enable); int small = (rumble->current << 21) / 65793; int big = ((rumble->current * rumble->current) << 18) / 65793; struct SceCtrlActuator state = { small, big }; sceCtrlSetActuator(1, &state); }