/// <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>
 /// Obtains an audio input stream with the specified format from the given
 /// audio input stream.
 /// </summary>
 /// <remarks>
 /// Obtains an audio input stream with the specified format from the given
 /// audio input stream.
 /// </remarks>
 /// <param name="targetFormat">- desired data format of the stream after processing.</param>
 /// <param name="sourceStream">- stream from which data to be processed should be read.
 /// 	</param>
 /// <returns>
 /// stream from which processed data with the specified format may be
 /// read.
 /// </returns>
 /// <exception>
 /// IllegalArgumentException
 /// - if the format combination supplied
 /// is not supported.
 /// </exception>
 public override javax.sound.sampled.AudioInputStream getAudioInputStream(javax.sound.sampled.AudioFormat
     targetFormat, javax.sound.sampled.AudioInputStream sourceStream)
 {
     if (isConversionSupported(targetFormat, sourceStream.getFormat()))
     {
         javax.sound.sampled.AudioFormat[] formats = getTargetFormats(targetFormat.getEncoding
             (), sourceStream.getFormat());
         if (formats != null && formats.Length > 0)
         {
             javax.sound.sampled.AudioFormat sourceFormat = sourceStream.getFormat();
             if (sourceFormat.Equals(targetFormat))
             {
                 return sourceStream;
             }
             else
             {
                 if (sourceFormat.getEncoding() is org.xiph.speex.spi.SpeexEncoding && targetFormat
                     .getEncoding().Equals(javax.sound.sampled.AudioFormat.Encoding.PCM_SIGNED))
                 {
                     return new org.xiph.speex.spi.Speex2PcmAudioInputStream(sourceStream, targetFormat
                         , -1);
                 }
                 else
                 {
                     if (sourceFormat.getEncoding().Equals(javax.sound.sampled.AudioFormat.Encoding.PCM_SIGNED
                         ) && targetFormat.getEncoding() is org.xiph.speex.spi.SpeexEncoding)
                     {
                         return new org.xiph.speex.spi.Pcm2SpeexAudioInputStream(sourceStream, targetFormat
                             , -1);
                     }
                     else
                     {
                         throw new System.ArgumentException("unable to convert " + sourceFormat.ToString()
                              + " to " + targetFormat.ToString());
                     }
                 }
             }
         }
         else
         {
             throw new System.ArgumentException("target format not found");
         }
     }
     else
     {
         throw new System.ArgumentException("conversion not supported");
     }
 }
 /// <summary>
 /// Obtains the set of target format encodings supported by the format
 /// converter given a particular source format.
 /// </summary>
 /// <remarks>
 /// Obtains the set of target format encodings supported by the format
 /// converter given a particular source format. If no target format encodings
 /// are supported for this source format, an array of length 0 is returned.
 /// </remarks>
 /// <param name="sourceFormat">format of the incoming data.</param>
 /// <returns>array of supported target format encodings.</returns>
 public override javax.sound.sampled.AudioFormat.Encoding[] getTargetEncodings(javax.sound.sampled.AudioFormat
     sourceFormat)
 {
     if (sourceFormat.getEncoding().Equals(javax.sound.sampled.AudioFormat.Encoding.PCM_SIGNED
         ))
     {
         javax.sound.sampled.AudioFormat.Encoding[] encodings = new javax.sound.sampled.AudioFormat.Encoding
             [] { org.xiph.speex.spi.SpeexEncoding.SPEEX_Q0, org.xiph.speex.spi.SpeexEncoding
             .SPEEX_Q1, org.xiph.speex.spi.SpeexEncoding.SPEEX_Q2, org.xiph.speex.spi.SpeexEncoding
             .SPEEX_Q3, org.xiph.speex.spi.SpeexEncoding.SPEEX_Q4, org.xiph.speex.spi.SpeexEncoding
             .SPEEX_Q5, org.xiph.speex.spi.SpeexEncoding.SPEEX_Q6, org.xiph.speex.spi.SpeexEncoding
             .SPEEX_Q7, org.xiph.speex.spi.SpeexEncoding.SPEEX_Q8, org.xiph.speex.spi.SpeexEncoding
             .SPEEX_Q9, org.xiph.speex.spi.SpeexEncoding.SPEEX_Q10, org.xiph.speex.spi.SpeexEncoding
             .SPEEX_VBR0, org.xiph.speex.spi.SpeexEncoding.SPEEX_VBR1, org.xiph.speex.spi.SpeexEncoding
             .SPEEX_VBR2, org.xiph.speex.spi.SpeexEncoding.SPEEX_VBR3, org.xiph.speex.spi.SpeexEncoding
             .SPEEX_VBR4, org.xiph.speex.spi.SpeexEncoding.SPEEX_VBR5, org.xiph.speex.spi.SpeexEncoding
             .SPEEX_VBR6, org.xiph.speex.spi.SpeexEncoding.SPEEX_VBR7, org.xiph.speex.spi.SpeexEncoding
             .SPEEX_VBR8, org.xiph.speex.spi.SpeexEncoding.SPEEX_VBR9, org.xiph.speex.spi.SpeexEncoding
             .SPEEX_VBR10 };
         return encodings;
     }
     else
     {
         if (sourceFormat.getEncoding() is org.xiph.speex.spi.SpeexEncoding)
         {
             javax.sound.sampled.AudioFormat.Encoding[] encodings = new javax.sound.sampled.AudioFormat.Encoding
                 [] { javax.sound.sampled.AudioFormat.Encoding.PCM_SIGNED };
             return encodings;
         }
         else
         {
             javax.sound.sampled.AudioFormat.Encoding[] encodings = new javax.sound.sampled.AudioFormat.Encoding
                 [] {  };
             return encodings;
         }
     }
 }
        /// <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;
        }