OSDN Git Service

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