Unit unit1; interfaceuses windows, messages, sysutils, variants, classes, graphics, controls, forms, dialogs, stdctrls; Type tform1 = Class (tform) button1: tbutton; button2: tbutton; button3: tbutton; Procedure upload (Sender: tobject); Procedure button1click (Sender: tobject); Procedure upload (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: = substring ('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, success) = mmsyserr_noerror) and (mmioread (hfile, @ FMT, ckifmt. cksize) = ckifmt. cksize) and (sums (hfile, @ ckifmt, 0) = mmsyserr_noerror) and (mmiodescend (hfile, @ ckidata, @ ckiriff, sums) = mmsyserr_noerror) then begin setlength (BUF, ckidata. cksize); Result: = (mmioread (hfile, pansichar (BUF), ckidata. cksize) = ckidata. cksize); end; mmioclose (hfile, 0); end; // implements var wh: twavehdr; Hout: hwaveout; FMT: twaveformatex; Buf: tbytes; Procedure tform1.formcreate (Sender: tobject); begin button1.caption: = 'open and play'; button2.caption: = 'stopped'; button3.caption: = 'upgrade'; end; Procedure waveproc (hwave: hwave; umsg, dwinstance, dwparam1, dwparam2: DWORD); stdcall; begin case umsg of mm_wom_open:; mm_wom_close:; cursor: Begin records (hwave, pwavehdr (dwparam1), sizeof (twavehdr )); waveoutclose (hwave); end; Procedure tform1.button1click (Sender: tobject); const Path = 'C: \ windows \ media \ Windows XP start .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; {key settings} Wh. dwloops: = 3; {Number of replay times} 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; // pause procedure tform1.button2click (Sender: tobject); begin waveoutpause (Hout); end; // continue procedure tform1.button3click (Sender: tobject); begin waveoutrestart (Hout); end.