我在程序中打开了一个音频文件,使用完毕后,我需要对她关闭后在做别的操作,但是不知道为什么死活都关不掉,老是提示我被别的程序占用,有什么办法强制关闭她呀!!!我得代码如下:
function TCMPlayWave.OpenFileName(Name: PChar; Draw: Boolean): Boolean;
var
mmckinfoParent, mmckinfoSubchunk: MMCKINFO;//音频信息头
dwfmtSize: DWORD;
DrawAll: TDrawWave_Type; //波形结构体
begin
Self.MODInt := 0;
Self.PlaySize := 0; //打开音频文件 只读 以缓冲区方式打开
Self.hio := mmioOpen(Name, NIL, MMIO_READ or MMIO_ALLOCBUF);
if Self.hio = 0 then
raise EMMIO.Create('打不开文件或文件不存在!'); Try
//寻找 RIFF 块的类型标志,以确定是 WAV 文件
mmckinfoParent.fccType := mmioStringToFOURCC('WAVE', 0);
if mmioDescend(Self.hio, @mmckinfoParent, NIL, MMIO_FINDRIFF) <> 0 then
raise EMMIO.Create('不是WAVE文件!'); //寻找 fmt 子块,以确定是 WAV 文件并找出一些音频文件的数据
mmckinfoSubchunk.ckid := mmioStringToFOURCC('fmt', 0);
if mmioDescend(Self.hio, @mmckinfoSubchunk, @mmckinfoParent, MMIO_FINDCHUNK) <> 0 then
raise EMMIO.Create('不是WAVE文件!'); //音频信息头的大小
dwFmtSize := mmckinfoSubchunk.cksize;
//锁定内存
Self.hFormat := LocalAlloc(LMEM_MOVEABLE, LOWORD(dwFmtSize));
if Self.hFormat = 0 then
raise EMMIO.Create('不能分配内存!'); try //开辟内存
Self.pFormat := PWAVEFORMATEX(LocalLock(Self.hFormat));
if Self.pFormat = NIL then
raise EMMIO.Create('不能锁定内存!'); //读取音频信息头( 音频格式 )
if mmioRead(Self.hio, PChar(Self.pFormat), dwFmtSize) <> LongInt(dwFmtSize) then
raise EMMIO.Create('读格式错!'); //确定是否为指定格式类型
if Self.pFormat^.wFormatTag <> WAVE_FORMAT_PCM then
raise EMMIO.Create('波形音频不是PCM格式音频!'); //打开音频输出设备
if WaveOutOpen(@Self.hwo, WAVE_MAPPER, Self.pFormat, 0, 0, WAVE_FORMAT_QUERY) <> 0 then
raise EMMIO.Create('波形音频输出设备不支持该格式!'); //把文件指针移到 data 数据块的开始处
mmioAscend(Self.hio, @mmckinfoSubchunk, 0); //查找 data 数据块
mmckinfoSubchunk.ckid := mmioStringToFOURCC('data', 0);
if mmioDescend(Self.hio, @mmckinfoSubchunk, @mmckinfoParent, MMIO_FINDCHUNK) <> 0 then
raise EMMIO.Create('找不到数据块!'); //音频数据的长度
Self.DataLength := mmckinfoSubchunk.cksize; if Self.DataLength = 0 then
begin //音频数据的长度为0
LocalUnlock(Self.hFormat); //解锁内存块
LocalFree(Self.hFormat); //释放内存块
mmioClose(Self.hio, 0); //关闭文件
end;
Finally
end;
Finally
end; if Self.DataLength = 0 then
begin
with Self.FDesBMP do
begin
Canvas.Brush.Color := Self.DrawBackColor;
Canvas.Brush.Style := bsSolid;
Canvas.Pen.Color := Self.DrawLineColor;
Canvas.Pen.Mode := pmCopy;
Canvas.FillRect(Rect(0, 0, Self.FDrawWave.ClientWidth, Self.FDrawWave.ClientHeight));
end;
BitBlt(Self.FDrawWave.Canvas.Handle, 0, 0, Self.FDrawWave.ClientWidth,
Self.FDrawWave.ClientHeight, Self.FDesBMP.Canvas.Handle, 0, 0, SRCCOPY);
Application.MessageBox('文件长度为零!', '提示', MB_OK + MB_ICONINFORMATION);
SendMessage(Application.MainForm.Handle, CM_ENDDRAW, 0, 0);
end; if (Self.FDrawWave <> NIL) AND (Self.FDesBMP <> NIL) AND Draw AND Self.FShowDrawWave
and (Self.DataLength <> 0) then
begin //画波形
DrawAll.FileType := CS_SAVE_PLAY; //播放方式
DrawAll.hio := Self.hio;
DrawAll.Flag := Integer(Self.DataLength) DIV 2 DIV Self.FDrawWave.ClientWidth + 1;
if DrawAll.Flag <= 0 then DrawAll.Flag := 1;
DrawAll.FileName := '';
DrawAll.Length := Self.DataLength;
DrawAll.DesCanvas := Self.FDrawWave.Canvas;
DrawAll.DH := Self.FDrawWave.ClientHeight;
DrawAll.DW := Self.FDrawWave.ClientWidth;
DrawAll.DesBitMap := Self.FDesBMP;
DrawAllWave(DrawAll, Self.WaveMin, Self.WaveMax, Self.FDrawLineColor, Self.FDrawBackColor);
end; Self.FCanUndo := False; //不能进行撤消操作
Result := True; //打开成功
end;//-------------------------我用这种办法关闭,但是不行---------------------------
procedure TCMPlayWave.CloseWaveFile;
begin
if NowPlay <> CPSTOPING then //不是停止状态
Exit;
LocalUnlock(hFormat); //解锁内存
LocalFree(hFormat); //释放音频信息头
mmioClose(hio, 0); //关闭音频输出设备
Self.hio := 0;
Self.DataLength := 0;
FNowPlay := CPNONE; //当前没有状态
end;
function TCMPlayWave.OpenFileName(Name: PChar; Draw: Boolean): Boolean;
var
mmckinfoParent, mmckinfoSubchunk: MMCKINFO;//音频信息头
dwfmtSize: DWORD;
DrawAll: TDrawWave_Type; //波形结构体
begin
Self.MODInt := 0;
Self.PlaySize := 0; //打开音频文件 只读 以缓冲区方式打开
Self.hio := mmioOpen(Name, NIL, MMIO_READ or MMIO_ALLOCBUF);
if Self.hio = 0 then
raise EMMIO.Create('打不开文件或文件不存在!'); Try
//寻找 RIFF 块的类型标志,以确定是 WAV 文件
mmckinfoParent.fccType := mmioStringToFOURCC('WAVE', 0);
if mmioDescend(Self.hio, @mmckinfoParent, NIL, MMIO_FINDRIFF) <> 0 then
raise EMMIO.Create('不是WAVE文件!'); //寻找 fmt 子块,以确定是 WAV 文件并找出一些音频文件的数据
mmckinfoSubchunk.ckid := mmioStringToFOURCC('fmt', 0);
if mmioDescend(Self.hio, @mmckinfoSubchunk, @mmckinfoParent, MMIO_FINDCHUNK) <> 0 then
raise EMMIO.Create('不是WAVE文件!'); //音频信息头的大小
dwFmtSize := mmckinfoSubchunk.cksize;
//锁定内存
Self.hFormat := LocalAlloc(LMEM_MOVEABLE, LOWORD(dwFmtSize));
if Self.hFormat = 0 then
raise EMMIO.Create('不能分配内存!'); try //开辟内存
Self.pFormat := PWAVEFORMATEX(LocalLock(Self.hFormat));
if Self.pFormat = NIL then
raise EMMIO.Create('不能锁定内存!'); //读取音频信息头( 音频格式 )
if mmioRead(Self.hio, PChar(Self.pFormat), dwFmtSize) <> LongInt(dwFmtSize) then
raise EMMIO.Create('读格式错!'); //确定是否为指定格式类型
if Self.pFormat^.wFormatTag <> WAVE_FORMAT_PCM then
raise EMMIO.Create('波形音频不是PCM格式音频!'); //打开音频输出设备
if WaveOutOpen(@Self.hwo, WAVE_MAPPER, Self.pFormat, 0, 0, WAVE_FORMAT_QUERY) <> 0 then
raise EMMIO.Create('波形音频输出设备不支持该格式!'); //把文件指针移到 data 数据块的开始处
mmioAscend(Self.hio, @mmckinfoSubchunk, 0); //查找 data 数据块
mmckinfoSubchunk.ckid := mmioStringToFOURCC('data', 0);
if mmioDescend(Self.hio, @mmckinfoSubchunk, @mmckinfoParent, MMIO_FINDCHUNK) <> 0 then
raise EMMIO.Create('找不到数据块!'); //音频数据的长度
Self.DataLength := mmckinfoSubchunk.cksize; if Self.DataLength = 0 then
begin //音频数据的长度为0
LocalUnlock(Self.hFormat); //解锁内存块
LocalFree(Self.hFormat); //释放内存块
mmioClose(Self.hio, 0); //关闭文件
end;
Finally
end;
Finally
end; if Self.DataLength = 0 then
begin
with Self.FDesBMP do
begin
Canvas.Brush.Color := Self.DrawBackColor;
Canvas.Brush.Style := bsSolid;
Canvas.Pen.Color := Self.DrawLineColor;
Canvas.Pen.Mode := pmCopy;
Canvas.FillRect(Rect(0, 0, Self.FDrawWave.ClientWidth, Self.FDrawWave.ClientHeight));
end;
BitBlt(Self.FDrawWave.Canvas.Handle, 0, 0, Self.FDrawWave.ClientWidth,
Self.FDrawWave.ClientHeight, Self.FDesBMP.Canvas.Handle, 0, 0, SRCCOPY);
Application.MessageBox('文件长度为零!', '提示', MB_OK + MB_ICONINFORMATION);
SendMessage(Application.MainForm.Handle, CM_ENDDRAW, 0, 0);
end; if (Self.FDrawWave <> NIL) AND (Self.FDesBMP <> NIL) AND Draw AND Self.FShowDrawWave
and (Self.DataLength <> 0) then
begin //画波形
DrawAll.FileType := CS_SAVE_PLAY; //播放方式
DrawAll.hio := Self.hio;
DrawAll.Flag := Integer(Self.DataLength) DIV 2 DIV Self.FDrawWave.ClientWidth + 1;
if DrawAll.Flag <= 0 then DrawAll.Flag := 1;
DrawAll.FileName := '';
DrawAll.Length := Self.DataLength;
DrawAll.DesCanvas := Self.FDrawWave.Canvas;
DrawAll.DH := Self.FDrawWave.ClientHeight;
DrawAll.DW := Self.FDrawWave.ClientWidth;
DrawAll.DesBitMap := Self.FDesBMP;
DrawAllWave(DrawAll, Self.WaveMin, Self.WaveMax, Self.FDrawLineColor, Self.FDrawBackColor);
end; Self.FCanUndo := False; //不能进行撤消操作
Result := True; //打开成功
end;//-------------------------我用这种办法关闭,但是不行---------------------------
procedure TCMPlayWave.CloseWaveFile;
begin
if NowPlay <> CPSTOPING then //不是停止状态
Exit;
LocalUnlock(hFormat); //解锁内存
LocalFree(hFormat); //释放音频信息头
mmioClose(hio, 0); //关闭音频输出设备
Self.hio := 0;
Self.DataLength := 0;
FNowPlay := CPNONE; //当前没有状态
end;
解决方案 »
- 如何动态创建TIDTCPserver并为之分配相应的onexecute处理事件?
- 一个业务上面的问题,关于货品的组装和拆卸
- Excel文件导入Access中遇到的重大问题:Excel文件中有一列为“检查时间”....在线等待....在线等待
- 请问RichView部件在那个选项卡利?我怎么找不到啊??另外它的用法和RichEdit部件一样吗??
- 在codelphi.com发布的没一个人能回答的问题!
- 一个TBLOBFIELD的问题?
- 高分求遍历硬盘上所有文件的方法。
- 这是有关internetexpress控件的问题,给100分!
- 大家能不能帮帮忙,介绍一些关于视频捕捉压缩卡的网址以及视频技术方面的网站,项目急需!!
- 关于用DELPHI6的WebSnap开发网络应用程序的讨论
- NTFS类型文件问题:将一个文件设为只读,当别的用户以普通客户身份进入时无法修改此文件
- 不同的ORACLE驱动程序对存储或读取TBlobField有不同的影响?欢迎讨论
begin
if NowPlay <> CPSTOPING then //不是停止状态
Exit;
LocalUnlock(hFormat); //解锁内存
LocalFree(hFormat); //释放音频信息头
mmioClose(hio, 0); //关闭音频输出设备
Self.hio := 0;
Self.DataLength := 0;
FNowPlay := CPNONE; //当前没有状态
sendmessage(handle,wm_close,0,0) //-----------------------------不知道行不行
end;