⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmdsound.pas

📁 一套及时通讯的原码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
    flDistanceFactor    : D3DVALUE;
    flRolloffFactor     : D3DVALUE;
    flDopplerFactor     : D3DVALUE;
  end;

  PDSDRIVERDESC = ^TDSDRIVERDESC;
  TDSDRIVERDESC = record
    lpGUID     : PGUID;
    Description: String;
    Module     : String;
  end;

  PDSBPOSITIONNOTIFY = ^TDSBPOSITIONNOTIFY;
  TDSBPOSITIONNOTIFY = record
    dwOffset: DWORD;
    hEventNotify: THandle;
  end;

  {-- IDirectSound ------------------------------------------------------------}
  IDirectSound = class(IUnknown)
  public
    function CreateSoundBuffer(const DSBufferDesc: TDSBUFFERDESC;
                               var lpDSB: IDirectSoundBuffer;
                               pUnkOuter: IUnknown): HRESULT; virtual; stdcall; abstract;
    function GetCaps(var DSCaps: TDSCAPS): HRESULT; virtual; stdcall; abstract;
    function DuplicateSoundBuffer(lpDSBOriginal: IDirectSoundBuffer;
                                  var lpDSBDuplicate: IDirectSoundBuffer): HRESULT; virtual; stdcall; abstract;
    function SetCooperativeLevel(hwnd: HWND; dwLevel: DWORD): HRESULT; virtual; stdcall; abstract;
    function Compact: HRESULT; virtual; stdcall; abstract;
    function GetSpeakerConfig(var dwSpeakerConfig: DWORD): HRESULT; virtual; stdcall; abstract;
    function SetSpeakerConfig(dwSpeakerConfig: DWORD): HRESULT; virtual; stdcall; abstract;
    function Initialize(lpGuid: PGUID): HRESULT; virtual; stdcall; abstract;
  end;

  {-- IDirectSoundBuffer ------------------------------------------------------}
  IDirectSoundBuffer = class(IUnknown)
  public
    function GetCaps(var DSBCaps: TDSBCAPS): HRESULT; virtual; stdcall; abstract;
    function GetCurrentPosition(var dwCurrentPlayCursor: DWORD;
                                var dwCurrentWriteCursor: DWORD): HRESULT; virtual; stdcall; abstract;
    function GetFormat(lpwfxFormat: PWaveFormatEx; dwSizeAllocated: DWORD;
                       lpdwSizeWritten: PDWORD): HRESULT; virtual; stdcall; abstract;
    function GetVolume(var lVolume: DWORD): HRESULT; virtual; stdcall; abstract;
    function GetPan(var lPan: DWORD): HRESULT; virtual; stdcall; abstract;
    function GetFrequency(var dwFrequency: DWORD): HRESULT; virtual; stdcall; abstract;
    function GetStatus(var dwStatus: DWORD): HRESULT; virtual; stdcall; abstract;
    function Initialize(lpDirectSound: IDirectSound;
                        const DSBDesc: TDSBUFFERDESC): HRESULT; virtual; stdcall; abstract;
    function Lock(dwWriteCursor: DWORD; dwWriteBytes: DWORD;
                  var lpvAudioPtr1: PChar; var dwAudioBytes1: DWORD;
                  var lpvAudioPtr2: PChar; var dwAudioBytes2: DWORD;
                  dwFlags: DWORD): HRESULT; virtual; stdcall; abstract;
    function Play(dwReserved1: DWORD; dwReserved2: DWORD; dwFlags: DWORD): HRESULT; virtual; stdcall; abstract;
    function SetCurrentPosition(dwNewPosition: DWORD): HRESULT; virtual; stdcall; abstract;
    function SetFormat(pwfx: PWaveFormatEx): HRESULT; virtual; stdcall; abstract;
    function SetVolume(lVolume: LONGINT): HRESULT; virtual; stdcall; abstract;
    function SetPan(lPan: LONGINT): HRESULT; virtual; stdcall; abstract;
    function SetFrequency(dwFrequency: DWORD): HRESULT; virtual; stdcall; abstract;
    function Stop: HRESULT; virtual; stdcall; abstract;
    function Unlock(lpvAudioPtr1: PChar; dwAudioBytes1: DWORD;
                    lpvAudioPtr2: PChar; dwAudioBytes2: DWORD): HRESULT; virtual; stdcall; abstract;
    function Restore: HRESULT; virtual; stdcall; abstract;
  end;

  {-- IDirectSound3DListener --------------------------------------------------}
  IDirectSound3DListener = class(IUnknown)
  public
    function GetAllParameters(lpListener: PDS3DLISTENER): HResult; virtual; stdcall; abstract;
    function GetDistanceFactor(lpflDistanceFactor: PD3DVALUE): HResult; virtual; stdcall; abstract;
    function GetDopplerFactor(lpflDopplerFactor: PD3DVALUE): HResult; virtual; stdcall; abstract;
    function GetOrientation(lpvOrientFront, lpvOrientTop: PD3DVECTOR): HResult; virtual; stdcall; abstract;
    function GetPosition(lpvPosition: PD3DVECTOR): HResult; virtual; stdcall; abstract;
    function GetRolloffFactor(lpflRolloffFactor: PD3DVALUE ): HResult; virtual; stdcall; abstract;
    function GetVelocity(lpvVelocity: PD3DVECTOR): HResult; virtual; stdcall; abstract;
    function SetAllParameters(lpListener: PDS3DLISTENER; dwApply: DWORD): HResult; virtual; stdcall; abstract;
    function SetDistanceFactor(flDistanceFactor: D3DVALUE; dwApply: DWORD): HResult; virtual; stdcall; abstract;
    function SetDopplerFactor(flDopplerFactor: D3DVALUE; dwApply: DWORD): HResult; virtual; stdcall; abstract;
    function SetOrientation(xFront, yFront, zFront, xTop, yTop, zTop: D3DVALUE; dwApply: DWORD): HResult; virtual; stdcall; abstract;
    function SetPosition(x, y, z: D3DVALUE; dwApply: DWORD): HResult; virtual; stdcall; abstract;
    function SetRolloffFactor(flRolloffFactor: D3DVALUE; dwApply: DWORD): HResult; virtual; stdcall; abstract;
    function SetVelocity(x, y, z: D3DVALUE; dwApply: DWORD): HResult; virtual; stdcall; abstract;
    function CommitDeferredSettings: HResult; virtual; stdcall; abstract;
  end;

  {-- IDirectSound3DBuffer ----------------------------------------------------}
  IDirectSound3DBuffer = class(IUnknown)
  public
    function GetAllParameters(lpDS3DBuffer: PDS3DBUFFER): HResult; virtual; stdcall; abstract;
    function GetConeAngles(lpdwInsideConeAngle, lpdwOutsideConeAngle: PDWORD): HResult; virtual; stdcall; abstract;
    function GetConeOrientation(lpvOrientation: PD3DVECTOR): HResult; virtual; stdcall; abstract;
    function GetConeOutsideVolume(lplConeOutsideVolume: PLONG): HResult; virtual; stdcall; abstract;
    function GetMaxDistance(lpflMaxDistance: PD3DVALUE): HResult; virtual; stdcall; abstract;
    function GetMinDistance(lpflMinDistance: PD3DVALUE): HResult; virtual; stdcall; abstract;
    function GetMode(lpdwMode: PDWORD): HResult; virtual; stdcall; abstract;
    function GetPosition(lpvPosition: PD3DVECTOR): HResult; virtual; stdcall; abstract;
    function GetVelocity(lpvVelocity: PD3DVECTOR): HResult; virtual; stdcall; abstract;
    function SetAllParameters(lpDS3DBuffer: PDS3DBUFFER; dwApply: DWORD): HResult; virtual; stdcall; abstract;
    function SetConeAngles(dwInsideConeAngle, dwOutsideConeAngle: DWORD; dwApply: DWORD): HResult; virtual; stdcall; abstract;
    function SetConeOrientation(x, y, z: D3DVALUE; dwApply: DWORD): HResult; virtual; stdcall; abstract;
    function SetConeOutsideVolume(lConeOutsideVolume: LONG; dwApply: DWORD): HResult; virtual; stdcall; abstract;
    function SetMaxDistance(flMaxDistance: D3DVALUE; dwApply: DWORD): HResult; virtual; stdcall; abstract;
    function SetMinDistance(flMinDistance: D3DVALUE; dwApply: DWORD): HResult; virtual; stdcall; abstract;
    function SetMode(dwMode: DWORD; dwApply: DWORD): HResult; virtual; stdcall; abstract;
    function SetPosition(x, y, z: D3DVALUE; dwApply: DWORD): HResult; virtual; stdcall; abstract;
    function SetVelocity(x, y, z: D3DVALUE; dwApply: DWORD): HResult; virtual; stdcall; abstract;
  end;

  {-- IDirectSoundNotify ------------------------------------------------------}
  IDirectSoundNotify = class(IUnknown)
  public
    function SetNotificationPositions(cPositionNotifies: DWORD;
                                      lpcPositionNotifies: PDSBPOSITIONNOTIFY): HRESULT; virtual; stdcall; abstract;
  end;

  {-- Capturing ---------------------------------------------------------------}
  PDSCCAPS = ^TDSCCAPS;
  TDSCCAPS = record
    dwSize: DWORD;
    dwFlags: DWORD;
    dwFormats: DWORD;
    dwChannels: DWORD;
  end;

  PDSCBUFFERDESC = ^TDSCBUFFERDESC;
  TDSCBUFFERDESC = record
    dwSize: DWORD;
    dwFlags: DWORD;
    dwBufferBytes: DWORD;
    dwReserved: DWORD;
    lpwfxFormat: PWaveFormatEx;
  end;

  PDSCBCAPS = ^TDSCBCAPS;
  TDSCBCAPS = record
    dwSize: DWORD;
    dwFlags: DWORD;
    dwBufferBytes: DWORD;
    dwReserved: DWORD;
  end;

  IDirectSoundCapture = class;
  IDirectSoundCaptureBuffer = class;

  {-- IDirectSoundCapture -----------------------------------------------------}
  IDirectSoundCapture = class(IUnknown)
  public
    function CreateCaptureBuffer(const lpDSCBufferDesc: TDSCBUFFERDESC;
                                 var lplpDirectSoundCaptureBuffer: IDirectSoundCaptureBuffer;
                                 pUnkOuter: IUnknown): HRESULT; virtual; stdcall; abstract;
    function GetCaps(var lpDSCCaps: TDSCCAPS): HRESULT; virtual; stdcall; abstract;
    function Initialize(lpGuid: PGUID): HRESULT; virtual; stdcall; abstract;
  end;

  {-- IDirectSoundCaptureBuffer -----------------------------------------------}
  IDirectSoundCaptureBuffer = class(IUnknown)
  public
    function GetCaps(var lpDSCBCaps: TDSCBCAPS): HRESULT; virtual; stdcall; abstract;
    function GetCurrentPosition(var lpdwCapturePosition,
                                lpdwReadPosition: DWORD): HRESULT; virtual; stdcall; abstract;
    function GetFormat(lpwfxFormat: PWaveFormatEx; dwSizeAllocated: DWORD;
                       var lpdwSizeWritten: DWORD): HRESULT; virtual; stdcall; abstract;
    function GetStatus(var dwStatus: DWORD): HRESULT; virtual; stdcall; abstract;
    function Initialize(lpDirectSoundCapture: IDirectSoundCapture;
                        const lpcDSBufferDesc: TDSCBUFFERDESC): HRESULT; virtual; stdcall; abstract;
    function Lock(dwReadCursor: DWORD; dwReadBytes: DWORD;
                  var lplpvAudioPtr1: Pointer; var lpdwAudioBytes1: DWORD;
                  var lplpvAudioPtr2: Pointer; var lpdwAudioBytes2: DWORD;
                  dwFlags: DWORD): HRESULT; virtual; stdcall; abstract;
    function Start(dwFlags: DWORD): HRESULT; virtual; stdcall; abstract;
    function Stop: HRESULT; virtual; stdcall; abstract;
    function Unlock(lpvAudioPtr1: Pointer; dwAudioBytes1: DWORD;
                    lpvAudioPtr2: Pointer; dwAudioBytes2: DWORD): HRESULT; virtual; stdcall; abstract;
  end;


  PDSENUMCALLBACKA = function(lpGUID: PGUID; lpDescription: PChar;
                              lpModule: PChar; lpContext: Pointer): BOOL; stdcall;
  PDSENUMCALLBACKW = function(lpGUID: PGUID; lpDescription: PWideChar;
                              lpModule: PWideChar; lpContext: Pointer): BOOL; stdcall;

  PDSENUMCALLBACK  = PDSENUMCALLBACKA;

  { Obtaining interface }

