Many updates, see CHANGLOG diff
[rokon:rokon.git] / src / com / stickycoding / rokon / audio / RokonAudio.java
1 package com.stickycoding.rokon.audio;\r
2 import android.media.AudioManager;\r
3 import android.media.SoundPool;\r
4 \r
5 import com.stickycoding.rokon.Debug;\r
6 import com.stickycoding.rokon.Rokon;\r
7 \r
8 /**\r
9  * RokonAudio.java\r
10  * This is optimized for short sound files, which must be played quickly\r
11  * such as sound effects in games. This is not suitable for music, and a \r
12  * relatively low file size limit exists.\r
13  * \r
14  * The RokonAudio class uses SoundPool to manage its sounds.\r
15  * \r
16  * @author Richard\r
17  */\r
18 public class RokonAudio {\r
19 \r
20         public static final int MAX_SOUNDS = 50;\r
21         public static final int MAX_STREAMS = 8;\r
22         \r
23         public static RokonAudio singleton;\r
24         private int i, j;\r
25         \r
26         private float masterVolume;\r
27         private SoundPool soundPool;\r
28         private SoundFile[] soundArr = new SoundFile[MAX_SOUNDS];\r
29         \r
30         public static boolean mute = false;\r
31         \r
32         public RokonAudio() {\r
33                 RokonAudio.singleton = this;\r
34                 soundPool = new SoundPool(MAX_STREAMS, AudioManager.STREAM_MUSIC, 0);\r
35                 masterVolume = 1;\r
36         }\r
37         \r
38         public void mute() {\r
39                 mute = true;\r
40         }\r
41         \r
42         public void unmute() {\r
43                 mute = false;\r
44         }\r
45         \r
46         public boolean isMuted() {\r
47                 return mute;\r
48         }\r
49         \r
50         /**\r
51          * Frees up some memory, this should be called when you are finished.\r
52          */\r
53         public void destroy() {\r
54                 try {\r
55                         for(i = 0; i < MAX_STREAMS; i++)\r
56                                 soundArr[i].unload();\r
57                         soundPool.release();\r
58                 } catch (Exception e) { }\r
59                 soundPool = null;\r
60         }\r
61         \r
62         /**\r
63          * @return a HashSet of all current SoundFile's \r
64          */\r
65         public SoundFile[] getSounds() {\r
66                 return soundArr;\r
67         }\r
68         \r
69         /**\r
70          * @return the SoundPool object currently being used\r
71          */\r
72         public SoundPool getSoundPool() {\r
73                 return soundPool;\r
74         }\r
75         \r
76         /**\r
77          * Loads a file from the /assets/ folder in your APK, ready to be played\r
78          * @param filename\r
79          * @return \r
80          */\r
81         public SoundFile createSoundFile(String filename) {\r
82                 try {\r
83                         int id = soundPool.load(Rokon.getActivity().getAssets().openFd(filename), 0);\r
84                         SoundFile soundFile = new SoundFile(id);\r
85                         Debug.print("SoundFile loaded as id=" + id);\r
86                         j = -1;\r
87                         for(i = 0; i < MAX_SOUNDS; i++)\r
88                                 if(soundArr[i] == null)\r
89                                         j = i;\r
90                         if(j == -1) {\r
91                                 Debug.print("TOO MANY SOUNDS");\r
92                                 return null;\r
93                         }\r
94                         soundArr[j] = soundFile;\r
95                         return soundFile;\r
96                 } catch (Exception e) {\r
97                         Debug.print("CANNOT FIND " + filename + " IN ASSETS");\r
98                         e.printStackTrace();\r
99                         return null;\r
100                 }\r
101         }\r
102         \r
103         /**\r
104          * @param soundFile SoundFile to be removed from the memory\r
105          */\r
106         public void removeSoundFile(SoundFile soundFile) {\r
107                 soundPool.unload(soundFile.getId());\r
108                 for(i = 0; i < MAX_SOUNDS; i++)\r
109                         if(soundArr[i] != null)\r
110                                 if(soundArr[i].equals(soundFile))\r
111                                         soundArr[i] = null;\r
112         }\r
113         \r
114         /**\r
115          * Removes all SoundFile's from the memory\r
116          */\r
117         public void removeAllSoundFiles() {\r
118                 for(i = 0; i < MAX_SOUNDS; i++)\r
119                         soundArr[i] = null;\r
120                 soundPool.release();\r
121         }\r
122         \r
123         /**\r
124          * @param masterVolume the volume at which all future AudioStream's will play\r
125          */\r
126         public void setMasterVolume(float masterVolume) {\r
127                 this.masterVolume = masterVolume;\r
128         }\r
129         \r
130         /**\r
131          * @return the current volume at which AudioStream's will play at\r
132          */\r
133         public float getMasterVolume() {\r
134                 return masterVolume;\r
135         }\r
136         \r
137 \r
138 }