使用窗口接受音频输出设备的消息:
Unit1; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; TForm1 = (TForm) Button1: TButton; Button1Click(Sender: TObject); WndProc( Message: TMessage); ; ; Form1: TForm1; MMSystem; GetWaveFmtData(path: ; fmt: TWaveFormatEx; buf: TBytes): Boolean; hFile: HMMIO; ckiRIFF,ckiFmt,ckiData: TMMCKInfo; Result := False; hFile := mmioOpen(PChar(path), , MMIO_READ); hFile = Exit; ZeroMemory(@ckiRIFF, SizeOf(TMMCKInfo)); ZeroMemory(@ckiFmt, SizeOf(TMMCKInfo)); ZeroMemory(@ckiData, SizeOf(TMMCKInfo)); ckiRIFF.fccType := mmioStringToFOURCC(, ); ckiFmt.ckid := mmioStringToFOURCC(, ); ckiData.ckid := mmioStringToFOURCC(, ); ZeroMemory(@fmt, SizeOf(TWaveFormatEx)); mmioDescend(hFile, @ckiRIFF, , MMIO_FINDRIFF); (ckiRIFF.ckid = FOURCC_RIFF) (ckiRIFF.fccType = mmioStringToFOURCC(,)) (mmioDescend(hFile, @ckiFmt, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR) (mmioRead(hFile, @fmt, ckiFmt.cksize) = ckiFmt.cksize) (mmioAscend(hFile, @ckiFmt, ) = MMSYSERR_NOERROR) (mmioDescend(hFile, @ckiData, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR) SetLength(buf, ckiData.cksize); Result := (mmioRead(hFile, PAnsiChar(buf), ckiData.cksize) = ckiData.cksize); ; mmioClose(hFile, ); ; wh: TWaveHdr; hOut: HWAVEOUT; fmt: TWaveFormatEx; buf: TBytes; TForm1.Button1Click(Sender: TObject); path = ; GetWaveFmtData(path, fmt, buf); wh.lpData := PAnsiChar(buf); wh.dwBufferLength := Length(buf); wh.dwBytesRecorded := ; wh.dwUser := ; wh.dwFlags := ; wh.dwLoops := ; wh.lpNext := ; wh.reserved := ; waveOutOpen(@hOut, WAVE_MAPPER, @fmt, Handle, , CALLBACK_WINDOW); waveOutPrepareHeader(hOut, @wh, SizeOf(TWaveHdr)); waveOutWrite(hOut, @wh, SizeOf(TWaveHdr)); ; TForm1.WndProc( Message: TMessage); ; Message.Msg MM_WOM_OPEN: ; MM_WOM_CLOSE: ; MM_WOM_DONE: waveOutUnprepareHeader(hOut, @wh, SizeOf(TWaveHdr)); waveOutClose(hOut); ; ; ; .
使用回调函数:
Unit1; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; TForm1 = (TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button1Click(Sender: TObject); Button2Click(Sender: TObject); Button3Click(Sender: TObject); ; Form1: TForm1; MMSystem; GetWaveFmtData(path: ; fmt: TWaveFormatEx; buf: TBytes): Boolean; hFile: HMMIO; ckiRIFF,ckiFmt,ckiData: TMMCKInfo; Result := False; hFile := mmioOpen(PChar(path), , MMIO_READ); hFile = Exit; ZeroMemory(@ckiRIFF, SizeOf(TMMCKInfo)); ZeroMemory(@ckiFmt, SizeOf(TMMCKInfo)); ZeroMemory(@ckiData, SizeOf(TMMCKInfo)); ckiRIFF.fccType := mmioStringToFOURCC(, ); ckiFmt.ckid := mmioStringToFOURCC(, ); ckiData.ckid := mmioStringToFOURCC(, ); ZeroMemory(@fmt, SizeOf(TWaveFormatEx)); mmioDescend(hFile, @ckiRIFF, , MMIO_FINDRIFF); (ckiRIFF.ckid = FOURCC_RIFF) (ckiRIFF.fccType = mmioStringToFOURCC(,)) (mmioDescend(hFile, @ckiFmt, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR) (mmioRead(hFile, @fmt, ckiFmt.cksize) = ckiFmt.cksize) (mmioAscend(hFile, @ckiFmt, ) = MMSYSERR_NOERROR) (mmioDescend(hFile, @ckiData, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR) SetLength(buf, ckiData.cksize); Result := (mmioRead(hFile, PAnsiChar(buf), ckiData.cksize) = ckiData.cksize); ; mmioClose(hFile, ); ; wh: TWaveHdr; hOut: HWAVEOUT; fmt: TWaveFormatEx; buf: TBytes; WaveProc(hWave: HWAVE; uMsg, dwInstance, dwParam1, dwParam2: DWORD); ; uMsg MM_WOM_OPEN: ; MM_WOM_CLOSE: ; MM_WOM_DONE: waveOutUnprepareHeader(hWave, PWaveHdr(dwParam1), SizeOf(TWaveHdr)); waveOutClose(hWave); ; ; ; TForm1.Button1Click(Sender: TObject); path = ; GetWaveFmtData(path, fmt, buf); wh.lpData := PAnsiChar(buf); wh.dwBufferLength := Length(buf); wh.dwBytesRecorded := ; wh.dwUser := ; wh.dwFlags := ; wh.dwLoops := ; wh.lpNext := ; wh.reserved := ; waveOutOpen(@hOut, WAVE_MAPPER, @fmt, DWORD(@WaveProc), , CALLBACK_FUNCTION); waveOutPrepareHeader(hOut, @wh, SizeOf(TWaveHdr)); waveOutWrite(hOut, @wh, SizeOf(TWaveHdr)); ; TForm1.Button2Click(Sender: TObject); waveOutPause(hOut); ; TForm1.Button3Click(Sender: TObject); waveOutRestart(hOut); ; .