This is an automated email from the git hooks/post-receive script. ecsv-guest pushed a commit to branch master in repository mupen64plus-input-sdl.
commit cd48263409a7c3583995e16c260e3212d61ab059 Author: Sven Eckelmann <[email protected]> Date: Wed Jun 12 23:10:49 2013 +0200 Use SDL2 to play force feedback effects --- debian/changelog | 1 + debian/patches/sdl2_forcefeedback.patch | 242 ++++++++++++++++++++++++++++++++ debian/patches/series | 1 + 3 files changed, 244 insertions(+) diff --git a/debian/changelog b/debian/changelog index 4428144..dd32246 100644 --- a/debian/changelog +++ b/debian/changelog @@ -7,6 +7,7 @@ mupen64plus-input-sdl (2.0~rc2+1+9aaeab081d97-2) UNRELEASED; urgency=low * debian/patches: - Add sdl2_scancodes.patch, Convert predefined SDL1.2 Keycodes to SDL2 Scancodes + - Add sdl2_forcefeedback.patch, Use SDL2 to play force feedback effects -- Sven Eckelmann <[email protected]> Sun, 09 Jun 2013 22:36:16 +0200 diff --git a/debian/patches/sdl2_forcefeedback.patch b/debian/patches/sdl2_forcefeedback.patch new file mode 100644 index 0000000..7cebc9f --- /dev/null +++ b/debian/patches/sdl2_forcefeedback.patch @@ -0,0 +1,242 @@ +Description: Use SDL2 to play force feedback effects +Author: Sven Eckelmann <[email protected]> + +--- +diff --git a/src/plugin.c b/src/plugin.c +index 8ce635c592f35d774d0ab8fadd25160328d03796..e47d1d4411218aa65a6b6ddb4e458d5b2dcc909a 100644 +--- a/src/plugin.c ++++ b/src/plugin.c +@@ -111,7 +111,14 @@ static int romopen = 0; // is a rom opened + + static unsigned char myKeyState[SDL_NUM_SCANCODES]; + +-#ifdef __linux__ ++#if SDL_VERSION_ATLEAST(2,0,0) ++static SDL_HapticEffect ffeffect[4]; ++static int ffeffect_id[4]; ++static SDL_HapticEffect ffstrong[4]; ++static int ffstrong_id[4]; ++static SDL_HapticEffect ffweak[4]; ++static int ffweak_id[4]; ++#elif __linux__ + static struct ff_effect ffeffect[3]; + static struct ff_effect ffstrong[3]; + static struct ff_effect ffweak[3]; +@@ -402,7 +409,15 @@ EXPORT void CALL ControllerCommand(int Control, unsigned char *Command) + unsigned int dwAddress = (Command[3] << 8) + (Command[4] & 0xE0); + if (dwAddress == PAK_IO_RUMBLE && *Data) + DebugMessage(M64MSG_VERBOSE, "Triggering rumble pack."); +-#ifdef __linux__ ++#if SDL_VERSION_ATLEAST(2,0,0) ++ if(dwAddress == PAK_IO_RUMBLE && controller[Control].event_joystick) { ++ if (*Data) { ++ SDL_HapticRunEffect(controller[Control].event_joystick, ffeffect_id[Control], 1); ++ } else { ++ SDL_HapticStopEffect(controller[Control].event_joystick, ffeffect_id[Control]); ++ } ++ } ++#elif __linux__ + struct input_event play; + if( dwAddress == PAK_IO_RUMBLE && controller[Control].event_joystick != 0) + { +@@ -617,7 +632,29 @@ EXPORT void CALL GetKeys( int Control, BUTTONS *Keys ) + *Keys = controller[Control].buttons; + + /* handle mempack / rumblepak switching (only if rumble is active on joystick) */ +-#ifdef __linux__ ++#if SDL_VERSION_ATLEAST(2,0,0) ++ if (controller[Control].event_joystick) { ++ static unsigned int SwitchPackTime[4] = {0, 0, 0, 0}, SwitchPackType[4] = {0, 0, 0, 0}; ++ if (controller[Control].buttons.Value & button_bits[14]) { ++ SwitchPackTime[Control] = SDL_GetTicks(); // time at which the 'switch pack' command was given ++ SwitchPackType[Control] = PLUGIN_MEMPAK; // type of new pack to insert ++ controller[Control].control->Plugin = PLUGIN_NONE;// remove old pack ++ SDL_HapticRunEffect(controller[Control].event_joystick, ffweak_id[Control], 1); ++ } ++ if (controller[Control].buttons.Value & button_bits[15]) { ++ SwitchPackTime[Control] = SDL_GetTicks(); // time at which the 'switch pack' command was given ++ SwitchPackType[Control] = PLUGIN_RAW; // type of new pack to insert ++ controller[Control].control->Plugin = PLUGIN_NONE;// remove old pack ++ SDL_HapticRunEffect(controller[Control].event_joystick, ffstrong_id[Control], 1); ++ } ++ // handle inserting new pack if the time has arrived ++ if (SwitchPackTime[Control] != 0 && (SDL_GetTicks() - SwitchPackTime[Control]) >= 1000) ++ { ++ controller[Control].control->Plugin = SwitchPackType[Control]; ++ SwitchPackTime[Control] = 0; ++ } ++ } ++#elif __linux__ + if (controller[Control].event_joystick != 0) + { + struct input_event play; +@@ -657,9 +694,81 @@ EXPORT void CALL GetKeys( int Control, BUTTONS *Keys ) + controller[Control].buttons.Value = 0; + } + ++static void InitiateJoysticks(int cntrl) ++{ ++ // init SDL joystick subsystem ++ if (!SDL_WasInit(SDL_INIT_JOYSTICK)) ++ if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) == -1) { ++ DebugMessage(M64MSG_ERROR, "Couldn't init SDL joystick subsystem: %s", SDL_GetError() ); ++ return; ++ } ++ ++ if (controller[cntrl].device >= 0) { ++ controller[cntrl].joystick = SDL_JoystickOpen(controller[cntrl].device); ++ if (!controller[cntrl].joystick) ++ DebugMessage(M64MSG_WARNING, "Couldn't open joystick for controller #%d: %s", cntrl + 1, SDL_GetError()); ++ } else { ++ controller[cntrl].joystick = NULL; ++ } ++} ++ ++static void DeinitJoystick(int cntrl) ++{ ++ if (controller[cntrl].joystick) { ++ SDL_JoystickClose(controller[cntrl].joystick); ++ controller[cntrl].joystick = NULL; ++ } ++} ++ + static void InitiateRumble(int cntrl) + { +-#ifdef __linux__ ++#if SDL_VERSION_ATLEAST(2,0,0) ++ if (!SDL_WasInit(SDL_INIT_HAPTIC)) { ++ if (SDL_InitSubSystem(SDL_INIT_HAPTIC) == -1) { ++ DebugMessage(M64MSG_ERROR, "Couldn't init SDL haptic subsystem: %s", SDL_GetError() ); ++ return; ++ } ++ } ++ ++ controller[cntrl].event_joystick = SDL_HapticOpenFromJoystick(controller[cntrl].joystick); ++ if (!controller[cntrl].event_joystick) { ++ DebugMessage(M64MSG_WARNING, "Couldn't open rumble support for joystick #%i", cntrl + 1); ++ return; ++ } ++ ++ if ((SDL_HapticQuery(controller[cntrl].event_joystick) & SDL_HAPTIC_SINE) == 0) { ++ controller[cntrl].event_joystick = NULL; ++ DebugMessage(M64MSG_WARNING, "Joystick #%i doesn't support sine effect", cntrl + 1); ++ return; ++ } ++ ++ memset(&ffeffect[cntrl], 0, sizeof(SDL_HapticEffect)); ++ ffeffect[cntrl].type = SDL_HAPTIC_SINE; ++ ffeffect[cntrl].periodic.period = 1000; ++ ffeffect[cntrl].periodic.magnitude = 0x7FFF; ++ // TODO this should have been SDL_HAPTIC_INFINITY but doesnt work with xboxdrv? ++ ffeffect[cntrl].periodic.length = 0x7FFF; ++ ++ ffeffect_id[cntrl] = SDL_HapticNewEffect(controller[cntrl].event_joystick, &ffeffect[cntrl]); ++ ++ memset(&ffstrong[cntrl], 0, sizeof(SDL_HapticEffect)); ++ ffstrong[cntrl].type = SDL_HAPTIC_SINE; ++ ffstrong[cntrl].periodic.period = 1000; ++ ffstrong[cntrl].periodic.magnitude = 0x7FFF; ++ ffstrong[cntrl].periodic.length = 500; ++ ++ ffstrong_id[cntrl] = SDL_HapticNewEffect(controller[cntrl].event_joystick, &ffstrong[cntrl]); ++ ++ memset(&ffstrong[cntrl], 0, sizeof(SDL_HapticEffect)); ++ ffweak[cntrl].type = SDL_HAPTIC_SINE; ++ ffweak[cntrl].periodic.period = 1000; ++ ffweak[cntrl].periodic.magnitude = 0x3FFF; ++ ffweak[cntrl].periodic.length = 500; ++ ++ ffweak_id[cntrl] = SDL_HapticNewEffect(controller[cntrl].event_joystick, &ffweak[cntrl]); ++ ++ DebugMessage(M64MSG_INFO, "Rumble activated on N64 joystick #%i", cntrl + 1); ++#elif __linux__ + DIR* dp; + struct dirent* ep; + unsigned long features[4]; +@@ -760,6 +869,19 @@ static void InitiateRumble(int cntrl) + #endif /* __linux__ */ + } + ++static void DeinitRumble(int cntrl) ++{ ++#if SDL_VERSION_ATLEAST(2,0,0) ++ if (controller[cntrl].event_joystick) { ++ SDL_HapticDestroyEffect(controller[cntrl].event_joystick, ffeffect_id[cntrl]); ++ SDL_HapticDestroyEffect(controller[cntrl].event_joystick, ffstrong_id[cntrl]); ++ SDL_HapticDestroyEffect(controller[cntrl].event_joystick, ffweak_id[cntrl]); ++ SDL_HapticClose(controller[cntrl].event_joystick); ++ controller[cntrl].event_joystick = NULL; ++ } ++#endif ++} ++ + /****************************************************************** + Function: InitiateControllers + Purpose: This function initialises how each of the controllers +@@ -790,10 +912,13 @@ EXPORT void CALL InitiateControllers(CONTROL_INFO ControlInfo) + for( i = 0; i < 4; i++ ) + { + // test for rumble support for this joystick ++ InitiateJoysticks(i); + InitiateRumble(i); + // if rumble not supported, switch to mempack + if (controller[i].control->Plugin == PLUGIN_RAW && controller[i].event_joystick == 0) + controller[i].control->Plugin = PLUGIN_MEMPAK; ++ DeinitRumble(i); ++ DeinitJoystick(i); + } + + DebugMessage(M64MSG_INFO, "%s version %i.%i.%i initialized.", PLUGIN_NAME, VERSION_PRINTF_SPLIT(PLUGIN_VERSION)); +@@ -830,12 +955,10 @@ EXPORT void CALL RomClosed(void) + int i; + + // close joysticks +- for( i = 0; i < 4; i++ ) +- if( controller[i].joystick ) +- { +- SDL_JoystickClose( controller[i].joystick ); +- controller[i].joystick = NULL; +- } ++ for( i = 0; i < 4; i++ ) { ++ DeinitRumble(i); ++ DeinitJoystick(i); ++ } + + // quit SDL joystick subsystem + SDL_QuitSubSystem( SDL_INIT_JOYSTICK ); +@@ -871,15 +994,10 @@ EXPORT int CALL RomOpen(void) + } + + // open joysticks +- for( i = 0; i < 4; i++ ) +- if( controller[i].device >= 0 ) +- { +- controller[i].joystick = SDL_JoystickOpen( controller[i].device ); +- if( controller[i].joystick == NULL ) +- DebugMessage(M64MSG_WARNING, "Couldn't open joystick for controller #%d: %s", i + 1, SDL_GetError() ); +- } +- else +- controller[i].joystick = NULL; ++ for (i = 0; i < 4; i++) { ++ InitiateJoysticks(i); ++ InitiateRumble(i); ++ } + + // grab mouse + if (controller[0].mouse || controller[1].mouse || controller[2].mouse || controller[3].mouse) +diff --git a/src/plugin.h b/src/plugin.h +index f5e7bfd32916d650447efd39076eaf0038bea6eb..c55e96bee51f7e5df429f53724d4baa688a624b4 100644 +--- a/src/plugin.h ++++ b/src/plugin.h +@@ -135,7 +135,11 @@ typedef struct + int device; // joystick device; -1 = keyboard; -2 = none + int mouse; // mouse enabled: 0 = no; 1 = yes + SDL_Joystick *joystick; // SDL joystick device ++#if SDL_VERSION_ATLEAST(2,0,0) ++ SDL_Haptic *event_joystick; // the sdl device for force feeback ++#else + int event_joystick; // the /dev/input/eventX device for force feeback ++#endif + int axis_deadzone[2]; // minimum absolute value before analog movement is recognized + int axis_peak[2]; // highest analog value returned by SDL, used for scaling + float mouse_sens[2]; // mouse sensitivity diff --git a/debian/patches/series b/debian/patches/series index 994b2da..cb89e5b 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1 +1,2 @@ sdl2_scancodes.patch +sdl2_forcefeedback.patch -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/mupen64plus-input-sdl.git _______________________________________________ Pkg-games-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-games-commits

