OSDN Git Service

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