Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 使用mmio函数读取列表块失败?_Delphi_Winapi_Delphi 7_Wav - Fatal编程技术网

Delphi 使用mmio函数读取列表块失败?

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

这是我读取.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; // 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


您的代码有许多问题:

  • 您没有检查错误
  • 在读取列表之前,您没有为列表分配任何内存
  • 您没有正确读取“列表”块,因为WAV文件中没有“列表”块。您试图读取的是一个列表类型的“信息”块。因此,你必须找到并下降到“信息”块中,根据需要下降到并读取其子块,然后上升回到RIFF块中
  • 当你不应该提升时,你正在提升出“即兴”部分
  • 请尝试以下方法:

    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块,比如存储文件创建日期的块等等。你真是个了不起的人。。