package com.limegroup.gnutella.gui.mp3; /*************************************************************************** * * * WaveStreamObuffer.java * * Credit: Code modified from javazoom.jl.decoder.WaveFileObuffer * * Purpose: Allows storage for recently decoded mpeg frames * * Thanks to Ben Fransen, Donn Morrison. * * * ***************************************************************************/ import javazoom.jl.decoder.Obuffer; public final class WaveStreamObuffer extends Obuffer { // stores decoded frame private final short[] buffer = new short[OBUFFERSIZE]; private final short[] bufferp = new short[MAXCHANNELS]; private int channels; public WaveStreamObuffer(int number_of_channels, int freq) { channels = number_of_channels; for(int i=0;i<channels;++i) bufferp[i] = (short)i; } /** * append * * - append a value to the channel buffer * */ public final void append(final int channel, final short value) { buffer[bufferp[channel]] = value; bufferp[channel] += channels; } /** * Accepts 32 new PCM samples. * Stolen from superclass. */ public final void appendSamples(final int channel, final float[] f) { short s; for (int i=0; i<32;) { { final float currFloat = f[i++]; s = ((currFloat > 32767.0f) ? 32767 : ((currFloat < -32768.0f) ? -32768 : (short) currFloat)); } // append(channel, s); buffer[bufferp[channel]] = s; bufferp[channel] += channels; } } /** * write_buffer * * - write a value to the buffer * */ public void write_buffer(int val) { for(int i=0;i<channels;++i) bufferp[i] = (short)i; } /** * get_data * * - Used by Player to retrieve the output written to the Obuffer * by the Decoder. The bytes are retrieved and sent directly to * the SourceDataLine for playing. */ public byte [] get_data() { byte[] theData = new byte[buffer.length*2]; int yc = 0; for (int y = 0;y<buffer.length*2;y=y+2) { theData[y] = (byte) (buffer[yc] & 0x00FF); theData[y+1] =(byte) ((buffer[yc++] >>> 8) & 0x00FF); } return theData; } // close() code removed - not needed public void close() {} // clear_buffer() code removed - not needed public void clear_buffer() {} // set_stop_flag() code removed - not needed public void set_stop_flag() {} }