Class Speex2PcmAudioInputStream

  • All Implemented Interfaces:
    java.io.Closeable, java.lang.AutoCloseable

    public class Speex2PcmAudioInputStream
    extends FilteredAudioInputStream
    Converts an Ogg Speex bitstream into a PCM 16bits/sample audio stream.
    Version:
    $Revision: 1.5 $
    Author:
    Marc Gimpel, Wimba S.A. (mgimpel@horizonwimba.com)
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private Bits bits
      Speex bit packing and unpacking class.
      private int channelCount
      The number of audio channels (1=mono, 2=stereo).
      private float[] decodedData
      Array containing the decoded audio samples.
      private Decoder decoder
      Speex Decoder.
      private int frameSize
      The frame size, in samples.
      private int framesPerPacket
      The number of Speex frames that will be put in each Ogg packet.
      private boolean initialised
      Flag to indicate if this Stream has been initialised.
      private byte[] outputData
      Array containing the decoded audio samples converted into bytes.
      private int packetCount
      The number of Ogg packets that have been decoded in the current page.
      private byte[] packetSizes
      Array containing the sizes of Ogg packets in the current page.
      private int packetsPerOggPage
      The number of Ogg packets that are in each Ogg page.
      private int sampleRate
      The sample rate of the audio, in samples per seconds (Hz).
      private int streamSerialNumber
      A unique serial number that identifies the Ogg stream.
      • Fields inherited from class javax.sound.sampled.AudioInputStream

        format, frameLength, framePos
    • Constructor Summary

      Constructors 
      Constructor Description
      Speex2PcmAudioInputStream​(java.io.InputStream in, javax.sound.sampled.AudioFormat format, long length)
      Constructor
      Speex2PcmAudioInputStream​(java.io.InputStream in, javax.sound.sampled.AudioFormat format, long length, int size)
      Constructor
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      int available()
      Returns the number of bytes that can be read from this inputstream without blocking.
      protected void decode​(byte[] data, int offset, int len)
      This is where the actual decoding takes place.
      protected void fill()
      Fills the buffer with more data, taking into account shuffling and other tricks for dealing with marks.
      protected void initialise​(boolean blocking)
      Initialises the Ogg Speex to PCM InputStream.
      private static int readInt​(byte[] data, int offset)
      Converts Little Endian (Windows) bytes to an int (Java uses Big Endian).
      private void readOggPageHeader()
      Read the Ogg Page header and extract the speex packet sizes.
      long skip​(long n)
      See the general contract of the skip method of InputStream.
      • Methods inherited from class javax.sound.sampled.AudioInputStream

        getFormat, getFrameLength, read
      • Methods inherited from class java.io.InputStream

        nullInputStream, readAllBytes, readNBytes, readNBytes, transferTo
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • initialised

        private boolean initialised
        Flag to indicate if this Stream has been initialised.
      • sampleRate

        private int sampleRate
        The sample rate of the audio, in samples per seconds (Hz).
      • channelCount

        private int channelCount
        The number of audio channels (1=mono, 2=stereo).
      • decodedData

        private float[] decodedData
        Array containing the decoded audio samples.
      • outputData

        private byte[] outputData
        Array containing the decoded audio samples converted into bytes.
      • bits

        private Bits bits
        Speex bit packing and unpacking class.
      • decoder

        private Decoder decoder
        Speex Decoder.
      • frameSize

        private int frameSize
        The frame size, in samples.
      • framesPerPacket

        private int framesPerPacket
        The number of Speex frames that will be put in each Ogg packet.
      • streamSerialNumber

        private int streamSerialNumber
        A unique serial number that identifies the Ogg stream.
      • packetsPerOggPage

        private int packetsPerOggPage
        The number of Ogg packets that are in each Ogg page.
      • packetCount

        private int packetCount
        The number of Ogg packets that have been decoded in the current page.
      • packetSizes

        private byte[] packetSizes
        Array containing the sizes of Ogg packets in the current page.
    • Constructor Detail

      • Speex2PcmAudioInputStream

        public Speex2PcmAudioInputStream​(java.io.InputStream in,
                                         javax.sound.sampled.AudioFormat format,
                                         long length)
        Constructor
        Parameters:
        in - the underlying input stream.
        format - the target format of this stream's audio data.
        length - the length in sample frames of the data in this stream.
      • Speex2PcmAudioInputStream

        public Speex2PcmAudioInputStream​(java.io.InputStream in,
                                         javax.sound.sampled.AudioFormat format,
                                         long length,
                                         int size)
        Constructor
        Parameters:
        in - the underlying input stream.
        format - the target format of this stream's audio data.
        length - the length in sample frames of the data in this stream.
        size - the buffer size.
        Throws:
        java.lang.IllegalArgumentException - if size <= 0.
    • Method Detail

      • initialise

        protected void initialise​(boolean blocking)
                           throws java.io.IOException
        Initialises the Ogg Speex to PCM InputStream. Read the Ogg Speex header and extract the speex decoder parameters to initialise the decoder. Then read the Comment header. Ogg Header description:
          0 -  3: capture_pattern
               4: stream_structure_version
               5: header_type_flag (2=bos: beginning of sream)
          6 - 13: absolute granule position
         14 - 17: stream serial number
         18 - 21: page sequence no
         22 - 25: page checksum
              26: page_segments
         27 -...: segment_table
         
        Speex Header description
          0 -  7: speex_string
          8 - 27: speex_version
         28 - 31: speex_version_id
         32 - 35: header_size
         36 - 39: rate
         40 - 43: mode (0=narrowband, 1=wb, 2=uwb)
         44 - 47: mode_bitstream_version
         48 - 51: nb_channels
         52 - 55: bitrate
         56 - 59: frame_size
         60 - 63: vbr
         64 - 67: frames_per_packet
         68 - 71: extra_headers
         72 - 75: reserved1
         76 - 79: reserved2
         
        Parameters:
        blocking - whether the method should block until initialisation is successfully completed or not.
        Throws:
        java.io.IOException
      • fill

        protected void fill()
                     throws java.io.IOException
        Fills the buffer with more data, taking into account shuffling and other tricks for dealing with marks. Assumes that it is being called by a synchronized method. This method also assumes that all data has already been read in, hence pos > count.
        Overrides:
        fill in class FilteredAudioInputStream
        Throws:
        java.io.IOException
      • decode

        protected void decode​(byte[] data,
                              int offset,
                              int len)
                       throws java.io.StreamCorruptedException
        This is where the actual decoding takes place.
        Parameters:
        data - the array of data to decode.
        offset - the offset from which to start reading the data.
        len - the length of data to read from the array.
        Throws:
        java.io.StreamCorruptedException - If the input stream not valid Ogg Speex data.
      • skip

        public long skip​(long n)
                  throws java.io.IOException
        See the general contract of the skip method of InputStream.
        Overrides:
        skip in class FilteredAudioInputStream
        Parameters:
        n - the number of bytes to be skipped.
        Returns:
        the actual number of bytes skipped.
        Throws:
        java.io.IOException - if an I/O error occurs.
      • available

        public int available()
                      throws java.io.IOException
        Returns the number of bytes that can be read from this inputstream without blocking.

        The available method of FilteredAudioInputStream returns the sum of the the number of bytes remaining to be read in the buffer (count - pos). The result of calling the available method of the underlying inputstream is not used, as this data will have to be filtered, and thus may not be the same size after processing (although subclasses that do the filtering should override this method and use the amount of data available in the underlying inputstream).

        Overrides:
        available in class FilteredAudioInputStream
        Returns:
        the number of bytes that can be read from this inputstream without blocking.
        Throws:
        java.io.IOException - if an I/O error occurs.
        See Also:
        FilteredAudioInputStream.in
      • readOggPageHeader

        private void readOggPageHeader()
                                throws java.io.IOException
        Read the Ogg Page header and extract the speex packet sizes. Note: the checksum is ignores. Note: the method should no block on a read because it will not read more then is available
        Throws:
        java.io.IOException
      • readInt

        private static int readInt​(byte[] data,
                                   int offset)
        Converts Little Endian (Windows) bytes to an int (Java uses Big Endian).
        Parameters:
        data - the data to read.
        offset - the offset from which to start reading.
        Returns:
        the integer value of the reassembled bytes.