var
   DirectSoundCreate: function (lpGUID: PGUID; var lpDS: IDirectSound;
                                pUnkOuter: IUnknown): HRESULT; stdcall;
   DirectSoundEnumerateA: function (lpCallback: PDSENUMCALLBACKA;
                                    lpContext: Pointer): HRESULT; stdcall;
   DirectSoundEnumerateW: function (lpCallback: PDSENUMCALLBACKW;
                                    lpContext: Pointer): HRESULT; stdcall;
   DirectSoundEnumerate: function (lpCallback: PDSENUMCALLBACK;
                                   lpContext: Pointer): HRESULT; stdcall;

   DirectSoundCaptureCreate: function(lpGUID: PGUID;
                                      var lplpDSC: IDirectSoundCapture;
                                      pUnkOuter: IUnknown): HRESULT; stdcall;
   DirectSoundCaptureEnumerateA: function(lpDSEnumCallback: PDSENUMCALLBACKA;
                                          lpContext: Pointer): HRESULT; stdcall;
   DirectSoundCaptureEnumerateW: function(lpDSEnumCallback: PDSENUMCALLBACKW;
                                          lpContext: Pointer): HRESULT; stdcall;
   DirectSoundCaptureEnumerate: function(lpDSEnumCallback: PDSENUMCALLBACKA;
                                         lpContext: Pointer): HRESULT; stdcall;

