OSDN Git Service

微調整
[sample-delphi/sample-DELPHI.git] / wav_proj.dpr
1 program wav_proj;
2
3 {$APPTYPE CONSOLE}
4 {$R *.res}
5
6 uses
7   System.SysUtils,
8   System.Classes,
9   wav in 'wav.pas',
10   WriteHeader in 'WriteHeader.pas',
11   spWav in 'spWav.pas';
12
13 function cut(fpIn, fpOut: TFileStream; sp: SpParam): integer;
14 var
15   Buffer: array of ShortInt;
16   size: integer;
17 begin
18   result := 0;
19   size := (sp.endpos - sp.startpos + 1) * sp.channels * sp.samplePerSec *
20     sp.bitsPerSample div 8;
21   SetLength(Buffer, size);
22   try
23     fpIn.ReadBuffer(Pointer(Buffer)^, size);
24     fpOut.WriteBuffer(Pointer(Buffer)^, size);
25     Finalize(Buffer);
26   except
27     result := -1;
28   end;
29 end;
30
31 function checkRange(var sp: SpParam): integer;
32 begin
33   result := 0;
34   if sp.startpos * sp.bytesPerSec > sp.sizeOfData then
35   begin
36     Writeln('\8aJ\8en\88Ê\92u\82ª\83t\83@\83C\83\8b\83T\83C\83Y\82ð\92´\82¦\82Ä\82¢\82Ü\82·');
37     result := -1;
38   end
39   else if (sp.endpos + 1) * sp.bytesPerSec > sp.sizeOfData then
40   begin
41     Writeln('\8fI\97¹\88Ê\92u\82ª\83t\83@\83C\83\8b\83T\83C\83Y\82ð\92´\82¦\82Ä\82¢\82Ü\82·');
42     Writeln('\8fI\97¹\82ð\83t\83@\83C\83\8b\82Ì\8dÅ\8cã\82É\92²\90®\82µ\82Ü\82µ\82½');
43     sp.endpos := (sp.sizeOfData div sp.bytesPerSec) - 1;
44   end;
45 end;
46
47 function wavDataWrite(fpIn, fpOut: TFileStream; const sp: SpParam): integer;
48 begin
49   fpIn.Position := sp.posOfData;
50   result := cut(fpIn, fpOut, sp);
51 end;
52
53 function wavWrite(inFile, outFile: PChar; var sp: SpParam): integer;
54 var
55   fpIn, fpOut: TFileStream;
56 begin
57   try
58     fpIn := TFileStream.Create(inFile, fmOpenRead);
59     fpOut := TFileStream.Create(outFile, fmCreate);
60     sp.sizeOfData := (sp.endpos - sp.startpos + 1) * sp.bytesPerSec;
61     if waveHeaderWrite(fpOut, sp) > 44 then
62       raise EWriteError.Create('\83w\83b\83_\82ð\8f\91\82«\8d\9e\82ß\82Ü\82¹\82ñ');
63     if wavDataWrite(fpIn, fpOut, sp) = -1 then
64       raise EWriteError.Create('\83G\83\89\81[\94­\90¶');
65   except
66     on EFOpenError do
67       Writeln(inFile, '\82ð\83I\81[\83v\83\93\82Å\82«\82Ü\82¹\82ñ');
68     on EFOpenError do
69       fpIn.Free;
70     else
71
72     begin
73       fpIn.Free;
74       fpOut.Free;
75     end;
76     result := -1;
77     Exit;
78   end;
79   result := 0;
80 end;
81
82 var
83   sp: SpParam;
84
85 begin
86   try
87     { TODO -oUser -cConsole \83\81\83C\83\93 : \82±\82±\82É\83R\81[\83h\82ð\8bL\8fq\82µ\82Ä\82­\82¾\82³\82¢ }
88     sp.startpos := StrToInt(ParamStr(3));
89     sp.endpos := StrToInt(ParamStr(4));
90     if sp.startpos > sp.endpos then
91     begin
92       Writeln('\8aJ\8en\95b\82Í\8fI\97¹\95b\82ð\92´\82¦\82Ä\82Í\82È\82è\82Ü\82¹\82ñ');
93       Exit;
94     end;
95     if wavHdrRead(PChar(ParamStr(1)), sp) = -1 then
96       Exit;
97     if wavWrite(PChar(ParamStr(1)), PChar(ParamStr(2)), sp) = -1 then
98       Exit;
99     Writeln('\8a®\97¹');
100   except
101     on E: Exception do
102       Writeln(E.ClassName, ': ', E.Message);
103   end;
104
105 end.