poli-smen, я все сделал и у меня все работает, как я хотел. Но в то время пока я занимался медиаплеером и графиками, (по чистой случайности заметил), перестала работать ЗАПИСЬ нового wav. Причину я, скорее всего, вычислил. Это идентификатор NumSamples. Он стал находится в
Код:
TWavInfo = record
WaveFormat: TWaveFormat;
NumSamples: Integer;
MaxAmplitude: Integer;
Samples: packed array of array of Smallint;
end;
Я так понял это нужно для построения графика. Но перестала работать запись, просто кнопка не работает.
Я заметил в процедуре чтения эту новую строчку:
Код:
WavInfo.NumSamples := LongInt(NumSamples);
Код записи:
Код:
procedure WriteWav(const FileName: string; const WavInfo: TWavInfo);
type
TChunkID = packed array[0..3] of Char;
THeader = packed record
ChunkID: TChunkID;
ChunkSize: Longword;
Format: TChunkID;
Subchunk1ID: TChunkID;
Subchunk1Size: Longword;
AudioFormat: Word;
NumChannels: Word;
SampleRate: Longword;
ByteRate: Longword;
BlockAlign: Word;
BitsPerSample: Word;
Subchunk2ID: TChunkID;
Subchunk2Size: Longword;
end;
var
Header: THeader;
NumSamples, BytsPerSample, I, J: Longword;
fs: TFileStream;
begin
NumSamples := LongInt(NumSamples); //это я изменил, думал поможет, нет!
BytsPerSample := WavInfo.WaveFormat.wBitsPerSample div 8;
Header.ChunkID := 'RIFF';
Header.Format := 'WAVE';
Header.Subchunk1ID := 'fmt ';
Header.Subchunk1Size := 16;
Header.AudioFormat := WAVE_FORMAT_PCM;
Header.NumChannels := WavInfo.WaveFormat.nChannels;
Header.SampleRate := WavInfo.WaveFormat.nSamplesPerSec;
Header.BitsPerSample := BytsPerSample * 8;
Header.BlockAlign := Header.NumChannels * BytsPerSample;
Header.ByteRate := Header.SampleRate * Header.BlockAlign;
Header.Subchunk2ID := 'data';
Header.Subchunk2Size := NumSamples * Header.BlockAlign;
Header.ChunkSize := Header.Subchunk2Size + SizeOf(Header) - 8;
fs := TFileStream.Create(FileName, fmCreate);
try
fs.WriteBuffer(Header, SizeOf(Header));
for I := 1 to NumSamples do
begin
for J := 1 to Header.NumChannels do
begin
fs.WriteBuffer(WavInfo.Samples[I - 1, J - 1], BytsPerSample);
end;
end;
finally
fs.Free;
end;
end;
procedure TForm1.Button4Click{это кнопка записи}(Sender: TObject);
begin
if WavInfo.WaveFormat.wFormatTag = WAVE_FORMAT_PCM then
begin
if SaveDialog2.Execute then
begin
WriteWav(SaveDialog2.FileName, WavInfo);
end;
end;
end;
Как можно исправить?
А еще меня все время интересовал вопрос: что выполняет эта строчка в процедуре чтения?
Код:
SetLength(WavInfo.Samples, WavInfo.WaveFormat.nChannels, NumSamples);