OSDN Git Service

chapter2
[sample-delphi/sample-DELPHI.git] / wav.pas
1 unit wav;
2
3 interface
4
5 uses
6   System.Classes, System.SysUtils;
7
8 {$INCLUDE spWav}
9
10 function readFmtChank(fp: TFileStream; waveFmtPcm: tWaveFormatPcm): integer;
11 function wavHdrRead(wavefile: PChar; var sampRate, sampBits: SmallInt;
12   var posOfData, sizeOfData: Cardinal): integer;
13
14 implementation
15
16 function readFmtChank(fp: TFileStream; waveFmtPcm: tWaveFormatPcm): integer;
17 begin
18   result := 0;
19   try
20     fp.ReadBuffer(waveFmtPcm, SizeOf(tWaveFormatPcm));
21     Writeln('\83f\81[\83^\8c`\8e®\81F', waveFmtPcm.formatTag);
22     Writeln('\83`\83\83\83\93\83l\83\8b\90\94\81F', waveFmtPcm.channels);
23     Writeln('\83T\83\93\83v\83\8a\83\93\83O\8eü\94g\90\94\81F', waveFmtPcm.sampleParSec);
24     Writeln('\83o\83C\83g\90\94\81@/\81@\95b\81F', waveFmtPcm.bytesPerSec);
25     Writeln('\83o\83C\83g\90\94 \82w\83`\83\83\83\93\83l\83\8b\90\94\81F', waveFmtPcm.blockAlign);
26     Writeln('\83r\83b\83g\90\94\81@/\81@\83T\83\93\83v\83\8b\81F', waveFmtPcm.bitsPerSample);
27   except
28     on EReadError do
29       result := -1;
30   end;
31 end;
32
33 function wavHdrRead(wavefile: PChar; var sampRate, sampBits: SmallInt;
34   var posOfData, sizeOfData: Cardinal): integer;
35 var
36   waveFileHeader: SWaveFileHeader;
37   waveFmtPcm: tWaveFormatPcm;
38   chank: tChank;
39   len: integer;
40   fp: TFileStream;
41 begin
42   try
43     fp := TFileStream.Create(wavefile, fmOpenRead);
44     fp.ReadBuffer(waveFileHeader, SizeOf(SWaveFileHeader));
45   except
46     on EReadError do
47     begin
48       Writeln('\93Ç\82Ý\8d\9e\82Ý\8e¸\94s');
49       fp.Free;
50     end;
51     else
52       Writeln('\8aJ\82¯\82Ü\82¹\82ñ');
53     result := -1;
54     Exit;
55   end;
56   Writeln(wavefile);
57   if CompareStr(waveFileHeader.hdrRiff, STR_RIFF) <> 0 then
58   begin
59     Writeln('RIFF\83t\83H\81[\83}\83b\83g\82Å\82È\82¢');
60     result := -1;
61     fp.Free;
62     Exit;
63   end;
64   if CompareStr(waveFileHeader.hdrWave, STR_WAVE) <> 0 then
65   begin
66     Writeln('"WAVE"\82ª\82È\82¢');
67     result := -1;
68     fp.Free;
69     Exit;
70   end;
71   while True do
72   begin
73     try
74       fp.ReadBuffer(chank, SizeOf(tChank));
75     except
76       on EReadError do
77       begin
78         result := 0;
79         fp.Free;
80         break;
81       end;
82     end;
83     if CompareStr(chank.hdrFmtData, STR_fmt) = 0 then
84     begin
85       len := chank.sizeOfFmtData;
86       Writeln('fmt \82Ì\92·\82³', len, '[bytes]');
87       if readFmtChank(fp, waveFmtPcm) <> 0 then
88       begin
89         result := -1;
90         fp.Free;
91         Exit;
92       end;
93       sampRate := waveFmtPcm.sampleParSec;
94       sampBits := waveFmtPcm.bytesPerSec;
95     end
96     else if CompareStr(chank.hdrFmtData, STR_data) = 0 then
97     begin
98       sizeOfData := chank.sizeOfFmtData;
99       Writeln('data\82Ì\92·\82³:', sizeOfData, '[bytes]');
100       posOfData := fp.Position;
101       fp.Seek(sizeOfData - 4, soCurrent);
102       break;
103     end
104     else
105     begin
106       len := chank.sizeOfFmtData;
107       Writeln(chank.hdrFmtData, '\82Ì\92·\82³[bytes]', len);
108       fp.Seek(len, soFromCurrent);
109     end;
110   end;
111   fp.Free;
112   result := 0;
113 end;
114
115 end.