tb1/tb1_dos/tbsound.pas

205 lines
6.3 KiB
ObjectPascal

{ SMIX is Copyright 1995 by Ethan Brodsky. All rights reserved. }
program MixTest;
uses
CRT,
Detect,
SMix;
const
XMSRequired = 190; {XMS memory required to load the sounds (KBytes) }
SharedEMB = true;
{TRUE: All sounds will be stored in a shared EMB}
{FALSE: Each sound will be stored in a separate EMB}
NumSounds = 8;
var
BaseIO: word; IRQ, DMA, DMA16: byte;
Sound: array[0..NumSounds-1] of PSound;
i: byte;
Counter: LongInt;
InKey: char;
Stop: boolean;
Num: byte;
Temp: integer;
OldExitProc: pointer;
function HexW(W: word): string; {Word}
const
HexChars: array [0..$F] of Char = '0123456789ABCDEF';
begin
HexW :=
HexChars[(W and $F000) shr 12] +
HexChars[(W and $0F00) shr 8] +
HexChars[(W and $00F0) shr 4] +
HexChars[(W and $000F)];
end;
procedure OurExitProc; far;
{If the program terminates with a runtime error before the extended memory}
{is deallocated, then the memory will still be allocated, and will be lost}
{until the next reboot. This exit procedure is ALWAYS called upon program}
{termination and will deallocate extended memory if necessary. }
var
i: byte;
begin
for i := 0 to NumSounds-1 do
if Sound[i] <> nil then FreeSound(Sound[i]);
if SharedEMB then ShutdownSharing;
ExitProc := OldExitProc; {Chain to next exit procedure}
end;
procedure Init;
begin
Randomize;
writeln;
writeln('-------------------------------------------');
writeln('Sound Mixing Library v1.27 by Ethan Brodsky');
if not(GetSettings(BaseIO, IRQ, DMA, DMA16))
then
begin
writeln('Error initializing: Invalid or non-existant BLASTER environment variable');
Halt(1); {BLASTER environment variable invalid or non-existant}
end
else
begin
if not(InitSB(BaseIO, IRQ, DMA, DMA16))
then
begin
writeln('Error initializing sound card');
writeln('Incorrect base IO address, sound card not installed, or broken');
Halt(2); {Sound card could not be initialized}
end;
if SixteenBit
then writeln('BaseIO=', HexW(BaseIO), 'h IRQ', IRQ, ' DMA8=', DMA, ' DMA16=', DMA16)
else writeln('BaseIO=', HexW(BaseIO), 'h IRQ', IRQ, ' DMA8=', DMA);
end;
write('DSP version ', DSPVersion:0:2, ': ');
if SixteenBit
then write('16-bit, ')
else write('8-bit, ');
if AutoInit
then writeln('Auto-initialized')
else writeln('Single-cycle');
if not(InitXMS)
then
begin
writeln('Error initializing extended memory');
writeln('HIMEM.SYS must be installed');
Halt(3); {XMS driver not installed}
end
else
begin
writeln('Extended memory succesfully initialized');
write('Free XMS memory: ', GetFreeXMS, 'k ');
if GetFreeXMS < XMSRequired
then
begin
writeln('Insufficient free XMS');
writeln('You are probably running MIXTEST from the protected mode IDE');
writeln('Run it from the command line or read the documentation');
Halt(4); {Insufficient XMS memory}
end
else
begin
writeln('Loading sounds');
if SharedEMB then InitSharing;
OpenSoundResourceFile('sounds.tb1');
LoadSound(Sound[0], 'CLICK');
LoadSound(Sound[1], 'AHH');
LoadSound(Sound[2], 'ZOOP');
LoadSound(Sound[3], 'KAPOW');
LoadSound(Sound[4], 'CC');
LoadSound(Sound[5], 'BONK');
LoadSound(sound[6], 'OW');
LoadSound(sound[7], 'SCREAM');
CloseSoundResourceFile;
{OpenSoundResourceFile('MIXTEST.SND');
LoadSound(Sound[0], 'JET');
LoadSound(Sound[1], 'GUN');
LoadSound(Sound[2], 'CRASH');
LoadSound(Sound[3], 'CANNON');
LoadSound(Sound[4], 'LASER');
LoadSound(Sound[5], 'GLASS');
LoadSOund(Sound
CloseSoundResourceFile;}
OldExitProc := ExitProc;
ExitProc := @OurExitProc;
end
end;
InitMixing;
writeln;
end;
procedure Shutdown;
begin
ShutdownMixing;
ShutdownSB5;
for i := 0 to NumSounds-1 do
FreeSound(Sound[i]);
if SharedEMB then ShutdownSharing;
writeln;
end;
begin
Init;
writeln('Press:');
writeln(' 0) Click');
writeln(' 1) Ahh... Mr. Bombem');
writeln(' 2) Zhhip');
writeln(' 3) Explosion');
writeln(' 4) Cachoo');
writeln(' 5) Bonk');
writeln(' 6) Ow');
writeln(' 7) ARRRGH!!!');
writeln(' Q) Quit');
Stop := false;
Counter := 0;
repeat
{Display counters}
Inc(Counter);
write(Counter:8, IntCount:8, VoiceCount:4);
GotoXY(1, WhereY);
{Maybe start a random sound}
{if Random(64000) = 0
then
begin
Num := Random(NumSounds-1)+1;
StartSound(Sound[Num], Num, false);
end;}
{Start a sound if a key is pressed}
if KeyPressed
then
begin
InKey := ReadKey;
case InKey
of
'0'..'9':
begin
Val(InKey, Num, Temp);
if Num < NumSounds
then
StartSound(Sound[Num], Num, false);
end;
else
Stop := true;
end;
end;
until Stop;
writeln;
Shutdown;
end.