在 Delphi 下使用 DirectSound (6): 按文件自己的格式(TWaveFormatEx)播放
这必须手动建立主缓冲区.
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)播放相关推荐
- windows 下java调用winrar压缩文件为rar 格式
windows 下java调用winrar压缩文件为rar 格式 import java.io.BufferedReader; import java.io.IOException; import ...
- 在 Delphi 下使用 DirectSound (5): 获取或设置缓冲区的格式:
次缓冲区(或叫辅助缓冲区)尽管使用了波形文件自己的 TWaveFormatEx, 但最终播放的却只是 22050HZ 的 8 位立体声. 因为次缓冲区最终要混入主缓冲区才播放, 可主缓冲区的缺省格式是 ...
- 在 Delphi 下使用 DirectSound (9): 效果器初步及 IDirectSoundFXGargle8 效果器
只有使用 IDirectSoundBuffer8 的次缓冲区才能设置"特效", 主缓冲区主要负责的是混音和处理 3D 效果. IDirectSoundBuffer8(非 IDire ...
- 在 Delphi 下使用 DirectSound (4): 设置音量、相位、播放频率和播放位置
通过 IDirectSoundBuffer 的 SetVolume.SetPan.SetFrequency.SetCurrentPosition 方法可以简单进行这些设置. 同时 IDirectSou ...
- 在 Delphi 下使用 DirectSound (12): 测试失真效果器 IDirectSoundFXDistortion8
为什么80%的码农都做不了架构师?>>> {相关结构:} TDSFXDistortion = packed recordfGain: Sinle; //-60 .. 0 : - ...
- 在 Delphi 下使用 DirectSound (14): 测试镶边效果器 IDirectSoundFXFlanger8
{相关结构:} TDSFXFlanger = packed recordfWetDryMix: Single; // 0 .. 100 : 50 (%)fDepth: Single; // 0 .. ...
- 在 Delphi 下使用 DirectSound (2): 查看设备性能
使用 DirectSound 前应先建立 IDirectSound8 对象(之前的版本是 IDirectSound): function DirectSoundCreate8(pcGuidDevice ...
- 如何播放html文件类型,m3u8格式如何播放
播放m3u8格式的方法:1.通过添加浏览器插件Native HLS Playback来播放:2.在浏览器上输入"JOCeEEUuoteFrjCg/playlist.m3u8"地址就 ...
- java 制作 winrar,windows 上java调用winrar压缩文件为rar 格式
windows 下java调用winrar压缩文件为rar 格式 windows 下java调用winrar压缩文件为rar 格式 import java.io.BufferedReader; im ...
最新文章
- C语言求最大公约数与最小公倍数
- html 表格_UiPath之发送正文包含表格的邮件(通过Html实现表格)
- IDEA无法通过类加载器获取resources文件夹配置文件解决办法
- Web框架——Flask系列之请求上下文与应用上下文请求钩子Flask-Script扩展命令行(十七)
- 深夜,我偷听到程序员要对session下手......
- 腾讯视频下载安装链接_腾讯视频怎么上传视频
- mysql sqlite 语法_[Sqlite] Sqlite的基本日常SQL操作语句汇总
- TiKV 是如何存取数据的(下)
- 深度解析工业机器人主流离线编程软件
- 冰点还原8.53破解版
- 在图片上涂鸦(其实就是乱画 O(∩_∩)O)
- Java题目详解——LeetCode20.有效的括号
- Hexo个人博客NexT主题添加Local Search本地搜索
- 爬虫基本原理与实战---1、爬虫实战概述
- 在Pycharm中更新安装最新版本pip,安装tensorflow
- 基于Tensorflow2实现的中文声纹识别
- python实现流媒体,python +OpenCV实现rtmp视频流媒体的播放
- pyqt5在表格中添加单选框(勾选框)
- 什么是电子邮箱地址?好用的电子邮箱注册申请
- 使用python中openpyxl模块操作excel文件,计算单元格分子式的相对分子质量(一)