播放wav文件显示图形的问题, 文件很大为啥WaveOutProc调用很少?

torrentwang 2006-08-04 05:59:18
播放wav显示图形的问题 文件很大为啥WaveOutProc调用很少?

//waveOut
procedure WaveOutProc(waveOut: HWAVEOut; uMsg: UINT; dwInstance, dwParam1, dwParam2: DWORD); stdcall;
begin
case uMsg of
WOM_OPEN:
if (uMsg = MM_WIM_DATA) and (dwInstance <> 0)
and (TObject(dwInstance) is TSkyAudioMeterOut) then
begin
with TSkyAudioMeterOut(TObject(dwInstance)) do begin //这里调用只几次,画不出图形
//....画声波图形;
end;
end;

WOM_CLOSE: ; //TWave(dwInstance).WaveClose(hwo); //关闭wave-form设备
WOM_DONE:
//TWave(dwInstance).WaveFinish(hwo); //wave数据播放完毕
end;
end;


//---wavein
procedure WaveInProc(waveIn: HWAVEIN; uMsg: UINT; dwInstance, dwParam1, dwParam2: DWORD); stdcall;
begin
if (uMsg = MM_WIM_DATA) and (dwInstance <> 0)
and (TObject(dwInstance) is TSkyAudioMeterOut) then
begin
with TSkyAudioMeterOut(TObject(dwInstance)) do begin //这里可以不停被执行 画出图形
//....画声波图形;
end;
end;
end;

...全文
481 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
putao7926 2010-06-24
  • 打赏
  • 举报
回复
等待结果 我也有一样的问题
lvjun 2006-08-10
  • 打赏
  • 举报
回复
大概看了一下代码,太长了,你好像是一次读取文件内容,然后交给播放API是吧,这样的话,一次播放的缓冲可能比较大,你可以试一下,每次只读取一点数据,然后用循环的方式播放,这样就可以实现你的想法了。
torrentwang 2006-08-10
  • 打赏
  • 举报
回复
自己指定每次播放的大小, 但是播放不够流畅 有噪音 ?正在调试程序中
torrentwang 2006-08-09
  • 打赏
  • 举报
回复
有没有人做过相似的工作啊
torrentwang 2006-08-07
  • 打赏
  • 举报
回复
用的是waveoutwrite 下面是完整代码
procedure TSkyAudioMeterOut.PlayWaveSound(const FileName: String);
var
mmioHandle : HMMIO;
mmckInfoParent : MMCKInfo;
mmckInfoSubChunk : MMCKInfo;
dwFmtSize, dwDataSize : DWORD;
pFormat: PWAVEFORMATEX;
ErrorCode: MMRESULT;
begin
//FBusy := True;

mmioHandle := mmioOpen(PChar(FileName),Nil, MMIO_READ or MMIO_ALLOCBUF); //打开wave文件
if mmioHandle = 0 then
begin
WaveError('不能打开文件:' + FileName);
Exit;
end;
try
mmckInfoParent.fccType := mmioStringToFOURCC ('WAVE', 0);
if mmioDescend (mmioHandle, @mmckinfoParent, Nil, MMIO_FINDRIFF) <> MMSYSERR_NOERROR then
begin
WaveError('Wave文件格式错误');
Exit;
end;

mmckinfoSubchunk.ckid := mmioStringToFourCC ('fmt ', 0);
if mmioDescend (mmioHandle, @mmckinfoSubchunk, @mmckinfoParent,MMIO_FINDCHUNK) <> MMSYSERR_NOERROR then
begin
WaveError('Wave文件格式错误');
Exit;
end;

dwFmtSize := mmckinfoSubchunk.cksize;
GetMem (pFormat, dwFmtSize);

try
if DWORD (mmioRead (mmioHandle,PChar(pFormat), dwFmtSize)) <> dwFmtSize then
begin
WaveError('读文件出错');
Exit;
end;

if pFormat^.wFormatTag <> WAVE_FORMAT_PCM then
begin
WaveError('Wave文件格式错误');
Exit;
end;

if waveOutOpen(@FWaveHandle,FDevice,pFormat, 0, 0,WAVE_FORMAT_QUERY) <> MMSYSERR_NOERROR then
begin
WaveError('打开声音设备出错');
Exit;
end;
mmioAscend(mmioHandle, @mmckinfoSubchunk, 0);
mmckinfoSubchunk.ckid := mmioStringToFourCC ('data', 0);
if mmioDescend (mmioHandle, @mmckinfoSubchunk, @mmckinfoParent,MMIO_FINDCHUNK) <> MMSYSERR_NOERROR then
begin
WaveError('无法定位数据块');
Exit;
end;
dwDataSize := mmckinfoSubchunk.cksize;
if dwDataSize = 0 then Exit;


{ if waveOutReset(HWaveHandle) <> MMSYSERR_NOERROR then
begin
// MPostErrorMsg('复位wave设备出错',FWaveOutHandle[DeviceID]);
Exit;
end;
}
//wBlockSize := pFormat^.nBlockAlign;
//ReallocMem (pFormat, 0);

ReallocMem (FData, dwDataSize);

if DWORD(mmioRead(mmioHandle,FData,dwDataSize)) <> dwDataSize then Exit;

GetMem(FWaveHeader,sizeof(WAVEHDR));

FWaveHeader^.lpData := FData;
FWaveHeader^.dwBufferLength := dwDataSize;
FWaveHeader^.dwFlags := 0;
FWaveHeader^.dwLoops := 0;
FWaveHeader^.dwUser := 0;

if FwaveHandle = 0 then
if waveOutOpen (@FWaveHandle,FDevice,pFormat,DWORD(@WaveOutProc),Integer(Self),CALLBACK_FUNCTION) <> MMSYSERR_NOERROR
then
begin
WaveError('打开发声设备出错');
Exit;
end;

//waveOutReset(FWaveHandle);

if waveOutPrepareHeader(FWaveHandle,FWaveHeader,sizeof(WAVEHDR)) <> MMSYSERR_NOERROR then
begin
WaveError('Prepare文件头失败');
Exit;
end;


ErrorCode := waveOutWrite(FWaveHandle,FWaveHeader,sizeof(WAVEHDR));
if ErrorCode <> MMSYSERR_NOERROR then
begin
WaveError('写发声设备出错 ErrorCode:' + IntToStr(ErrorCode));
Exit;
end;
//waveOutPause(FWaveHandle);
//waveOutRestart(FWaveHandle);
//ProcessOutput;

finally
ReallocMem(pFormat, 0)
end;
finally
mmioClose(mmioHandle, 0)
end

end;
FigoZhu 2006-08-07
  • 打赏
  • 举报
回复
你用什么api播放wav的啊?
torrentwang 2006-08-07
  • 打赏
  • 举报
回复
有没有人做过相同的事情?
torrentwang 2006-08-04
  • 打赏
  • 举报
回复
或者说哪个api 可以不断处理播放过程中的声音 以便我可以根据声音数据画出图形

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