have linear-type-safe source codes of mp3decoder
[IRC.git] / Robust / src / Tests / ssJava / mp3decoder / Decoder.java
index e7ca3fd22f0d4016b158eb092df76ac69bcbd911..8b3ecbc659a6088f08bd43a92c5151f8e1c0da18 100644 (file)
@@ -33,26 +33,26 @@ public class Decoder implements DecoderErrors {
   /**\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
@@ -93,9 +93,11 @@ public class Decoder implements DecoderErrors {
    *          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
@@ -109,20 +111,20 @@ public class Decoder implements DecoderErrors {
     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
@@ -136,56 +138,61 @@ public class Decoder implements DecoderErrors {
    */\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
@@ -236,78 +243,6 @@ public class Decoder implements DecoderErrors {
     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
@@ -315,7 +250,9 @@ public class Decoder implements DecoderErrors {
    * 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
@@ -325,8 +262,8 @@ public class Decoder implements DecoderErrors {
     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