Delphi 使用mmio函数读取列表块失败?
这是我读取.wav文件代码的一部分Delphi 使用mmio函数读取列表块失败?,delphi,winapi,delphi-7,wav,Delphi,Winapi,Delphi 7,Wav,这是我读取.wav文件代码的一部分 //Variable wavehdr:TWaveHeader; ckiRIFF,ckiFmt,ckiData,ckiLIST: TMMCKInfo; mmioinfo: PMMIOInfo; waveFmt: TWaveFormatEx; buf: Array of smallint; buf_recon: Array of double; list:Array of longint; // TH
//Variable
wavehdr:TWaveHeader;
ckiRIFF,ckiFmt,ckiData,ckiLIST: TMMCKInfo;
mmioinfo: PMMIOInfo;
waveFmt: TWaveFormatEx;
buf: Array of smallint;
buf_recon: Array of double;
list:Array of longint; // THIS IS MY GUESS so it's definetly not work
HMMIO: hFile;
//Locate the "RIFF" chunk
ckiRIFF.fccType := mmioStringToFOURCC('WAVE',0);
mmioDescend(HMMIO, @ckiRIFF, nil, MMIO_FINDRIFF);
mmioAscend(HMMIO, @ckiRIFF, MMIO_FINDRIFF);
//Locate the "FMT" subchunk
ckiFmt.ckid := mmioStringToFOURCC('fmt', 0);
mmioDescend(HMMIO, @ckiFmt, nil, MMIO_FINDCHUNK);
mmioRead(HMMIO, @waveFmt, ckiFmt.cksize);
mmioAscend(HMMIO, @ckiFmt, 0);
//Locate the "LIST" chunk (THIS PART IS NOT WORK)
ckiLIST.fccType := mmioStringToFOURCC('LIST',0);
mmioDescend(HMMIO, @ckiLIST, nil, MMIO_FINDLIST);
mmioRead(HMMIO, @list, ckiLIST.cksize);
mmioAscend(HMMIO, @ckiFmt, 0);
//Locate the "data" subchunk
ckiData.ckid := mmioStringToFOURCC('data', 0);
if (mmioDescend(HMMIO, @ckiData, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR) then begin
SetLength(buf, ckiData.cksize);
mmioRead(HMMIO, PAnsiChar(buf), ckiData.cksize);
它工作得非常完美,直到我意识到我错过了列表块,在那里我只能得到“列表”。这里是一个文件的例子,在我读写它之前,有一个列表块和它的数据
这是我读过并写回的
我标记的部分不见了。如果有人知道我的错误,请帮助我
编辑1
您的代码有许多问题:
var
wavehdr: TWaveHeader;
ckiRIFF, ckiFmt, ckiData, ckiLIST, ckiINAM: TMMCKInfo;
mmioinfo: PMMIOInfo;
waveFmt: TWaveFormatEx;
buf: Array of smallint;
buf_recon: Array of double;
HMMIO: hFile;
begin
...
//Locate the "RIFF" chunk
ckiRIFF.fccType := mmioStringToFOURCC('WAVE',0);
if mmioDescend(HMMIO, @ckiRIFF, nil, MMIO_FINDRIFF) = 0 then
begin
//Locate the "FMT" subchunk
ZeroMemory(@waveFmt, SizeOf(waveFmt));
ckiFmt.ckid := mmioStringToFOURCC('fmt', 0);
if mmioDescend(HMMIO, @ckiFmt, @ckiRIFF, MMIO_FINDCHUNK) = 0 then
begin
// technically, you should use a dynamic-length buffer instead of a static buffer
mmioRead(HMMIO, @waveFmt, ckiFmt.cksize);
mmioAscend(HMMIO, @ckiFmt, 0);
end;
//Locate the "INFO" chunk
ckiLIST.fccType := mmioStringToFOURCC('INFO', 0);
if mmioDescend(HMMIO, @ckiLIST, @ckiRIFF, MMIO_FINDLIST) = 0 then
begin
//Locate the "INAM" chunk
ckiINAM.fccType := mmioStringToFOURCC('INAM', 0);
if mmioDescend(HMMIO, @ckiINAM, @ckiLIST, MMIO_FINDCHUNK) = 0 then
begin
// read chunk data as needed...
mmioAscend(HMMIO, @ckiINAM, 0);
end;
mmioAscend(HMMIO, @ckiLIST, 0);
end;
//Locate the "data" subchunk
ckiData.ckid := mmioStringToFOURCC('data', 0);
if (mmioDescend(HMMIO, @ckiData, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR) then
begin
SetLength(buf, ckiData.cksize);
mmioRead(HMMIO, PAnsiChar(buf), ckiData.cksize);
mmioAscend(HMMIO, @ckiData, 0);
end;
...
end;
...
end;
我听从了你的建议,但结果是这样的:编辑1看起来我遗漏了什么,这部分//根据需要读取块数据。。。我应该使用mmioRead(HMMIO,@inam,ckiINAM.cksize)?我需要什么变量来存储它?好吧,多亏了你,我才算出来。我仍然在挖掘它,因为不是所有的wav文件都有INAM块,而且有些可能有超过INAM块,比如存储文件创建日期的块等等。你真是个了不起的人。。