/**\r
* The Bistream from which the MPEG audio frames are read.\r
*/\r
- @LOC("ST")\r
- private Bitstream stream;\r
+ // @LOC("ST")\r
+ // private Bitstream stream;\r
\r
/**\r
* The Obuffer instance that will receive the decoded PCM samples.\r
*/\r
- @LOC("OUT")\r
- private Obuffer output;\r
+ // @LOC("OUT")\r
+ // private Obuffer output;\r
\r
/**\r
* Synthesis filter for the left channel.\r
*/\r
- @LOC("FIL")\r
- private SynthesisFilter filter1;\r
+ // @LOC("FIL")\r
+ // private SynthesisFilter filter1;\r
\r
/**\r
* Sythesis filter for the right channel.\r
*/\r
- @LOC("FIL")\r
- private SynthesisFilter filter2;\r
+ // @LOC("FIL")\r
+ // private SynthesisFilter filter2;\r
\r
/**\r
* The decoder used to decode layer III frames.\r
* The <code>Params</code> instance that describes the customizable\r
* aspects of the decoder.\r
*/\r
- public Decoder(Params params0) {\r
- if (params0 == null)\r
- params0 = DEFAULT_PARAMS;\r
+ public Decoder(@DELEGATE Params params0) {\r
+\r
+ if (params0 == null) {\r
+ params0 = getDefaultParams();\r
+ }\r
\r
params = params0;\r
\r
return (Params) DEFAULT_PARAMS.clone();\r
}\r
\r
- public void setEqualizer(Equalizer eq) {\r
- if (eq == null)\r
- eq = Equalizer.PASS_THRU_EQ;\r
-\r
- equalizer.setFrom(eq);\r
-\r
- float[] factors = equalizer.getBandFactors();\r
-\r
- if (filter1 != null)\r
- filter1.setEQ(factors);\r
-\r
- if (filter2 != null)\r
- filter2.setEQ(factors);\r
- }\r
+ // public void setEqualizer(Equalizer eq) {\r
+ // if (eq == null)\r
+ // eq = Equalizer.PASS_THRU_EQ;\r
+ //\r
+ // equalizer.setFrom(eq);\r
+ //\r
+ // float[] factors = equalizer.getBandFactors();\r
+ //\r
+ // if (filter1 != null)\r
+ // filter1.setEQ(factors);\r
+ //\r
+ // if (filter2 != null)\r
+ // filter2.setEQ(factors);\r
+ // }\r
\r
/**\r
* Decodes one frame from an MPEG audio bitstream.\r
*/\r
@LATTICE("O<DE,DE<TH,TH<IN,THISLOC=TH")\r
@RETURNLOC("O")\r
- public Obuffer decodeFrame(@LOC("IN") Header header, @LOC("IN") Bitstream stream)\r
- throws DecoderException {\r
+ public Obuffer decodeFrame(@LOC("IN") Header header) throws DecoderException {\r
\r
if (!initialized) {\r
- initialize(header);\r
+ float scalefactor = 32700.0f;\r
+\r
+ int mode = header.mode();\r
+ int layer = header.layer();\r
+ int channels = mode == Header.SINGLE_CHANNEL ? 1 : 2;\r
+\r
+ // set up output buffer if not set up by client.\r
+ // if (output == null)\r
+ // output = new SampleBuffer(header.frequency(), channels);\r
+ SampleBufferWrapper.init(header.frequency(), channels);\r
+\r
+ float[] factors = equalizer.getBandFactors();\r
+ SynthesisFilter filter1 = new SynthesisFilter(0, scalefactor, factors);\r
+\r
+ // REVIEW: allow mono output for stereo\r
+ SynthesisFilter filter2 = null;\r
+ if (channels == 2) {\r
+ filter2 = new SynthesisFilter(1, scalefactor, factors);\r
+ }\r
+\r
+ outputChannels = channels;\r
+ outputFrequency = header.frequency();\r
+\r
+ l3decoder = new LayerIIIDecoder(filter1, filter2, OutputChannels.BOTH_CHANNELS);\r
+\r
+ initialized = true;\r
}\r
\r
@LOC("TH") int layer = header.layer();\r
\r
- output.clear_buffer();\r
- \r
- @LOC("DE,Decoder.DE") FrameDecoder decoder = retrieveDecoder(header, stream, layer); // return\r
- // ceil=DELTA(TH)\r
- decoder.decodeFrame();\r
-\r
- // if (layer == 3) {\r
- // if (l3decoder == null) {\r
- // l3decoder =\r
- // new LayerIIIDecoder(stream, header, filter1, filter2, output,\r
- // OutputChannels.BOTH_CHANNELS);\r
- // }\r
- // l3decoder.decodeFrame();\r
- // } else if (layer == 2) {\r
- // if (l2decoder == null) {\r
- // l2decoder = new LayerIIDecoder();\r
- // l2decoder.create(stream, header, filter1, filter2, output,\r
- // OutputChannels.BOTH_CHANNELS);\r
- // }\r
- // l2decoder.decodeFrame();\r
- // } else {\r
- // if (l1decoder == null) {\r
- // l1decoder = new LayerIDecoder();\r
- // l1decoder.create(stream, header, filter1, filter2, output,\r
- // OutputChannels.BOTH_CHANNELS);\r
- // }\r
- // l1decoder.decodeFrame();\r
- // }\r
-\r
- output.write_buffer(1);\r
-\r
- return output;\r
+ SampleBufferWrapper.getOutput().clear_buffer();\r
+ // output.clear_buffer();\r
+\r
+ // @LOC("DE,Decoder.DE") FrameDecoder decoder = retrieveDecoder(header,\r
+ // stream, layer);\r
+ // decoder.decodeFrame();\r
+\r
+ l3decoder.decodeFrame(header);\r
+\r
+ SampleBufferWrapper.getOutput().write_buffer(1);\r
+ // output.write_buffer(1);\r
+\r
+ // return output;\r
}\r
\r
/**\r
* Changes the output buffer. This will take effect the next time\r
* decodeFrame() is called.\r
*/\r
- public void setOutputBuffer(Obuffer out) {\r
- output = out;\r
- }\r
+ // public void setOutputBuffer(Obuffer out) {\r
+ // output = out;\r
+ // }\r
\r
/**\r
* Retrieves the sample frequency of the PCM samples output by this decoder.\r
return new DecoderException(errorcode, throwable);\r
}\r
\r
- @LATTICE("IN,TH,THISLOC=TH")\r
- @RETURNLOC("TH")\r
- protected FrameDecoder retrieveDecoder(@LOC("IN") Header header, @LOC("IN") Bitstream stream,\r
- @LOC("IN") int layer) throws DecoderException {\r
- // @LOC("DE") FrameDecoder decoder = null;\r
-\r
- // REVIEW: allow channel output selection type\r
- // (LEFT, RIGHT, BOTH, DOWNMIX)\r
- switch (layer) {\r
- case 3:\r
- if (l3decoder == null) {\r
- l3decoder =\r
- new LayerIIIDecoder(header, filter1, filter2, output, OutputChannels.BOTH_CHANNELS);\r
- }\r
-\r
- return l3decoder;\r
- // decoder = l3decoder;\r
- break;\r
- // case 2:\r
- // if (l2decoder == null) {\r
- // l2decoder = new LayerIIDecoder();\r
- // l2decoder.create(stream, header, filter1, filter2, output,\r
- // OutputChannels.BOTH_CHANNELS);\r
- // }\r
- // return l2decoder;\r
- // // decoder = l2decoder;\r
- // break;\r
- // case 1:\r
- // if (l1decoder == null) {\r
- // l1decoder = new LayerIDecoder();\r
- // l1decoder.create(stream, header, filter1, filter2, output,\r
- // OutputChannels.BOTH_CHANNELS);\r
- // }\r
- // return l1decoder;\r
- // // decoder = l1decoder;\r
- // break;\r
- }\r
- //\r
- // if (decoder==null)\r
- // {\r
- // throw newDecoderException(UNSUPPORTED_LAYER, null);\r
- // }\r
- //\r
- // return decoder;\r
- }\r
-\r
- public void initialize(Header header) throws DecoderException {\r
-\r
- // REVIEW: allow customizable scale factor\r
- float scalefactor = 32700.0f;\r
-\r
- int mode = header.mode();\r
- int layer = header.layer();\r
- int channels = mode == Header.SINGLE_CHANNEL ? 1 : 2;\r
-\r
- // set up output buffer if not set up by client.\r
- if (output == null)\r
- output = new SampleBuffer(header.frequency(), channels);\r
-\r
- float[] factors = equalizer.getBandFactors();\r
- filter1 = new SynthesisFilter(0, scalefactor, factors);\r
-\r
- // REVIEW: allow mono output for stereo\r
- if (channels == 2)\r
- filter2 = new SynthesisFilter(1, scalefactor, factors);\r
-\r
- outputChannels = channels;\r
- outputFrequency = header.frequency();\r
-\r
- initialized = true;\r
- }\r
-\r
/**\r
* The <code>Params</code> class presents the customizable aspects of the\r
* decoder.\r
* Instances of this class are not thread safe.\r
*/\r
public static class Params implements Cloneable {\r
- private OutputChannels outputChannels = OutputChannels.BOTH;\r
+\r
+ // private OutputChannels outputChannels = OutputChannels.BOTH;\r
+ private OutputChannels outputChannels = new OutputChannels(0);\r
\r
private Equalizer equalizer = new Equalizer();\r
\r
public Object clone() {\r
// TODO: need to have better clone method\r
Params clone = new Params();\r
- clone.outputChannels = outputChannels;\r
- clone.equalizer = equalizer;\r
+ clone.outputChannels = new OutputChannels(outputChannels.getChannelsOutputCode());\r
+ clone.equalizer = new Equalizer();\r
return clone;\r
// try\r
// {\r