home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Personal Computer World 1995 May
/
pcw-0595.bin
/
demos
/
databeck
/
wsounds
/
setup.dir
/
wswsrc.exe
/
WAVEUTIL.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1992-11-02
|
4KB
|
168 lines
Unit WaveUtil;
Interface
Uses WinCrt, WinDos, WObjects, Strings;
TYPE
FourCC = Array[0..3] OF CHAR;
ChunkSize = Array[0..3] OF Byte;
CK = RECORD
ckId : FourCC;
ckSize : ChunkSize;
END;
FUNCTION WAVCalcSize(MSize : ChunkSize): LongInt;
FUNCTION WAVCheckType(VAR F : TDosStream) : BOOLEAN;
FUNCTION WAVNextChunk(VAR F : TDosStream; VAR Name : FourCC) : BOOLEAN;
FUNCTION WAVskip2fmtChunk(VAR F : TDosStream; VAR Name : FourCC) : BOOLEAN;
FUNCTION WAVOpenFile(VAR F : TDosStream; Name : PChar) : BOOLEAN;
FUNCTION WAVGetInfo(VAR F : TDosStream; VAR SRate : WORD; VAR NChan : Byte) : BOOLEAN;
PROCEDURE WAVCloseFile(VAR F : TDosStream);
PROCEDURE WAVReadPrint(VAR F:TDosStream);
FUNCTION WAVExists(Name : PChar) : BOOLEAN;
IMPLEMENTATION
VAR
F : TDosStream;
FUNCTION WAVExists(Name : PChar) : BOOLEAN;
VAR
F : TDosStream;
BEGIN
(*
{$I-}
F.Init(Name, stOpenRead);
{$I+}
*)
F.Init(Name, stOpenRead);
IF F.Status = stOk THEN BEGIN
WAVExists := TRUE;
F.Done;
END
ELSE WAVExists := FALSE;
F.Done;
END;
FUNCTION WAVCalcSize(MSize : ChunkSize): LongInt;
{
* INPUT : 32-bit number as 4-byte array
* OUTPUT : True 32-bit value as LongInt
* PURPOSE : Converts the 32-bit value for WAV file
* to a true 32-bit LongInt value
}
VAR
Power : REAL;
Dummy : LongInt;
Count : BYTE;
BEGIN
Dummy := 0;
FOR Count := 0 TO 3 DO BEGIN
Power := Exp(Count * Ln(256));
Dummy := Dummy + (Trunc(Power)*MSize[Count]);
END;
WAVCalcSize := Dummy;
END;
FUNCTION WAVCheckType(VAR F : TDosStream) : BOOLEAN;
VAR
Check : FourCC;
CurPos : LongInt;
BEGIN
F.Read(Check,SizeOf(Check));
IF StrLComp(Check,'RIFF',4) = 0 THEN BEGIN
CurPos := F.GetPos;
F.Seek(CurPos+4);
F.Read(Check, SizeOf(Check));
IF StrLComp(Check,'WAVE',4) = 0 THEN WAVCheckType := TRUE
ELSE WAVCheckType := FALSE;
END
ELSE WAVCheckType := FALSE;
END;
FUNCTION WAVNextChunk(VAR F : TDosStream; VAR Name : FourCC) : BOOLEAN;
VAR
CSize : ChunkSize;
BEGIN
F.Read(Name, SizeOf(Name));
IF (F.Status <> stOK) THEN BEGIN
WAVNextChunk := False;
Exit;
END;
IF ((StrLComp(Name,'RIFF',4) <> 0) AND
(StrLComp(Name,'fmt ',4) <> 0) AND
(StrLComp(Name,'data',4) <> 0))THEN BEGIN
F.Read(CSize, SizeOf(CSize));
F.Seek(F.GetPos+WAVCalcSize(CSize));
IF (WavNextChunk(F, Name) = FALSE) THEN WAVNextChunk := False;
END
ELSE WAVNextChunk := TRUE;
END;
FUNCTION WAVskip2fmtChunk(VAR F : TDosStream; VAR Name : FourCC) : BOOLEAN;
VAR
CSize : ChunkSize;
BEGIN
F.Read(Name, SizeOf(Name));
IF (F.Status <> stOK) THEN BEGIN
WAVSkip2fmtChunk := False;
Exit;
END;
IF ((StrLComp(Name,'fmt ',4) <> 0))THEN BEGIN
F.Read(CSize, SizeOf(CSize));
F.Seek(F.GetPos+WAVCalcSize(CSize));
IF (WavSkip2fmtChunk(F, Name) = FALSE) THEN WAVSkip2fmtChunk := False;
END
ELSE WAVSkip2fmtChunk := TRUE;
END;
FUNCTION WAVOpenFile(VAR F : TDosStream; Name : PChar) : BOOLEAN;
BEGIN
IF WAVExists(Name) THEN BEGIN
F.Init(Name,stOpenRead);
if F.Status = stOk THEN BEGIN
IF WAVCheckType(F) = TRUE THEN WAVOpenFile := TRUE
ELSE WAVOpenFile := FALSE
END
END
ELSE WavOpenFile := False;
END;
FUNCTION WAVGetInfo(VAR F : TDosStream; VAR SRate : WORD; VAR NChan : Byte) : BOOLEAN;
VAR
SampPS : ChunkSize;
Chann : WORD;
BEGIN
F.Seek(F.GetPos + 6);
F.Read(Chann, SizeOf(Chann));
F.Read(SampPS, SizeOf(SampPS));
IF (F.Status <> stOk) THEN BEGIN
NChan := 0;
SRate := 0;
WavGetInfo := False;
END
ELSE BEGIN
NChan := Chann;
SRate := WORD(WAVCalcSize(SampPS));
WavGetInfo := True;
END;
END;
PROCEDURE WAVCloseFile(VAR F : TDosStream);
BEGIN
F.Done;
END;
PROCEDURE WAVReadPrint(VAR F:TDosStream);
VAR
C : CHar;
BEGIN
F.Read(C, SizeOf(C));
Write('-',C);
END;
BEGIN
END.