|
|
/*==========================================================================;
* * Copyright (C) 1995-2001 Microsoft Corporation. All Rights Reserved. * * File: dsvxdi.h * Content: dsound.vxd private include file * **************************************************************************/
#ifndef __DSVXDI_INCLUDED__
#define __DSVXDI_INCLUDED__
#ifdef __cplusplus
extern "C" { #endif
extern VMMLIST gvmmlistDrivers;
//
//
//
typedef const GUID* LPCGUID; typedef HRESULT DSVAL;
#ifdef __cplusplus
//
//
//
class CBuf_IDsDriverPropertySet : public IDsDriverPropertySet { private: int m_cRef; class CBuf *m_pBuf;
public: // constructor
CBuf_IDsDriverPropertySet(class CBuf* pBuf);
// IUnknown members
STDMETHODIMP QueryInterface(REFIID, PVOID*); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void);
// IDsDriverPropertySet members
STDMETHODIMP Get(PDSPROPERTY pDsProperty, PVOID pPropertyParams, ULONG cbPropertyParams, PVOID pPropertyData, ULONG cbPropertyData, PULONG pcbReturnedData); STDMETHODIMP Set(PDSPROPERTY pDsProperty, PVOID pPropertyParams, ULONG cbPropertyParams, PVOID pPropertyData, ULONG cbPropertyData); STDMETHODIMP QuerySupport(REFGUID PropertySetId, ULONG PropertyId, PULONG pSupport); };
//
//
//
class CBuf : public IDsDriverBuffer { private: int m_cRef; class CDrv *m_pDrv; BOOL m_fDeregistered;
IDsDriverBuffer *m_pIDsDriverBuffer_Real; IDsDriverPropertySet *m_pIDsDriverPropertySet_Real;
// contained interface implementations
CBuf_IDsDriverPropertySet m_IDsDriverPropertySet;
friend CBuf_IDsDriverPropertySet;
public: // new/delete operators
void* operator new(size_t size, VMMLIST list); void operator delete(void * pv, size_t size);
// constructor
CBuf(void);
// class methods
static VMMLIST CreateList(void); static void DestroyList(VMMLIST list); static HRESULT CreateBuf(CDrv *pDrv, VMMLIST list, IDsDriverBuffer *pIDsDriverBuffer_Real, IDsDriverBuffer **ppIDsDriverBuffer); static void DeregisterBuffers(VMMLIST list);
// IUnknown members
STDMETHODIMP QueryInterface(REFIID, PVOID*); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void);
// IDsDriverBuffer members
STDMETHODIMP Lock(LPVOID *, LPDWORD, LPVOID *, LPDWORD, DWORD, DWORD, DWORD); STDMETHODIMP Unlock(LPVOID, DWORD, LPVOID, DWORD); STDMETHODIMP SetFormat(LPWAVEFORMATEX); STDMETHODIMP SetFrequency(DWORD); STDMETHODIMP SetVolumePan(PDSVOLUMEPAN); STDMETHODIMP SetPosition(DWORD); STDMETHODIMP GetPosition(LPDWORD, LPDWORD); STDMETHODIMP Play(DWORD, DWORD, DWORD); STDMETHODIMP Stop(void);
// Other members
STDMETHODIMP_(BOOL) IsDeregistered(void); STDMETHODIMP_(IDsDriverBuffer*) GetRealDsDriverBuffer(void); };
//
//
//
class CDrv : public IDsDriver { private: int m_cRef; int m_cOpen; BOOL m_fDeregistered; IDsDriver *m_pIDsDriver_Real; GUID m_guidDriver; VMMLIST m_listBuffers;
static CDrv* FindFromIDsDriver(IDsDriver *pIDsDriver); static CDrv* FindFromGuid(REFGUID riid);
public: // Class methods
static HRESULT CreateAndRegisterDriver(IDsDriver *pIDsDriver); static HRESULT DeregisterDriver(IDsDriver *pIDsDriver); static HRESULT GetDescFromGuid(REFGUID rguidDriver, PDSDRIVERDESC pDrvDesc); static HRESULT GetNextDescFromGuid(LPCGUID pguidLast, LPGUID pGuid, PDSDRIVERDESC pDrvDesc); static HRESULT OpenFromGuid(REFGUID rguidDriver, IDsDriver **ppIDsDriver);
// new/delete operators
void* operator new(size_t size); void operator delete(void * pv);
// IUnknown members
STDMETHODIMP QueryInterface(REFIID, PVOID*); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void);
// IDsDriver members
STDMETHODIMP GetDriverDesc(PDSDRIVERDESC); STDMETHODIMP Open(void); STDMETHODIMP Close(void); STDMETHODIMP GetCaps(PDSDRIVERCAPS); STDMETHODIMP CreateSoundBuffer(LPWAVEFORMATEX, DWORD, DWORD, LPDWORD, LPBYTE *, LPVOID *); STDMETHODIMP DuplicateSoundBuffer(PIDSDRIVERBUFFER, LPVOID *); }; #endif
//
//
//
int ctrlDrvInit(); int ctrlDrvExit();
int eventScheduleWin32Event(DWORD vxdh, DWORD dwDelay);
int ioctlDsvxd_GetMixerMutexPtr(PDIOCPARAMETERS pdiocp);
int ioctlMixer_Run(PDIOCPARAMETERS pdiocp); int ioctlMixer_Stop(PDIOCPARAMETERS pdiocp); int ioctlMixer_PlayWhenIdle(PDIOCPARAMETERS pdiocp); int ioctlMixer_StopWhenIdle(PDIOCPARAMETERS pdiocp); int ioctlMixer_MixListAdd(PDIOCPARAMETERS pdiocp); int ioctlMixer_MixListRemove(PDIOCPARAMETERS pdiocp); int ioctlMixer_FilterOn(PDIOCPARAMETERS pdiocp); int ioctlMixer_FilterOff(PDIOCPARAMETERS pdiocp); int ioctlMixer_GetBytePosition(PDIOCPARAMETERS pdiocp); int ioctlMixer_SignalRemix(PDIOCPARAMETERS pdiocp);
int ioctlKeDest_New(PDIOCPARAMETERS pdiocp); int ioctlMixDest_Delete(PDIOCPARAMETERS pdiocp); int ioctlMixDest_Initialize(PDIOCPARAMETERS pdiocp); int ioctlMixDest_Terminate(PDIOCPARAMETERS pdiocp); int ioctlMixDest_SetFormat(PDIOCPARAMETERS pdiocp); int ioctlMixDest_SetFormatInfo(PDIOCPARAMETERS pdiocp); int ioctlMixDest_AllocMixer(PDIOCPARAMETERS pdiocp); int ioctlMixDest_FreeMixer(PDIOCPARAMETERS pdiocp); int ioctlMixDest_Play(PDIOCPARAMETERS pdiocp); int ioctlMixDest_Stop(PDIOCPARAMETERS pdiocp); int ioctlMixDest_GetFrequency(PDIOCPARAMETERS pdiocp); int ioctlMixDest_Lock(PDIOCPARAMETERS pdiocp); int ioctlMixDest_Unlock(PDIOCPARAMETERS pdiocp);
VOID _ZeroMemory(PVOID pDestination, DWORD cbLength);
int VXDINLINE VMM_lstrcmpi(char *pString1, char *pString2); LPVOID VXDINLINE VMM_GetCurrentContext(); BOOL VXDINLINE VMM_PageAttach(ULONG pagesrc, LPVOID hcontextsrc, ULONG pagedst, ULONG cpages); BOOL VXDINLINE VMM_PageFree(PVOID pPage, ULONG flags); void VXDINLINE VMM_EnterMustComplete(); void VXDINLINE VMM_LeaveMustComplete(); BOOL VXDINLINE VWIN32_CloseVxDHandle(DWORD vxdh);
int ctrlDynamicDeviceInit(void); int ctrlDynamicDeviceExit(void);
int ioctlDsvxdInitialize(PDIOCPARAMETERS pdiocp); int ioctlDsvxdShutdown(PDIOCPARAMETERS pdiocp); int ioctlDsvxd_PageFile_Get_Version(PDIOCPARAMETERS pdiocp); int ioctlDsvxd_VMM_Test_Debug_Installed(PDIOCPARAMETERS pdiocp); int ioctlDsvxd_VMCPD_Get_Version(PDIOCPARAMETERS pdiocp); int ioctlDrvGetNextDescFromGuid(PDIOCPARAMETERS pdiocp); int ioctlDrvGetDescFromGuid(PDIOCPARAMETERS pdiocp); int ioctlDrvOpenFromGuid(PDIOCPARAMETERS pdiocp); int ioctlIUnknown_QueryInterface(PDIOCPARAMETERS pdiocp); int ioctlIUnknown_AddRef(PDIOCPARAMETERS pdiocp); int ioctlIUnknown_Release(PDIOCPARAMETERS pdiocp); int ioctlIDsDriver_QueryInterface(PDIOCPARAMETERS pdiocp); int ioctlIDsDriver_Close(PDIOCPARAMETERS pdiocp); int ioctlIDsDriver_GetCaps(PDIOCPARAMETERS pdiocp); int ioctlIDsDriver_CreateSoundBuffer(PDIOCPARAMETERS pdiocp); int ioctlIDsDriver_DuplicateSoundBuffer(PDIOCPARAMETERS pdiocp); int ioctlBufferRelease(PDIOCPARAMETERS pdiocp); int ioctlBufferLock(PDIOCPARAMETERS pdiocp); int ioctlBufferUnlock(PDIOCPARAMETERS pdiocp); int ioctlBufferSetFormat(PDIOCPARAMETERS pdiocp); int ioctlBufferSetFrequency(PDIOCPARAMETERS pdiocp); int ioctlBufferSetVolumePan(PDIOCPARAMETERS pdiocp); int ioctlBufferSetPosition(PDIOCPARAMETERS pdiocp); int ioctlBufferGetPosition(PDIOCPARAMETERS pdiocp); int ioctlBufferPlay(PDIOCPARAMETERS pdiocp); int ioctlBufferStop(PDIOCPARAMETERS pdiocp); int ioctlIDirectSoundPropertySet_GetProperty(PDIOCPARAMETERS pdiocp); int ioctlIDirectSoundPropertySet_SetProperty(PDIOCPARAMETERS pdiocp); int ioctlIDirectSoundPropertySet_QuerySupport(PDIOCPARAMETERS pdiocp); int ioctlEventScheduleWin32Event(PDIOCPARAMETERS pdiocp); int ioctlEventCloseVxDHandle(PDIOCPARAMETERS pdiocp); int ioctlMemReserveAlias(PDIOCPARAMETERS pdiocp); int ioctlMemCommitAlias(PDIOCPARAMETERS pdiocp); int ioctlMemDecommitAlias(PDIOCPARAMETERS pdiocp); int ioctlMemRedirectAlias(PDIOCPARAMETERS pdiocp); int ioctlMemFreeAlias(PDIOCPARAMETERS pdiocp); int ioctlMemPageLock(PDIOCPARAMETERS pdiocp); int ioctlMemPageUnlock(PDIOCPARAMETERS pdiocp); int ioctlMemCommitPhysAlias(PDIOCPARAMETERS pdiocp); int ioctlMemRedirectPhysAlias(PDIOCPARAMETERS pdiocp); int ioctlGetInternalVersionNumber(PDIOCPARAMETERS pdiocp);
void Dsvxd_PageFile_Get_Version(PDWORD pVersion, PDWORD pMaxSize, PDWORD pPagerType); BOOL Dsvxd_VMM_Test_Debug_Installed(void); void Dsvxd_VMCPD_Get_Version(PLONG pMajorVersion, PLONG pMinorVersion, PLONG pCoprocessorLevel);
HRESULT SERVICE DSOUND_RegisterDeviceDriver(PIDSDRIVER pIDsDriver, DWORD dwFlags); HRESULT SERVICE DSOUND_DeregisterDeviceDriver(PIDSDRIVER pIDsDriver, DWORD dwFlags);
//--------------------------------------------------------------------------;
//
// Some useful IOCTL macros
//
//--------------------------------------------------------------------------;
// the ASSERT in IOSTART confirms that the count of
// input bytes is what we expect
#define IOSTART(cbInExpected) LPDWORD pdiocIn = (LPDWORD)pdiocp->lpvInBuffer; \
LPDWORD pdiocOut = (LPDWORD)pdiocp->lpvOutBuffer; \ ASSERT( pdiocp->cbInBuffer == (cbInExpected) );
#define IOINPUT(x, t) x = ( *(t*)(pdiocIn++) );
#define IOOUTPUT(x, t) ( *(t*)((pdiocOut++)) ) = x;
// the ASSERT in IORETURN confirms that we read all
// of the bytes out of the input buffer
#define IORETURN (*(DWORD*)pdiocp->lpcbBytesReturned) = ((LPBYTE)pdiocOut) - ((LPBYTE)pdiocp->lpvOutBuffer); \
ASSERT( (DWORD)(((LPBYTE)pdiocIn) - ((LPBYTE)pdiocp->lpvInBuffer)) == pdiocp->cbInBuffer );
#ifdef DEBUG
#ifndef USEASSERT
#define USEASSERT
#endif
#endif
// ASSERT macro
#undef HOLYCOW
#undef CRLF
#undef ASSERT
#define HOLYCOW "******************************************************************************"
#define CRLF "\n"
#ifdef USEASSERT
#define ASSERT(exp) if(!(exp)) _Trace_Out_Service("DSVXD: "), _Debug_Printf_Service(CRLF HOLYCOW CRLF "Assertion failed in %s, line %u: %s" CRLF HOLYCOW CRLF, __FILE__, __LINE__, #exp), _Debug_Out_Service("")
#else
// Disable empty controlled statement warning for ASSERT macro
#pragma warning(disable:4390)
#define ASSERT(exp)
#endif
// BREAK and DPF macros
#undef DPF
#undef BREAK
#define DPF_GUID_STRING "{%8.8lX-%4.4X-%4.4X-%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X}"
#define DPF_GUID_VAL(guid) (guid).Data1, (guid).Data2, (guid).Data3, (guid).Data4[0], (guid).Data4[1], (guid).Data4[2], (guid).Data4[3], (guid).Data4[4], (guid).Data4[5], (guid).Data4[6], (guid).Data4[7]
// #define DEBUG_VXDDRIVERCALLS
#ifdef DEBUG_VXDDRIVERCALLS
#define DRVCALL(arg) _Trace_Out_Service("DSVXD: "), _Debug_Printf_Service##arg, _Trace_Out_Service(CRLF)
#else
#define DRVCALL(arg)
#endif
#ifdef DEBUG
#define DPF(arg) _Trace_Out_Service("DSVXD: "), _Debug_Printf_Service##arg, _Trace_Out_Service(CRLF)
#define BREAK(arg) DPF(arg), _Debug_Out_Service("")
#else
#define DPF(arg)
#define BREAK(arg)
#endif
#ifdef __cplusplus
}; #endif
#endif // __DSVXDI_INCLUDED__
|