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

Цитата:
Сообщение от poli-smen
Исходники программы, то я смотрел (Ну той которая в самом первом сообщении здесь прикреплена). Вот только где там попытки прочитать "sample 1, sample 2", которые не читаются и "выводиться 0"? - Нету!

Вот в твоей функции ReadWave (это ведь твоя функция?):
  1. Читаешь заголовок файла и проверяешь, что это действительно RIFF-WAVE-файл
  2. Ищешь чанк 'fmt', читаешь его и выводишь в Memo1 его содержимое
  3. Ищешь чанк 'data' и... выходишь из функции...
А зачем ты выходишь из функции? Самое время читать эти самые "sample 1, sample 2". Чтото типа:
Код:
f.ReadBuffer(sample, SampleSize);

И не забывай освобождать объект в переменной f (Вот попробуй дважды открыть один и тот же wav-файл).
Я попробовал что-то сделать, но не получается ввести в программу sample и SampleSize, выдаются ошибки, типа тип не описан, но я ведь его описал. Вот код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, sSkinManager, ImgList, Inifiles;


Const
  noError            = 0;
  ReadError          = 1;
  HeaderError        = 2;
  DataError          = 3;
  FileCorrupt        = 4;
  IncorectFileFormat = 5;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    N12: TMenuItem;
    sSkinManager1: TsSkinManager;
    ImageList1: TImageList;

    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure N9Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure N11Click(Sender: TObject);
    procedure N12Click(Sender: TObject);


  private
    { Private declarations }
  public
    { Public declarations }
end;
  TWaveHeaderChank = record
    wFormatTag     : Smallint;
    wChannels      : WORD;
    wSamplesPerSec : Cardinal;
    wAvgBytesPerSec: Cardinal;
    wBlockAlign    : WORD;
    wBitsPerSample : WORD;
    wcbSize        : WORD;

  end;

  TWaveResult = record
    ERROR          : WORD;
    wAvgBytesPerSec: Cardinal;
    wBitsPerSample : WORD;
    wChannels      : WORD;
    Data           : TMemoryStream;
    Sample         : WORD;
  end;

var
  Form1: TForm1;
  TxtFile : TextFile;
  i : integer;
  Ini:Tinifile;
  language:string;
implementation

{$R *.dfm}
{$R WindowsXP.res}

uses math, Unit2;

Function ReadWave(FileName : AnsiString) : TWaveResult;
var
  f             : TFileStream;
  wFileSize     : Cardinal;
  wChankSize    : Cardinal;
  wSampleSize   : Cardinal;
  ID            : array[0..3] of Char;
  Header        : TWaveHeaderChank;

Begin
  FillChar(Result, SizeOf(Result), 0);

  Try
    f := TFileStream.Create(FileName, fmOpenRead);
    f.Seek(0, soFromBeginning);
    f.ReadBuffer(ID[0], 4);
  If String(ID) <> 'RIFF'
    then
      Begin
        Result.ERROR := IncorectFileFormat;



        exit;
      end;
  Form1.memo1.Lines.Add(String(ID));

     f.ReadBuffer(wFileSize, 4);

      Form1.memo1.Lines.Add('' + intToStr(wFileSize));

    if f.size <> (wFileSize + 8)
    then
      Begin
        Result.ERROR := FileCorrupt;



        exit;
      end;

    f.ReadBuffer(ID[0], 4);

      Form1.memo1.Lines.Add(String(ID));

    if String(ID) <> 'WAVE'
    then
      Begin
        Result.ERROR := IncorectFileFormat;



        exit;
      end;

    wChankSize := 0;
    repeat
      f.Seek(wChankSize, soFromCurrent);
      f.ReadBuffer(ID[0], 4);


        Form1.memo1.Lines.Add(String(ID));
      f.ReadBuffer(wChankSize, 4);

      if wChankSize > High(integer)
      then
        Begin
          Result.ERROR := DataError;



          exit;
        end;

        Form1.memo1.Lines.Add('' + intToStr(wChankSize));
    until  (String(ID)='fmt ') or (String(ID)='data');

    if String(ID)='data'
    then
      Begin
        Result.ERROR := HeaderError;