function DriverEnumerate(lpGUID: PGUID; lpDescription: PChar;
                         lpModule: PChar; lpContext: Pointer): BOOL; stdcall;
procedure FreeDriverList(lpContext: Pointer);

const
   DSoundDLLLoaded : Boolean = False;
   DSoundDLLHandle : THandle = 0;

function LoadDSoundDLL: Boolean;

implementation

var
   ErrorMode: DWORD;

{-- DriverEnumerate -----------------------------------------------------------}
function DriverEnumerate(lpGUID: PGUID; lpDescription: PChar;
                         lpModule: PChar; lpContext: Pointer): BOOL; stdcall;
var
   lpDriverDesc: PDSDRIVERDESC;

begin
   if (lpContext <> nil) then
   begin
      lpDriverDesc := GlobalAllocPtr(GHND,sizeOf(TDSDRIVERDESC));
      if (lpDriverDesc = nil) then OutOfMemoryError;
      lpDriverDesc^.lpGUID := nil;
      if (lpGUID <> nil) then
      begin
         lpDriverDesc^.lpGUID := GlobalAllocPtr(GHND,sizeOf(TGUID));
         if (lpDriverDesc^.lpGUID = nil) then OutOfMemoryError;
         Move(lpGUID^, lpDriverDesc^.lpGUID^, sizeof(TGUID));
      end;
      lpDriverDesc^.Description := lpDescription;
      lpDriverDesc^.Module := lpModule;
      TList(lpContext).Add(lpDriverDesc);
   end;
   Result := True;
