Delay of force feedback in DirectInput

Started by
1 comment, last by FlyinDeath 18 years, 1 month ago
I have copied and pasted the sample code in the force feedback tutorial in MSDN, but there was a 1-second delay every time I started the effect. And, in debug mode, the force feedback effect didn't even respond. Only in release mode did the force feedback work. The code looks like this:

	void CControl::InitializeForceFeedback(HWND hWnd)
	{
		HRESULT hr;

		//enumerate force feedback device
		pDirectInput8->EnumDevices(DI8DEVCLASS_GAMECTRL, Callbacks::EnumerateForceFeedback, NULL, DIEDFL_FORCEFEEDBACK | DIEDFL_ATTACHEDONLY);

		//check if a force feedback device is availible
		if(!pForceFeedback)
			return;

		//initialize the force feedback device
		hr = pForceFeedback->SetCooperativeLevel(hWnd, DISCL_EXCLUSIVE | DISCL_FOREGROUND);
		if (FAILED(hr))
			return;

		hr = pForceFeedback->SetDataFormat(&c_dfDIJoystick);
		if (FAILED(hr))
			return;

		pForceFeedback->Acquire();

		pForceFeedback->SendForceFeedbackCommand(DISFFC_RESET);

		InitializeForceEffect();
	}


	void CControl::InitializeForceEffect(void)
	{
		//check if a force feedback device is availible
		if(!pForceFeedback)
			return;

		DWORD      dwAxes[2] = {DIJOFS_X, DIJOFS_Y};
		LONG       lDirection[2] = {0, 0};

		DIPERIODIC diPeriodic;      // type-specific parameters
		DIENVELOPE diEnvelope;      // envelope
		DIEFFECT   diEffect;        // general parameters

		diPeriodic.dwMagnitude = DI_FFNOMINALMAX; 
		diPeriodic.lOffset = 0; 
		diPeriodic.dwPhase = 0; 
		diPeriodic.dwPeriod = (DWORD)(0.025 * DI_SECONDS); 
		 

		diEnvelope.dwSize = sizeof(DIENVELOPE);
		diEnvelope.dwAttackLevel = DI_FFNOMINALMAX; 
		diEnvelope.dwAttackTime = (DWORD)(0.5 * DI_SECONDS); 
		diEnvelope.dwFadeLevel = 0; 
		diEnvelope.dwFadeTime = (DWORD)(3.0 * DI_SECONDS); 

		diEffect.dwSize = sizeof(DIEFFECT); 
		diEffect.dwFlags = DIEFF_POLAR | DIEFF_OBJECTOFFSETS; 
		diEffect.dwDuration = (DWORD)(3 * DI_SECONDS);

		diEffect.dwSamplePeriod = 0;               // = default 
		diEffect.dwGain = DI_FFNOMINALMAX;         // no scaling
		diEffect.dwTriggerButton = DIEB_NOTRIGGER;
		diEffect.dwTriggerRepeatInterval = 0;      
		diEffect.cAxes = 2; 
		diEffect.rgdwAxes = dwAxes; 
		diEffect.rglDirection = &lDirection[0]; 
		diEffect.lpEnvelope = &diEnvelope; 
		diEffect.cbTypeSpecificParams = sizeof(diPeriodic);
		diEffect.lpvTypeSpecificParams = &diPeriodic;  

		HRESULT hr = pForceFeedback->CreateEffect(
							GUID_Triangle,     // GUID from enumeration
							&diEffect,      // where the data is
							&pEffect,  // where to put interface pointer
							NULL);          // no aggregation

		pConstantForce->Download();
	}


	void CControl::PlayEffect(void)
	{
		HRESULT hr;

		if(pEffect)
			hr = pEffect->Start(1, NULL);
	}


What could be the possible problem? [Edited by - FlyinDeath on March 15, 2006 11:07:31 AM]
Advertisement
Just for the future, [ source] and [ /source] (no spaces in it) are your friends!

"Those who would give up essential liberty to purchase a little temporary safety deserve neither liberty nor safety." --Benjamin Franklin

thanks...waiting to see if somebody could answer my problm :)

This topic is closed to new replies.

Advertisement