为什么80%的码农都做不了架构师?>>>   

这两个参数也都是可以 Get(waveOutGetPlaybackRate、waveOutGetPitch)

设备默认的播放速度是 $00010000, 此值乘以 2 是快一倍, 除以 2 是慢一倍; 最快可到 $000F8000.
设备默认的音高参数是 $00010000, 此值乘以 2 是高一倍, 除以 2 是低一倍; 最高可到 $000F8000.

可能有很多声卡不支持, 我的 IBM 手提就不支持; 不过通过其他技术可以实现的.



代码文件(仅有播放速度的设置代码):


unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ComCtrls;typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;Button3: TButton;Button4: TButton;TrackBar1: TTrackBar;Button5: TButton;procedure FormCreate(Sender: TObject);procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure Button3Click(Sender: TObject);procedure Button4Click(Sender: TObject);procedure Button5Click(Sender: TObject);procedure TrackBar1Change(Sender: TObject);procedure FormDestroy(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}uses MMSystem;function GetWaveFmtData(path: string; var fmt: TWaveFormatEx; var buf: TBytes): Boolean;
varhFile: HMMIO;ckiRIFF,ckiFmt,ckiData: TMMCKInfo;
beginResult := 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) thenbeginSetLength(buf, ckiData.cksize);Result := (mmioRead(hFile, PAnsiChar(buf), ckiData.cksize) = ckiData.cksize);end;mmioClose(hFile, 0);
end;//------------------------------------------------------------------------------
varwh: TWaveHdr;hWaveOut: HWAVE;fmt: TWaveFormatEx;buf: TBytes;procedure TForm1.FormCreate(Sender: TObject);
beginButton1.Caption := '打开并播放';Button2.Caption := '暂停';Button3.Caption := '继续';TrackBar1.Min := -4;TrackBar1.Max := 4;TrackBar1.Position := 0;
end;procedure WaveProc(hWave: HWAVE; uMsg, dwInstance, dwParam1, dwParam2: DWORD); stdcall;
begincase uMsg ofMM_WOM_DONE: waveOutUnprepareHeader(hWave, PWaveHdr(dwParam1), SizeOf(TWaveHdr));end;
end;procedure TForm1.Button1Click(Sender: TObject);
constpath = 'C:\WINDOWS\Media\Windows XP 启动.wav';
varvolume: DWORD;
beginGetWaveFmtData(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(@hWaveOut, WAVE_MAPPER, @fmt, DWORD(@WaveProc), 0, CALLBACK_FUNCTION);waveOutPrepareHeader(hWaveOut, @wh, SizeOf(TWaveHdr));waveOutWrite(hWaveOut, @wh, SizeOf(TWaveHdr));
end;//暂停
procedure TForm1.Button2Click(Sender: TObject);
beginwaveOutPause(hWaveOut);
end;//继续
procedure TForm1.Button3Click(Sender: TObject);
beginwaveOutRestart(hWaveOut);
end;//调整播放速度
procedure TForm1.TrackBar1Change(Sender: TObject);
constmid = $00010000;
varpos, rate: Integer;
beginpos := TTrackBar(Sender).Position;if pos > 0 thenrate := mid shl poselserate := mid shr Abs(pos);waveOutSetPlaybackRate(hWaveOut, rate);Text := IntToStr(pos);
end;//判断设备是否支持播放速度调整
procedure TForm1.Button4Click(Sender: TObject);
varwaveOutCaps: TWaveOutCaps;
beginwaveOutGetDevCaps(WAVE_MAPPER, @waveOutCaps, SizeOf(TWaveOutCaps));if waveOutCaps.dwSupport and WAVECAPS_PLAYBACKRATE = WAVECAPS_PLAYBACKRATE thenShowMessage('默认设备支持播放速度调整.')elseShowMessage('默认设备不支持播放速度调整!');
end;//判断设备是否支持声调变化
procedure TForm1.Button5Click(Sender: TObject);
varwaveOutCaps: TWaveOutCaps;
beginwaveOutGetDevCaps(WAVE_MAPPER, @waveOutCaps, SizeOf(TWaveOutCaps));if waveOutCaps.dwSupport and WAVECAPS_PITCH = WAVECAPS_PITCH thenShowMessage('默认设备支持声调变化.')elseShowMessage('默认设备不支持声调变化!');
end;procedure TForm1.FormDestroy(Sender: TObject);
beginif hWaveOut <> 0 then waveOutClose(hWaveOut);
end;end.

窗体文件:


object Form1: TForm1Left = 0Top = 0Caption = 'Form1'ClientHeight = 204ClientWidth = 342Color = clBtnFaceFont.Charset = DEFAULT_CHARSETFont.Color = clWindowTextFont.Height = -11Font.Name = 'Tahoma'Font.Style = []OldCreateOrder = FalseOnCreate = FormCreateOnDestroy = FormDestroyPixelsPerInch = 96TextHeight = 13object Button1: TButtonLeft = 32Top = 24Width = 75Height = 25Caption = #25171#24320#24182#25773#25918TabOrder = 0OnClick = Button1Clickendobject Button2: TButtonLeft = 136Top = 24Width = 75Height = 25Caption = #26242#20572TabOrder = 1OnClick = Button2Clickendobject Button3: TButtonLeft = 240Top = 24Width = 75Height = 25Caption = #32487#32493TabOrder = 2OnClick = Button3Clickendobject TrackBar1: TTrackBarLeft = 32Top = 88Width = 283Height = 45TabOrder = 3OnChange = TrackBar1Changeendobject Button4: TButtonLeft = 152Top = 139Width = 163Height = 25Caption = #21028#26029#35774#22791#26159#21542#25903#25345#36895#24230#35843#25972TabOrder = 4OnClick = Button4Clickendobject Button5: TButtonLeft = 152Top = 170Width = 163Height = 25Caption = #21028#26029#35774#22791#26159#21542#25903#25345#22768#35843#21464#21270TabOrder = 5OnClick = Button5Clickend
end

转载于:https://my.oschina.net/hermer/blog/320885

操作 Wave 文件(14): waveOutSetPlaybackRate、waveOutSetPitch相关推荐

  1. 操作 Wave 文件(3): 接触 mmio 系列函数

    mmio 系列函数用于 Wave 等多媒体文件的 I/O 操作, 相关函数有: mmioOpen mmioClose mmioRead mmioWrite mmioFlush mmioSeek mmi ...

  2. 操作 Wave 文件(4): 获取 Wave 文件主块与子块的信息

    有两个相关的结构体: TMMIOInfo.TMMCKInfo. TMMIOInfo 是多媒体文件打开后的状态信息, mmioOpen 函数的第二个参数就是这个结构的指针. 现在先用到了 TMMCKIn ...

  3. 操作 Wave 文件(13): waveOutGetVolume、waveOutSetVolume

    左右声道的音量是单调的; 表示音量的 32 位整数的低 16 位是左声道.高 16 位是右声道. 代码文件: unit Unit1;interfaceusesWindows, Messages, Sy ...

  4. C语言---14文件操作---01文件内容的顺序读写

    文中的源码都在这里哦!!! 文中的源码都在这里哦!!! 一.文件的基本概念 一个文件通常是磁盘上一段命名的存储区 磁盘文件(通常用的文件):指一组相关数据的有序集合,通常存储在外部介质(如磁盘)上,使 ...

  5. 【C语言】Wave文件处理

    WAVE 文件作为多媒体中使用的声音波形文件格式之一,它是以RIFF(Resource Interchange File Format)格式为标准的. 1. 大小端对齐问题 大小端是不同的对于数据在内 ...

  6. ADPCM WAVE文件的压缩与解压缩

    一.WAVE文件   WAVE文件是计算机领域最常用的数字化声音文件格式之一,它是微软专门为Windows系统定义的波形文件格式(Waveform Audio),由于其扩展名为"*.wav& ...

  7. C#操作Excel文件(转)

    摘要:本文介绍了Excel对象.C#中的受管代码和非受管代码,并介绍了COM组件在.net环境中的使用. 关键词:受管代码:非受管代码:Excel对象:动态连接库 引言 Excel是微软公司办公自动化 ...

  8. 使用ITEXT操作PDF文件

    2019独角兽企业重金招聘Python工程师标准>>> 使用ITEXT操作PDF文件 pom.xml <dependency><groupId>com.ite ...

  9. Delphi多媒体设计之播放WAVE文件(API)

    多媒体程序设计是一个名不符实的词组,其道理就是多媒体程序设计包含着广泛的可能性,它尤其包括了Wave音频.MIDI音频.AVI视频和动画等.不要将多媒体程序设计与游戏程序设计混淆了. 游戏设计自然包含 ...

最新文章

  1. 【Android 逆向】Android 进程注入工具开发 ( 远程调用 | x86 架构的返回值获取 | arm 架构远程调用 )
  2. Python递归调用
  3. JS 中 call()、apply()、bind() 的用法
  4. appinventor广州服务器网页,app inventor服务器
  5. c语言错误spawning,C语言一直出现Error spawning cl.exe的解决办法
  6. 分布式保存Session 和 StateServer 解决 Session过期
  7. RPA应用场景-自动轮询汇总报表
  8. Unity遮罩简单复刻2D平台《Unbound: Worlds Apart》游离于世界之海的双重世界效果
  9. 【金融科技前沿】金融实人认证+基于百度AI的身份证图片批量OCR识别
  10. Unity编程笔录--实现360全景视频和VR视频
  11. c语言编程设计实验课件,c语言程序设计实验课件.ppt
  12. cala中隐式转换(implicit conversion)的优先顺序
  13. SQLTableSource
  14. GPS主时钟|北斗卫星时钟|GPS卫星同步时钟|北斗时钟系统
  15. python封装成exe后运行失败_解决Python使用pyinstaller打包生成exe运行提示错误 | kTWO-个人博客...
  16. 选择正确的域名和空间/服务器
  17. 解决Win10系统msconfig配置错误后无法启动的问题
  18. 用C语言多线程描述哲学家,C语言多线程之“哲学家就餐”问题
  19. 程序运行出现错误:返回值为 -1073741701 (0xc000007b)
  20. 微型计算机简单并行接口实验心得,实验二简单并行接口.doc

热门文章

  1. ITK:从图像区域中随机选择像素
  2. VTK:Points之PoissonExtractSurface
  3. OpenCV离散傅立叶变换DFT的实例(附完整代码)
  4. Qt Creator查找和更换
  5. OpenGL GLFX开放GL效果库
  6. C语言实现最长子序列 longest subsequence 算法(附完整源码)
  7. QT的QScriptValueIterator类的使用
  8. android自定义url协议,Android自定义URL方案…?
  9. 3socket编程:UDP编程
  10. proxool配置详解