Вот наваял пример (будешь должен
):
Код:
var
...
sample: Int64;
SampleSize, chanel, n, i: Integer;
s: String;
...
if Header.wFormatTag<>1 then
begin
Form1.Memo1.Lines.Add('ОШИБКА! Я умею читать wav-файлы только в формате PCM, а этот файл в формате 0x'+IntToHex(Header.wFormatTag, 4));
// Можешь вместо числового значения выдавать текстом взятым например отсюда: http://wiki.multimedia.cx/index.php?title=TwoCC
Exit;
end;
SampleSize:=(Header.wBitsPerSample+7) div 8;
if SampleSize>SizeOf(sample) then
begin
Form1.Memo1.Lines.Add('ОШИБКА! Слишком большой размер сэмпла ('+IntToStr(SampleSize)+' байт)');
Exit;
end;
if Header.wChannels=0 then
begin
Form1.Memo1.Lines.Add('ОШИБКА! Нет каналов');
Exit;
end;
Form1.Memo1.WordWrap:=False;
Form1.Memo1.ScrollBars:=ssBoth;
sample:=0;
i:=0;
while wChankSize>=(SampleSize*Header.wChannels) do
begin
if Header.wBlockAlign>0 then
begin
n:=f.Position mod Header.wBlockAlign;
if n>0 then
begin
f.Seek(wChankSize, soFromCurrent);
Dec(wChankSize, n);
if wChankSize<(SampleSize*Header.wChannels) then Break;
end;
end;
Inc(i);
s:='Сэмпл '+IntToStr(i);
for chanel := 1 to Header.wChannels do
begin
f.ReadBuffer(sample, SampleSize);
Dec(wChankSize, SampleSize);
s:=s+', Канал '+IntToStr(chanel)+': '+IntToHex(sample, SampleSize*2);
end;
Form1.Memo1.Lines.Add(s);
end;
Писал на скорую руку - могут быть ошибки, так что проверяй.
Если и после этого тебе будет не ясно как читать PCM-сэмплы - убью