provides makefile and makes it compile for david
[IRC.git] / Robust / src / Tests / ssJava / mp3decoder / Player.java
1 /*\r
2  * 11/19/04             1.0 moved to LGPL.\r
3  * 29/01/00             Initial version. mdm@techie.com\r
4  *-----------------------------------------------------------------------\r
5  *   This program is free software; you can redistribute it and/or modify\r
6  *   it under the terms of the GNU Library General Public License as published\r
7  *   by the Free Software Foundation; either version 2 of the License, or\r
8  *   (at your option) any later version.\r
9  *\r
10  *   This program is distributed in the hope that it will be useful,\r
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  *   GNU Library General Public License for more details.\r
14  *\r
15  *   You should have received a copy of the GNU Library General Public\r
16  *   License along with this program; if not, write to the Free Software\r
17  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\r
18  *----------------------------------------------------------------------\r
19  */\r
20 \r
21 \r
22 import java.io.InputStream;\r
23 \r
24         \r
25 /**\r
26  * The <code>Player</code> class implements a simple player for playback\r
27  * of an MPEG audio stream. \r
28  * \r
29  * @author      Mat McGowan\r
30  * @since       0.0.8\r
31  */\r
32 \r
33 // REVIEW: the audio device should not be opened until the\r
34 // first MPEG audio frame has been decoded. \r
35 public class Player\r
36 {               \r
37         /**\r
38          * The current frame number. \r
39          */\r
40         private int frame = 0;\r
41         \r
42         /**\r
43          * The MPEG audio bitstream. \r
44          */\r
45         // javac blank final bug. \r
46         /*final*/ private Bitstream             bitstream;\r
47         \r
48         /**\r
49          * The MPEG audio decoder. \r
50          */\r
51         /*final*/ private Decoder               decoder; \r
52         \r
53         /**\r
54          * The AudioDevice the audio samples are written to. \r
55          */\r
56         //private AudioDevice   audio; \r
57         \r
58         /**\r
59          * Has the player been closed?\r
60          */\r
61         private boolean         closed = false;\r
62         \r
63         /**\r
64          * Has the player played back all frames from the stream?\r
65          */\r
66         private boolean         complete = false;\r
67 \r
68         private int                     lastPosition = 0;\r
69         \r
70         /**\r
71          * Creates a new <code>Player</code> instance. \r
72          */\r
73         public Player(InputStream stream) throws JavaLayerException\r
74         {\r
75                 //this(stream, null);   \r
76         }\r
77 \r
78         /* temporarily disabled by eom\r
79         public Player(InputStream stream, AudioDevice device) throws JavaLayerException\r
80         {\r
81                 bitstream = new Bitstream(stream);              \r
82                 decoder = new Decoder();\r
83                                 \r
84                 if (device!=null)\r
85                 {               \r
86                         audio = device;\r
87                 }\r
88                 else\r
89                 {                       \r
90                         FactoryRegistry r = FactoryRegistry.systemRegistry();\r
91                         audio = r.createAudioDevice();\r
92                 }\r
93                 audio.open(decoder);\r
94         }\r
95         */\r
96         \r
97         public void play() throws JavaLayerException\r
98         {\r
99                 play(Integer.MAX_VALUE);\r
100         }\r
101         \r
102         /**\r
103          * Plays a number of MPEG audio frames. \r
104          * \r
105          * @param frames        The number of frames to play. \r
106          * @return      true if the last frame was played, or false if there are\r
107          *                      more frames. \r
108          */\r
109         public boolean play(int frames) throws JavaLayerException\r
110         {\r
111                 boolean ret = true;\r
112                 \r
113                 \r
114                 while (frames-- > 0 && ret)\r
115                 {\r
116                         ret = decodeFrame();                    \r
117                 }\r
118                 /*\r
119                 if (!ret)\r
120                 {\r
121                         // last frame, ensure all data flushed to the audio device. \r
122                         AudioDevice out = audio;\r
123                         if (out!=null)\r
124                         {                               \r
125                                 out.flush();\r
126                                 synchronized (this)\r
127                                 {\r
128                                         complete = (!closed);\r
129                                         close();\r
130                                 }                               \r
131                         }\r
132                 }\r
133                 */\r
134                 return ret;\r
135         }\r
136                 \r
137         /**\r
138          * Cloases this player. Any audio currently playing is stopped\r
139          * immediately. \r
140          */\r
141         \r
142         public synchronized void close()\r
143         {               \r
144 /*\r
145                 AudioDevice out = audio;\r
146                 if (out!=null)\r
147                 { \r
148                         closed = true;\r
149                         audio = null;   \r
150                         // this may fail, so ensure object state is set up before\r
151                         // calling this method. \r
152                         out.close();\r
153                         lastPosition = out.getPosition();\r
154                         try\r
155                         {\r
156                                 bitstream.close();\r
157                         }\r
158                         catch (BitstreamException ex)\r
159                         {\r
160                         }\r
161                 }\r
162 */\r
163         }\r
164         \r
165         \r
166         /**\r
167          * Returns the completed status of this player.\r
168          * \r
169          * @return      true if all available MPEG audio frames have been\r
170          *                      decoded, or false otherwise. \r
171          */\r
172         public synchronized boolean isComplete()\r
173         {\r
174                 return complete;        \r
175         }\r
176                                 \r
177         /**\r
178          * Retrieves the position in milliseconds of the current audio\r
179          * sample being played. This method delegates to the <code>\r
180          * AudioDevice</code> that is used by this player to sound\r
181          * the decoded audio samples. \r
182          */\r
183         public int getPosition()\r
184         {\r
185                 //int position = lastPosition;\r
186                 \r
187                 //AudioDevice out = audio;              \r
188                 //if (out!=null)\r
189                 //{\r
190                 //      position = out.getPosition();   \r
191                 //}\r
192                 //return position;\r
193                 return 0;\r
194         }               \r
195         \r
196         /**\r
197          * Decodes a single frame.\r
198          * \r
199          * @return true if there are no more frames to decode, false otherwise.\r
200          */\r
201         protected boolean decodeFrame() throws JavaLayerException\r
202         {               \r
203                 try\r
204                 {\r
205                         //AudioDevice out = audio;\r
206                         //if (out==null)\r
207                         //      return false;\r
208 \r
209                         Header h = bitstream.readFrame();       \r
210                         \r
211                         if (h==null)\r
212                                 return false;\r
213                                 \r
214                         // sample buffer set when decoder constructed\r
215                         SampleBuffer output = (SampleBuffer)decoder.decodeFrame(h, bitstream);\r
216                                                                                                                                                                                                                                                                                                         \r
217                         //synchronized (this)\r
218                         //{\r
219                         //      out = audio;\r
220                         //      if (out!=null)\r
221                         //      {                                       \r
222                         //              out.write(output.getBuffer(), 0, output.getBufferLength());\r
223                         //      }                               \r
224                         //}\r
225                                                                                                                                                         \r
226                         bitstream.closeFrame();\r
227                 }               \r
228                 catch (RuntimeException ex)\r
229                 {\r
230                         throw new JavaLayerException("Exception decoding audio frame", ex);\r
231                 }\r
232 /*\r
233                 catch (IOException ex)\r
234                 {\r
235                         System.out.println("exception decoding audio frame: "+ex);\r
236                         return false;   \r
237                 }\r
238                 catch (BitstreamException bitex)\r
239                 {\r
240                         System.out.println("exception decoding audio frame: "+bitex);\r
241                         return false;   \r
242                 }\r
243                 catch (DecoderException decex)\r
244                 {\r
245                         System.out.println("exception decoding audio frame: "+decex);\r
246                         return false;                           \r
247                 }\r
248 */              \r
249                 return true;\r
250         }\r
251 \r
252         \r
253 }\r