博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在 Delphi 下使用 DirectSound (6): 按文件自己的格式(TWaveFormatEx)播放
阅读量:5771 次
发布时间:2019-06-18

本文共 2101 字,大约阅读时间需要 7 分钟。

  hot3.png

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

unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;type  TForm1 = class(TForm)    Button1: TButton;    procedure FormCreate(Sender: TObject);    procedure FormDestroy(Sender: TObject);    procedure Button1Click(Sender: TObject);  end;var  Form1: TForm1;implementation{$R *.dfm}uses DirectSound, MMSystem, ReadWaveFile; //ReadWaveFile 是在前面(4)自定义的单元var  myDSound: IDirectSound8;        //设备对象  bufPrimary: IDirectSoundBuffer; //主缓冲  buf: IDirectSoundBuffer;        //次缓冲{初始化设备并建立主缓冲区}procedure TForm1.FormCreate(Sender: TObject);var  wavFormat: TWaveFormatEx;  bufDesc: TDSBufferDesc;begin  DirectSoundCreate8(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);var  wavFormat: TWaveFormatEx;  bufDesc: TDSBufferDesc;  wavPath: string;  wav: TReadWaveFile;  p1: Pointer;  n1: DWORD;begin  buf := nil;  with TOpenDialog.Create(nil) do begin    Filter := 'Wave File(*.wav)|*.wav';    if Execute then wavPath := FileName;    Free;  end;  wav := TReadWaveFile.Create;  if not wav.Open(wavPath) then  begin    ShowMessage('只能是 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);begin  bufPrimary := nil;  buf := nil;  myDSound := nil;end;end.

转载于:https://my.oschina.net/hermer/blog/319962

你可能感兴趣的文章
JSP和Struts2、Hibernate、Spring3基础内容和原理
查看>>
’白帽子‘被起诉所见所想
查看>>
python获取文件
查看>>
翻译研讨 2009/10/17 财经新闻《国外投资再次向印度流动》
查看>>
PSP0级 周活动总结表+时间记录日志+缺陷记录日志 表格模板
查看>>
UIButton
查看>>
Android获取各种设备的状态
查看>>
区块链开发_以太坊测试功能
查看>>
CodeChef November Challenge 2013 解题报告
查看>>
[改善Java代码]不推荐覆写start方法
查看>>
JDK中ConcurrentHashMap效率测试
查看>>
[Usaco2006 Dec]Wormholes
查看>>
window编译caffe总结
查看>>
C#之Invoke学习
查看>>
高一寒假集训总结
查看>>
bzoj3555[Ctsc2014]企鹅QQ
查看>>
微信分享config:ok 但自定义内容无效
查看>>
OPENGL和DX的不同.
查看>>
Linux下如何删除非空目录
查看>>
Objective-C代码的文件扩展名与数据类型
查看>>