home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Personal Computer World 1995 May
/
pcw-0595.bin
/
demos
/
databeck
/
wsounds
/
setup.dir
/
wswsrc.exe
/
WAVEIO.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1992-12-02
|
17KB
|
483 lines
{
Unit WAVEIO
WAV file input and output
}
Unit WAVEIO;
Interface
Uses WObjects, WinDos, Wincrt, WinTypes, WinProcs, Strings, MMSystem, BWCC,
WaveUtil, StrTool, DataObj, RiffComm;
FUNCTION WD_GetFileInfo(HW : Hwnd; VAR WData : WaveDataType) : BOOLEAN;
PROCEDURE WD_ReadRecDir(HW : HWnd;SPt : DirStr; Lvl : Word; CurrCollect : PWaveCollection);
PROCEDURE WD_ReadOneDir(HW : HWnd;DPath : DirStr;Level : Word; CurrCollect : PWaveCollection);
PROCEDURE WD_ReadOneFile(HW : HWnd;DPath : DirStr; Pfile : PChar;Level : Word; CurrCollect : PWaveCollection);
{Direct DirStr?}
PROCEDURE WD_ReadOneFileIntoWD(HW : HWnd;DPath : DirStr; PFile : Pchar;VAR WDum : WaveDataType);
IMPLEMENTATION
{----------------------------------------------------------------------------------------------}
PROCEDURE GetFileInfoRIFF (HW : Hwnd;Var Data : WaveDataType; VAR MMessage : INTEGER );
Var InFile : THMMIO;
Parent : TMMCKINFO;
Infos : TMMIOInfo;
Result : Integer;
FileP : Array[0..140] of char;
Begin
FileP[0] := Data.DiskDrive;
FileP[1] := #0;
StrCat (FileP,':');
StrCat (FileP,Data.PathName);
StrCat (FileP,Data.FileName);
InFile := mmioOpen (FileP,NIL,MMIO_READ);
IF InFile <> 0 then
Begin
FillChar(Parent,SizeOf(Parent),0);
Parent.fccType := mmioStringToFourCC ('RIFF',0);
Result := mmioDescend (InFile,@Parent,NIL,MMIO_FINDLIST);
if result = 0 then
Begin
MMessage := MMReadOK;
mmioRead (InFile,@Data.FileComment,64);
End
ELSE BEGIN
MMessage := MMReadNoSuccess;
END;
End
ELSE BEGIN
MMessage := MMReadCancel;
END;
mmioClose (InFile,0);
End;
FUNCTION WD_GetFileInfo(HW : Hwnd; VAR WData : WaveDataType) : BOOLEAN;
VAR
TDummy : ARRAY[0..255] OF Char;
MDummy : ARRAY[0..255] OF Char;
WStream : TDosStream;
CName : FourCC;
DSR : WORD;
DChan : BYTE;
BEGIN
TDummy[0] := WData.DiskDrive;
TDummy[1] := #0;
{ WriteLn(TDummy);}
DSR := 0;
DChan := 1;
StrCat(TDummy, ':');
{ WriteLn(TDummy);}
StrCat(TDummy,WData.PathName);
StrCat(TDummy,WData.FileName);
{ WriteLn(TDummy);}
IF WAVOpenFile(WStream, TDummy) = FALSE THEN BEGIN
StrCopy(MDummy,'Error while opening file ');
StrLCat(MDummy,TDummy, SizeOf(MDummy)-1);
StrCat(MDummy,', or file cannot be handled as a RIFF WAV file.');
BWCCMessageBox(HW, MDummy,'Wicked Sounds for Windows: Note', mb_Ok + mb_IconExclamation);
WAVCloseFile(WStream);
WD_GetFileInfo := FALSE;
Exit;
END;
IF WAVSkip2fmtChunk(WStream, CName) = FALSE THEN BEGIN
StrCopy(MDummy,TDummy);
StrCat(MDummy, #10#13);
StrCat(MDummy,'WAV information could not be read. WAV file may be corrupt.');
BWCCMessageBox(HW, MDummy,'Wicked Sounds for Windows: Note', mb_Ok + mb_IconExclamation);
WD_GetFileInfo := FALSE;
WAVCloseFile(WStream);
Exit;
END
ELSE IF StrLComp(CName, 'fmt ',4) = 0 THEN BEGIN
IF (WAVGetInfo(WStream, DSR, DChan) = FALSE) THEN BEGIN
StrCopy(MDummy,'WAV information could not be read. WAV file may be corrupt.');
StrLCat(MDummy,TDummy, StrLen(TDummy));
BWCCMessageBox(HW, MDummy,'Wicked Sounds for Windows: Note', mb_Ok + mb_IconExclamation);
WD_GetFileInfo := FALSE;
END;
END;
WData.SampRate := DSR;
WData.Channels := DChan;
WAVCloseFile(WStream);
END;
{----------------------------------------------------------------------------------------------}
PROCEDURE WD_ReadRecDir(HW : HWnd;SPt : DirStr; Lvl : Word; CurrCollect : PWaveCollection);
{
*** Input : SPt : String with starting path
Lvl : Starting level in directory tree (not needed for function)
CurrCollect : Pointer to collection in which insertion should be made
*** Output : None
*** Remarks : Places all *.WAV files from current directory in the collection
}
VAR
DInfo : TSearchRec;
Dummy : DirStr;
PPasStr : String[12];
VDummy : String[12];
VolID : Array[0..12] of Char;
Message : Integer;
Procedure ReadRecDir(DPath : DirStr;Level : Word);
VAR
DirInfo : TSearchRec; { DIR information buffer }
Dummy : DirStr; { Path transfer dummy }
PasStr : String; { Dummy for Pascal string operations }
PasPath : String[128];
PWTest : PWaveData; { Dummy for data parameter in TWaveData inst. }
BEGIN
{ Read current DIR info }
StrCopy(Dummy,DPath);
StrLCat(Dummy,WildCard, SizeOf(Dummy)-1);
FindFirst(Dummy,faAnyFile,DirInfo);
{ Data available? Continue }
While DosError = 0 DO BEGIN
{ Is the file a subdirectory other than "." and ".."? }
IF ((DirInfo.Name[0] <> '.') AND (DirInfo.Attr = faDirectory)) THEN BEGIN
StrCopy(Dummy,DPath);
StrLCat(Dummy,DirInfo.Name, SizeOf(Dummy)-1);
StrLCat(Dummy,'\', SizeOf(Dummy)-1);
SetDlgItemText(HW, 1100, Dummy);
{WriteLn('Level ',Level,' - Directory : ', Dummy);}
{ Yes-> Continue recursion and read next subdirectory }
ReadRecDir(Dummy, Level+1);
END;
{ Prepare file information for transfer to list }
WITH DirInfo DO BEGIN
PasStr := StrPas(Name);
IF ((Name[0] <> '.') AND (Attr <> faDirectory)) THEN
IF Copy(PasStr,Pos('.',PasStr)+1,Length(PasStr)) = ChooseWild THEN BEGIN
FillChar(WaveDummy,SizeOf(WaveDummy),0);
StrCopy(WaveDummy.FileName, Name);
PasPath := StrPas(DPath);
Delete(PasPath,1,2);
StrPCopy(Dummy, PasPath);
StrUpper(Dummy);
StrCopy(WaveDummy.PathName, Dummy);
WaveDummy.CreationDate := Time;
WaveDummy.FileSize := Size;
{StrCopy(WaveDummy.FileComment, '.');}
WaveDummy.FileComment[0] := #0;
StrCopy(WaveDummy.DiskLabel, VolID);
WaveDummy.DiskDrive := UpCase(DPath[0]);
WaveDummy.Save2Wave := 0;
SetDlgItemText(HW, 1101, Name);
{ Read sample rate and channels from file }
IF (WD_GetFileInfo(HW, WaveDummy) = TRUE) THEN BEGIN
GetRiffCommentICMT(WaveDummy, Message);
IF Message = MMReadNoSuccess THEN GetRiffCommentINAM(WaveDummy, Message);
IF Message = MMReadOK THEN WaveDummy.Save2Wave := C2W_IsSaved
ELSE WaveDummy.Save2Wave := C2W_DontSave;
Message := MMReadCancel;
PWTest := New(PWaveData, Init(WaveDummy));
CurrCollect^.Insert(PWTest);
END;
END;
END;
{ Read next directory entry }
FindNext(DirInfo);
END;
END;
BEGIN
{ Read volume label }
StrCopy(Dummy,SPt);
StrLCat(Dummy,WildCard, SizeOf(Dummy)-1);
DInfo.Name[0] := #0;
FindFirst(Dummy,faVolumeID,DInfo);
{ Convert volume label }
IF (StrLen(DInfo.Name)>0) THEN BEGIN
PPasStr := StrPas(DInfo.Name);
IF Pos('.',PPasStr) > 0 THEN Delete(PPasStr,Pos('.',PPasStr),1);
StrPCopy(VolID, PPasStr);
StrUpper(VolID);
VolId[11] := #0;
VolId[12] := #0;
END
ELSE
StrCopy(VolID,'No label');
{ Start file search }
ReadRecDir(SPt,Lvl);
END;
{----------------------------------------------------------------------------------------------}
PROCEDURE WD_ReadOneDir(HW : HWnd;DPath : DirStr;Level : Word; CurrCollect : PWaveCollection);
{
*** Input : DPath : String with starting path
Level : Starting level in directory tree (not needed for function)
CurrCollect : Pointer to collection in which insertion should be made
*** Output : None
*** Remarks : Places all *.WAV files from current directory in the collection
For code commentary, see WD_ReadRecDir
}
VAR
DirInfo : TSearchRec;
Dummy : DirStr;
PasStr : String[12];
PPasStr : String[12];
PasPath : String[128];
PWTest : PWaveData;
VolID : Array[0..12] of Char;
Message : Integer;
BEGIN
StrCopy(Dummy,DPath);
StrLCat(Dummy,WildCard, SizeOf(Dummy)-1);
DirInfo.Name[0] := #0;
FindFirst(Dummy,faVolumeID,DirInfo);
{ Convert volume label }
IF (StrLen(DirInfo.Name)>0) THEN BEGIN
PasStr := StrPas(DirInfo.Name);
IF Pos('.',PasStr) > 0 THEN Delete(PasStr,Pos('.',PasStr),1);
StrPCopy(VolID, PasStr);
StrUpper(VolID);
VolId[11] := #0;
VolId[12] := #0;
END
ELSE
StrCopy(VolID,'No label');
{
StrCopy(Dummy,DPath);
StrLCat(Dummy,WildCard, SizeOf(Dummy)-1);
}
SetDlgItemText(HW, 1100, Dummy);
FindFirst(Dummy,faAnyFile,DirInfo);
While DosError = 0 DO BEGIN
WITH DirInfo DO BEGIN
PasStr := StrPas(Name);
IF ((Name[0] <> '.') AND (Attr <> faDirectory)) THEN
IF Copy(PasStr,Pos('.',PasStr)+1,Length(PasStr)) = ChooseWild THEN BEGIN
FillChar(WaveDummy,SizeOf(WaveDummy),0);
StrCopy(WaveDummy.FileName, Name);
PasPath := StrPas(DPath);
Delete(PasPath,1,2);
StrPCopy(Dummy, PasPath);
StrUpper(Dummy);
StrCopy(WaveDummy.PathName, Dummy);
WaveDummy.CreationDate := Time;
WaveDummy.FileSize := Size;
{StrCopy(WaveDummy.FileComment, '.');}
WaveDummy.FileComment[0] := #0;
StrCopy(WaveDummy.DiskLabel, VolID);
WaveDummy.DiskDrive := UpCase(DPath[0]);
WaveDummy.Save2Wave := 0;
{ Read sample rate and channels from file }
SetDlgItemText(HW, 1101, Name);
IF (WD_GetFileInfo(HW, WaveDummy) = TRUE) THEN BEGIN
GetRiffCommentICMT(WaveDummy, Message);
IF Message = MMReadNoSuccess THEN GetRiffCommentINAM(WaveDummy, Message);
IF Message = MMReadOK THEN WaveDummy.Save2Wave := C2W_IsSaved
ELSE WaveDummy.Save2Wave := C2W_DontSave;
Message := MMReadCancel;
PWTest := New(PWaveData, Init(WaveDummy));
CurrCollect^.Insert(PWTest);
END;
END;
END;
FindNext(DirInfo);
END;
END;
{----------------------------------------------------------------------------------------------}
PROCEDURE WD_ReadOneFile(HW : HWnd;DPath : DirStr; Pfile : PChar;Level : Word; CurrCollect : PWaveCollection);
{
*** Input : DPath : String with starting path
PFile: Search file name
Level : Starting level in directory tree (not needed for function)
CurrCollect : Pointer to collection in which insertion should be made
*** Output : None
*** Remarks : Places all *.WAV files from current directory in the collection
For code commentary, see WD_ReadRecDir
}
VAR
DirInfo : TSearchRec;
Dummy : DirStr;
PasStr : String[12];
PasPath : String[128];
PWTest : PWaveData;
VolID : Array[0..12] of Char;
count : Integer;
Message : Integer;
BEGIN
StrCopy(Dummy,DPath);
StrLCat(Dummy,WildCard, SizeOf(Dummy)-1);
DirInfo.Name[0] := #0;
FindFirst(Dummy,faVolumeID,DirInfo);
{
StrCopy(Dummy,DPath);
StrCat(Dummy,'*.*');
For Count := 0 to StrLen(DirInfo.Name) DO DirInfo.Name[Count] := #0;
}
FindFirst(Dummy,faVolumeID,DirInfo);
{ Convert volume label }
IF (StrLen(DirInfo.Name)>0) THEN BEGIN
PasStr := StrPas(DirInfo.Name);
IF Pos('.',PasStr) > 0 THEN Delete(PasStr,Pos('.',PasStr),1);
StrPCopy(VolID, PasStr);
StrUpper(VolID);
VolId[11] := #0;
VolId[12] := #0;
{
For Count := 0 to StrLen(DirInfo.Name) DO BEGIN
IF (DirInfo.Name[Count] <> '.') THEN VolID[Count] := DirInfo.Name[Count];
END;
StrUpper(VolID);
}
END
ELSE
StrCopy(VolID,'No label');
StrCopy(Dummy,DPath);
StrCat(Dummy, PFile);
FindFirst(Dummy,faAnyFile,DirInfo);
IF DosError = 0 THEN BEGIN
WITH DirInfo DO BEGIN
PasStr := StrPas(Name);
IF ((Name[0] <> '.') AND (Attr <> faDirectory)) THEN
IF Copy(PasStr,Pos('.',PasStr)+1,Length(PasStr)) = ChooseWild THEN BEGIN
FillChar(WaveDummy,SizeOf(WaveDummy),0);
StrCopy(WaveDummy.FileName, Name);
PasPath := StrPas(DPath);
Delete(PasPath,1,2);
StrPCopy(Dummy, PasPath);
StrUpper(Dummy);
StrCopy(WaveDummy.PathName, Dummy);
WaveDummy.CreationDate := Time;
WaveDummy.FileSize := Size;
{StrCopy(WaveDummy.FileComment, '.');}
WaveDummy.FileComment[0] := #0;
StrCopy(WaveDummy.DiskLabel, VolID);
WaveDummy.DiskDrive := UpCase(DPath[0]);
WaveDummy.Save2Wave := 0;
{
WriteLn(WaveDummy.DiskDrive);
WriteLn(WaveDummy.PathName);
}
{ Read sample rate and channels from file }
IF (WD_GetFileInfo(HW, WaveDummy) = TRUE) THEN BEGIN
GetRiffCommentICMT(WaveDummy, Message);
IF Message = MMReadNoSuccess THEN GetRiffCommentINAM(WaveDummy, Message);
IF Message = MMReadOK THEN WaveDummy.Save2Wave := C2W_IsSaved
ELSE WaveDummy.Save2Wave := C2W_DontSave;
Message := MMReadCancel;
PWTest := New(PWaveData, Init(WaveDummy));
CurrCollect^.Insert(PWTest);
END;
END;
END;
END;
END;
{----------------------------------------------------------------------------------------------}
PROCEDURE WD_ReadOneFileIntoWD(HW : HWnd;DPath : DirStr; PFile : Pchar;VAR WDum : WaveDataType);
{
*** Input : DPath : String with starting path
PFile: Search file name
*** Output : None
*** Remarks : Places all *.WAV files from current directory in the collection
For code commentary, see WD_ReadRecDir
}
VAR
DirInfo : TSearchRec;
Dummy : DirStr;
PasStr : String[12];
PasPath : String[128];
PWTest : PWaveData;
VolID : Array[0..12] of Char;
count : Integer;
Message : Integer;
BEGIN
StrCopy(Dummy,DPath);
StrCat(Dummy,'*.*');
For Count := 0 to StrLen(DirInfo.Name) DO DirInfo.Name[Count] := #0;
FindFirst(Dummy,faVolumeID,DirInfo);
{ Convert volume label }
IF (StrLen(DirInfo.Name)>0) THEN BEGIN
PasStr := StrPas(DirInfo.Name);
IF Pos('.',PasStr) > 0 THEN Delete(PasStr,Pos('.',PasStr),1);
StrPCopy(VolID, PasStr);
StrUpper(VolID);
VolId[11] := #0;
VolId[12] := #0;
{
For Count := 0 to StrLen(DirInfo.Name) DO BEGIN
IF (DirInfo.Name[Count] <> '.') THEN VolID[Count] := DirInfo.Name[Count];
END;
StrUpper(VolID);
}
END
ELSE
StrCopy(VolID,'No label');
StrCopy(Dummy,DPath);
StrCat(Dummy, PFile);
FindFirst(Dummy,faAnyFile,DirInfo);
IF DosError = 0 THEN BEGIN
WITH DirInfo DO BEGIN
PasStr := StrPas(Name);
IF ((Name[0] <> '.') AND (Attr <> faDirectory)) THEN
IF Copy(PasStr,Pos('.',PasStr)+1,Length(PasStr)) = ChooseWild THEN BEGIN
FillChar(WaveDummy,SizeOf(WaveDummy),0);
StrCopy(WaveDummy.FileName, Name);
PasPath := StrPas(DPath);
Delete(PasPath,1,2);
StrPCopy(Dummy, PasPath);
StrUpper(Dummy);
StrCopy(WaveDummy.PathName, Dummy);
WaveDummy.CreationDate := Time;
WaveDummy.FileSize := Size;
{StrCopy(WaveDummy.FileComment, '.');}
WaveDummy.FileComment[0] := #0;
StrCopy(WaveDummy.DiskLabel, VolID);
WaveDummy.DiskDrive := UpCase(DPath[0]);
WaveDummy.Save2Wave := 0;
{ Read sample rate and channels from file }
IF (WD_GetFileInfo(HW, WaveDummy) = TRUE) THEN BEGIN
GetRiffCommentICMT(WaveDummy, Message);
IF Message = MMReadNoSuccess THEN GetRiffCommentINAM(WaveDummy, Message);
IF Message = MMReadOK THEN WaveDummy.Save2Wave := C2W_IsSaved
ELSE WaveDummy.Save2Wave := C2W_DontSave;
Message := MMReadCancel;
END;
END;
END;
END;
END;
BEGIN
END.