热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

画WAV的图形函数

画WAV的图形函数:***********************************************************************画全部音

画WAV的图形函数:
//***********************************************************************//
// //
// 画全部音频数据的波形 //
// 参数: //
// Dw_Type : 波形显示数据记录 //
// WaveMin : 波形数据的最小值 //
// WaveMax : 波形数据的最大值 //
// DrawLineColor : 画波形的颜色 //
// DrawBackColor : 画波形的背景颜色 //
// Draw : 是否画波形 //
// 返回值: 无 //
// //
//***********************************************************************//
procedure DrawAllWave(Dw_Type: TDrawWave_Type; var WaveMin, WaveMax: LongInt;
DrawLineColor, DrawBackColor: TColor; Draw: Boolean = True);
var
Buf: PChar;
i, Loop, j, k, lmax, lmin: LongInt;
Max, Min: LongInt;
X, Y: SmallInt;
DrawLoop: LongInt;
MODDrawSize: LongInt;
LoadSize: LongInt;
hFile: Integer;
begin
Application.ProcessMessages;

hFile := 0;

DrawLoop := Dw_Type.Length DIV LoadMemSize;
MODDrawSize := 0;
if (Dw_Type.Length MOD LoadMemSize) <> 0 then
begin
DrawLoop := DrawLoop + 1;
MODDrawSize := Dw_Type.Length MOD LoadMemSize;
end;

SendMessage(Application.MainForm.Handle, CM_BEGINDRAW, DrawLoop * 3, 0);

with Dw_Type.DesBitMap do
begin
Width := Dw_Type.DW;
Height := Dw_Type.DH;
Canvas.Brush.Color := DrawBackColor;
Canvas.Brush.Style := bsSolid;
Canvas.Pen.Color := DrawLineColor;
Canvas.Pen.Mode := pmCopy;
Canvas.FillRect(Rect(0, 0, Dw_Type.DW, Dw_Type.DH));
end;

if Dw_Type.Length = 0 then
begin
BitBlt(Dw_Type.DesCanvas.Handle, 0, 0, Dw_Type.DW, Dw_Type.DH,
Dw_Type.DesBitMap.Canvas.Handle, 0, 0, SRCCOPY);
Exit;
end;

case Dw_Type.FileType of //不同的方式,打开不同的文件
//移到文件音频数据开始处
CS_SAVE_PLAY: mmioseek(Dw_Type.hio, Dw_Type.Length, SEEK_END); //播方方式
CS_SAVE_RECORD: hFile := FileOpen(Dw_Type.FileName, fmOpenRead); //录音方式
end;

Max := -32768;
Min := 32767;

Try
for Loop := 1 to DrawLoop do
begin
if (MODDrawSize <> 0) AND (Loop = DrawLoop) then
LoadSize := MODDrawSize //要播放的音频数据的长度
else
LoadSize := LoadMemSize;
//开辟内存
Buf := PChar(GlobalAllocPtr(GMEM_MOVEABLE or GMEM_SHARE, LoadMemSize));

if Buf = NIL then
raise EMMIO.Create('不能分配内存!');

Try
case Dw_Type.FileType of //读音频数
CS_SAVE_PLAY: mmioRead(Dw_Type.hio, Buf, LoadSize);
CS_SAVE_RECORD: FileRead(hFile, Buf^, LoadSize);
end;

if Dw_Type.Length <= LoadMemSize then //假如小于区域长度的最大长度
begin //画区域波形
DrawPartWave(Dw_Type.Flag, Buf, Dw_Type.Length, Dw_Type.DesCanvas,
Dw_Type.DH, Dw_Type.DW, Dw_Type.DesBitMap, DrawLineColor,
DrawBackColor, Draw);
WaveMin := DrawMin;
WaveMax := DrawMax;
SendMessage(Application.MainForm.Handle, CM_DRAWPosI, DrawLoop * 3, 0);
SendMessage(Application.MainForm.Handle, CM_ENDDRAW, 0, 0);
FileClose(hFile);
Exit;
end;

for i := 0 to (LoadSize div 2 - 1) do
begin //取最大最小值
j := PCMInt(PChar(Buf)+ i * 2)^;
if j > Max then Max := j;
if j end;
Finally
GloBalFreePtr(Buf);
end;
SendMessage(Application.MainForm.Handle, CM_DRAWPosI, DrawLoop, 0);
end;
Finally
FileClose(hFile);
end;

WaveMin := Min;
WaveMax := Max;

if Not Draw then
begin
if Dw_Type.FileType = CS_SAVE_RECORD then FileClose(hFile);
SendMessage(Application.MainForm.Handle, CM_ENDDRAW, 0, 0);
Exit;
end;

Max := Max - Min;
Dw_Type.DesBitMap.Canvas.MoveTo(0, Dw_Type.DH div 2);
j := 0;
X := 0;
lmax := 0;
lmin := 32767;

hFile := 0;

case Dw_Type.FileType of //移到文件开始处
CS_SAVE_PLAY: mmioseek(Dw_Type.hio, Dw_Type.Length, SEEK_END);
CS_SAVE_RECORD: hFile := FileOpen(Dw_Type.FileName, fmOpenRead);
else
hFile := 0;
end;

Try
for Loop := 1 to DrawLoop do
begin
if (MODDrawSize <> 0) AND (Loop = DrawLoop) then
begin
//开辟内存
Buf := PChar(GlobalAllocPtr(GMEM_MOVEABLE or GMEM_SHARE, MODDrawSize));
LoadSize := MODDrawSize; //要播放的音频数据的长度
end
else begin
Buf := PChar(GlobalAllocPtr(GMEM_MOVEABLE or GMEM_SHARE, LoadMemSize));
LoadSize := LoadMemSize;
end;

if Buf = NIL then
raise EMMIO.Create('不能分配内存!');

Try
case Dw_Type.FileType of
CS_SAVE_PLAY: mmioRead(Dw_Type.hio, Buf, LoadSize);
CS_SAVE_RECORD: FileRead(hFile, Buf^, LoadSize);
end;
for i := 0 to (LoadSize div 2 - 1 ) do
begin
if j <(Dw_Type.Flag - 1) then //在同一周期内
begin
INC(j);
end
else begin
j := 0;
X := X + 1;
lmax := 0;
lmin := 32767;
end;
if Max <> 0 then
Y := Abs(PCMInt(PChar(Buf) + i * 2)^ - Min) * Dw_Type.DH div Max
else
Y := Dw_Type.DH div 2;

k := 0;
if Y > lmax then
begin
lmax := Y;
k := 1;
end;
if Y begin
lmin := Y;
k := 1;
end;
if k = 1 then
Dw_Type.DesBitMap.Canvas.LineTo(X, Y);
if X > Dw_Type.DW then break;
end;
Finally
GloBalFreePtr(Buf);
end;
SendMessage(Application.MainForm.Handle, CM_DRAWPosI, DrawLoop + Loop * 2 , 0);
end;
Finally
FileClose(hFile);
end;

//复制图像
BitBlt(Dw_Type.DesCanvas.Handle, 0, 0, Dw_Type.DW, Dw_Type.DH,
Dw_Type.DesBitMap.Canvas.Handle, 0, 0, SRCCOPY);
SendMessage(Application.MainForm.Handle, CM_ENDDRAW, 0, 0);
end;
 


推荐阅读
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了一个程序,可以输出1000内能被3整除且个位数为6的所有整数。程序使用了循环和条件判断语句来筛选符合条件的整数,并将其输出。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
author-avatar
丽sd园印章
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有