/// <summary>
 /// Obtains the set of target formats with the encoding specified supported by
 /// the format converter.
 /// </summary>
 /// <remarks>
 /// Obtains the set of target formats with the encoding specified supported by
 /// the format converter. If no target formats with the specified encoding are
 /// supported for this source format, an array of length 0 is returned.
 /// </remarks>
 /// <param name="targetEncoding">desired encoding of the outgoing data.</param>
 /// <param name="sourceFormat">format of the incoming data.</param>
 /// <returns>array of supported target formats.</returns>
 public override javax.sound.sampled.AudioFormat[] getTargetFormats(javax.sound.sampled.AudioFormat.Encoding
     targetEncoding, javax.sound.sampled.AudioFormat sourceFormat)
 {
     if (sourceFormat.getEncoding().Equals(javax.sound.sampled.AudioFormat.Encoding.PCM_SIGNED
         ) && targetEncoding is org.xiph.speex.spi.SpeexEncoding)
     {
         if (sourceFormat.getChannels() > 2 || sourceFormat.getChannels() <= 0 || sourceFormat
             .isBigEndian())
         {
             javax.sound.sampled.AudioFormat[] formats = new javax.sound.sampled.AudioFormat[]
                  {  };
             return formats;
         }
         else
         {
             javax.sound.sampled.AudioFormat[] formats = new javax.sound.sampled.AudioFormat[]
                  { new javax.sound.sampled.AudioFormat(targetEncoding, sourceFormat.getSampleRate
                 (), -1, sourceFormat.getChannels(), -1, -1, false) };
             // sample size in bits
             // frame size
             // frame rate
             // little endian
             return formats;
         }
     }
     else
     {
         if (sourceFormat.getEncoding() is org.xiph.speex.spi.SpeexEncoding && targetEncoding
             .Equals(javax.sound.sampled.AudioFormat.Encoding.PCM_SIGNED))
         {
             javax.sound.sampled.AudioFormat[] formats = new javax.sound.sampled.AudioFormat[]
                  { new javax.sound.sampled.AudioFormat(sourceFormat.getSampleRate(), 16, sourceFormat
                 .getChannels(), true, false) };
             // sample size in bits
             // signed
             // little endian (for PCM wav)
             return formats;
         }
         else
         {
             javax.sound.sampled.AudioFormat[] formats = new javax.sound.sampled.AudioFormat[]
                  {  };
             return formats;
         }
     }
 }
        /// <summary>Constructor</summary>
        /// <param name="mode">the mode of the encoder (0=NB, 1=WB, 2=UWB).</param>
        /// <param name="quality">the quality setting of the encoder (between 0 and 10).</param>
        /// <param name="in">the underlying input stream.</param>
        /// <param name="format">the target format of this stream's audio data.</param>
        /// <param name="length">the length in sample frames of the data in this stream.</param>
        /// <param name="size">the buffer size.</param>
        /// <exception>
        /// IllegalArgumentException
        /// if size &lt;= 0.
        /// </exception>
        public Pcm2SpeexAudioInputStream(int mode, int quality, java.io.InputStream @in, 
            javax.sound.sampled.AudioFormat format, long length, int size)
            : base(@in, format
			, length, size)
        {
            //  public static final boolean DEFAULT_VBR              = true;
            // .4s of audio
            // Speex variables
            // Ogg variables
            // Ogg initialisation
            granulepos = 0;
            if (streamSerialNumber == 0)
            {
                streamSerialNumber = new java.util.Random().nextInt();
            }
            packetsPerOggPage = DEFAULT_PACKETS_PER_OGG_PAGE;
            packetCount = 0;
            pageCount = 0;
            // Speex initialisation
            framesPerPacket = DEFAULT_FRAMES_PER_PACKET;
            int samplerate = (int)format.getSampleRate();
            if (samplerate < 0)
            {
                samplerate = DEFAULT_SAMPLERATE;
            }
            channels = format.getChannels();
            if (channels < 0)
            {
                channels = DEFAULT_CHANNELS;
            }
            if (mode < 0)
            {
                mode = (samplerate < 12000) ? 0 : ((samplerate < 24000) ? 1 : 2);
            }
            this.mode = mode;
            javax.sound.sampled.AudioFormat.Encoding encoding = format.getEncoding();
            if (quality < 0)
            {
                if (encoding is org.xiph.speex.spi.SpeexEncoding)
                {
                    quality = ((org.xiph.speex.spi.SpeexEncoding)encoding).getQuality();
                }
                else
                {
                    quality = DEFAULT_QUALITY;
                }
            }
            encoder = new org.xiph.speex.SpeexEncoder();
            encoder.init(mode, quality, samplerate, channels);
            if (encoding is org.xiph.speex.spi.SpeexEncoding && ((org.xiph.speex.spi.SpeexEncoding
                )encoding).isVBR())
            {
                setVbr(true);
            }
            else
            {
                setVbr(false);
            }
            frameSize = 2 * channels * encoder.getFrameSize();
            // Misc initialsation
            comment = "Encoded with " + org.xiph.speex.SpeexEncoder.VERSION;
            first = true;
        }