Итак, приступлю.
Определим сначала с чем мы будем иметь дело:
Исходный файл: wav(потом что-нить другое добавлю)
Цель: Загрузить файл в прогу.
Код:
//Тип, описывающий формат:
type TWaveHeader = record//будет заголовок нашего файла
ChunkRiff: array [0..3] of char;//'RIFF'
RiffLen: longint;
ChunkWave: array [0..3] of char;//'WAVE'
ChunkFmt: array [0..3] of char; //'fmt '
InfoLen: longint;
WaveType: smallint;//(1=pcm) метод сжатия
Ch: smallint;
Freq: longint;
BytesPerSec: longint;
align: smallint;
Bits: smallint;
end;
type TWaveHeaderData = record
ChunkData: array[0..3] of char;//'data'
DataLen: longint;
end;
тут такое дело. Можно было бы поместить всё в одном типе, но заголовки wav файлов различны. Поэтому желательно разделить эти части на две. Далее будет понятно, почему.
var main: TMain;
WavFile,WavMemory:TStream;
Hdr:TWaveHeader;
hdrd:TWaveHeaderData;
Procedure OpenWavFile(FileName:String);
var n: integer;
begin
WavFile:=TFileStream.Create(filename,fmOpenRead,fmShareDenyNone);
WavMemory:=TMemoryStream.Create;
WavMemory.CopyFrom(WavFile,WavFile.Size);
WavFile.Free;
WavMemory.Position:=0;
WavMemory.Read(Hdr,sizeof(hdr)); // читаем заголовок
WavMemory.Position:=0;
wavmemory.Read(hdrd,sizeof(hdrd));
n:=wavmemory.Position;
while hdrd.idData<>'data' do begin
n:=n+1;
wavmemory.Position:=n-4;
wavmemory.Read(hdrd,sizeof(hdrd));
if wavmemory.Position>1024 then begin //вот тут заминочка, пока не решил...
ShowMessage('Неподдерживаемый формат файла!');
WavMemory.Free;
exit;
end
end;
end;
procedure Tmain.openfileClick(Sender: TObject);
begin
if opendialog1.Execute then
openWavFile(opendialog1.FileName);
end;
Admin: Пользуемся тегами!
Фсё! Данные файла успешно заносятся в поток!
Люди, не спите, подключайтесь!!!
