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 }