这必须手动建立主缓冲区.


unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;procedure FormCreate(Sender: TObject);procedure FormDestroy(Sender: TObject);procedure Button1Click(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}uses DirectSound, MMSystem, ReadWaveFile; //ReadWaveFile 是在前面(4)自定义的单元varmyDSound: IDirectSound8;        //设备对象bufPrimary: IDirectSoundBuffer; //主缓冲buf: IDirectSoundBuffer;        //次缓冲{初始化设备并建立主缓冲区}
procedure TForm1.FormCreate(Sender: TObject);
varwavFormat: TWaveFormatEx;bufDesc: TDSBufferDesc;
beginDirectSoundCreate8(nil, myDSound, nil);myDSound.SetCooperativeLevel(Handle, DSSCL_PRIORITY);ZeroMemory(@bufDesc, SizeOf(TDSBufferDesc));bufDesc.dwSize := SizeOf(TDSBufferDesc);bufDesc.dwFlags := DSBCAPS_PRIMARYBUFFER;bufDesc.dwBufferBytes := 0;bufDesc.lpwfxFormat := nil;myDSound.CreateSoundBuffer(bufDesc, bufPrimary, nil);
end;{建立次缓冲区, 并从 Wave 文件填充数据}
procedure TForm1.Button1Click(Sender: TObject);
varwavFormat: TWaveFormatEx;bufDesc: TDSBufferDesc;wavPath: string;wav: TReadWaveFile;p1: Pointer;n1: DWORD;
beginbuf := nil;with TOpenDialog.Create(nil) do beginFilter := 'Wave File(*.wav)|*.wav';if Execute then wavPath := FileName;Free;end;wav := TReadWaveFile.Create;if not wav.Open(wavPath) thenbeginShowMessage('只能是 PCM 格式的 WAVE 文件');wav.Free;Exit;end;ZeroMemory(@bufDesc, SizeOf(TDSBufferDesc));bufDesc.dwSize := SizeOf(TDSBufferDesc);bufDesc.dwFlags := DSBCAPS_STATIC;bufDesc.dwBufferBytes := wav.Size;bufDesc.lpwfxFormat := @wav.Format;{建立次缓冲, 并把主缓冲的格式修改为当前文件的格式}myDSound.CreateSoundBuffer(bufDesc, buf, nil);bufPrimary.SetFormat(@wavFormat); //!buf.Lock(0, 0, @p1, @n1, nil, nil, DSBLOCK_ENTIREBUFFER);wav.Read(p1, n1);wav.Free;buf.Unlock(p1, n1, nil, 0);buf.Play(0, 0, 0);
end;procedure TForm1.FormDestroy(Sender: TObject);
beginbufPrimary := nil;buf := nil;myDSound := nil;
end;end.

转载于:https://www.cnblogs.com/del/archive/2011/01/19/1939105.html

在 Delphi 下使用 DirectSound (6): 按文件自己的格式(TWaveFormatEx)播放相关推荐

  1. windows 下java调用winrar压缩文件为rar 格式

    windows  下java调用winrar压缩文件为rar 格式 import java.io.BufferedReader; import java.io.IOException; import ...

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

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

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

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

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

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

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

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

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

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

  7. 在 Delphi 下使用 DirectSound (2): 查看设备性能

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

  8. 如何播放html文件类型,m3u8格式如何播放

    播放m3u8格式的方法:1.通过添加浏览器插件Native HLS Playback来播放:2.在浏览器上输入"JOCeEEUuoteFrjCg/playlist.m3u8"地址就 ...

  9. java 制作 winrar,windows 上java调用winrar压缩文件为rar 格式

    windows 下java调用winrar压缩文件为rar 格式 windows  下java调用winrar压缩文件为rar 格式 import java.io.BufferedReader; im ...

最新文章

  1. C语言求最大公约数与最小公倍数
  2. html 表格_UiPath之发送正文包含表格的邮件(通过Html实现表格)
  3. IDEA无法通过类加载器获取resources文件夹配置文件解决办法
  4. Web框架——Flask系列之请求上下文与应用上下文请求钩子Flask-Script扩展命令行(十七)
  5. 深夜,我偷听到程序员要对session下手......
  6. 腾讯视频下载安装链接_腾讯视频怎么上传视频
  7. mysql sqlite 语法_[Sqlite] Sqlite的基本日常SQL操作语句汇总
  8. TiKV 是如何存取数据的(下)
  9. 深度解析工业机器人主流离线编程软件
  10. 冰点还原8.53破解版
  11. 在图片上涂鸦(其实就是乱画 O(∩_∩)O)
  12. Java题目详解——LeetCode20.有效的括号
  13. Hexo个人博客NexT主题添加Local Search本地搜索
  14. 爬虫基本原理与实战---1、爬虫实战概述
  15. 在Pycharm中更新安装最新版本pip,安装tensorflow
  16. 基于Tensorflow2实现的中文声纹识别
  17. python实现流媒体,python +OpenCV实现rtmp视频流媒体的播放
  18. pyqt5在表格中添加单选框(勾选框)
  19. 什么是电子邮箱地址?好用的电子邮箱注册申请
  20. 使用python中openpyxl模块操作excel文件,计算单元格分子式的相对分子质量(一)

热门文章

  1. LeetCode(1089)——复写零(JavaScript)
  2. 数据库---查询操作
  3. jQuery学习(九)—常用的包裹方法
  4. JavaScript学习(五十六)—寄生式继承(临时构造器的使用)
  5. MySQL提供链接途径_MySQL 连接
  6. python qt5 数据改变 触发信号_pyqt5自定义信号实例解析
  7. redis深度历险 pdf_程序员面试必备精选文档:Redis+Ng+Tomcat+并发编程+Spring系列
  8. 手机有信号但是连不上网是怎么回事?
  9. 你觉得iPhone吸引你的是什么?
  10. 多肉建议多久浇一次水?