mirror of https://github.com/lianthony/NT4.0
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.
341 lines
9.3 KiB
341 lines
9.3 KiB
/*==========================================================================;
|
|
*
|
|
* Copyright (C) 1995,1996 Microsoft Corporation. All Rights Reserved.
|
|
*
|
|
* File: dsdriver.h
|
|
* Content: DirectSound driver include file
|
|
*
|
|
***************************************************************************/
|
|
|
|
#ifndef _INC_DSDRIVER
|
|
#define _INC_DSDRIVER
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
/*
|
|
* The requested COM interface is not available. This value is the same
|
|
* as E_NOINTERFACE as defined in winerror.h in the Win32 SDK.
|
|
*/
|
|
#define DSERR_NOINTERFACE 0x80004002L
|
|
|
|
//@@BEGIN_MSINTERNAL
|
|
|
|
// HALHWMODE flags Note: This file is generated by modeflag.m4
|
|
|
|
#include "modeflag.h"
|
|
|
|
//
|
|
// HALHWMODE afAbilityFlags values
|
|
//
|
|
// These flags describe dynamic capabilities (what the device
|
|
// can/cannot do)
|
|
//
|
|
|
|
#define A_CAN_CHANGE_VOLUME 1 //Can change volume while playing
|
|
#define A_CANNOT_CHANGE_VOLUME 0 //Cannot change volume while playing
|
|
|
|
#define A_CAN_CHANGE_MODE 2 //Can change PCM mode while playing
|
|
#define A_CANNOT_CHANGE_MODE 0 //Cannot change PCM mode while playing
|
|
|
|
#define A_CAN_CHANGE_RATE 4 //Can change rate while playing
|
|
#define A_CANNOT_CHANGE_RATE 0 //Cannot change rate while playing
|
|
|
|
#define A_CAN_LOOP_SECONDARY 8 //Can loop secondary buffers before starting
|
|
#define A_CANNOT_LOOP_SECONDARY 0 //Cannot loop secondary buffers before starting
|
|
|
|
#define A_CAN_UNLOOP_SECONDARY 16 //Secondary bufers do not have to loop
|
|
#define A_CANNOT_UNLOOP_SECONDARY 0 //Secondary buffers must always loop
|
|
|
|
#define A_CAN_CHANGE_LOOP_STATUS 32 //Can turn looping on/off during playback
|
|
#define A_CANNOT_CHANGE_LOOP_STATUS 0 //Cannot turn looping on/off during playback
|
|
|
|
//
|
|
// Typedef for H_ flag sets
|
|
//
|
|
|
|
typedef DWORD HFLAGS;
|
|
|
|
//
|
|
// Typedef for A_ flag sets
|
|
//
|
|
|
|
typedef DWORD AFLAGS;
|
|
|
|
//
|
|
// HALSTRBUF.dwFlags values
|
|
//
|
|
|
|
#define HSB_DMA_ALLOC 1 // Buffer was allocated from DMA services
|
|
#define HSB_RAM_ALLOC 2 // Buffer was allocated from sound card RAM
|
|
|
|
|
|
//
|
|
// Stream buffer descriptor
|
|
//
|
|
|
|
typedef struct {
|
|
HFLAGS hfFormat; // PCM format flag desc of stream buffer
|
|
DWORD dwSampleRate; // Stream sample rate
|
|
LONG lVolume; // mono volume
|
|
LONG lPan; // Pan position
|
|
DWORD dwLVolume; // For mixer use - linear Left Voume
|
|
DWORD dwRVolume; // For mixer use - linear Right Voume
|
|
DWORD dwMVolume; // For mixer use - linear MONO Voume
|
|
}
|
|
HALSTRBUF;
|
|
|
|
typedef HALSTRBUF * LPHALSTRBUF;
|
|
|
|
//@@END_MSINTERNAL
|
|
|
|
|
|
//
|
|
// Driver description
|
|
//
|
|
typedef struct tDSDRIVERDESC {
|
|
DWORD dwFlags;
|
|
TCHAR szDesc[256];
|
|
TCHAR szDrvname[256];
|
|
DWORD dnDevNode;
|
|
WORD wVxdId;
|
|
WORD wReserved;
|
|
ULONG ulDeviceNum;
|
|
DWORD dwHeapType;
|
|
LPVOID pvDirectDrawHeap;
|
|
DWORD dwMemStartAddress;
|
|
DWORD dwMemEndAddress;
|
|
DWORD dwMemAllocExtra;
|
|
LPVOID pvReserved1;
|
|
LPVOID pvReserved2;
|
|
} DSDRIVERDESC, *PDSDRIVERDESC;
|
|
#define DSDDESC_DOMMSYSTEMOPEN 0x00000001
|
|
#define DSDDESC_DOMMSYSTEMSETFORMAT 0x00000002
|
|
#define DSDDESC_USESYSTEMMEMORY 0x00000004
|
|
#define DSDDESC_DONTNEEDPRIMARYLOCK 0x00000008
|
|
#define DSDDESC_DONTNEEDSECONDARYLOCK 0x00000010
|
|
|
|
#define DSDHEAP_NOHEAP 0x00000000
|
|
#define DSDHEAP_CREATEHEAP 0x00000001
|
|
#define DSDHEAP_USEDIRECTDRAWHEAP 0x00000002
|
|
#define DSDHEAP_PRIVATEHEAP 0x00000003
|
|
|
|
//
|
|
// Driver caps
|
|
//
|
|
typedef struct tDSDRIVERCAPS {
|
|
DWORD dwFlags;
|
|
DWORD dwMinSecondarySampleRate;
|
|
DWORD dwMaxSecondarySampleRate;
|
|
DWORD dwPrimaryBuffers;
|
|
DWORD dwMaxHwMixingAllBuffers;
|
|
DWORD dwMaxHwMixingStaticBuffers;
|
|
DWORD dwMaxHwMixingStreamingBuffers;
|
|
DWORD dwFreeHwMixingAllBuffers;
|
|
DWORD dwFreeHwMixingStaticBuffers;
|
|
DWORD dwFreeHwMixingStreamingBuffers;
|
|
DWORD dwMaxHw3DAllBuffers;
|
|
DWORD dwMaxHw3DStaticBuffers;
|
|
DWORD dwMaxHw3DStreamingBuffers;
|
|
DWORD dwFreeHw3DAllBuffers;
|
|
DWORD dwFreeHw3DStaticBuffers;
|
|
DWORD dwFreeHw3DStreamingBuffers;
|
|
DWORD dwTotalHwMemBytes;
|
|
DWORD dwFreeHwMemBytes;
|
|
DWORD dwMaxContigFreeHwMemBytes;
|
|
} DSDRIVERCAPS, *PDSDRIVERCAPS;
|
|
|
|
//
|
|
// Buffer volume and pan
|
|
//
|
|
typedef struct tDSVOLUMEPAN {
|
|
DWORD dwTotalLeftAmpFactor;
|
|
DWORD dwTotalRightAmpFactor;
|
|
|
|
LONG lVolume;
|
|
DWORD dwVolAmpFactor;
|
|
|
|
LONG lPan;
|
|
DWORD dwPanLeftAmpFactor; // pan effect on left
|
|
DWORD dwPanRightAmpFactor; // pan effect on right
|
|
} DSVOLUMEPAN, *PDSVOLUMEPAN;
|
|
|
|
//@@BEGIN_MSINTERNAL
|
|
//
|
|
// Return codes
|
|
//
|
|
typedef DWORD HALRESULT;
|
|
|
|
#define HAL_OK 0
|
|
#define HAL_ERROR 1
|
|
#define HAL_CANT_OPEN_VXD 2
|
|
#define HAL_ALLOC_FAILED 3
|
|
#define HAL_NOT_ALLOCATED 4
|
|
#define HAL_MUST_STOP_FIRST 5
|
|
|
|
#define HAL_SYSALLOCMEM 11
|
|
|
|
//
|
|
// Pass HF_NO_CHANGE to HAL_ChangeStreamFormat() to leave parameter
|
|
// unchanged
|
|
//
|
|
|
|
#define HF_NO_CHANGE 0xffffffff
|
|
|
|
|
|
//
|
|
// This is slop size added on to the end of the driver memory space to
|
|
// have extra room to loop if needed.
|
|
#define DRVMEM_SLOP_SIZE 32
|
|
|
|
//@@END_MSINTERNAL
|
|
|
|
//
|
|
// Direct Sound Driver interfaces
|
|
//
|
|
DEFINE_GUID(IID_IDsDriver, 0x8C4233C0L, 0xB4CC, 0x11CE, 0x92, 0x94, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00);
|
|
DEFINE_GUID(IID_IDsDriverBuffer, 0x8C4233C1L, 0xB4CC, 0x11CE, 0x92, 0x94, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00);
|
|
|
|
//
|
|
// IDsDriverBuffer
|
|
//
|
|
typedef struct IDSDRIVERBUFFER {
|
|
struct IDSDRIVERBUFFERVTBL *lpVtbl;
|
|
} IDSDRIVERBUFFER, *PIDSDRIVERBUFFER;
|
|
|
|
typedef struct IDSDRIVERBUFFERVTBL {
|
|
// IUnknown
|
|
HRESULT (__stdcall *QueryInterface) ( PIDSDRIVERBUFFER, REFIID, LPVOID* );
|
|
ULONG (__stdcall *AddRef) ( PIDSDRIVERBUFFER );
|
|
ULONG (__stdcall *Release) ( PIDSDRIVERBUFFER );
|
|
|
|
// IDsDriverBuffer
|
|
HRESULT (__stdcall *Lock) ( PIDSDRIVERBUFFER pIDsDriverBuffer,
|
|
LPLPVOID ppvAudio1,
|
|
LPDWORD pdwLen1,
|
|
LPLPVOID ppvAudio2,
|
|
LPDWORD pdwLen2,
|
|
DWORD dwWritePosition,
|
|
DWORD dwWriteLen,
|
|
DWORD dwFlags );
|
|
HRESULT (__stdcall *Unlock) ( PIDSDRIVERBUFFER pIDsDriverBuffer,
|
|
LPVOID pvAudio1,
|
|
DWORD dwLen1,
|
|
LPVOID pvAudio2,
|
|
DWORD dwLen2 );
|
|
HRESULT (__stdcall *SetFormat) ( PIDSDRIVERBUFFER pIDsDriverBuffer,
|
|
LPWAVEFORMATEX pwfxToSet );
|
|
HRESULT (__stdcall *SetFrequency) ( PIDSDRIVERBUFFER pIDsDriverBuffer,
|
|
DWORD dwFrequency );
|
|
HRESULT (__stdcall *SetVolumePan) ( PIDSDRIVERBUFFER pIDsDriverBuffer,
|
|
PDSVOLUMEPAN pDsVolumePan );
|
|
HRESULT (__stdcall *SetPosition) ( PIDSDRIVERBUFFER pIDsDriverBuffer,
|
|
DWORD dwNewPosition );
|
|
HRESULT (__stdcall *GetPosition) ( PIDSDRIVERBUFFER pIDsDriverBuffer,
|
|
LPDWORD lpdwCurrentPlayCursor,
|
|
LPDWORD lpdwCurrentWriteCursor );
|
|
HRESULT (__stdcall *Play) ( PIDSDRIVERBUFFER pIDsDriverBuffer,
|
|
DWORD dwReserved1,
|
|
DWORD dwReserved2,
|
|
DWORD dwFlags );
|
|
HRESULT (__stdcall *Stop) ( PIDSDRIVERBUFFER pIDsDriverBuffer);
|
|
} IDSDRIVERBUFFERVTBL;
|
|
|
|
//
|
|
// IDsDriver
|
|
//
|
|
typedef struct IDSDRIVER {
|
|
struct IDSDRIVERVTBL *lpVtbl;
|
|
} IDSDRIVER, *PIDSDRIVER;
|
|
|
|
typedef struct IDSDRIVERVTBL {
|
|
// IUnknown
|
|
HRESULT (__stdcall *QueryInterface) ( PIDSDRIVER, REFIID, LPVOID* );
|
|
ULONG (__stdcall *AddRef) ( PIDSDRIVER );
|
|
ULONG (__stdcall *Release) ( PIDSDRIVER );
|
|
|
|
// IDsDriver
|
|
HRESULT (__stdcall *GetDriverDesc) ( PIDSDRIVER pIDsDriver,
|
|
PDSDRIVERDESC );
|
|
HRESULT (__stdcall *Open) ( PIDSDRIVER pIDsDriver );
|
|
HRESULT (__stdcall *Close) ( PIDSDRIVER pIDsDriver );
|
|
HRESULT (__stdcall *GetCaps) ( PIDSDRIVER pIDsDriver,
|
|
PDSDRIVERCAPS pDsDrvCaps );
|
|
HRESULT (__stdcall *CreateSoundBuffer)( PIDSDRIVER pIDsDriver,
|
|
LPWAVEFORMATEX pwfx,
|
|
DWORD dwFlags,
|
|
DWORD dwCardAddress,
|
|
LPDWORD pdwcbBufferSize,
|
|
LPBYTE *ppBuffer,
|
|
LPVOID *ppvObj );
|
|
HRESULT (__stdcall *DuplicateSoundBuffer)( PIDSDRIVER pIDsDriver,
|
|
PIDSDRIVERBUFFER pIDsDriverBuffer,
|
|
LPVOID *ppv );
|
|
} IDSDRIVERVTBL;
|
|
|
|
|
|
//
|
|
// Driver registration
|
|
//
|
|
// Device id registered to DSOUND.VXD
|
|
#define DSOUND_DEVICE_ID 0x357E
|
|
|
|
#ifndef Not_VxD
|
|
|
|
Begin_Service_Table (DSOUND, VxD)
|
|
Declare_Service (_DSOUND_GetVersion, LOCAL)
|
|
Declare_Service (_DSOUND_RegisterDeviceDriver, VxD_CODE)
|
|
Declare_Service (_DSOUND_DeregisterDeviceDriver, VxD_CODE)
|
|
End_Service_Table (DSOUND, VxD)
|
|
|
|
#ifndef NODSOUNDWRAPS
|
|
|
|
DWORD __inline DSOUND_GetVersion(void)
|
|
{
|
|
DWORD dwVersion;
|
|
Touch_Register(eax)
|
|
VxDCall(_DSOUND_GetVersion);
|
|
_asm mov dwVersion, eax
|
|
return dwVersion;
|
|
}
|
|
|
|
HRESULT __inline DSOUND_RegisterDeviceDriver(PIDSDRIVER pIDsDriver, DWORD dwFlags)
|
|
{
|
|
HRESULT dsv;
|
|
Touch_Register(eax)
|
|
Touch_Register(ecx)
|
|
Touch_Register(edx)
|
|
_asm push dwFlags;
|
|
_asm push pIDsDriver;
|
|
VxDCall(_DSOUND_RegisterDeviceDriver);
|
|
_asm add esp, 8;
|
|
_asm mov dsv, eax;
|
|
return dsv;
|
|
}
|
|
|
|
HRESULT __inline DSOUND_DeregisterDeviceDriver(PIDSDRIVER pIDsDriver, DWORD dwFlags)
|
|
{
|
|
HRESULT dsv;
|
|
Touch_Register(eax)
|
|
Touch_Register(ecx)
|
|
Touch_Register(edx)
|
|
_asm push dwFlags;
|
|
_asm push pIDsDriver;
|
|
VxDCall(_DSOUND_DeregisterDeviceDriver);
|
|
_asm add esp, 8;
|
|
_asm mov dsv, eax;
|
|
return dsv;
|
|
}
|
|
|
|
#endif // NODSOUNDWRAPS
|
|
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
};
|
|
#endif
|
|
|
|
|
|
#endif
|