home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deathday Collection
/
dday.bin
/
edit
/
dfe
/
sounds.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-05-26
|
3KB
|
116 lines
{****************************************************************************
* The DOOM Hacker's Tool Kit *
*****************************************************************************
* Unit: SOUNDS *
* Purpose: Loading and Playing WAD file sounds *
* Date: 4/28/94 *
* Author: Joshua Jackson Internet: joshjackson@delphi.com *
****************************************************************************}
unit Sounds;
interface
uses Wad,WadDecl,Crt;
Type PSoundDef=^TSoundDef;
TSoundDef=object
Constructor Init(WDir:PWadDirectory;SndName:ObjNameStr);
Procedure PlaySound;
Function IsComplete:boolean;
Procedure EndSound;
Destructor Done;
Private
SoundBuff:PSoundBuff;
IsPlaying:Boolean;
sbBuff:word;
end;
implementation
{$IFDEF DPMI}
uses DPMI,Sounder2,ObjCache;
{$ELSE}
uses Sounder2,ObjCache;
{$ENDIF}
type TBuff=Array[0..46080] of byte;
var BuffPtr:^TBuff;
Constructor TSoundDef.Init(WDir:PWadDirectory;SndName:ObjNameStr);
var l:word;
begin
l:=WDir^.FindObject(SndName);
if l=0 then begin
if TerminateOnWadError then begin
TextMode(co80);
writeln('ReadSound: Could not locate sound ID: ',SndName);
halt(1);
end
else begin
WadResult:=wrNoSound;
exit;
end;
end;
seek(WDir^.WadFile,WDir^.DirEntry^[l].ObjStart);
New(SoundBuff); {Allocate New Sound Descriptor}
BlockRead(WDir^.WadFile,SoundBuff^,8);
GetMem(SoundBuff^.Sound, SoundBuff^.Samples);
BlockRead(WDir^.WadFile,SoundBuff^.Sound^,SoundBuff^.Samples);
IsPlaying:=False;
end;
Procedure TSoundDef.PlaySound;
var TempAddr:word;
MemSize:word;
BuffAddr:longint;
begin
if IsPlaying then
EndSound;
{$IFDEF DPMI}
MemSize:=(SoundBuff^.Samples div 16) + 1;
AllocDosMem(MemSize,SbBuff,TempAddr); {Allocate DMA Buffer}
BuffPtr:=ptr(SbBuff,0);
BuffAddr:=TempAddr;
BuffAddr:=longint(BuffAddr) shl 4;
move(SoundBuff^.Sound^[0],BuffPtr^[0],SoundBuff^.Samples);
{$ELSE}
BuffPtr:=@SoundBuff^.Sound^;
BuffAddr:=(longint(Seg(BuffPtr^)) shl 4) + Ofs(BuffPtr^);
{$ENDIF}
InitSB;
PlayBuff(SoundBuff,BuffAddr);
IsPlaying:=True;
end;
Function TSoundDef.IsComplete;
begin
IsComplete:=DMA_Complete;
end;
Procedure TSoundDef.EndSound;
begin
if not IsPlaying then
exit;
StopBuff;
{$IFDEF DPMI}
DeAllocDosMem(sbBuff); {Dispose DMA Buffer}
{$ENDIF}
IsPlaying:=False;
end;
Destructor TSoundDef.Done;
begin
FreeMem(SoundBuff^.Sound,SoundBuff^.Samples); {Dispose Sound Data}
Dispose(SoundBuff); {Dispose Sound Descriptor}
end;
end.