end;

{------------------------------------------------------------------------------}
procedure FreeDriverList(lpContext: Pointer);
var
   Index: Integer;
   Driver: PDSDRIVERDESC;
begin
   if (lpContext <> nil) then
   with TList(lpContext) do
   begin
      for Index := Count-1 downto 0 do
      begin
         Driver := PDSDRIVERDESC(Items[Index]);
         if Driver <> nil then
         begin
            if Driver^.lpGuid <> nil then
               GlobalFreePtr(Driver^.lpGuid);
            Driver^.Description := '';
            Driver^.Module      := '';
            GlobalFreePtr(Driver);
         end;
      end;
      Clear;
   end;
end;

{------------------------------------------------------------------------------}
function LoadDSoundDLL: Boolean;
begin
   if not DSoundDLLLoaded then
   begin
      ErrorMode := SetErrorMode(SEM_NoOpenFileErrorBox);
      try
         DSoundDLLHandle := LoadLibrary('DSOUND.DLL');

         if (DSoundDLLHandle <> 0) then
         begin
            DSoundDLLLoaded := True;
            @DirectSoundCreate       := GetProcAddress(DSoundDLLHandle,'DirectSoundCreate');
            @DirectSoundEnumerateA := GetProcAddress(DSoundDLLHandle,'DirectSoundEnumerateA');
            @DirectSoundEnumerateW := GetProcAddress(DSoundDLLHandle,'DirectSoundEnumerateW');
            @DirectSoundEnumerate  := @DirectSoundEnumerateA;

            @DirectSoundCaptureCreate := GetProcAddress(DSoundDLLHandle, 'DirectSoundCaptureCreate');
            @DirectSoundCaptureEnumerateA := GetProcAddress(DSoundDLLHandle, 'DirectSoundCaptureEnumerateA');
            @DirectSoundCaptureEnumerateW := GetProcAddress(DSoundDLLHandle, 'DirectSoundCaptureEnumerateW');
            @DirectSoundCaptureEnumerate := @DirectSoundCaptureEnumerateA;
         end;

      finally
         SetErrorMode(ErrorMode);
      end;
   end;
   Result := DSoundDLLLoaded;
end;

Initialization

Finalization
     if DSoundDLLHandle <> 0 then
        FreeLibrary(DSoundDLLHandle);
end.


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -