使用 DirectSound 前应先建立 IDirectSound8 对象(之前的版本是 IDirectSound):


function DirectSoundCreate8(pcGuidDevice: PGUID;      //设备的 GUID; 指定 nil 表示使用默认声卡out ppDS8: IDirectSound8; //要返回的 IDirectSound8 对象pUnkOuter: IUnknown       //未使用, 应为 nil
): HResult; stdcall; //返回错误码//也可使用 GUID 常数指定设备:
DSDEVID_DefaultPlayback      //默认设备
DSDEVID_DefaultVoicePlayback //二级默认设备


然后通过 IDirectSound8 对象(它代表着一个播放设备)创建缓冲区, 以写入声音信息.

这里的缓冲区分 "主缓冲区" 和 "次缓冲区". 主缓冲区只有一个; 次缓冲区可以有多个, 以实现多个声音的同时播放.

DirectSound 会尽量使用硬件(声卡)提供的缓冲区; 如果硬件不支持则只好使用系统内存做缓冲区, 但这样效率不及前者.

通过 IDirectSound8.GetCaps() 方法可以获取指定设备的详细性能:


function GetCaps(out pDSCaps: TDSCaps //获取到的信息将放在 TDSCaps 结构体中
): HResult; stdcall;//TDSCaps 结构:
TDSCaps = packed recorddwSize                         : DWORD; //结构大小(字节)dwFlags                        : DWORD; //性能标志dwMinSecondarySampleRate       : DWORD; //次缓冲区的最小取样率dwMaxSecondarySampleRate       : DWORD; //次缓冲区的最大取样率dwPrimaryBuffers               : DWORD; //主缓冲区个数dwMaxHwMixingAllBuffers        : DWORD; //硬件缓冲区的最大数目dwMaxHwMixingStaticBuffers     : DWORD; //静态硬件缓冲区的最大数目dwMaxHwMixingStreamingBuffers  : DWORD; //流式硬件缓冲区的最大数目dwFreeHwMixingAllBuffers       : DWORD; //空闲的硬件缓冲区个数dwFreeHwMixingStaticBuffers    : DWORD; //空闲的静态硬件缓冲区个数dwFreeHwMixingStreamingBuffers : DWORD; //空闲的流式硬件缓冲区个数dwMaxHw3DAllBuffers            : DWORD; //3D 硬件缓冲区的最大数目dwMaxHw3DStaticBuffers         : DWORD; //3D 静态硬件缓冲区的最大数目dwMaxHw3DStreamingBuffers      : DWORD; //3D 流式硬件缓冲区的最大数目dwFreeHw3DAllBuffers           : DWORD; //空闲的 3D 硬件缓冲区的最大数目dwFreeHw3DStaticBuffers        : DWORD; //空闲的 3D 静态硬件缓冲区的最大数目dwFreeHw3DStreamingBuffers     : DWORD; //空闲的 3D 流式硬件缓冲区的最大数目dwTotalHwMemBytes              : DWORD; //硬件内存总量(字节)dwFreeHwMemBytes               : DWORD; //空闲的硬件内存总量(字节)dwMaxContigFreeHwMemBytes      : DWORD; //空闲的硬件内存最大连续块大小(字节)dwUnlockTransferRateHwBuffers  : DWORD; //硬件缓冲区的数据传输速率(千字节/秒)dwPlayCpuOverheadSwBuffers     : DWORD; //混合软件缓冲区占用的 CPU 周期的百分比dwReserved1                    : DWORD; //未使用dwReserved2                    : DWORD; //未使用
end;


查看默认设备性能的测试程序:


unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Memo1: TMemo; //用于显示信息procedure FormCreate(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}uses DirectSound;procedure TForm1.FormCreate(Sender: TObject);
varmyDSound: IDirectSound8;capInfo: TDSCaps;p: PDSCaps;
beginMemo1.ScrollBars := ssBoth;Memo1.Align := alLeft;Memo1.Clear;FillChar(capInfo, SizeOf(TDSCaps), 0);capInfo.dwSize := SizeOf(TDSCaps);DirectSoundCreate8(nil, myDSound, nil);myDSound.GetCaps(capInfo);with Memo1.Lines do beginAdd(Format('%d'#9'dwSize',                         [capInfo.dwSize                        ]));Add(Format('%d'#9'dwFlags',                        [capInfo.dwFlags                       ]));Add(Format('%d'#9'dwMinSecondarySampleRate',       [capInfo.dwMinSecondarySampleRate      ]));Add(Format('%d'#9'dwMaxSecondarySampleRate',       [capInfo.dwMaxSecondarySampleRate      ]));Add(Format('%d'#9'dwPrimaryBuffers',               [capInfo.dwPrimaryBuffers              ]));Add(Format('%d'#9'dwMaxHwMixingAllBuffers',        [capInfo.dwMaxHwMixingAllBuffers       ]));Add(Format('%d'#9'dwMaxHwMixingStaticBuffers',     [capInfo.dwMaxHwMixingStaticBuffers    ]));Add(Format('%d'#9'dwMaxHwMixingStreamingBuffers',  [capInfo.dwMaxHwMixingStreamingBuffers ]));Add(Format('%d'#9'dwFreeHwMixingAllBuffers',       [capInfo.dwFreeHwMixingAllBuffers      ]));Add(Format('%d'#9'dwFreeHwMixingStaticBuffers',    [capInfo.dwFreeHwMixingStaticBuffers   ]));Add(Format('%d'#9'dwFreeHwMixingStreamingBuffers', [capInfo.dwFreeHwMixingStreamingBuffers]));Add(Format('%d'#9'dwMaxHw3DAllBuffers',            [capInfo.dwMaxHw3DAllBuffers           ]));Add(Format('%d'#9'dwMaxHw3DStaticBuffers',         [capInfo.dwMaxHw3DStaticBuffers        ]));Add(Format('%d'#9'dwMaxHw3DStreamingBuffers',      [capInfo.dwMaxHw3DStreamingBuffers     ]));Add(Format('%d'#9'dwFreeHw3DAllBuffers',           [capInfo.dwFreeHw3DAllBuffers          ]));Add(Format('%d'#9'dwFreeHw3DStaticBuffers',        [capInfo.dwFreeHw3DStaticBuffers       ]));Add(Format('%d'#9'dwFreeHw3DStreamingBuffers',     [capInfo.dwFreeHw3DStreamingBuffers    ]));Add(Format('%d'#9'dwTotalHwMemBytes',              [capInfo.dwTotalHwMemBytes             ]));Add(Format('%d'#9'dwFreeHwMemBytes',               [capInfo.dwFreeHwMemBytes              ]));Add(Format('%d'#9'dwMaxContigFreeHwMemBytes',      [capInfo.dwMaxContigFreeHwMemBytes     ]));Add(Format('%d'#9'dwUnlockTransferRateHwBuffers',  [capInfo.dwUnlockTransferRateHwBuffers ]));Add(Format('%d'#9'dwPlayCpuOverheadSwBuffers',     [capInfo.dwPlayCpuOverheadSwBuffers    ]));end;
end;end.


查看所有设备性能的测试程序:


unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Memo1: TMemo;ComboBox1: TComboBox; //用于设备列表procedure FormCreate(Sender: TObject);procedure ComboBox1Change(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}uses DirectSound;varguidArr: array of TGUID;function EnumCallback(lpGuid: PGUID; lpcstrDescription, lpcstrModule: PChar;lpContext: Pointer): BOOL; stdcall;
beginif lpGuid <> nil thenbeginTStrings(lpContext).Add(lpcstrDescription);SetLength(guidArr, Length(guidArr) + 1);guidArr[Length(guidArr) - 1] := lpGuid^;end;Result := True;
end;procedure TForm1.FormCreate(Sender: TObject);
beginComboBox1.Align := alTop;Memo1.ScrollBars := ssBoth;Memo1.Align := alClient;Memo1.Clear;DirectSoundEnumerate(EnumCallback, ComboBox1.Items);ComboBox1.ItemIndex := 0;ComboBox1.OnChange(nil);
end;procedure TForm1.ComboBox1Change(Sender: TObject);
varmyDSound: IDirectSound8;capInfo: TDSCaps;p: PDSCaps;
beginMemo1.Clear;ZeroMemory(@capInfo, SizeOf(TDSCaps));capInfo.dwSize := SizeOf(TDSCaps);DirectSoundCreate8(@guidArr[ComboBox1.ItemIndex], myDSound, nil);Caption := GUIDToString(guidArr[ComboBox1.ItemIndex]);myDSound.GetCaps(capInfo);with Memo1.Lines do beginAdd(Format('%d'#9'dwSize',                         [capInfo.dwSize                        ]));Add(Format('%d'#9'dwFlags',                        [capInfo.dwFlags                       ]));Add(Format('%d'#9'dwMinSecondarySampleRate',       [capInfo.dwMinSecondarySampleRate      ]));Add(Format('%d'#9'dwMaxSecondarySampleRate',       [capInfo.dwMaxSecondarySampleRate      ]));Add(Format('%d'#9'dwPrimaryBuffers',               [capInfo.dwPrimaryBuffers              ]));Add(Format('%d'#9'dwMaxHwMixingAllBuffers',        [capInfo.dwMaxHwMixingAllBuffers       ]));Add(Format('%d'#9'dwMaxHwMixingStaticBuffers',     [capInfo.dwMaxHwMixingStaticBuffers    ]));Add(Format('%d'#9'dwMaxHwMixingStreamingBuffers',  [capInfo.dwMaxHwMixingStreamingBuffers ]));Add(Format('%d'#9'dwFreeHwMixingAllBuffers',       [capInfo.dwFreeHwMixingAllBuffers      ]));Add(Format('%d'#9'dwFreeHwMixingStaticBuffers',    [capInfo.dwFreeHwMixingStaticBuffers   ]));Add(Format('%d'#9'dwFreeHwMixingStreamingBuffers', [capInfo.dwFreeHwMixingStreamingBuffers]));Add(Format('%d'#9'dwMaxHw3DAllBuffers',            [capInfo.dwMaxHw3DAllBuffers           ]));Add(Format('%d'#9'dwMaxHw3DStaticBuffers',         [capInfo.dwMaxHw3DStaticBuffers        ]));Add(Format('%d'#9'dwMaxHw3DStreamingBuffers',      [capInfo.dwMaxHw3DStreamingBuffers     ]));Add(Format('%d'#9'dwFreeHw3DAllBuffers',           [capInfo.dwFreeHw3DAllBuffers          ]));Add(Format('%d'#9'dwFreeHw3DStaticBuffers',        [capInfo.dwFreeHw3DStaticBuffers       ]));Add(Format('%d'#9'dwFreeHw3DStreamingBuffers',     [capInfo.dwFreeHw3DStreamingBuffers    ]));Add(Format('%d'#9'dwTotalHwMemBytes',              [capInfo.dwTotalHwMemBytes             ]));Add(Format('%d'#9'dwFreeHwMemBytes',               [capInfo.dwFreeHwMemBytes              ]));Add(Format('%d'#9'dwMaxContigFreeHwMemBytes',      [capInfo.dwMaxContigFreeHwMemBytes     ]));Add(Format('%d'#9'dwUnlockTransferRateHwBuffers',  [capInfo.dwUnlockTransferRateHwBuffers ]));Add(Format('%d'#9'dwPlayCpuOverheadSwBuffers',     [capInfo.dwPlayCpuOverheadSwBuffers    ]));end;
end;end.

在 Delphi 下使用 DirectSound (2): 查看设备性能相关推荐

  1. 在 Delphi 下使用 DirectSound (5): 获取或设置缓冲区的格式:

    次缓冲区(或叫辅助缓冲区)尽管使用了波形文件自己的 TWaveFormatEx, 但最终播放的却只是 22050HZ 的 8 位立体声. 因为次缓冲区最终要混入主缓冲区才播放, 可主缓冲区的缺省格式是 ...

  2. 在 Delphi 下使用 DirectSound (9): 效果器初步及 IDirectSoundFXGargle8 效果器

    只有使用 IDirectSoundBuffer8 的次缓冲区才能设置"特效", 主缓冲区主要负责的是混音和处理 3D 效果. IDirectSoundBuffer8(非 IDire ...

  3. 在 Delphi 下使用 DirectSound (6): 按文件自己的格式(TWaveFormatEx)播放

    这必须手动建立主缓冲区. unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Contr ...

  4. 在 Delphi 下使用 DirectSound (12): 测试失真效果器 IDirectSoundFXDistortion8

    为什么80%的码农都做不了架构师?>>>    {相关结构:} TDSFXDistortion = packed recordfGain: Sinle; //-60 .. 0 : - ...

  5. 在 Delphi 下使用 DirectSound (4): 设置音量、相位、播放频率和播放位置

    通过 IDirectSoundBuffer 的 SetVolume.SetPan.SetFrequency.SetCurrentPosition 方法可以简单进行这些设置. 同时 IDirectSou ...

  6. 在 Delphi 下使用 DirectSound (14): 测试镶边效果器 IDirectSoundFXFlanger8

    {相关结构:} TDSFXFlanger = packed recordfWetDryMix: Single; // 0 .. 100 : 50 (%)fDepth: Single; // 0 .. ...

  7. Delphi下利用WinIo模拟鼠标键盘详解

    本文最早在编程论坛上发表,文章地址:http://programbbs.com/bbs/view12-17207-1.htm,相关文件可以在上述地址的页面中下载.转载时请注明出处. 前言 一日发现Se ...

  8. solaris下使用USB 海量存储设备

    第8 章• 使用USB 设备(任务) 139 从Solaris 10 1/06 发行版开始,vold 可自动挂载热插拔设备.有关更多信息,请参见第 124 页中的"vold 用于识别热插拔U ...

  9. windbg查看设备栈设备树学习总结

    用windbg寻找设备树根节点 http://blog.csdn.net/lixiangminghate/article/details/51729945 用ReactOS上明确说过,Pnp管理器对每 ...

最新文章

  1. str_pad函数php,str_pad
  2. Scala, Groovy, Clojure, Jython, JRuby and Java ----我们的工作语言
  3. CentOS7搭建hadoop2.6.4+HBase1.1.6
  4. 默认文件夹为空,如何从Microsoft Edge下载收藏夹
  5. Flutter实战之FlutterPlugin插件入门指南
  6. 2022年下半年系统集成项目管理工程师(软考中级)报名条件
  7. 网站服务器建立数据库连接时出错,WordPress提示建立数据库连接出错的解决办法...
  8. 大数据技术原理与应用:期末考点总结
  9. 计算机网络机房巡视表,机房巡查记录表.doc
  10. QPushButton设置背景图片变换(素材四连图)
  11. 菠萝粉的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  12. 吴军老师的《计算之魂》部分重点摘要
  13. 手机端获取用户详细地理位置(腾讯地图/高德)
  14. 背包问题(01背包,完全背包,多重背包(朴素算法二进制优化))
  15. 什么样的自学Java网站才适合学习者?
  16. 驼峰命名法与下划线命名法之争
  17. 测试种类大汇总(45类)
  18. 2年Java开发工作经验面试总结
  19. 版本管理之gitlab实践教程:基础篇(3)
  20. ffmpeg视频按帧截取图片和ffmpeg将图片合成mp4视频

热门文章

  1. 《Arduino实战》——1.7 为代码编写注释
  2. Access数据库基于时间盲注的实现[www.freebuf.com]
  3. 2010-11-23 network virtualization papers(2)
  4. 微软开放Windows Phone 7中文开发中心
  5. MFCC里面的log energy和matlab实现
  6. Windows添加启动项的两种方法
  7. 离线人脸识别C#类库分享 虹软2.0版本
  8. 元素定位-XPATH定位方法总结
  9. Spark之MLlib
  10. Oracle 11g行字段拼接WMSYS.WM_CONCAT问题Not A LOB