Это часть моего кода для чтения файла .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);
И это работало просто идеально, пока я не понял, что пропустил кусок LIST, где мне удалось получить только «LIST». Вот пример файла до того, как я прочитал и запишу его обратно, и есть фрагмент списка и его данные
И вот после того, как я прочитаю и запишу его обратно
Часть, которую я пометил, ушла. Так что, если кто-нибудь знает, в чем моя ошибка, пожалуйста, помогите мне
РЕДАКТИРОВАТЬ 1
1 ответ
С вашим кодом много проблем:
- Вы не проверяете ошибки.
- Вы не выделяете памяти для списка перед его чтением.
- В любом случае вы неправильно читаете блок «LIST», потому что в файлах WAV изначально нет блока «LIST». Вы пытаетесь прочитать блок «ИНФОРМАЦИЯ» типа LIST. Таким образом, вы должны найти и спуститься в блок «INFO», при необходимости спуститься и прочитать его суб-блоки, а затем вернуться обратно в блок RIFF.
- Вы поднимаетесь из чанка «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;
Похожие вопросы
Новые вопросы
delphi
Delphi - это язык для быстрой разработки собственных приложений для Windows, macOS, Linux, iOS и Android с использованием Object Pascal. Название относится к языку Delphi, а также к его библиотекам, компилятору и IDE, которые используются для помощи в редактировании и отладке проектов Delphi.