DSoundDevices.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:4k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1.     (*********************************************************************
  2.      *                                                                   *
  3.      * The contents of this file are used with permission, subject to    *
  4.      * the Mozilla Public License Version 1.1 (the "License"); you may   *
  5.      * not use this file except in compliance with the License. You may  *
  6.      * obtain a copy of the License at                                   *
  7.      * http://www.mozilla.org/MPL/MPL-1.1.html                           *
  8.      *                                                                   *
  9.      * Software distributed under the License is distributed on an       *
  10.      * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or    *
  11.      * implied. See the License for the specific language governing      *
  12.      * rights and limitations under the License.                         *
  13.      *                                                                   *
  14.      * (C) 2004 Milenko Mitrovic <dcoder@dsp-worx.de>                    *
  15.      *                                                                   *
  16.      *********************************************************************)
  17. unit DSoundDevices;
  18. interface
  19. uses
  20.   Windows, Classes, DirectSound, SysUtils, IniFiles, ActiveX, DSUtil;
  21. type
  22.   TDSDeviceItem  = class(TCollectionItem)
  23.   public
  24.     DeviceName : String;
  25.     DeviceGUID : TGUID;
  26.   end;
  27.   TDSDeviceList = class(TCollection)
  28.   private
  29.     function  GetItem(Index : Integer) : TDSDeviceItem;
  30.     procedure SetItem(Index : Integer; Value : TDSDeviceItem);
  31.   public
  32.     function Add : TDSDeviceItem;
  33.     property Items[Index: Integer]: TDSDeviceItem read GetItem write SetItem; default;
  34.   end;
  35.   procedure SaveDevice(Guid : TGUID);
  36.   function GetSavedDevice : TGUID;
  37. var
  38.   DSDeviceList : TDSDeviceList;
  39. implementation
  40. {*** Device Enumeration Callback **********************************************}
  41. function DSEnumCallback(Guid : PGUID; lpstrDescription : PChar; lpstrModule : PChar; lpContext : Pointer) : BOOL; stdcall;
  42. begin
  43.   DSDeviceList.Add;
  44.   DSDeviceList.Items[DSDeviceList.Count -1].DeviceName := lpstrDescription;
  45.   if Assigned(GUID) then DSDeviceList.Items[DSDeviceList.Count -1].DeviceGUID := Guid^;
  46.   Result := True;
  47. end;
  48. {*** TDSDeviceList ************************************************************}
  49. function TDSDeviceList.Add : TDSDeviceItem;
  50. begin
  51.   Result := TDSDeviceItem(inherited Add);
  52. end;
  53. function TDSDeviceList.GetItem(Index : Integer) : TDSDeviceItem;
  54. begin
  55.   Result := TDSDeviceItem(inherited GetItem(Index));
  56. end;
  57. procedure TDSDeviceList.SetItem(Index : Integer; Value : TDSDeviceItem);
  58. begin
  59.   inherited SetItem(Index, Value);
  60. end;
  61. {******************************************************************************}
  62. function GetSavedDevice : TGUID;
  63. var
  64.   Buf : array[0..MAX_PATH -1] of Char;
  65.   str : String;
  66.   i : integer;
  67.   Guid : TGuid;
  68. begin
  69.   Result := GUID_NULL;
  70.   if DSDeviceList.Count = 0 then Exit;
  71.   if GetModuleFileName(HInstance,Buf,MAX_PATH) > 0 then
  72.   begin
  73.     str := ExtractFilePath(Buf) + 'Device.ini';
  74.     with TIniFile.Create(str) do
  75.     begin
  76.       if ValueExists('Device','Default') then
  77.       begin
  78.         str := ReadString('Device','Default',GUIDToString(GUID_NULL));
  79.         Guid := StringToGUID(str);
  80.         for i := 0 to DSDeviceList.Count -1 do
  81.         begin
  82.           if IsEqualGUID(DSDeviceList.Items[i].DeviceGUID,Guid) then
  83.           begin
  84.             Result := Guid;
  85.             break;
  86.           end;
  87.         end;
  88.       end;
  89.       Free;
  90.     end;
  91.   end;
  92. end;
  93. procedure SaveDevice(Guid : TGUID);
  94. var
  95.   Buf : array[0..MAX_PATH -1] of Char;
  96.   str : String;
  97. begin
  98.   if GetModuleFileName(HInstance,Buf,MAX_PATH) > 0 then
  99.   begin
  100.     str := ExtractFilePath(Buf) + 'Device.ini';
  101.     with TIniFile.Create(str) do
  102.     begin
  103.       WriteString('Device','Default',GUIDToString(Guid));
  104.       Free;
  105.     end;
  106.   end;
  107. end;
  108. {******************************************************************************}
  109. initialization
  110.   DSDeviceList := TDSDeviceList.Create(TDSDeviceItem);
  111.   DirectSoundEnumerate(DSEnumCallback, nil);
  112. finalization
  113.   FreeAndNil(DSDeviceList);
  114. end.