Class Speex2PcmAudioInputStream

All Implemented Interfaces:
Closeable, 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 Details

    • 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 Details

    • Speex2PcmAudioInputStream

      public Speex2PcmAudioInputStream(InputStream in, 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(InputStream in, 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:
      IllegalArgumentException - if size invalid input: '<'= 0.
  • Method Details

    • initialise

      protected void initialise(boolean blocking) throws 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:
      IOException
    • fill

      protected void fill() throws 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:
      IOException
    • decode

      protected void decode(byte[] data, int offset, int len) throws 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:
      StreamCorruptedException - If the input stream not valid Ogg Speex data.
    • skip

      public long skip(long n) throws 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:
      IOException - if an I/O error occurs.
    • available

      public int available() throws 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:
      IOException - if an I/O error occurs.
      See Also:
    • readOggPageHeader

      private void readOggPageHeader() throws 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:
      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.