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<CONT,BUFP*")
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;
42 public SampleBuffer(@LOC("IN") int sample_frequency, @LOC("IN") int number_of_channels)
44 buffer = new short[OBUFFERSIZE];
45 bufferp = new int[MAXCHANNELS];
46 channels = number_of_channels; // [IN] -> [D]
47 frequency = sample_frequency; // [IN] -> [D]
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
57 public int getChannelCount()
62 public int getSampleFrequency()
64 return this.frequency;
67 public short[] getBuffer()
72 public int getBufferLength()
78 * Takes a 16 Bit PCM sample.
80 public void append(@LOC("IN") int channel, @LOC("IN") short value)
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]
87 bufferp[channel] += channels;
88 // for lhs, LOC(bufferp[channel]) = [local.D, SampleBuffer.BUFP]
89 // for rhs, LOC(channels) = [local.D, SampleBuffer.CON]
93 @LATTICE("D<IN,D<C,THISLOC=D")
94 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.BUF]
98 // LOC(pos)=[D,SampleBuffer.BUFP]
100 @LOC("D,SampleBuffer.BUFP") short s;
101 @LOC("D,SampleBuffer.BUFP") float fs;
103 for (@LOC("C") int i=0; i<32;)
105 fs = f[i++]; // [IN] -> [D,BUFP]
110 // it has an indirect flow from LOC(fs)
111 // since LOC(fs) is a shared location, it's okay
119 fs = (fs>32767.0f ? 32767.0f
120 : (fs < -32767.0f ? -32767.0f : fs));
123 s = (short)fs; // it's okay since BUFP of [D,BUFP] is a shared location
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]
129 pos += channels; // [D,BUFP] -> [D,BUFP]
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
140 * Write the samples to the file (Random Acces).
142 public void write_buffer(int val)
145 //for (int i = 0; i < channels; ++i)
146 // bufferp[i] = (short)i;
156 public void clear_buffer()
158 for (int i = 0; i < channels; ++i)
159 bufferp[i] = (short)i;
165 public void set_stop_flag()