Показать сообщение отдельно
  #38  
Старый 30.08.2012, 20:25
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

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);
Ответить с цитированием