You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
5.4 KiB
171 lines
5.4 KiB
/****************************************************************************
|
|
|
|
MODULE: SW_Objec.hpp
|
|
Tab settings: 5 9
|
|
Copyright 1995, 1996, 1999, Microsoft Corporation, All Rights Reserved.
|
|
|
|
PURPOSE: Definition of the CDirectInputEffectDriver class that uses interface
|
|
implementations to provide IDirectInputEffectDriver
|
|
|
|
FUNCTIONS:
|
|
|
|
Author(s): Name:
|
|
---------- ----------------
|
|
MEA Manolito E. Adan
|
|
|
|
Revision History:
|
|
-----------------
|
|
Version Date Author Comments
|
|
------- ------ ----- -------------------------------------------
|
|
1.0 06-Feb-97 MEA original, Based on SWForce
|
|
23-Feb-97 MEA Modified for DirectInput FF Device Driver
|
|
26-Feb-97 MEA Added SetGain
|
|
21-Mar-99 waltw Removed unreferenced CreateDirectInputEffectDriver
|
|
|
|
****************************************************************************/
|
|
#ifndef _SW_OBJEC_SEEN
|
|
#define _SW_OBJEC_SEEN
|
|
|
|
#include <windows.h>
|
|
#include <mmsystem.h>
|
|
#include <memory.h>
|
|
#include "dinput.h"
|
|
#include "dinputd.h"
|
|
#include "midi_obj.hpp"
|
|
#include "dx_map.hpp"
|
|
|
|
|
|
//Type for an object-destroyed callback
|
|
typedef void (*PFNDESTROYED)(void);
|
|
|
|
//DeleteInterfaceImp calls 'delete' and NULLs the pointer
|
|
#define DeleteInterfaceImp(p)\
|
|
{\
|
|
if (NULL!=p)\
|
|
{\
|
|
delete p;\
|
|
p=NULL;\
|
|
}\
|
|
}
|
|
|
|
//ReleaseInterface calls 'Release' and NULLs the pointer
|
|
#define ReleaseInterface(p)\
|
|
{\
|
|
if (NULL!=p)\
|
|
{\
|
|
p->Release();\
|
|
p=NULL;\
|
|
}\
|
|
}
|
|
|
|
#ifndef PPVOID
|
|
typedef LPVOID * PPVOID;
|
|
#endif //PPVOID
|
|
|
|
/*
|
|
* The object we want to provide in OLE supports the IUnknown,
|
|
* IDirectInputEffectDriver interfaces.
|
|
*
|
|
* The C++ class, CDirectInputEffectDriver, implements these interfaces with
|
|
* "interface implementations" where the C++ class itself inherits
|
|
* from and implements IUnknown members and then contains
|
|
* other C++ classes that each separately inherit from the other
|
|
* interfaces. The other classes are the "interface implementations."
|
|
*/
|
|
|
|
|
|
/*
|
|
* In this technique you'll generally need forward references
|
|
* like this for use in declaring the object class.
|
|
*/
|
|
class CImpIDirectInputEffectDriver;
|
|
typedef CImpIDirectInputEffectDriver *PCImpIDirectInputEffectDriver;
|
|
|
|
//The C++ class that manages the actual object.
|
|
class CDirectInputEffectDriver : public IUnknown
|
|
{
|
|
/*
|
|
* Usually interface implementations will need back pointers
|
|
* to the object itself since this object usually manages
|
|
* the important data members. In that case, make the
|
|
* interface implementation classes friends of the object.
|
|
*/
|
|
|
|
friend CImpIDirectInputEffectDriver;
|
|
|
|
protected:
|
|
ULONG m_cRef; //Object reference count
|
|
LPUNKNOWN m_pUnkOuter; //Controlling unknown
|
|
|
|
PFNDESTROYED m_pfnDestroy; //To call on closure
|
|
|
|
/*
|
|
* I use "m_pImpI" as a prefix to differentiate interface
|
|
* implementations for this object from other interface
|
|
* pointer variables I might hold to other objects, which
|
|
* would be prefixed with "m_pI".
|
|
*/
|
|
PCImpIDirectInputEffectDriver m_pImpIDirectInputEffectDriver;
|
|
|
|
public:
|
|
CDirectInputEffectDriver(LPUNKNOWN, PFNDESTROYED);
|
|
~CDirectInputEffectDriver(void);
|
|
|
|
BOOL Init(void);
|
|
|
|
//IUnknown members
|
|
STDMETHODIMP QueryInterface(REFIID, PPVOID);
|
|
STDMETHODIMP_(DWORD) AddRef(void);
|
|
STDMETHODIMP_(DWORD) Release(void);
|
|
};
|
|
|
|
|
|
typedef CDirectInputEffectDriver *PCDirectInputEffectDriver;
|
|
|
|
|
|
/*
|
|
* Interface implementation classes are C++ classes that
|
|
* each singly inherit from an interface. Their IUnknown
|
|
* members delegate calls to CDirectInputEffectDriver's IUnknown members--
|
|
* since IUnknown members affect the entire *object*, and
|
|
* since these interfaces are not the object itself, we must
|
|
* delegate to implement the correct behavior.
|
|
*/
|
|
|
|
class CImpIDirectInputEffectDriver : public IDirectInputEffectDriver
|
|
{
|
|
private:
|
|
DWORD m_cRef; //For debugging
|
|
PCDirectInputEffectDriver m_pObj; //Back pointer for delegation
|
|
|
|
// SideWinder Force Feedback Device
|
|
CJoltMidi *m_pJoltMidi;
|
|
|
|
public:
|
|
CImpIDirectInputEffectDriver(PCDirectInputEffectDriver);
|
|
~CImpIDirectInputEffectDriver(void);
|
|
|
|
// CEffect access methods
|
|
CJoltMidi *CJoltMidiPtrOf() { return m_pJoltMidi; }
|
|
void SetJoltMidiPtr(CJoltMidi* pJoltMidi) { m_pJoltMidi = pJoltMidi; }
|
|
|
|
//IUnknown members
|
|
STDMETHODIMP QueryInterface(REFIID, PPVOID);
|
|
STDMETHODIMP_(DWORD) AddRef(void);
|
|
STDMETHODIMP_(DWORD) Release(void);
|
|
|
|
/*** IDirectInputEffectDriver methods ***/
|
|
STDMETHOD(DeviceID)(THIS_ DWORD,DWORD,DWORD,DWORD,LPVOID);
|
|
STDMETHOD(GetVersions)(THIS_ LPDIDRIVERVERSIONS);
|
|
STDMETHOD(Escape)(THIS_ DWORD,DWORD,LPDIEFFESCAPE);
|
|
STDMETHOD(SetGain)(THIS_ DWORD,DWORD);
|
|
STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD,DWORD);
|
|
STDMETHOD(GetForceFeedbackState)(THIS_ DWORD,LPDIDEVICESTATE);
|
|
STDMETHOD(DownloadEffect)(THIS_ DWORD,DWORD,LPDWORD,LPCDIEFFECT,DWORD);
|
|
STDMETHOD(DestroyEffect)(THIS_ DWORD,DWORD);
|
|
STDMETHOD(StartEffect)(THIS_ DWORD,DWORD,DWORD,DWORD);
|
|
STDMETHOD(StopEffect)(THIS_ DWORD,DWORD);
|
|
STDMETHOD(GetEffectStatus)(THIS_ DWORD,DWORD,LPDWORD);
|
|
};
|
|
|
|
#endif _SW_OBJEC_SEEN
|