Windows NT 4.0 source code leak
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

/*==========================================================================;
*
* 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