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