/******************************************************************************
 *                                                                            *
 * Copyright (c) 1999-2003 Wimba S.A., All Rights Reserved.                   *
 *                                                                            *
 * COPYRIGHT:                                                                 *
 *      This software is the property of Wimba S.A.                           *
 *      This software is redistributed under the Xiph.org variant of          *
 *      the BSD license.                                                      *
 *      Redistribution and use in source and binary forms, with or without    *
 *      modification, are permitted provided that the following conditions    *
 *      are met:                                                              *
 *      - Redistributions of source code must retain the above copyright      *
 *      notice, this list of conditions and the following disclaimer.         *
 *      - Redistributions in binary form must reproduce the above copyright   *
 *      notice, this list of conditions and the following disclaimer in the   *
 *      documentation and/or other materials provided with the distribution.  *
 *      - Neither the name of Wimba, the Xiph.org Foundation nor the names of *
 *      its contributors may be used to endorse or promote products derived   *
 *      from this software without specific prior written permission.         *
 *                                                                            *
 * WARRANTIES:                                                                *
 *      This software is made available by the authors in the hope            *
 *      that it will be useful, but without any warranty.                     *
 *      Wimba S.A. is not liable for any consequence related to the           *
 *      use of the provided software.                                         *
 *                                                                            *
 * Class: Inband.java                                                         *
 *                                                                            *
 * Author: Marc GIMPEL                                                        *
 *                                                                            *
 * Date: 14th July 2003                                                       *
 *                                                                            *
 ******************************************************************************/

/* $Id: Inband.java,v 1.2 2004/10/21 16:21:57 mgimpel Exp $ */

package org.xiph.speex;

import java.io.StreamCorruptedException;

/**
 * Speex in-band and User in-band controls.
 * 
 * @author Marc Gimpel, Wimba S.A. (mgimpel@horizonwimba.com)
 * @version $Revision: 1.2 $
 */
public class Inband
{
  private Stereo stereo;

  /**
   * Constructor.
   * @param stereo
   */
  public Inband (final Stereo stereo)
  {
    this.stereo = stereo;
  }

  /**
   * Speex in-band request (submode=14).
   * @param bits - Speex bits buffer.
   * @throws StreamCorruptedException If stream seems corrupted.
   */
  public void speexInbandRequest(final Bits bits)
    throws StreamCorruptedException
  {
    int code = bits.unpack(4);
    switch (code) {
      case 0: // asks the decoder to set perceptual enhancment off (0) or on (1)
        bits.advance(1);
        break;
      case 1: // asks (if 1) the encoder to be less "aggressive" due to high packet loss
        bits.advance(1);
        break;
      case 2: // asks the encoder to switch to mode N
        bits.advance(4);
        break;
      case 3: // asks the encoder to switch to mode N for low-band
        bits.advance(4);
        break;
      case 4: // asks the encoder to switch to mode N for high-band
        bits.advance(4);
        break;
      case 5: // asks the encoder to switch to quality N for VBR
        bits.advance(4);
        break;
      case 6: // request acknowledgement (0=no, 1=all, 2=only for inband data)
        bits.advance(4);
        break;
      case 7: // asks the encoder to set CBR(0), VAD(1), DTX(3), VBR(5), VBR+DTX(7)
        bits.advance(4);
        break;
      case 8: // transmit (8-bit) character to the other end
        bits.advance(8);
        break;
      case 9: // intensity stereo information
        // setup the stereo decoder; to skip: tmp = bits.unpack(8); break;
        stereo.init(bits); // read 8 bits
        break;
      case 10: // announce maximum bit-rate acceptable (N in byets/second)
        bits.advance(16);
        break;
      case 11: // reserved
        bits.advance(16);
        break;
      case 12: // Acknowledge receiving packet N
        bits.advance(32);
        break;
      case 13: // reserved
        bits.advance(32);
        break;
      case 14: // reserved
        bits.advance(64);
        break;
      case 15: // reserved
        bits.advance(64);
        break;
      default:
    }
  }
  
  /**
   * User in-band request (submode=13).
   * @param bits - Speex bits buffer.
   * @throws StreamCorruptedException If stream seems corrupted.
   */
  public void userInbandRequest(final Bits bits)
    throws StreamCorruptedException
  {
    int req_size = bits.unpack(4);
    bits.advance(5+8*req_size);
  }
}
