2 * 11/19/04 1.0 moved to LGPL.
4 * 12/12/99 Initial Version based on FileObuffer. mdm@techie.com.
7 * 15/02/99 Java Conversion by E.B ,javalayer@javazoom.net
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.
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.
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 *----------------------------------------------------------------------
27 * The <code>SampleBuffer</code> class implements an output buffer
28 * that provides storage for a fixed size block of samples.
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
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 @LOC("IDX") private int idx;
43 public SampleBuffer(@LOC("IN") int sample_frequency, @LOC("IN") int number_of_channels)
45 buffer = new short[OBUFFERSIZE];
46 bufferp = new int[MAXCHANNELS];
47 channels = number_of_channels; // [IN] -> [D]
48 frequency = sample_frequency; // [IN] -> [D]
50 for (@LOC("C") int i = 0; i < number_of_channels; ++i) {
51 bufferp[i] = (short)i; // LOC(bufferp[i]) has indirect flows from the location C, IN
52 // also, it has a direct flow from C
53 // anyway, LOC(bufferp[i])=[D,SampleBuffer.BUFP] is lower than all locations that have in-flows
58 public int getChannelCount()
63 public int getSampleFrequency()
65 return this.frequency;
68 public short[] getBuffer()
73 public int getBufferLength()
79 * Takes a 16 Bit PCM sample.
81 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]
88 bufferp[channel] += channels;
89 // for lhs, LOC(bufferp[channel]) = [local.D, SampleBuffer.BUFP]
90 // for rhs, LOC(channels) = [local.D, SampleBuffer.CON]
94 @LATTICE("D<IN,IN<C,THISLOC=D,C*")
95 public void appendSamples(@LOC("IN") int channel, @LOC("IN") float[] f)
97 @LOC("D,SampleBuffer.BUFP") int pos = bufferp[channel];
98 // LOC(bufferp[channel])=[D,SampleBuffer.BUFP]
99 // LOC(pos)=[D,SampleBuffer.BUFP]
101 @LOC("D,SampleBuffer.BUFP") short s;
102 @LOC("D,SampleBuffer.BUFP") float fs;
104 for (@LOC("C") int i=0; i<32;)
106 fs = f[i++]; // [IN] -> [D,BUFP]
111 // it has an indirect flow from LOC(fs)
112 // since LOC(fs) is a shared location, it's okay
120 fs = (fs>32767.0f ? 32767.0f
121 : (fs < -32767.0f ? -32767.0f : fs));
124 s = (short)fs; // it's okay since BUFP of [D,BUFP] is a shared location
126 // for LHS, LOC(buffer[pos])= GLB( [D,BUF] , [D,BUFP] ) = [D,BUF]
127 // for RHS, LOC(s) = [D,BUFP]
128 // so it's okay: [D,BUFP] -> [D,BUF]
130 pos += channels; // [D,BUFP] -> [D,BUFP]
133 bufferp[channel] = pos;
134 // for lhs, LOC(bufferp[channel])=[D,BUFP]
135 // for rhs, LOC(pos)=[D,BUFP]
136 // since BUFP is a shared location, the assignment is okay
141 * Write the samples to the file (Random Acces).
143 public void write_buffer(@LOC("IN") int val)
146 //for (int i = 0; i < channels; ++i)
147 // bufferp[i] = (short)i;
158 public void clear_buffer()
160 for (idx = 0; idx < channels; ++idx)
161 bufferp[idx] = (short)idx;
167 public void set_stop_flag()