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 }