dweisman@umiami.ir.miami.edu (Ordinary Man) (02/04/91)
I'm posting this program for asynchronous sound playing on behalf of
John B. Matthews. It was sent to me in reply to my question on this topic. I
hope someone out there can find it useful.
==Dan
--cut here--
program TestSound;
{Asynchronous 'snd ' play demo, @1990 Gem City Software}
{non-commercial distribution encouraged}
uses
Sound;
const
sndID = 2000; {id of an 'snd ' resource}
var
wRect: Rect;
sndDone: Boolean; {becomes true when our snd finishes}
procedure Animation;
var h, v: Integer;
begin
randSeed := TickCount;
with wRect do
begin
h := right - left;
v := bottom - top
end;
while not sndDone do
begin
MoveTo(abs(Random) mod h, abs(Random) mod v);
LineTo(abs(Random) mod h, abs(Random) mod v);
end
end;
procedure SndEnd (sndPtr: SndChannelPtr; theCmd: SndCommand);
var a5: LongInt;
begin
a5 := SetA5(theCmd.param2);
sndDone := true;
a5 := SetA5(a5)
end;
procedure PlaySound (sndID: Integer);
var
sndPtr: SndChannelPtr;
sndHdl: Handle;
sndErr: OSErr;
sndCmd: SndCommand;
begin
with sndCmd do {prepare a call back command}
begin
cmd := callBackCmd;
param1 := 0;
param2 := SetCurrentA5 {needed at interrupt time}
end;
sndPtr := SndChannelPtr(NewPtrClear(SizeOf(SndChannel)));
if sndPtr <> nil then
begin
sndPtr^.qLength := stdQLength; {just to be sure}
sndHdl := GetResource('snd ', sndID);
if sndHdl <> nil then
begin
if SndNewChannel(sndPtr, 0, initMono, @SndEnd) = noErr then
begin
sndErr := SndPlay(sndPtr, sndHdl, true);
{add a call back cmd to this channel's queue}
sndErr := SndDoCommand(sndPtr, sndCmd, false);
{continue execution while snd plays}
Animation;
sndErr := SndDisposeChannel(sndPtr, false)
end;
ReleaseResource(sndHdl)
end;
DisposPtr(Ptr(sndPtr))
end
end;
procedure FinishUp;
var
theEvent: EventRecord;
r: Rect;
s: Str255;
dh, dv: Integer;
begin
s := ' Press any key or the mouse button to end...';
SetRect(r, 0, 0, 0, 0);
r.right := StringWidth(s) + 10;
r.bottom := 20;
with wRect do
begin
dh := (right - r.right) div 2;
dv := (bottom - r.bottom) div 2
end;
OffsetRect(r, dh, dv);
TextBox(pointer(ord(@s) + 1), length(s), r, TEJustCenter);
repeat
until GetNextEvent(mDownMask + keyDownMask, theEvent)
end;
begin
InitCursor;
wRect := screenBits.bounds;
InsetRect(wRect, 100, 100);
SetDrawingRect(wRect);
ShowDrawing; {LSP lazy window open}
OffsetRect(wRect, -wRect.left, -wRect.top);
sndDone := false;
PlaySound(sndID);
FinishUp
end.
--
John B. Matthews
am103