文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:34
字数 302
阅读 8
收藏 0

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

unit Unit1;

interface

uses
  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.

本文转载自:http://www.cnblogs.com/del/archive/2011/01/19/1939105.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
DirectSound入门

文档内容: (费话篇) 关于DirectSound DirectSound是DirectX API的音频(waveaudio)组件之一,它可以提供快速的混音、硬件加速功能,并且可以直接访问相关设备,当然,最主要的是它提供的...

长平狐
2012/08/13
824
0
C#中使用DirectX编程

我感觉声音的播放比较简单。我们从播放声音开始。为什么我这么觉得?我也不知道。 这里是展示最最最最最简单的DirectX播放声音的例子,我尽量省略了无关的代码。最后的代码只有19行,够简单了...

晨曦之光
2012/03/09
150
0
DirectSound学习(二)--流式缓冲区

使用流式缓冲方式播放波形音频文件比较复杂,主要原因是在只有一个缓冲区提供给用户的前提下,这个缓冲区在提供给声卡播放数据的同是还需要用户不断的定时向其中写入数据。要注意从缓冲区这时...

imxiangzi
02/11
0
0
waveOutOpen 函数说明

waveOutOpen 函数说明 (2008-12-21 13:33:10) 转载▼ 使用心得:首先打开声音输出设备,然后初始化输出内存,并保证不要使用缓存;(调用waveOutPrepareHeader设置内存),然后通过回调函数进...

薛蕊
2014/05/28
0
0
SDL2源代码分析1:初始化(SDL_Init())

===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDLInit()) SDL2源代码分析2:窗口(SDLWindow) SDL2源代码分析3:渲染器...

leixiaohua1020
2014/11/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mac OS X下Maven的安装与配置

Mac OS X 安装Maven: 下载 Maven, 并解压到某个目录。例如/Users/robbie/apache-maven-3.3.3 打开Terminal,输入以下命令,设置Maven classpath $ vi ~/.bash_profile 添加下列两行代码,之后...

TonyStarkSir
今天
3
0
关于编程,你的练习是不是有效的?

最近由于工作及Solution项目的影响,我在重新学习DDD和领域建模的一些知识。然后,我突然就想到了这个问题,以及我是怎么做的? 对于我来说,提升技能的项目会有四种: 纯兴趣驱动的项目。即...

问题终结者
今天
4
0
打开eclipse出现an error has occurred see the log file

解决方法: 1,打开eclipse安装目录下的eclipse.ini文件; 2,打开的文本文件最后添加一行 --add-modules=ALL-SYSTEM 3,保存重新打开Eclipse。...

任梁荣
昨天
4
0
搞定Northwind示例数据库,无论哪个版本的SQLServer都受用

Northwind数据库 从这里可以找到突破口: http://social.msdn.microsoft.com/Forums/zh-CN/Vsexpressvb/thread/8490a1c6-9018-40c9-aafb-df9f79d29cde 下面是MSDN: http://msdn2.microsoft......

QQZZFT
昨天
1
0
mysql主从同步,安装配置操作

准备 两台mysql服务,我这里准备了如下: 主库:192.168.176.128 从库:192.168.176.131 如何在Linux上安装mysql服务,请看https://blog.csdn.net/qq_18860653/article/details/80250499 操作...

小致dad
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部