Type
TPCMWaveHeader = record
rID : array[0..3] of char; { ''RIFF'' Identifier }
rLen : longint;
wID : array[0..3] of char; { ''WAVE'' Identifier }
fId : array[0..3] of char; { ''fmt '' Identifier }
fLen : longint; { Fixed, must be 16 }
wFormatTag : word; { Fixed, must be 1 }
nChannels : word; { Mono=1, Stereo=2 }
nSamplesPerSec : longint; { SampleRate in Hertz }
nAvgBytesPerSec : longint;
nBlockAlign : word;
nBitsPerSample : word; { Resolution, e.g. 8 or 16 }
dId : array[0..3]of char; { ''data'' Identifier }
dLen : longint; { Number of following data bytes }
end;
procedure WritePCMWaveFile(Filename : string; Resolution, Channels, Samplerate, Samples : integer; Data : Pointer);
var h : TPCMWaveHeader;
f : file;
databytes : integer;
begin
DataBytes:=Samples;
DataBytes:=DataBytes*Channels; { double if stereo }
DataBytes:=DataBytes*(Resolution div 8); { double if 16 Bit }
FillChar(h,SizeOf(TPCMWaveHeader),#0);
with h do
begin
rID[0]:=''R'';
rID:=''I'';
rID:=''F'';
rID:=''F''; { 1st identifier }
rLen:=DataBytes+36;
wID[0]:=''W'';
wID:=''A'';
wID:=''V'';
wID:=''E''; { 2nd identifier }
fId[0]:=''f'';
fId:=''m'';
fId:=''t'';
fID:=Chr($20); { 3rdidentifier ends with a space character }
fLen:=$10; { Fixed, must be 16 }
wFormatTag:=1; { Fixed, must be 1 }
nChannels:=Channels; { Channels }
nSamplesPerSec:=SampleRate; { Sample rate in Hertz }
nAvgBytesPerSec:=SampleRate*Channels*trunc(Resolution div 8);
nBlockAlign:=Channels*(Resolution div 8); { Byte order, see below }
nBitsPerSample:=Resolution;
dId[0]:=''d'';
dId:=''a'';
dId:=''t'';
dId:=''a''; { Data identifier }
dLen:=DataBytes; { number of following data bytes }
end;
AssignFile(f,filename);
ReWrite(f,1);
BlockWrite(f,h,SizeOf(h));
BlockWr