OSDN Git Service

完成
[sample-delphi/sample-DELPHI.git] / WriteHeader.pas
index 7ece02e..fdb97f0 100644 (file)
@@ -2,38 +2,92 @@ unit WriteHeader;
 
 interface
 
-uses System.Classes;
+uses System.Classes, System.SysUtils, spWav;
 
-{$INCLUDE spWav}
-function waveHeaderWrite(fp: TFileStream; sizeOfData: integer; ch: SmallInt;
-  sampRate: Cardinal; sampBits: SmallInt): integer;
+function waveHeaderWrite(fp: TFileStream; const sp: SpParam): integer;
+function wavWrite(inFile, outFile: PChar; const wHdr: WrSWaveFileHeader;
+  var sp: SpParam): integer;
 
 implementation
 
-function waveHeaderWrite(fp: TFileStream; sizeOfData: integer; ch: SmallInt;
-  sampRate: Cardinal; sampBits: SmallInt): integer;
+uses effect;
+
+function waveHeaderWrite(fp: TFileStream; const sp: SpParam): integer;
 var
-  bytes: SmallInt;
+  bytes: Byte;
   wrWavHdr: WrSWaveFileHeader;
   s: tWaveFormatPCM;
 begin
   wrWavHdr.hdrRiff := STR_RIFF;
-  wrWavHdr.sizeOfFile := sizeOfData + SizeOf(WrSWaveFileHeader) - 4;
+  wrWavHdr.sizeOfFile := sp.sizeOfData + SizeOf(WrSWaveFileHeader) - 8;
   wrWavHdr.hdrWave := STR_WAVE;
   wrWavHdr.hdrFmt := STR_fmt;
   wrWavHdr.sizeOfFmt := SizeOf(tWaveFormatPCM);
-  wrWavHdr.stWaveFormat := s;
   s.formatTag := 1;
-  s.channels := ch;
-  s.sampleParSec := sampRate;
-  bytes := sampBits div 8;
-  s.bytesPerSec := bytes * ch * sampRate;
-  s.blockAlign := bytes * ch;
-  s.bytesPerSec := sampBits;
+  s.channels := sp.channels;
+  s.sampleParSec := sp.samplePerSec;
+  bytes := sp.bitsPerSample div 8;
+  s.bytesPerSec := bytes * sp.channels * sp.samplePerSec;
+  s.blockAlign := bytes * sp.channels;
+  s.bitsPerSample := sp.bitsPerSample;
+  wrWavHdr.stWaveFormat := s;
   wrWavHdr.hdrData := STR_data;
-  wrWavHdr.sizeOfData := sizeOfData;
+  wrWavHdr.sizeOfData := sp.sizeOfData;
   fp.WriteBuffer(wrWavHdr, SizeOf(WrSWaveFileHeader));
-  result:=fp.Position;
+  result := fp.Position;
+end;
+
+function wavDataWrite(fpIn, fpOut: TFileStream; const sp: SpParam): integer;
+var
+  pInMem, pOutMem: TMemoryStream;
+begin
+  result := 0;
+  fpIn.Position := sp.sizeOfData;
+  pInMem := TMemoryStream.Create;
+  pOutMem := TMemoryStream.Create;
+  try
+    pInMem.CopyFrom(fpIn, 0);
+    pOutMem.CopyFrom(fpIn, 0);
+    if sp.bitsPerSample = 8 then
+      result := effect8BitWav(pInMem, pOutMem, sp)
+    else
+      result := effect16BitWav(pInMem, pOutMem, sp);
+    fpOut.CopyFrom(pOutMem, 0);
+  except
+    on EReadError do
+      result := -1;
+    on EWriteError do
+      result := -1;
+  end;
+  pInMem.Free;
+  pOutMem.Free;
+end;
+
+function wavWrite(inFile, outFile: PChar; const wHdr: WrSWaveFileHeader;
+  var sp: SpParam): integer;
+var
+  fpIn, fpOut: TFileStream;
+begin
+  result := 0;
+  try
+    fpIn := TFileStream.Create(inFile, fmOpenRead);
+    fpOut := TFileStream.Create(outFile, fmCreate);
+    if wavDataWrite(fpIn, fpOut, sp) = -1 then
+      raise EWriteError.Create('');
+  except
+    on EFOpenError do
+    begin
+      Writeln(outFile, '\82ð\83I\81[\83v\83\93\82Å\82«\82Ü\82¹\82ñ');
+      result := -1;
+    end;
+    on EWriteError do
+    begin
+      Writeln('\83w\83b\83_\82ð\8f\91\82«\8d\9e\82ß\82Ü\82¹\82ñ');
+      result := -1;
+    end;
+  end;
+  fpIn.Free;
+  fpOut.Free;
 end;
 
 end.