设备默认的播放速度是 $00010000, 此值乘以 2 是快一倍, 除以 2 是慢一倍; 最快可到 $000F8000.
设备默认的音高参数是 $00010000, 此值乘以 2 是高一倍, 除以 2 是低一倍; 最高可到 $000F8000.
可能有很多声卡不支持, 我的 IBM 手提就不支持; 不过通过其他技术可以实现的.
代码文件(仅有播放速度的设置代码):
Unit1; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; TForm1 = (TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; TrackBar1: TTrackBar; Button5: TButton; FormCreate(Sender: TObject); Button1Click(Sender: TObject); Button2Click(Sender: TObject); Button3Click(Sender: TObject); Button4Click(Sender: TObject); Button5Click(Sender: TObject); TrackBar1Change(Sender: TObject); FormDestroy(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; hWaveOut: HWAVE; fmt: TWaveFormatEx; buf: TBytes; TForm1.FormCreate(Sender: TObject); Button1.Caption := ; Button2.Caption := ; Button3.Caption := ; TrackBar1.Min := -; TrackBar1.Max := ; TrackBar1.Position := ; ; WaveProc(hWave: HWAVE; uMsg, dwInstance, dwParam1, dwParam2: DWORD); ; uMsg MM_WOM_DONE: waveOutUnprepareHeader(hWave, PWaveHdr(dwParam1), SizeOf(TWaveHdr)); ; ; TForm1.Button1Click(Sender: TObject); path = ; volume: DWORD; GetWaveFmtData(path, fmt, buf); wh.lpData := PAnsiChar(buf); wh.dwBufferLength := Length(buf); wh.dwBytesRecorded := ; wh.dwUser := ; wh.dwFlags := WHDR_BEGINLOOP WHDR_ENDLOOP; wh.dwLoops := ; wh.lpNext := ; wh.reserved := ; waveOutOpen(@hWaveOut, WAVE_MAPPER, @fmt, DWORD(@WaveProc), , CALLBACK_FUNCTION); waveOutPrepareHeader(hWaveOut, @wh, SizeOf(TWaveHdr)); waveOutWrite(hWaveOut, @wh, SizeOf(TWaveHdr)); ; TForm1.Button2Click(Sender: TObject); waveOutPause(hWaveOut); ; TForm1.Button3Click(Sender: TObject); waveOutRestart(hWaveOut); ; TForm1.TrackBar1Change(Sender: TObject); mid = ; pos, rate: Integer; pos := TTrackBar(Sender).Position; pos > rate := mid pos rate := mid Abs(pos); waveOutSetPlaybackRate(hWaveOut, rate); Text := IntToStr(pos); ; TForm1.Button4Click(Sender: TObject); waveOutCaps: TWaveOutCaps; waveOutGetDevCaps(WAVE_MAPPER, @waveOutCaps, SizeOf(TWaveOutCaps)); waveOutCaps.dwSupport WAVECAPS_PLAYBACKRATE = WAVECAPS_PLAYBACKRATE ShowMessage() ShowMessage(); ; TForm1.Button5Click(Sender: TObject); waveOutCaps: TWaveOutCaps; waveOutGetDevCaps(WAVE_MAPPER, @waveOutCaps, SizeOf(TWaveOutCaps)); waveOutCaps.dwSupport WAVECAPS_PITCH = WAVECAPS_PITCH ShowMessage() ShowMessage(); ; TForm1.FormDestroy(Sender: TObject); hWaveOut <> waveOutClose(hWaveOut); ; .
窗体文件:
Form1: TForm1 Left = Top = Caption = ClientHeight = ClientWidth = Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = - Font.Name = Font.Style = [] OldCreateOrder = False OnCreate = FormCreate OnDestroy = FormDestroy PixelsPerInch = TextHeight = Button1: TButton Left = Top = Width = Height = Caption = TabOrder = OnClick = Button1Click Button2: TButton Left = Top = Width = Height = Caption = TabOrder = OnClick = Button2Click Button3: TButton Left = Top = Width = Height = Caption = TabOrder = OnClick = Button3Click TrackBar1: TTrackBar Left = Top = Width = Height = TabOrder = OnChange = TrackBar1Change Button4: TButton Left = Top = Width = Height = Caption = TabOrder = OnClick = Button4Click Button5: TButton Left = Top = Width = Height = Caption = TabOrder = OnClick = Button5Click