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

Цитата:
Сообщение от poli-smen
Конечное значение переменной i это и будет количество прочитанных сэмплов, т.е. NumSamples.
В каком месте вы считываете конечное значение переменной i? Считывать её нужно в конце этого цикла:
Код:
    sample := 0;
    i := 0;
    while wChankSize >= (SampleSize * Header.wChannels) do
    begin
      if Header.wBlockAlign > 0 then
      begin
        n := f.Position mod Header.wBlockAlign;
        if n > 0 then
        begin
          n := Header.wBlockAlign - n;
          f.Seek(n, soFromCurrent);
          Dec(wChankSize, n);
          if wChankSize < (SampleSize * Header.wChannels) then Break;
        end;
      end;

      Inc(i);
      s1 := '';
      for chanel := 1 to Header.wChannels do
      begin
        f.ReadBuffer(sample, SampleSize);
        Dec(wChankSize, SampleSize);
        s1 := s1 + IntToHex(sample, SampleSize * 2);
      end;
      Form1.Memo1.Lines.Add(s1);
    end;
    exit;
Как раз вместо слова exit. Кстати что это за exit? Откуда он тут взялся? Его здесь быть не должно.

А вот если ещё почитать внимательно справку здесь, то для звука в формате PCM вышеприведённый цикл можно значительно упростить:
Код:
    sample := 0;
    NumSamples := wChankSize div (SampleSize * Header.wChannels);
    for i := 1 to NumSamples do
    begin
      s1 := '';
      for chanel := 1 to Header.wChannels do
      begin
        f.ReadBuffer(sample, SampleSize);
        s1 := s1 + IntToHex(sample, SampleSize * 2);
      end;
      Form1.Memo1.Lines.Add(s1);
    end;
А каким кодом правильнее всего считать I? Что бы уже точно правильно было. Может так:
Код:
s2:=i;
Ответить с цитированием