PvP, вы немного напутали с форматом файла, дело в том, что ваше последнее поле DataBytes как раз и есть размер данных wav файла. А вот второе поле BytesFollowing это размер всего файла (или что-то другое, точно не помню уже). Попробуйте сделать как я написал. А вот за размер блока данных отвечает поле Block Align, которого у вас нет, точнее есть, но почему-то называется BytesPerSample.
UPD Вот посидел чуток, все работает. Обработку ошибок сами сделаете.
Код:
type
TWaveHeader = record
Marker1 : array [0..3] of Char;
BytesFollowing : LongInt;
Marker2 : Array[0..3] of Char;
Marker3 : Array[0..3] of Char;
Fixed1 : LongInt;
FormatTag : Word;
Channels : Word;
SampleRate : LongInt;
BytesPerSecond : LongInt;
BlockAlign : Word;
BitsPerSample : Word;
Marker4 : Array[0..3] of Char;
DataBytes : LongInt;
end;
procedure JoinWAVEFiles(FileIn1, FileIn2, FileOut : String);
var
f1, f2, fo : TFileStream;
h1, h2, ho : TWaveHeader;
begin
f1 := TFileStream.Create(FileIn1, fmOpenRead);
f2 := TFileStream.Create(FileIn2, fmOpenRead);
f1.Read(h1, SizeOf(h1));
f2.Read(h2, SizeOf(h2));
if (h1.Channels = h2.Channels) and
(h1.SampleRate = h2.SampleRate) and
(h1.BitsPerSample = h2.BitsPerSample) then begin
ho := h1;
ho.BytesFollowing := h1.BytesFollowing + h2.DataBytes;
ho.DataBytes := h1.DataBytes + h2.DataBytes;
fo := TFileStream.Create(FileOut, fmCreate);
fo.Write(ho, SizeOf(ho));
{ f1.Position := SizeOf(h1);
f2.Position := SizeOf(h2); } как-то не обратил внимания, что эти строки можно убрать.
fo.CopyFrom(f1, h1.DataBytes);
fo.CopyFrom(f2, h2.DataBytes);
fo.Free;
end;
f1.Free;
f2.Free;
end;