adding a test case
[IRC.git] / Robust / src / Tests / ssJava / mp3decoder / SampleBuffer.java
1 /* 
2  * 11/19/04     1.0 moved to LGPL.
3  * 
4  * 12/12/99  Initial Version based on FileObuffer.     mdm@techie.com.
5  * 
6  * FileObuffer:
7  * 15/02/99  Java Conversion by E.B ,javalayer@javazoom.net
8  *
9  *-----------------------------------------------------------------------
10  *   This program is free software; you can redistribute it and/or modify
11  *   it under the terms of the GNU Library General Public License as published
12  *   by the Free Software Foundation; either version 2 of the License, or
13  *   (at your option) any later version.
14  *
15  *   This program is distributed in the hope that it will be useful,
16  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *   GNU Library General Public License for more details.
19  *
20  *   You should have received a copy of the GNU Library General Public
21  *   License along with this program; if not, write to the Free Software
22  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23  *----------------------------------------------------------------------
24  */
25
26 /**
27  * The <code>SampleBuffer</code> class implements an output buffer that provides
28  * storage for a fixed size block of samples.
29  */
30 @LATTICE("BUF<BUFP,BUFP<IDX,IDX<CONT,BUFP*,IDX*")
31 @METHODDEFAULT("D<IN,D<C,C*,THISLOC=D")
32 public class SampleBuffer extends Obuffer {
33   @LOC("BUF")
34   private short[] buffer;
35   @LOC("BUFP")
36   private int[] bufferp;
37   @LOC("CONT")
38   private int channels;
39   @LOC("CONT")
40   private int frequency;
41   @LOC("IDX")
42   private int idx;
43
44   /**
45    * Constructor
46    */
47   public SampleBuffer(@LOC("IN") int sample_frequency, @LOC("IN") int number_of_channels) {
48     buffer = new short[OBUFFERSIZE];
49     bufferp = new int[MAXCHANNELS];
50     channels = number_of_channels; // [IN] -> [D]
51     frequency = sample_frequency; // [IN] -> [D]
52
53     for (@LOC("C") int i = 0; i < number_of_channels; ++i) {
54       bufferp[i] = (short) i; // LOC(bufferp[i]) has indirect flows from the
55                               // location C, IN
56       // also, it has a direct flow from C
57       // anyway, LOC(bufferp[i])=[D,SampleBuffer.BUFP] is lower than all
58       // locations that have in-flows
59     }
60
61   }
62
63   public int getChannelCount() {
64     return this.channels;
65   }
66
67   public int getSampleFrequency() {
68     return this.frequency;
69   }
70
71   public short[] getBuffer() {
72     return this.buffer;
73   }
74
75   public int getBufferLength() {
76     return bufferp[0];
77   }
78
79   /**
80    * Takes a 16 Bit PCM sample.
81    */
82   public void append(@LOC("IN") int channel, @LOC("IN") short value) {
83     buffer[bufferp[channel]] = value;
84     // LOC(bufferp[channel])= [local.D,SampleBuffer.BUF]
85     // so, for LHS, LOC(buffer) < LOC(bufferp[channle])
86     // also, bet' LHS and RHS, LOC(LHS) < LOC(RHS) since LOC(value)=[IN]
87
88     bufferp[channel] += channels;
89     // for lhs, LOC(bufferp[channel]) = [local.D, SampleBuffer.BUFP]
90     // for rhs, LOC(channels) = [local.D, SampleBuffer.CON]
91
92   }
93
94   @LATTICE("D<IN,IN<C,THISLOC=D,C*")
95   public void appendSamples(@LOC("IN") int channel, @LOC("IN") float[] f) {
96     @LOC("D,SampleBuffer.BUFP") int pos = bufferp[channel];
97     // LOC(bufferp[channel])=[D,SampleBuffer.BUFP]
98     // LOC(pos)=[D,SampleBuffer.BUFP]
99
100     @LOC("D,SampleBuffer.BUFP") short s;
101     @LOC("D,SampleBuffer.BUFP") float fs;
102
103     for (@LOC("C") int i = 0; i < 32;) {
104       fs = f[i++]; // [IN] -> [D,BUFP]
105
106       if (fs > 32767.0f) {
107         fs = 32767.0f;
108         // it has an indirect flow from LOC(fs)
109         // since LOC(fs) is a shared location, it's okay
110       } else {
111         if (fs < -32767.0f) {
112           fs = -32767.0f;
113         }
114       }
115
116       /*
117        * fs = (fs>32767.0f ? 32767.0f : (fs < -32767.0f ? -32767.0f : fs));
118        */
119
120       s = (short) fs; // it's okay since BUFP of [D,BUFP] is a shared location
121       buffer[pos] = s;
122       // for LHS, LOC(buffer[pos])= GLB( [D,BUF] , [D,BUFP] ) = [D,BUF]
123       // for RHS, LOC(s) = [D,BUFP]
124       // so it's okay: [D,BUFP] -> [D,BUF]
125
126       pos += channels; // [D,BUFP] -> [D,BUFP]
127     }
128
129     bufferp[channel] = pos;
130     // for lhs, LOC(bufferp[channel])=[D,BUFP]
131     // for rhs, LOC(pos)=[D,BUFP]
132     // since BUFP is a shared location, the assignment is okay
133   }
134
135   /**
136    * Write the samples to the file (Random Acces).
137    */
138   public void write_buffer(@LOC("IN") int val) {
139
140     // for (int i = 0; i < channels; ++i)
141     // bufferp[i] = (short)i;
142
143   }
144
145   public void close() {
146   }
147
148   /**
149    *
150    */
151
152   public void clear_buffer() {
153     for (idx = 0; idx < channels; ++idx)
154       bufferp[idx] = (short) idx;
155   }
156
157   /**
158    *
159    */
160   public void set_stop_flag() {
161   }
162 }