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 }