/***************************************************************************
* JLayerME is a JAVA library that decodes/plays/converts MPEG 1/2 Layer 3.
* Project Homepage: http://www.javazoom.net/javalayer/javalayerme.html.
* Copyright (C) JavaZOOM 1999-2005.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*---------------------------------------------------------------------------
*/
package javazoom.jlme.decoder;
public class Decoder {
private SampleBuffer output;
private SynthesisFilter filter1;
private SynthesisFilter filter2;
private LayerIIIDecoder decoder;
private int outputFrequency;
private int outputChannels;
/**
* Constructor for the Decoder object
*
* @param header
* Description of Parameter
* @param stream
* Description of Parameter
*/
public Decoder(Header header, BitStream stream) {
// E.B Fix - Damned unloaded static fields !
BitReserve.totbit = 0;
BitReserve.buf_bit_idx = 0;
BitReserve.buf_byte_idx = 0;
BitReserve.offset = 0;
// End of fix.
if (header.layer() == 3) {
// float scalefactor = 48000.0f;
float scalefactor = 32700.0f;
int mode = header.mode();
int channels = mode == Header.SINGLE_CHANNEL ? 1 : 2;
output = new SampleBuffer(header.frequency(), channels);
filter1 = new SynthesisFilter(0, scalefactor);
if (channels == 2) {
filter2 = new SynthesisFilter(1, scalefactor);
}
outputChannels = channels;
outputFrequency = header.frequency();
decoder = new LayerIIIDecoder(stream, header, filter1, filter2,
output, OutputChannels.BOTH_CHANNELS);
} else {
System.exit(1);
}
}
/**
* Sets the outputBuffer attribute of the Decoder object
*
* @param out
* The new outputBuffer value
*/
public final void setOutputBuffer(SampleBuffer out) {
output = out;
}
/**
* Gets the outputFrequency attribute of the Decoder object
*
* @return The outputFrequency value
*/
public final int getOutputFrequency() {
return outputFrequency;
}
/**
* Gets the outputChannels attribute of the Decoder object
*
* @return The outputChannels value
*/
public final int getOutputChannels() {
return outputChannels;
}
/**
* Gets the outputBlockSize attribute of the Decoder object
*
* @return The outputBlockSize value
*/
public final int getOutputBlockSize() {
return SampleBuffer.OBUFFERSIZE;
}
/**
* Description of the Method
*
* @return Description of the Returned Value
*/
public final SampleBuffer decodeFrame() {
output.clear();
decoder.decodeFrame();
return output;
}
}