001    package net.minecraft.client.audio;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    import java.io.File;
006    import java.net.MalformedURLException;
007    import java.net.URL;
008    import java.util.ArrayList;
009    import java.util.HashMap;
010    import java.util.List;
011    import java.util.Map;
012    import java.util.Random;
013    
014    @SideOnly(Side.CLIENT)
015    public class SoundPool
016    {
017        /** The RNG used by SoundPool. */
018        private Random rand = new Random();
019    
020        /**
021         * Maps a name (can be sound/newsound/streaming/music/newmusic) to a list of SoundPoolEntry's.
022         */
023        private Map nameToSoundPoolEntriesMapping = new HashMap();
024    
025        /** A list of all SoundPoolEntries that have been loaded. */
026        private List allSoundPoolEntries = new ArrayList();
027    
028        /**
029         * The number of soundPoolEntry's. This value is computed but never used (should be equal to
030         * allSoundPoolEntries.size()).
031         */
032        public int numberOfSoundPoolEntries = 0;
033        public boolean isGetRandomSound = true;
034    
035        /**
036         * Adds a sound to this sound pool.
037         */
038        public SoundPoolEntry addSound(String par1Str, File par2File)
039        {
040            try 
041            {
042                return addSound(par1Str, par2File.toURI().toURL());
043            }
044            catch (MalformedURLException ex)
045            {
046                ex.printStackTrace();
047                throw new RuntimeException(ex);
048            }
049        }
050        
051        /**
052         * URL version of addSound, as the back-end sound engine has full support for various types of URLs
053         * 
054         * @param par1Str The name of the sound to add
055         * @param url The url of the sound resource
056         * @return A SoundPoolEntry for the newly added sound
057         */
058        public SoundPoolEntry addSound(String par1Str, URL url)
059        {
060            try
061            {
062                String var3 = par1Str;
063                par1Str = par1Str.substring(0, par1Str.indexOf("."));
064    
065                if (this.isGetRandomSound)
066                {
067                    while (Character.isDigit(par1Str.charAt(par1Str.length() - 1)))
068                    {
069                        par1Str = par1Str.substring(0, par1Str.length() - 1);
070                    }
071                }
072    
073                par1Str = par1Str.replaceAll("/", ".");
074    
075                if (!this.nameToSoundPoolEntriesMapping.containsKey(par1Str))
076                {
077                    this.nameToSoundPoolEntriesMapping.put(par1Str, new ArrayList());
078                }
079    
080                SoundPoolEntry var4 = new SoundPoolEntry(var3, url);
081                ((List)this.nameToSoundPoolEntriesMapping.get(par1Str)).add(var4);
082                this.allSoundPoolEntries.add(var4);
083                ++this.numberOfSoundPoolEntries;
084                return var4;
085            }
086            catch (Exception var5)
087            {
088                var5.printStackTrace();
089                throw new RuntimeException(var5);
090            }
091        }
092    
093        /**
094         * gets a random sound from the specified (by name, can be sound/newsound/streaming/music/newmusic) sound pool.
095         */
096        public SoundPoolEntry getRandomSoundFromSoundPool(String par1Str)
097        {
098            List var2 = (List)this.nameToSoundPoolEntriesMapping.get(par1Str);
099            return var2 == null ? null : (SoundPoolEntry)var2.get(this.rand.nextInt(var2.size()));
100        }
101    
102        /**
103         * Gets a random SoundPoolEntry.
104         */
105        public SoundPoolEntry getRandomSound()
106        {
107            return this.allSoundPoolEntries.isEmpty() ? null : (SoundPoolEntry)this.allSoundPoolEntries.get(this.rand.nextInt(this.allSoundPoolEntries.size()));
108        }
109    }