Цитата:
Сообщение от poli-smen
Исходники программы, то я смотрел (Ну той которая в самом первом сообщении здесь прикреплена). Вот только где там попытки прочитать "sample 1, sample 2", которые не читаются и "выводиться 0"? - Нету!
Вот в твоей функции ReadWave (это ведь твоя функция?): - Читаешь заголовок файла и проверяешь, что это действительно RIFF-WAVE-файл
- Ищешь чанк 'fmt', читаешь его и выводишь в Memo1 его содержимое
- Ищешь чанк '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, ведь именно его программа видит в файле, или... и вообще за каким принципом читаются данные?
|