文档章节

操作 Wave 文件(12): 使用 waveOut...重复播放 wav 文件

涂孟超
 涂孟超
发布于 2014/09/26 15:38
字数 334
阅读 39
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses MMSystem;

function GetWaveFmtData(path: string; var fmt: TWaveFormatEx; var buf: TBytes): Boolean;
var
  hFile: HMMIO;
  ckiRIFF,ckiFmt,ckiData: TMMCKInfo;
begin
  Result := False;
  hFile := mmioOpen(PChar(path), nil, MMIO_READ);
  if hFile = 0 then Exit;

  ZeroMemory(@ckiRIFF, SizeOf(TMMCKInfo));
  ZeroMemory(@ckiFmt, SizeOf(TMMCKInfo));
  ZeroMemory(@ckiData, SizeOf(TMMCKInfo));

  ckiRIFF.fccType := mmioStringToFOURCC('WAVE', 0);
  ckiFmt.ckid := mmioStringToFOURCC('fmt', 0);
  ckiData.ckid := mmioStringToFOURCC('data', 0);

  ZeroMemory(@fmt, SizeOf(TWaveFormatEx));

  mmioDescend(hFile, @ckiRIFF, nil, MMIO_FINDRIFF);

  if (ckiRIFF.ckid = FOURCC_RIFF) and (ckiRIFF.fccType = mmioStringToFOURCC('WAVE',0)) and
     (mmioDescend(hFile, @ckiFmt, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR) and
     (mmioRead(hFile, @fmt, ckiFmt.cksize) = ckiFmt.cksize) and
     (mmioAscend(hFile, @ckiFmt, 0) = MMSYSERR_NOERROR) and
     (mmioDescend(hFile, @ckiData, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR) then
  begin
    SetLength(buf, ckiData.cksize);
    Result := (mmioRead(hFile, PAnsiChar(buf), ckiData.cksize) = ckiData.cksize);
  end;

  mmioClose(hFile, 0);
end;

//------------------------------------------------------------------------------
var
  wh: TWaveHdr;
  hOut: HWAVEOUT;
  fmt: TWaveFormatEx;
  buf: TBytes;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button1.Caption := '打开并播放';
  Button2.Caption := '暂停';
  Button3.Caption := '继续';
end;

procedure WaveProc(hWave: HWAVE; uMsg, dwInstance, dwParam1, dwParam2: DWORD); stdcall;
begin
  case uMsg of
    MM_WOM_OPEN: ;
    MM_WOM_CLOSE: ;
    MM_WOM_DONE: begin
      waveOutUnprepareHeader(hWave, PWaveHdr(dwParam1), SizeOf(TWaveHdr));
      waveOutClose(hWave);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
const
  path = 'C:\WINDOWS\Media\Windows XP 启动.wav';
begin
  GetWaveFmtData(path, fmt, buf);

  wh.lpData := PAnsiChar(buf);
  wh.dwBufferLength := Length(buf);
  wh.dwBytesRecorded := 0;
  wh.dwUser := 0;
  wh.dwFlags := WHDR_BEGINLOOP or WHDR_ENDLOOP; {关键设置}
  wh.dwLoops := 3;                              {重复播放的次数}
  wh.lpNext := nil;
  wh.reserved := 0;

  waveOutOpen(@hOut, WAVE_MAPPER, @fmt, DWORD(@WaveProc), 0, CALLBACK_FUNCTION);
  waveOutPrepareHeader(hOut, @wh, SizeOf(TWaveHdr));
  waveOutWrite(hOut, @wh, SizeOf(TWaveHdr));
end;

//暂停
procedure TForm1.Button2Click(Sender: TObject);
begin
  waveOutPause(hOut);
end;

//继续
procedure TForm1.Button3Click(Sender: TObject);
begin
  waveOutRestart(hOut);
end;

end.

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2009/11/11/1601156.html

涂孟超
粉丝 13
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
加载中

评论(0)

windows下使用waveout函数族播放wav文件

要使用waveout函数组,族,首先要知道几个数据结构,首先是这个 typedef struct tWAVEFORMATEX{ } WAVEFORMATEX, 这个结构体在打开音频设备准备播放声音的时候是必须的,打开音频设备的时候需...

邓小俊
2015/04/28
0
0
WaveOutXX 播放PCM流

最新在WM上开发音频想关的东西, 遇到的麻烦是播放流文件的时候会一顿一顿的,网上找了找答案,是由于没有用到双缓冲。网上遇到了一段代码,给了我很大帮助。在此分享。。。。 //waveout.h ...

长平狐
2012/08/13
999
0
C# NAudio录音和播放音频文件-实时绘制音频波形图(从音频流数据获取,而非设备获取)

  NAudio的录音和播放录音都有对应的类,我在使用Wav格式进行录音和播放录音时使用的类时WaveIn和WaveOut,这两个类是对功能的回调和一些事件触发。   在WaveIn和WaveOut之外还有对音频流...

osc_ehtwxifo
04/16
10
0
使用waveOut接口在Windows中播放声音

使用waveOut接口在Windows中播放声音 转贴地址:http://wmnmtm.blog.163.com/blog/static/382457142011101314135546/ ####################### //声明: 1 本帖作者是:加菲 ,至此感谢! 2 ...

ll124884135
2012/05/29
1.5K
0
wav音频文件格式解析【个人笔记】(自用)

WAV格式 wav是微软开发的一种音频文件格式,注意,wav文件格式是无损音频文件格式,相对于其他音频格式文件数据是没有经过压缩的,通常文件也相对比较大些。、 支持多种音频数字,取样频率和...

osc_15ajvvu8
2019/03/26
5
0

没有更多内容

加载失败,请刷新页面

加载更多

python+selenium自动化框架搭建

很多人想要项目源码之前都是加我QQ之后一个一个发的,这样有点麻烦,所以我就建了一个群,完整的项目文件放在里面了有需要的直接加这个群,其他的资料我也会放在里面。群里都是一些学习自动化...

osc_twlari2q
35分钟前
20
0
Dash 5 for Mac 5.1.6 好用的API文档工具

Dash for mac是使用与Mac OS平台的软件编程文档管理工具,Dash 5 Mac破解版可以浏览API文档,以及管理代码片段工具。Dash自带了丰富的API文档,涉及各种主流的编程语言和框架。 Dash是一个A...

麦克W
37分钟前
13
0
关于百度地图js api的getCurrentPosition定位不准确的解决方法

很久之前帮大叔解决了一个gps坐标转换为百度地图坐标的问题。今天大叔又给我讲百度地图定位不准。我查了一下api,用了官方给出的这样一组函数。 1 //创建查询对象 2 var geolocation = ne...

osc_wl6d9wri
37分钟前
18
0
12章节 Samba、NFS文件共享服务 13章节 bind域名解析服务

12.1 SAMBA文件共享服务 FTP文件传输服务确实可以让主机之间的文件传输变得简单方便,但是FTP协议的本质是传输文件,而非共享文件。 1991年,当时还在读大学的Tridgwell,为了解决Linux系统与...

bpqd2020
38分钟前
18
0
XGBoost 重要参数(调参使用)

XGBoost 重要参数(调参使用) 数据比赛Kaggle,天池中最常见的就是XGBoost和LightGBM。 模型是在数据比赛中尤为重要的,但是实际上,在比赛的过程中,大部分朋友在模型上花的时间却是相对较少的...

osc_kedi1mvz
38分钟前
28
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部