provides makefile and makes it compile for david
[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
28  * that provides storage for a fixed size block of samples. 
29  */
30 @LATTICE("BUF<BUFP,BUFP<CONT,BUFP*")
31 @METHODDEFAULT("D<IN,D<C,C*,THISLOC=D")
32 public class SampleBuffer extends Obuffer
33 {
34   @LOC("BUF") private short[]           buffer;
35   @LOC("BUFP") private int[]       bufferp;
36   @LOC("CONT") private int              channels;
37   @LOC("CONT") private int              frequency;
38
39   /**
40    * Constructor
41    */
42   public SampleBuffer(@LOC("IN") int sample_frequency, @LOC("IN") int number_of_channels)
43   {
44     buffer = new short[OBUFFERSIZE];
45     bufferp = new int[MAXCHANNELS];
46     channels = number_of_channels; // [IN] -> [D]
47     frequency = sample_frequency; // [IN] -> [D]
48
49     for (@LOC("C") int i = 0; i < number_of_channels; ++i) {
50       bufferp[i] = (short)i; // LOC(bufferp[i]) has indirect flows from the location C, IN
51       // also, it has a direct flow from C
52       // anyway, LOC(bufferp[i])=[D,SampleBuffer.BUFP] is lower than all locations that have in-flows
53     }
54
55   }
56
57   public int getChannelCount()
58   {
59     return this.channels;  
60   }
61
62   public int getSampleFrequency()
63   {
64     return this.frequency;
65   }
66
67   public short[] getBuffer()
68   {
69     return this.buffer;  
70   }
71
72   public int getBufferLength()
73   {
74     return bufferp[0];
75   }
76
77   /**
78    * Takes a 16 Bit PCM sample.
79    */
80   public void append(@LOC("IN") int channel, @LOC("IN") short value)
81   {
82     buffer[bufferp[channel]] = value; 
83     // LOC(bufferp[channel])= [local.D,SampleBuffer.BUF]
84     // so, for LHS, LOC(buffer) < LOC(bufferp[channle])
85     // also, bet' LHS and RHS, LOC(LHS) < LOC(RHS) since LOC(value)=[IN]
86     
87     bufferp[channel] += channels; 
88     // for lhs, LOC(bufferp[channel]) = [local.D, SampleBuffer.BUFP] 
89     // for rhs, LOC(channels) = [local.D, SampleBuffer.CON] 
90     
91   }
92
93   @LATTICE("D<IN,D<C,THISLOC=D")
94   public void appendSamples(@LOC("IN") int channel, @LOC("IN") float[] f)
95   {
96     @LOC("D, SampleBuffer.BUFP") int pos = bufferp[channel]; 
97     // LOC(bufferp[channel])=[D,SampleBuffer.BUF]
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     {
105       fs = f[i++]; // [IN] -> [D,BUFP]
106       
107       
108       if(fs>32767.0f){
109         fs=32767.0f; 
110         // it has an indirect flow from LOC(fs)
111         // since LOC(fs) is a shared location, it's okay        
112       }else{
113         if(fs<-32767f){
114           fs=-327.67f;
115         }
116       }
117       
118       /*
119       fs = (fs>32767.0f ? 32767.0f 
120           : (fs < -32767.0f ? -32767.0f : fs));
121       */
122
123       s = (short)fs; // it's okay since BUFP of [D,BUFP] is a shared location  
124       buffer[pos] = s;
125       // for LHS, LOC(buffer[pos])= GLB( [D,BUF] , [D,BUFP] ) = [D,BUF] 
126       // for RHS, LOC(s) = [D,BUFP]
127       // so it's okay: [D,BUFP] -> [D,BUF]
128       
129       pos += channels; // [D,BUFP] -> [D,BUFP]
130     }
131
132     bufferp[channel] = pos; 
133     // for lhs, LOC(bufferp[channel])=[D,BUFP]
134     // for rhs, LOC(pos)=[D,BUFP]
135     // since BUFP is a shared location, the assignment is okay
136   }
137
138
139   /**
140    * Write the samples to the file (Random Acces).
141    */
142   public void write_buffer(int val)
143   {
144
145     //for (int i = 0; i < channels; ++i) 
146     //    bufferp[i] = (short)i;
147
148   }
149
150   public void close()
151   {}
152
153   /**
154    *
155    */
156   public void clear_buffer()
157   {
158     for (int i = 0; i < channels; ++i) 
159       bufferp[i] = (short)i;
160   }
161
162   /**
163    *
164    */
165   public void set_stop_flag()
166   {}
167 }