📄 directx.pas
字号:
unit DirectX;
interface
{$Z4}
{$A+}
{$WEAKPACKAGEUNIT}
uses Windows, MMSystem, ActiveX;
{ GUIDS used by DirectDraw objects }
const
CLSID_DirectSound: TGUID = '{47D4D946-62E8-11cf-93BC-444553540000}';
CLSID_DirectSoundCapture: TGUID = '{B0210780-89CD-11d0-AF08-00A0C925CD16}';
IID_IDirectSound: TGUID = '{279AFA83-4981-11CE-A521-0020AF0BE560}';
IID_IDirectSoundBuffer: TGUID = '{279AFA85-4981-11CE-A521-0020AF0BE560}';
IID_IDirectSoundCapture: TGUID = '{B0210781-89CD-11D0-AF08-00A0C925CD16}';
IID_IDirectSoundCaptureBuffer: TGUID = '{B0210782-89CD-11D0-AF08-00A0C925CD16}';
IID_IDirectSoundNotify: TGUID = '{B0210783-89CD-11D0-AF08-00A0C925CD16}';
{ DirectSound Structures }
type
IDirectSound = interface;
IDirectSoundBuffer = interface;
IDirectSoundCapture = interface;
IDirectSoundCaptureBuffer = interface;
IDirectSoundNotify = interface;
{ TDSCaps }
PDSCaps = ^TDSCaps;
TDSCaps = record
dwSize: 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: DWORD;
dwUnlockTransferRateHwBuffers: DWORD;
dwPlayCpuOverheadSwBuffers: DWORD;
dwReserved1: DWORD;
dwReserved2: DWORD;
end;
DSCAPS = TDSCaps;
LPDSCAPS = PDSCaps;
{ TDSBCaps }
PDSBCaps = ^TDSBCaps;
TDSBCaps = record
dwSize: DWORD;
dwFlags: DWORD;
dwBufferBytes: DWORD;
dwUnlockTransferRate: DWORD;
dwPlayCpuOverhead: DWORD;
end;
DSBCAPS = TDSBCaps;
LPDSBCAPS = DSBCAPS;
{ TDSBufferDesc }
PDSBufferDesc = ^TDSBufferDesc;
TDSBufferDesc = record
dwSize: DWORD;
dwFlags: DWORD;
dwBufferBytes: DWORD;
dwReserved: DWORD;
lpwfxFormat: PWaveFormatEx;
guid3DAlgorithm: TGUID;
end;
DSBUFFERDESC = TDSBufferDesc;
LPDSBUFFERDESC = PDSBufferDesc;
{ TDSBufferDesc1 }
PDSBufferDesc1 = ^TDSBufferDesc1;
TDSBufferDesc1 = record
dwSize: DWORD;
dwFlags: DWORD;
dwBufferBytes: DWORD;
dwReserved: DWORD;
lpwfxFormat: PWaveFormatEx;
end;
DSBUFFERDESC1 = TDSBufferDesc1;
LPDSBUFFERDESC1 = PDSBufferDesc1;
{ TDSCCaps }
PDSCCaps = ^TDSCCaps;
TDSCCaps = record
dwSize: DWORD;
dwFlags: DWORD;
dwFormats: DWORD;
dwChannels: DWORD;
end;
DSCCAPS = TDSCCaps;
LPDSCCAPS = PDSCCaps;
{ TDSCBufferDesc }
PDSCBufferDesc = ^TDSCBufferDesc;
TDSCBufferDesc = record
dwSize: DWORD;
dwFlags: DWORD;
dwBufferBytes: DWORD;
dwReserved: DWORD;
lpwfxFormat: PWaveFormatEx;
end;
DSCBUFFERDESC = TDSCBufferDesc;
LPDSCBUFFERDESC = PDSCBufferDesc;
{ TDSCBCaps }
PDSCBCaps = ^TDSCBCaps;
TDSCBCaps = record
dwSize: DWORD;
dwFlags: DWORD;
dwBufferBytes: DWORD;
dwReserved: DWORD;
end;
DSCBCAPS = TDSCBCaps;
LPDSCBCAPS = PDSCBCaps;
{ TDSBPositionNotify }
PDSBPositionNotify = ^TDSBPositionNotify;
TDSBPositionNotify = record
dwOffset: DWORD;
hEventNotify: THandle;
end;
DSBPOSITIONNOTIFY = TDSBPositionNotify;
LPDSBPOSITIONNOTIFY = PDSBPositionNotify;
{ IDirectSound }
IDirectSound = interface(IUnknown)
['{279AFA83-4981-11CE-A521-0020AF0BE560}']
// IDirectSound methods
function CreateSoundBuffer(const lpDSBufferDesc: TDSBufferDesc;
out lplpDirectSoundBuffer: IDirectSoundBuffer;
pUnkOuter: IUnknown): HResult; stdcall;
function GetCaps(var lpDSCaps: TDSCaps): HResult; stdcall;
function DuplicateSoundBuffer(lpDsbOriginal: IDirectSoundBuffer;
out lpDsbDuplicate: IDirectSoundBuffer): HResult; stdcall;
function SetCooperativeLevel(hwnd: HWND; dwLevel: DWORD): HResult; stdcall;
function Compact: HResult; stdcall;
function GetSpeakerConfig(var lpdwSpeakerConfig: DWORD): HResult; stdcall;
function SetSpeakerConfig(dwSpeakerConfig: DWORD): HResult; stdcall;
function Initialize(lpGuid: PGUID): HResult; stdcall;
end;
{ IDirectSoundBuffer }
IDirectSoundBuffer = interface(IUnknown)
['{279AFA85-4981-11CE-A521-0020AF0BE560}']
// IDirectSoundBuffer methods
function GetCaps(var lpDSBufferCaps: TDSBCaps): HResult; stdcall;
function GetCurrentPosition(var lpdwCurrentPlayCursor,
lpdwCurrentWriteCursor: DWORD): HResult; stdcall;
function GetFormat(var lpwfxFormat: TWaveFormatEx; dwSizeAllocated: DWORD;
var lpdwSizeWritten: DWORD): HResult; stdcall;
function GetVolume(var lplVolume: Longint): HResult; stdcall;
function GetPan(var lplPan: Longint): HResult; stdcall;
function GetFrequency(var lpdwFrequency: DWORD): HResult; stdcall;
function GetStatus(var lpdwStatus: DWORD): HResult; stdcall;
function Initialize(lpDirectSound: IDirectSound; const
lpDSBufferDesc: TDSBufferDesc): HResult; stdcall;
function Lock(dwWriteCursor: DWORD; dwWriteBytes: DWORD;
var lplpvAudioPtr1: Pointer; var lpdwAudioBytes1: DWORD;
var lplpvAudioPtr2: Pointer; var lpdwAudioBytes2: DWORD;
dwFlags: DWORD): HResult; stdcall;
function Play(dwReserved1, dwReserved2: DWORD; dwFlags: DWORD): HResult; stdcall;
function SetCurrentPosition(dwNewPosition: DWORD): HResult; stdcall;
function SetFormat(const lpfxFormat: TWaveFormatEx): HResult; stdcall;
function SetVolume(lVolume: Longint): HResult; stdcall;
function SetPan(lPan: Longint): HResult; stdcall;
function SetFrequency(dwFrequency: DWORD): HResult; stdcall;
function Stop: HResult; stdcall;
function Unlock(lpvAudioPtr1: Pointer; dwAudioBytes1: DWORD;
lpvAudioPtr2: Pointer; dwAudioBytes2: DWORD): HResult; stdcall;
function Restore: HResult; stdcall;
end;
{ IDirectSoundCapture }
IDirectSoundCapture = interface(IUnknown)
['{B0210781-89CD-11D0-AF08-00A0C925CD16}']
// IDirectSoundCapture methods
function CreateCaptureBuffer(const lpDSCBufferDesc: TDSCBufferDesc;
out lplpDirectSoundCaptureBuffer: IDirectSoundCaptureBuffer;
pUnkOuter: IUnknown): HResult; stdcall;
function GetCaps(var lpDSCCaps: TDSCCaps): HResult; stdcall;
function Initialize(lpGuid: PGUID): HResult; stdcall;
end;
{ IDirectSoundCaptureBuffer }
IDirectSoundCaptureBuffer = interface(IUnknown)
['{B0210782-89CD-11D0-AF08-00A0C925CD16}']
// IDirectSoundCaptureBuffer methods
function GetCaps(var lpDSCBCaps: TDSCBCaps): HResult; stdcall;
function GetCurrentPosition(var lpdwCapturePosition,
lpdwReadPosition: DWORD): HResult; stdcall;
function GetFormat(var lpwfxFormat: TWaveFormatEx; dwSizeAllocated: DWORD;
var lpdwSizeWritten: DWORD): HResult; stdcall;
function GetStatus(var lpdwStatus: DWORD): HResult; stdcall;
function Initialize(lpDirectSoundCapture: IDirectSoundCapture;
const lpcDSBufferDesc: TDSCBufferDesc): HResult; stdcall;
function Lock(dwReadCursor: DWORD; dwReadBytes: DWORD;
var lplpvAudioPtr1: Pointer; var lpdwAudioBytes1: DWORD;
var lplpvAudioPtr2: Pointer; var lpdwAudioBytes2: DWORD;
dwFlags: DWORD): HResult; stdcall;
function Start(dwFlags: DWORD): HResult; stdcall;
function Stop: HResult; stdcall;
function Unlock(lpvAudioPtr1: Pointer; dwAudioBytes1: DWORD;
lpvAudioPtr2: Pointer; dwAudioBytes2: DWORD): HResult; stdcall;
end;
{ IDirectSoundNotify }
IDirectSoundNotify = interface(IUnknown)
['{B0210783-89CD-11D0-AF08-00A0C925CD16}']
// IDirectSoundNotify methods
function SetNotificationPositions(cPositionNotifies: DWORD;
const lpcPositionNotifies): HResult; stdcall;
end;
{ Return Codes }
const
DS_OK = HResult(S_OK);
DS_NO_VIRTUALIZATION = HResult($878000A);
DSERR_ALLOCATED = HResult($88780000 + 10);
DSERR_CONTROLUNAVAIL = HResult($88780000 + 30);
DSERR_INVALIDPARAM = HResult(E_INVALIDARG);
DSERR_INVALIDCALL = HResult($88780000 + 50);
DSERR_GENERIC = HResult(E_FAIL);
DSERR_PRIOLEVELNEEDED = HResult($88780000 + 70);
DSERR_OUTOFMEMORY = HResult(E_OUTOFMEMORY);
DSERR_BADFORMAT = HResult($88780000 + 100);
DSERR_UNSUPPORTED = HResult(E_NOTIMPL);
DSERR_NODRIVER = HResult($88780000 + 120);
DSERR_ALREADYINITIALIZED = HResult($88780000 + 130);
DSERR_NOAGGREGATION = HResult(CLASS_E_NOAGGREGATION);
DSERR_BUFFERLOST = HResult($88780000 + 150);
DSERR_OTHERAPPHASPRIO = HResult($88780000 + 160);
DSERR_UNINITIALIZED = HResult($88780000 + 170);
DSERR_NOINTERFACE = HResult(E_NOINTERFACE);
DSERR_ACCESSDENIED = HResult(E_ACCESSDENIED);
{ Flags }
DSCAPS_PRIMARYMONO = $00000001;
DSCAPS_PRIMARYSTEREO = $00000002;
DSCAPS_PRIMARY8BIT = $00000004;
DSCAPS_PRIMARY16BIT = $00000008;
DSCAPS_CONTINUOUSRATE = $00000010;
DSCAPS_EMULDRIVER = $00000020;
DSCAPS_CERTIFIED = $00000040;
DSCAPS_SECONDARYMONO = $00000100;
DSCAPS_SECONDARYSTEREO = $00000200;
DSCAPS_SECONDARY8BIT = $00000400;
DSCAPS_SECONDARY16BIT = $00000800;
DSSCL_NORMAL = $00000001;
DSSCL_PRIORITY = $00000002;
DSSCL_EXCLUSIVE = $00000003;
DSSCL_WRITEPRIMARY = $00000004;
DSSPEAKER_HEADPHONE = $00000001;
DSSPEAKER_MONO = $00000002;
DSSPEAKER_QUAD = $00000003;
DSSPEAKER_STEREO = $00000004;
DSSPEAKER_SURROUND = $00000005;
DSSPEAKER_5POINT1 = $00000006;
DSSPEAKER_GEOMETRY_MIN = $00000005;
DSSPEAKER_GEOMETRY_NARROW = $0000000A;
DSSPEAKER_GEOMETRY_WIDE = $00000014;
DSSPEAKER_GEOMETRY_MAX = $000000B4;
DSBCAPS_PRIMARYBUFFER = $00000001;
DSBCAPS_STATIC = $00000002;
DSBCAPS_LOCHARDWARE = $00000004;
DSBCAPS_LOCSOFTWARE = $00000008;
DSBCAPS_CTRL3D = $00000010;
DSBCAPS_CTRLFREQUENCY = $00000020;
DSBCAPS_CTRLPAN = $00000040;
DSBCAPS_CTRLVOLUME = $00000080;
DSBCAPS_CTRLPOSITIONNOTIFY = $00000100;
DSBCAPS_CTRLDEFAULT = $000000E0;
DSBCAPS_CTRLALL = $000001F0;
DSBCAPS_STICKYFOCUS = $00004000;
DSBCAPS_GLOBALFOCUS = $00008000;
DSBCAPS_GETCURRENTPOSITION2 = $00010000;
DSBCAPS_MUTE3DATMAXDISTANCE = $00020000;
DSBCAPS_LOCDEFER = $00040000;
DSBPLAY_LOOPING = $00000001;
DSBPLAY_LOCHARDWARE = $00000002;
DSBPLAY_LOCSOFTWARE = $00000004;
DSBPLAY_TERMINATEBY_TIME = $00000008;
DSBPLAY_TERMINATEBY_DISTANCE = $00000010;
DSBPLAY_TERMINATEBY_PRIORITY = $00000020;
DSBSTATUS_PLAYING = $00000001;
DSBSTATUS_BUFFERLOST = $00000002;
DSBSTATUS_LOOPING = $00000004;
DSBSTATUS_LOCHARDWARE = $00000008;
DSBSTATUS_LOCSOFTWARE = $00000010;
DSBSTATUS_TERMINATED = $00000020;
DSBLOCK_FROMWRITECURSOR = $00000001;
DSBLOCK_ENTIREBUFFER = $00000002;
DSBFREQUENCY_MIN = 100;
DSBFREQUENCY_MAX = 100000;
DSBFREQUENCY_ORIGINAL = 0;
DSBPAN_LEFT = -10000;
DSBPAN_CENTER = 0;
DSBPAN_RIGHT = 10000;
DSBVOLUME_MIN = -10000;
DSBVOLUME_MAX = 0;
DSBSIZE_MIN = 4;
DSBSIZE_MAX = $0FFFFFFF;
DSCCAPS_EMULDRIVER = DSCAPS_EMULDRIVER;
DSCCAPS_CERTIFIED = DSCAPS_CERTIFIED;
DSCBCAPS_WAVEMAPPED = $80000000;
DSCBLOCK_ENTIREBUFFER = $00000001;
DSCBSTATUS_CAPTURING = $00000001;
DSCBSTATUS_LOOPING = $00000002;
DSCBSTART_LOOPING = $00000001;
DSBPN_OFFSETSTOP = $FFFFFFFF;
{ DirectSound API }
type
TDSEnumCallbackW = function(lpGuid: PGUID; lpstrDescription: LPCWSTR;
lpstrModule: LPCWSTR; lpContext: Pointer): BOOL; stdcall;
LPDSENUMCALLBACKW = TDSEnumCallbackW;
TDSEnumCallbackA = function(lpGuid: PGUID; lpstrDescription: LPCSTR;
lpstrModule: LPCSTR; lpContext: Pointer): BOOL; stdcall;
LPDSENUMCALLBACKA = TDSEnumCallbackA;
TDSEnumCallback = TDSEnumCallbackA;
LPDSENUMCALLBACK = TDSEnumCallback;
function DirectSoundCreate(lpGUID: PGUID; out lpDS: IDirectSound; pUnkOuter: IUnknown): HResult; stdcall;
function DirectSoundEnumerateA(lpDSEnumCallback: TDSEnumCallbackA; lpContext: Pointer): HResult; stdcall;
function DirectSoundEnumerateW(lpDSEnumCallback: TDSEnumCallbackW; lpContext: Pointer): HResult; stdcall;
function DirectSoundEnumerate(lpDSEnumCallback: TDSEnumCallbackA; lpContext: Pointer): HResult; stdcall;
function DirectSoundCaptureCreate(lpGUID: PGUID; out lplpDSC: IDirectSoundCapture; pUnkOuter: IUnknown): HResult; stdcall;
function DirectSoundCaptureEnumerateA(lpDSEnumCallback: TDSEnumCallbackA; lpContext: Pointer): HResult; stdcall;
function DirectSoundCaptureEnumerateW(lpDSEnumCallback: TDSEnumCallbackW; lpContext: Pointer): HResult; stdcall;
function DirectSoundCaptureEnumerate(lpDSEnumCallback: TDSEnumCallbackA; lpContext: Pointer): HResult; stdcall;
function MAKEFOURCC(ch0, ch1, ch2, ch3: Char) : DWORD;
type
FOURCC = DWORD; // a four character code
implementation
const
DSoundLib = 'DSound.dll';
{ DirectSound }
function DSSPEAKER_COMBINED(c, g: Byte): DWORD;
begin
Result := c or (g shl 16);
end;
function DSSPEAKER_CONFIG(a: DWORD): Byte;
begin
Result := a;
end;
function DSSPEAKER_GEOMETRY(a: DWORD): Byte;
begin
Result := a shr 16;
end;
function DirectSoundCreate; external DSoundLib;
function DirectSoundEnumerateA; external DSoundLib;
function DirectSoundEnumerateW; external DSoundLib;
function DirectSoundEnumerate; external DSoundLib name 'DirectSoundEnumerateA';
function DirectSoundCaptureCreate; external DSoundLib;
function DirectSoundCaptureEnumerateA; external DSoundLib;
function DirectSoundCaptureEnumerateW; external DSoundLib;
function DirectSoundCaptureEnumerate; external DSoundLib name 'DirectSoundCaptureEnumerateA';
function MAKEFOURCC(ch0, ch1, ch2, ch3: Char) : DWORD;
begin
Result := Ord(ch0) + (Ord(ch1) shl 8) + (Ord(ch2) shl 16) + (Ord(ch3) shl 24);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -