文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:38
字数 334
阅读 9
收藏 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

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
WaveOutXX 播放PCM流

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

长平狐
2012/08/13
915
0
使用waveOut接口在Windows中播放声音

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

ll124884135
2012/05/29
0
0
[MicroPython]TPYBoardv102播放音乐实例

0x00前言 前段时间看到TPYBoard的技术交流群(群号:157816561,)里有人问关于TPYBoard播放音乐的问题。最近抽空看了一下文档介绍,着手做了个实验。更多MicroPython的教程可关注(微-信公众...

小五义
07/24
0
0
MicroPython开发板播放音乐教程

0x00前言 前段时间看到TPYBoard的技术交流群(群号:157816561,)里有人问关于TPYBoard播放音乐的问题。最近抽空看了一下文档介绍,着手做了个实验。 0x01实验器材 TPYBoardv102开发板1块 ...

bodasisiter
07/25
0
0
Jspeex转换出来的wav音频不被standing wave识别,无法播放

环境:JDK 1.7, Flex 4, Win7/8/8.1 前提:手机端的语音压缩用的是Speex。并把文件用Base64转码了。 公司项目需求:在Flex平台接收来自手机端发来的语音并播放。 项目结构:前台Flex,后台J...

bravehlp
2014/07/29
812
1

没有更多内容

加载失败,请刷新页面

加载更多

Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
2
0
3.6 rc脚本(start方法) 3.7 rc脚本(stop和status方法) 3.8 rc脚本(以daemon方式启动)

3.6-3.7 rc脚本(start、stop和status方法) #!/usr/bin/env python# -*- coding: utf-8 -*-# [@Version](https://my.oschina.net/u/931210) : python 2.7# [@Time](https://my.oschina.......

隐匿的蚂蚁
今天
3
0
Cnn学习相关博客

CNN卷积神经网络原理讲解+图片识别应用(附源码) 笨方法学习CNN图像识别系列 深度学习图像识别项目(中):Keras和卷积神经网络(CNN) 卷积神经网络模型部署到移动设备 使用CNN神经网络进行...

-九天-
昨天
4
0
flutter 底部输入框 聊天输入框 Flexible

想在页面底部放个输入框,结果键盘一直遮住了,原来是布局问题 Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("评论"), ...

大灰狼wow
昨天
4
0
Kernel I2C子系统

备注:所有图片来源于网络 1,I2C协议: 物理拓扑: I2C总线由两根信号线组成,一条是时钟信号线SCL,一条是数据信号线SDA。一条I2C总线可以接多个设备,每个设备都接入I2C总线的SCL和SDA。I...

yepanl
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部