001         package com.croftsoft.core.media.sound;
002    
003         import java.applet.*;
004         import java.net.*;
005         import java.util.*;
006    
007         import com.croftsoft.core.lang.NullArgumentException;
008    
009         /*********************************************************************
010         * Loads, caches, and plays AudioClips with master mute toggle.
011         *
012         * @author
013         *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
014         *
015         * @version
016         *   2003-04-04
017         *
018         * @since
019         *   2003-04-01
020         *********************************************************************/
021    
022         public final class  AudioClipCache
023         //////////////////////////////////////////////////////////////////////
024         //////////////////////////////////////////////////////////////////////
025         {
026    
027         private final ClassLoader  classLoader;
028    
029         private final String       mediaDir;
030    
031         private final Map          nameToAudioClipMap;
032    
033         //
034    
035         private boolean    muted;
036    
037         private AudioClip  audioClip;
038    
039         //////////////////////////////////////////////////////////////////////
040         // Constructor methods
041         //////////////////////////////////////////////////////////////////////
042    
043         public  AudioClipCache (
044           ClassLoader  classLoader,
045           String       mediaDir,
046           Map          nameToAudioClipMap )
047         //////////////////////////////////////////////////////////////////////
048         {
049           NullArgumentException.check ( this.classLoader = classLoader );
050    
051           this.mediaDir = mediaDir;
052    
053           NullArgumentException.check (
054             this.nameToAudioClipMap = nameToAudioClipMap );
055         }
056    
057         public  AudioClipCache (
058           ClassLoader  classLoader,
059           String       mediaDir )
060         //////////////////////////////////////////////////////////////////////
061         {
062           this ( classLoader, mediaDir, new HashMap ( ) );
063         }
064    
065         public  AudioClipCache ( ClassLoader  classLoader )
066         //////////////////////////////////////////////////////////////////////
067         {
068           this ( classLoader, ( String ) null, new HashMap ( ) );
069         }
070    
071         //////////////////////////////////////////////////////////////////////
072         // accessor methods
073         //////////////////////////////////////////////////////////////////////
074    
075         public boolean  isMuted ( ) { return muted; }
076    
077         //////////////////////////////////////////////////////////////////////
078         // mutator methods
079         //////////////////////////////////////////////////////////////////////
080    
081         public void  clear ( ) { nameToAudioClipMap.clear ( ); }
082    
083         public void  setMuted ( boolean  muted )
084         //////////////////////////////////////////////////////////////////////
085         {
086           this.muted = muted;
087    
088           if ( muted )
089           {
090             stop ( );
091           }
092         }
093    
094         //////////////////////////////////////////////////////////////////////
095         //////////////////////////////////////////////////////////////////////
096    
097         public synchronized void  play ( String  audioClipName )
098         //////////////////////////////////////////////////////////////////////
099         {
100           if ( muted )
101           {
102             return;
103           }
104    
105           stop ( );       
106    
107           audioClip = ( AudioClip ) nameToAudioClipMap.get ( audioClipName );
108    
109           if ( audioClip == null )
110           {
111             URL  audioClipURL = classLoader.getResource (
112               mediaDir == null ? audioClipName : mediaDir + audioClipName );
113    
114             audioClip = Applet.newAudioClip ( audioClipURL );
115    
116             nameToAudioClipMap.put ( audioClipName, audioClip );
117           }
118    
119           audioClip.play ( );       
120         }
121    
122         public synchronized void  stop ( )
123         //////////////////////////////////////////////////////////////////////
124         {
125           if ( audioClip != null )
126           {
127             audioClip.stop ( );
128           }
129         }
130    
131         //////////////////////////////////////////////////////////////////////
132         //////////////////////////////////////////////////////////////////////
133         }