OSDN Git Service

Merge branch 'master' of https://github.com/yamat0jp/wav
[sample-delphi/sample-DELPHI.git] / wav.pas
diff --git a/wav.pas b/wav.pas
index a3d2b56..c765bad 100644 (file)
--- a/wav.pas
+++ b/wav.pas
@@ -3,17 +3,14 @@ unit wav;
 interface
 
 uses
-  System.Classes, System.SysUtils;
+  System.Classes, System.SysUtils, spWav;
 
-{$INCLUDE spWav}
-
-function readFmtChank(fp: TFileStream; waveFmtPcm: tWaveFormatPcm): integer;
-function wavHdrRead(wavefile: PChar; var sampRate, sampBits: SmallInt;
-  var posOfData, sizeOfData: Cardinal): integer;
+function readFmtChank(fp: TFileStream; out waveFmtPcm: tWaveFormatPcm): integer;
+function wavHdrRead(wavefile: PChar; var sp: SpParam): integer;
 
 implementation
 
-function readFmtChank(fp: TFileStream; waveFmtPcm: tWaveFormatPcm): integer;
+function readFmtChank(fp: TFileStream; out waveFmtPcm: tWaveFormatPcm): integer;
 begin
   result := 0;
   try
@@ -22,21 +19,41 @@ begin
     Writeln('\83`\83\83\83\93\83l\83\8b\90\94\81F', waveFmtPcm.channels);
     Writeln('\83T\83\93\83v\83\8a\83\93\83O\8eü\94g\90\94\81F', waveFmtPcm.sampleParSec);
     Writeln('\83o\83C\83g\90\94\81@/\81@\95b\81F', waveFmtPcm.bytesPerSec);
-    Writeln('\83o\83C\83g\90\94 \82w\83`\83\83\83\93\83l\83\8b\90\94\81F', waveFmtPcm.blockAlign);
+    Writeln('\83o\83C\83g\90\94 \82w \83`\83\83\83\93\83l\83\8b\90\94\81F', waveFmtPcm.blockAlign);
     Writeln('\83r\83b\83g\90\94\81@/\81@\83T\83\93\83v\83\8b\81F', waveFmtPcm.bitsPerSample);
+    with waveFmtPcm do
+    begin
+      if channels <> 2 then
+      begin
+        Writeln('\83X\83e\83\8c\83I\83t\83@\83C\83\8b\82ð\91Î\8fÛ\82Æ\82µ\82Ä\82¢\82Ü\82·');
+        Writeln('\83`\83\83\83\93\83l\83\8b\90\94\82Í', channels);
+        result := -1;
+      end;
+      if formatTag <> 1 then
+      begin
+        Writeln('\96³\88³\8fk\82ÌPCM\82Ì\82Ý\91Î\8fÛ');
+        Writeln('\83t\83H\81[\83}\83b\83g\8c`\8e®\82Í', formatTag);
+        result := -1;
+      end;
+      if (bitsPerSample <> 8) and (bitsPerSample <> 16) then
+      begin
+        Writeln('8/16\83r\83b\83g\82Ì\82Ý\91Î\8fÛ');
+        Writeln('bit/sec\82Í', bitsPerSample);
+        result := -1;
+      end;
+    end;
   except
     on EReadError do
       result := -1;
   end;
 end;
 
-function wavHdrRead(wavefile: PChar; var sampRate, sampBits: SmallInt;
-  var posOfData, sizeOfData: LongWord): integer;
+function wavHdrRead(wavefile: PChar; var sp: SpParam): integer;
 var
   waveFileHeader: SWaveFileHeader;
   waveFmtPcm: tWaveFormatPcm;
   chank: tChank;
-  len: integer;
+  fPos, len: integer;
   fp: TFileStream;
 begin
   try
@@ -68,6 +85,8 @@ begin
     fp.Free;
     Exit;
   end;
+  fPos := 0;
+  len := waveFileHeader.sizeOfFile;
   while True do
   begin
     try
@@ -84,27 +103,32 @@ begin
     begin
       len := chank.sizeOfFmtData;
       Writeln('fmt \82Ì\92·\82³', len, '[bytes]');
+      fPos := fp.Position;
       if readFmtChank(fp, waveFmtPcm) <> 0 then
       begin
         result := -1;
         fp.Free;
         Exit;
       end;
-      sampRate := waveFmtPcm.sampleParSec;
-      sampBits := waveFmtPcm.bytesPerSec;
+      sp.samplePerSec := waveFmtPcm.sampleParSec;
+      sp.bitsPerSample := waveFmtPcm.bitsPerSample;
+      sp.channels := waveFmtPcm.channels;
+      sp.bytesPerSec := waveFmtPcm.bytesPerSec;
+      fp.Seek(fPos + len, soFromBeginning);
     end
     else if CompareStr(chank.hdrFmtData, STR_data) = 0 then
     begin
-      sizeOfData := chank.sizeOfFmtData;
-      Writeln('data\82Ì\92·\82³:', sizeOfData, '[bytes]');
-      posOfData := fp.Position;
-      fp.Seek(sizeOfData - 4, soCurrent);
+      sp.sizeOfData := chank.sizeOfFmtData;
+      Writeln('data\82Ì\92·\82³:', sp.sizeOfData, '[bytes]');
+      sp.posOfData := fp.Position;
+      fp.Seek(fPos + len, soFromBeginning);
       break;
     end
     else
     begin
       len := chank.sizeOfFmtData;
       Writeln(chank.hdrFmtData, '\82Ì\92·\82³[bytes]', len);
+      fPos := fp.Position;
       fp.Seek(len, soFromCurrent);
     end;
   end;