在网上找到的,在delphi2010下可以使用。用到delphi7下报错。TBytes 字段需要转换
ckiRIFF.fccType 也有问题。烦请各位老师帮忙看看。delphi实在不懂。谢谢!使用窗口接受音频输出设备的消息:
--------------------------------------------------------------------------------
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
protected
procedure WndProc(var Message: TMessage); override;
public
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.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 := 0;
wh.dwLoops := 1;
wh.lpNext := nil;
wh.reserved := 0; waveOutOpen(@hOut, WAVE_MAPPER, @fmt, Handle, 0, CALLBACK_WINDOW);
waveOutPrepareHeader(hOut, @wh, SizeOf(TWaveHdr));
waveOutWrite(hOut, @wh, SizeOf(TWaveHdr));
end;procedure TForm1.WndProc(var Message: TMessage);
begin
inherited;
case Message.Msg of
MM_WOM_OPEN: ;
MM_WOM_CLOSE: ;
MM_WOM_DONE: begin
waveOutUnprepareHeader(hOut, @wh, SizeOf(TWaveHdr));
waveOutClose(hOut);
end;
end;
end;end.
--------------------------------------------------------------------------------
ckiRIFF.fccType 也有问题。烦请各位老师帮忙看看。delphi实在不懂。谢谢!使用窗口接受音频输出设备的消息:
--------------------------------------------------------------------------------
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
protected
procedure WndProc(var Message: TMessage); override;
public
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.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 := 0;
wh.dwLoops := 1;
wh.lpNext := nil;
wh.reserved := 0; waveOutOpen(@hOut, WAVE_MAPPER, @fmt, Handle, 0, CALLBACK_WINDOW);
waveOutPrepareHeader(hOut, @wh, SizeOf(TWaveHdr));
waveOutWrite(hOut, @wh, SizeOf(TWaveHdr));
end;procedure TForm1.WndProc(var Message: TMessage);
begin
inherited;
case Message.Msg of
MM_WOM_OPEN: ;
MM_WOM_CLOSE: ;
MM_WOM_DONE: begin
waveOutUnprepareHeader(hOut, @wh, SizeOf(TWaveHdr));
waveOutClose(hOut);
end;
end;
end;end.
--------------------------------------------------------------------------------
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
buf: Array of byte;implementation{$R *.dfm}
uses MMSystem;
function GetWaveFmtData(path: string; var fmt: TWaveFormatEx ): Boolean;
var
hFile: HMMIO;
ckiRIFF,ckiFmt,ckiData: TMMCKInfo;
//buf: array of byte;
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;
procedure TForm1.Button1Click(Sender: TObject);
const
path = 'C:\WINDOWS\Media\Windows XP 启动.wav';
begin
GetWaveFmtData(path, fmt); wh.lpData := PAnsiChar(buf);
wh.dwBufferLength := Length(buf);
wh.dwBytesRecorded := 0;
wh.dwUser := 0;
wh.dwFlags := 0;
wh.dwLoops := 1;
wh.lpNext := nil;
wh.reserved := 0; waveOutOpen(@hOut, WAVE_MAPPER, @fmt, Handle, 0, CALLBACK_WINDOW);
waveOutPrepareHeader(hOut, @wh, SizeOf(TWaveHdr));
waveOutWrite(hOut, @wh, SizeOf(TWaveHdr));
end;
end.