/*
 * 11/19/04  1.0 moved to LGPL.
 * 12/12/99  Added appendSamples() method for efficiency. MDM.
 * 15/02/99 ,Java Conversion by E.B ,ebsp@iname.com, JavaLayer
 *
 *   Declarations for output buffer, includes operating system
 *   implementation of the virtual Obuffer. Optional routines
 *   enabling seeks and stops added by Jeff Tsay.
 *
 *  @(#) obuffer.h 1.8, last edit: 6/15/94 16:51:56
 *  @(#) Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de)
 *  @(#) Berlin University of Technology
 *
 *  Idea and first implementation for u-law output with fast downsampling by
 *  Jim Boucher (jboucher@flash.bu.edu)
 *
 *  LinuxObuffer class written by
 *  Louis P. Kruger (lpkruger@phoenix.princeton.edu)
 *-----------------------------------------------------------------------
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU Library General Public License as published
 *   by the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *   This program 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 Library General Public License for more details.
 *
 *   You should have received a copy of the GNU Library General Public
 *   License along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *----------------------------------------------------------------------
 */
package v4lk.lwbd.decoders.processing.jlayer;

/**
 * Base Class for audio output.
 */
public abstract class Obuffer {
    public static final int OBUFFERSIZE = 2 * 1152;    // max. 2 * 1152 samples per frame
    public static final int MAXCHANNELS = 2;        // max. number of channels

    /**
     * Takes a 16 Bit PCM sample.
     */
    public abstract void append(int channel, short value);

    /**
     * Accepts 32 new PCM samples.
     */
    public void appendSamples(int channel, float[] f) {
        short s;
        for (int i = 0; i < 32; ) {
            s = clip(f[i++]);
            append(channel, s);
        }
    }

    /**
     * Clip Sample to 16 Bits
     */
    private final short clip(float sample) {
        return ((sample > 32767.0f) ? 32767 :
                ((sample < -32768.0f) ? -32768 :
                        (short) sample));
    }

    /**
     * Write the samples to the file or directly to the audio hardware.
     */
    public abstract void write_buffer(int val);

    public abstract void close();

    /**
     * Clears all data in the buffer (for seeking).
     */
    public abstract void clear_buffer();

    /**
     * Notify the buffer that the user has stopped the stream.
     */
    public abstract void set_stop_flag();
}