//Попытка считать хоть один Сэмпл//

       f.ReadBuffer(wSampleSize, );
       Form1.memo1.Lines.Add(''   + intToStr(Sample.wSampleSize));
        exit;
      end;



    f.ReadBuffer(Header, Min(wChankSize, SizeOf(TWaveHeaderChank)));

      Form1.memo1.Lines.Add(''   + intToStr(Header.wFormatTag));
      Form1.memo1.Lines.Add(''   + intToStr(Header.wChannels));
      Form1.memo1.Lines.Add(''   + intToStr(Header.wSamplesPerSec));
      Form1.memo1.Lines.Add(''   + intToStr(Header.wAvgBytesPerSec));
      Form1.memo1.Lines.Add(''   + intToStr(Header.wBlockAlign));
      Form1.memo1.Lines.Add(''   + intToStr(Header.wBitsPerSample));

    if wChankSize > SizeOf(TWaveHeaderChank)
    then
      f.Seek(wChankSize - SizeOf(TWaveHeaderChank), soFromCurrent);

    if wChankSize >= SizeOf(TWaveHeaderChank)
    then

        Form1.memo1.Lines.Add('wcbSize '        + intToStr(Header.wcbSize));

    wChankSize := 0;
    repeat
      f.Seek(wChankSize, soFromCurrent);
      f.ReadBuffer(ID[0], 4);

        Form1.memo1.Lines.Add(String(ID));
      f.ReadBuffer(wChankSize, 4);

        Form1.memo1.Lines.Add(''    + intToStr(wChankSize));
    until  String(ID)='data';

Except
    Result.ERROR := ReadError;
  end;
end;




procedure  TForm1.Button1Click(Sender: TObject);
var
  r : TWaveResult;
begin
  if opendialog1.Execute
  then
    r := ReadWave(opendialog1.FileName);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if SaveDialog1.Execute then
Form1.Memo1.Lines.SaveToFile(Form1.SaveDialog1.FileName + '.txt');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Memo1.Clear;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
Ini := TIniFile.Create(ExtractFilePath(paramstr(0))+'options.ini');
language:=Ini.ReadString('Language','CurrentLang','');
Ini.Free;
Ini := TIniFile.Create(ExtractFilePath(paramstr(0))+'/Language/'+language+'.lng');

Form1.Caption:=Ini.ReadString('TForm1','Read Information From WAV','');
Form2.Caption:=Ini.ReadString('TForm2','About','');
N1.Caption:=Ini.ReadString('TForm1','File','');
N2.Caption:=Ini.ReadString('TForm1','Open','');
N3.Caption:=Ini.ReadString('TForm1','Exit','');
N4.Caption:=Ini.ReadString('TForm1','Help','');
N5.Caption:=Ini.ReadString('TForm1','About...','');
N6.Caption:=Ini.ReadString('TForm1','Save','');
N7.Caption:=Ini.ReadString('TForm1','Language','');
N8.Caption:=Ini.ReadString('TForm1','Russian','');
N9.Caption:=Ini.ReadString('TForm1','English','');
N10.Caption:=Ini.ReadString('TForm1','Ukrainian','');
N11.Caption:=Ini.ReadString('TForm1','French','');
N12.Caption:=Ini.ReadString('TForm1','German','');
Button1.Caption:=Ini.ReadString('TForm1','Open WAV file','');
Button2.Caption:=Ini.ReadString('TForm1','Save the values in TXT file','');
Button3.Caption:=Ini.ReadString('TForm1','Clear','');
Ini.Free;
end;


procedure TForm1.N2Click(Sender: TObject);
begin
button1.OnClick(self);
end;
procedure TForm1.N3Click(Sender: TObject);
begin
Form1.Close;
end;
procedure TForm1.N5Click(Sender: TObject);
begin
AnimateWindow(form2.Handle, 500, aw_blend);
Form2.Show;
end;
procedure TForm1.N6Click(Sender: TObject);
begin
if SaveDialog1.Execute then
Form1.Memo1.Lines.SaveToFile(Form1.SaveDialog1.FileName + '.txt');
end;
procedure TForm1.N8Click(Sender: TObject);
begin
Ini := TIniFile.Create(ExtractFilePath(paramstr(0))+'options.ini');
 Ini.WriteString('Language','CurrentLang','russian');
 Ini.Free;
 FormShow(Self);
end;
procedure TForm1.N9Click(Sender: TObject);
begin
 Ini := TIniFile.Create(ExtractFilePath(paramstr(0))+'options.ini');
 Ini.WriteString('Language','CurrentLang','english');
 Ini.Free;
 FormShow(Self);
end;
procedure TForm1.N10Click(Sender: TObject);
begin
 Ini := TIniFile.Create(ExtractFilePath(paramstr(0))+'options.ini');
 Ini.WriteString('Language','CurrentLang','ukrainian');
 Ini.Free;
 FormShow(Self);
end;
procedure TForm1.N11Click(Sender: TObject);
begin
 Ini := TIniFile.Create(ExtractFilePath(paramstr(0))+'options.ini');
 Ini.WriteString('Language','CurrentLang','french');
 Ini.Free;
 FormShow(Self);
end;
procedure TForm1.N12Click(Sender: TObject);
begin
 Ini := TIniFile.Create(ExtractFilePath(paramstr(0))+'options.ini');
 Ini.WriteString('Language','CurrentLang','german');
 Ini.Free;
 FormShow(Self);
end;
end.
Что тут не так. И еще одно: тип должен быть именно Sample, ведь именно его программа видит в файле, или... и вообще за каким принципом читаются данные?
Ответить с цитированием