Package org.xiph.speex.spi
Class Speex2PcmAudioInputStream
- java.lang.Object
-
- java.io.InputStream
-
- javax.sound.sampled.AudioInputStream
-
- org.xiph.speex.spi.FilteredAudioInputStream
-
- org.xiph.speex.spi.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.
-
Constructor Summary
Constructors Constructor Description Speex2PcmAudioInputStream(java.io.InputStream in, javax.sound.sampled.AudioFormat format, long length)
ConstructorSpeex2PcmAudioInputStream(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 theskip
method ofInputStream
.-
Methods inherited from class org.xiph.speex.spi.FilteredAudioInputStream
checkIfStillOpen, close, makeSpace, mark, markSupported, read, read, reset
-
-
-
-
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 description0 - 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 classFilteredAudioInputStream
- 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 theskip
method ofInputStream
.- Overrides:
skip
in classFilteredAudioInputStream
- 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 ofFilteredAudioInputStream
returns the sum of the the number of bytes remaining to be read in the buffer (count - pos
). The result of calling theavailable
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 classFilteredAudioInputStream
- 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.
-
-