home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Snippets / PNL Libraries / MyPlayAsyncSound.p < prev    next >
Encoding:
Text File  |  1997-05-29  |  3.9 KB  |  177 lines  |  [TEXT/CWIE]

  1. unit MyPlayAsyncSound;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Types, Memory;
  7.         
  8.     const
  9.         max_sound_channels = 10;
  10.  
  11.     procedure StartupPlayAsyncSound;
  12.     procedure ConfigurePlayAsyncSound( channels: integer );
  13.     
  14.     procedure PlayAsyncSound (theSound: Handle);
  15.     procedure PlayAsyncSoundID (id: integer);
  16.     function SoundIsPlaying: boolean;
  17.  
  18. implementation
  19.  
  20.     uses
  21.         Resources, Sound, 
  22.         MyMemory, MyStartup, MyAssertions;
  23.  
  24. {$ifc do_debug}
  25.     var
  26.         startup_check: integer;
  27. {$endc}
  28.  
  29. {$PUSH}
  30. {$ALIGN MAC68K}
  31.     const
  32.         MyQLength = 10;
  33.     type
  34.         MySndChannel = packed record
  35.             nextChan:SndChannelPtr;
  36.             firstMod:Ptr;
  37.             callBack:SndCallBackUPP;
  38.             userInfo:longint;
  39.             wait:longint;
  40.             cmdInProgress:SndCommand;
  41.             flags:integer;
  42.             qLength:integer;
  43.             qHead:integer;
  44.             qTail:integer;
  45.             queue:array[0..MyQLength-1] of SndCommand;
  46.             in_use: boolean;
  47.         end;
  48.     MySndChannelPtr = ^MySndChannel;
  49.     MySndChannelArray = array[1..max_sound_channels] of MySndChannel;
  50.     MySndChannelArrayPtr = ^MySndChannelArray;
  51. {$ALIGN RESET}
  52. {$POP}
  53.  
  54.     var
  55.         gChannels: integer;
  56.         channels: MySndChannelArrayPtr;
  57.         gChanCallBackProc:SndCallBackUPP;
  58.  
  59.     function SoundIsPlaying: boolean;
  60.         var
  61.             i: integer;
  62.     begin
  63.         SoundIsPlaying := false;
  64.         for i := 1 to gChannels do begin
  65.             if channels^[i].in_use then begin
  66.                 SoundIsPlaying := true;
  67.                 leave;
  68.             end;
  69.         end;
  70.     end;
  71.     
  72. { Called at interupt level! }
  73.     procedure ChanCallBack( chan: SndChannelPtr; var cmd: SndCommand );
  74.     begin
  75. {$unused(cmd)}
  76.         Assert( MySndChannelPtr(chan)^.in_use );
  77.         MySndChannelPtr(chan)^.in_use := false;
  78.     end;
  79.  
  80.     procedure PlayAsyncSound( theSound: Handle );
  81.         var
  82.             err: OSErr;
  83.             myWish: SndCommand;
  84.             i, free: integer;
  85.     begin
  86.         AssertDidStartup( startup_check );
  87.         Assert( (theSound <> nil) & (theSound^ <> nil) );
  88.         if (theSound <> nil) & (theSound^ <> nil) then begin
  89.             free := -1;
  90.             for i := 1 to gChannels do begin
  91.                 if not channels^[i].in_use then begin
  92.                     free := i;
  93.                     leave;
  94.                 end;
  95.             end;
  96.             if free > 0 then begin
  97.                 channels^[free].in_use := true;
  98.                 err := SndPlay( @channels^[free], SndListHandle(theSound), true );
  99.                 { set up a sound mgr command block }
  100.                 if err = noErr then begin
  101.                     myWish.cmd := callBackCmd;
  102.                     myWish.param1 := 0;
  103.                     myWish.param2 := 0;
  104.                     err := SndDoCommand( @channels^[free], myWish, false );
  105.                     { If any of these commands return with an error, we aren't going to get anywhere anyway }
  106.                 end;
  107.                 if err <> noErr then begin
  108.                     channels^[free].in_use := false;
  109.                 end;
  110.             end;
  111.         end;
  112.     end;
  113.  
  114.     procedure PlayAsyncSoundID (id: integer);
  115.         var
  116.             sound: Handle;
  117.     begin
  118.         sound := GetResource('snd ', id);
  119.         Assert( sound <> nil );
  120.         if sound <> nil then begin
  121.             PlayAsyncSound(sound);
  122.         end;
  123.     end;
  124.  
  125.     function InitPlayAsyncSound(var msg: integer): OSStatus;
  126.         var
  127.             err: OSErr;
  128.             i: integer;
  129.             cp: SndChannelPtr;
  130.     begin
  131. {$unused(msg)}
  132.         DidStartup( startup_check );
  133.         Assert( (0 < gChannels) & (gChannels <= max_sound_channels) );
  134.         gChanCallBackProc := NewSndCallBackProc( @ChanCallBack );
  135.         err := MNewPtr( channels, SizeOf(MySndChannel) * gChannels );
  136.         if err = noErr then begin
  137.             for i := 1 to gChannels do begin
  138.                 if err = noErr then begin
  139.                     channels^[i].qLength := MyQLength;
  140.                     channels^[i].in_use := false;
  141.                     cp := SndChannelPtr(@channels^[i]);
  142.                     err := SndNewChannel( cp, 0, 0, gChanCallBackProc );
  143.                 end;
  144.             end;
  145.         end;
  146.         InitPlayAsyncSound := err;
  147.     end;
  148.  
  149.     procedure FinishPlayAsyncSound;
  150.         var
  151.             i: integer;
  152.             junk: OSErr;
  153.     begin
  154.         for i := 1 to gChannels do begin
  155.             junk := SndDisposeChannel( @channels^[i], true );
  156.         end;
  157.         MDisposePtr( channels );
  158.     end;
  159.  
  160.     procedure ConfigurePlayAsyncSound( channels: integer );
  161.     begin
  162.         gChannels := channels;
  163.         Assert( (0 < gChannels) & (gChannels <= max_sound_channels) );
  164.         StartupPlayAsyncSound;
  165.     end;
  166.     
  167.     procedure StartupPlayAsyncSound;
  168.     begin
  169.         SetStartup(InitPlayAsyncSound, nil, 0, FinishPlayAsyncSound);
  170.     end;
  171.     
  172. end.
  173.         playing: boolean;
  174.         finished: boolean;
  175.         current_sound: Handle;
  176.         chan: SndChannelPtr;
  177.