Package org.xiph.speex.spi
Class Pcm2SpeexAudioInputStream
java.lang.Object
java.io.InputStream
javax.sound.sampled.AudioInputStream
org.xiph.speex.spi.FilteredAudioInputStream
org.xiph.speex.spi.Pcm2SpeexAudioInputStream
- All Implemented Interfaces:
Closeable
,AutoCloseable
Converts a PCM 16bits/sample mono audio stream to Ogg Speex
- Version:
- $Revision: 1.2 $
- Author:
- Marc Gimpel, Wimba S.A. (mgimpel@horizonwimba.com)
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate int
The number of audio channels (1=mono, 2=stereo).private String
The comment String that will appear in the Ogg comment packet.static final int
The default size of the buffer (UWB stereo requires at least 2560b).static final int
The default number of channels if none is given in the constructor.static final int
The default number of Speex frames that will be put in each Ogg packet.static final int
The default number of Ogg packets that will be put in each Ogg page.static final int
The default quality setting for the Speex encoder.static final int
The default sample rate if none is given in the constructor.private SpeexEncoder
The Speex Encoder class.private boolean
Flag to indicate if this is the first time a encode method is called.private int
The size in bytes of PCM data that will be encoded into 1 Speex frame.private int
The number of Speex frames that will be put in each Ogg packet.private int
A counter for the number of PCM samples that have been encoded.private int
The encoder mode (0=NB, 1=WB, 2=UWB).private int
Pointer in the buffer to the point where Ogg data is added.private int
The number of Ogg packets that have been encoded in the current page.private int
The number of Ogg packets that will be put in each Ogg page.private int
The number of Ogg pages that have been written to the stream.private int
A unique serial number that identifies the Ogg stream.static final int
Indicates the value is unknown or undetermined.Fields inherited from class org.xiph.speex.spi.FilteredAudioInputStream
buf, count, in, marklimit, markpos, pos, prebuf, precount, prepos
Fields inherited from class javax.sound.sampled.AudioInputStream
format, frameLength, framePos
-
Constructor Summary
ConstructorsConstructorDescriptionPcm2SpeexAudioInputStream
(int mode, int quality, InputStream in, AudioFormat format, long length) ConstructorPcm2SpeexAudioInputStream
(int mode, int quality, InputStream in, AudioFormat format, long length, int size) ConstructorPcm2SpeexAudioInputStream
(InputStream in, AudioFormat format, long length) ConstructorPcm2SpeexAudioInputStream
(InputStream in, AudioFormat format, long length, int size) Constructor -
Method Summary
Modifier and TypeMethodDescriptionint
Returns the number of bytes that can be read from this inputstream without blocking.protected void
fill()
Fills the buffer with more data, taking into account shuffling and other tricks for dealing with marks.Returns the Encoder.void
setComment
(String comment, boolean appendVersion) Sets the comment for the Ogg Comment Header.void
setFramesPerPacket
(int framesPerPacket) Sets the number of Audio Frames that are to be put in every Speex Packet.void
setPacketsPerOggPage
(int packetsPerOggPage) Sets the number of Speex Packets that are to be put in every Ogg Page.void
setQuality
(int quality) Sets the Speex encoder Quality.void
setSerialNumber
(int serialNumber) Sets the Stream Serial Number.void
setVbr
(boolean vbr) Sets whether of not the encoder is to use VBR.private void
Write the OGG Speex header then the comment header.private void
Calculate and write the OGG page checksum.private void
writeOggPageHeader
(int packets, int headertype) Write an OGG page header.Methods inherited from class org.xiph.speex.spi.FilteredAudioInputStream
checkIfStillOpen, close, makeSpace, mark, markSupported, read, read, reset, skip
Methods inherited from class javax.sound.sampled.AudioInputStream
getFormat, getFrameLength, read
Methods inherited from class java.io.InputStream
nullInputStream, readAllBytes, readNBytes, readNBytes, skipNBytes, transferTo
-
Field Details
-
DEFAULT_BUFFER_SIZE
public static final int DEFAULT_BUFFER_SIZEThe default size of the buffer (UWB stereo requires at least 2560b).- See Also:
-
DEFAULT_SAMPLERATE
public static final int DEFAULT_SAMPLERATEThe default sample rate if none is given in the constructor.- See Also:
-
DEFAULT_CHANNELS
public static final int DEFAULT_CHANNELSThe default number of channels if none is given in the constructor.- See Also:
-
DEFAULT_QUALITY
public static final int DEFAULT_QUALITYThe default quality setting for the Speex encoder.- See Also:
-
DEFAULT_FRAMES_PER_PACKET
public static final int DEFAULT_FRAMES_PER_PACKETThe default number of Speex frames that will be put in each Ogg packet.- See Also:
-
DEFAULT_PACKETS_PER_OGG_PAGE
public static final int DEFAULT_PACKETS_PER_OGG_PAGEThe default number of Ogg packets that will be put in each Ogg page.- See Also:
-
UNKNOWN
public static final int UNKNOWNIndicates the value is unknown or undetermined.- See Also:
-
encoder
The Speex Encoder class. -
mode
private int modeThe encoder mode (0=NB, 1=WB, 2=UWB). -
frameSize
private int frameSizeThe size in bytes of PCM data that will be encoded into 1 Speex frame. -
framesPerPacket
private int framesPerPacketThe number of Speex frames that will be put in each Ogg packet. -
channels
private int channelsThe number of audio channels (1=mono, 2=stereo). -
comment
The comment String that will appear in the Ogg comment packet. -
granulepos
private int granuleposA counter for the number of PCM samples that have been encoded. -
streamSerialNumber
private int streamSerialNumberA unique serial number that identifies the Ogg stream. -
packetsPerOggPage
private int packetsPerOggPageThe number of Ogg packets that will be put in each Ogg page. -
packetCount
private int packetCountThe number of Ogg packets that have been encoded in the current page. -
pageCount
private int pageCountThe number of Ogg pages that have been written to the stream. -
oggCount
private int oggCountPointer in the buffer to the point where Ogg data is added. -
first
private boolean firstFlag to indicate if this is the first time a encode method is called.
-
-
Constructor Details
-
Pcm2SpeexAudioInputStream
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.
-
Pcm2SpeexAudioInputStream
public Pcm2SpeexAudioInputStream(int mode, int quality, InputStream in, AudioFormat format, long length) Constructor- Parameters:
mode
- the mode of the encoder (0=NB, 1=WB, 2=UWB).quality
- the quality setting of the encoder (between 0 and 10).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.
-
Pcm2SpeexAudioInputStream
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.
-
Pcm2SpeexAudioInputStream
public Pcm2SpeexAudioInputStream(int mode, int quality, InputStream in, AudioFormat format, long length, int size) Constructor- Parameters:
mode
- the mode of the encoder (0=NB, 1=WB, 2=UWB).quality
- the quality setting of the encoder (between 0 and 10).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
-
setSerialNumber
public void setSerialNumber(int serialNumber) Sets the Stream Serial Number. Must not be changed mid stream.- Parameters:
serialNumber
-
-
setFramesPerPacket
public void setFramesPerPacket(int framesPerPacket) Sets the number of Audio Frames that are to be put in every Speex Packet. An Audio Frame contains 160 samples for narrowband, 320 samples for wideband and 640 samples for ultra-wideband.- Parameters:
framesPerPacket
-- See Also:
-
setPacketsPerOggPage
public void setPacketsPerOggPage(int packetsPerOggPage) Sets the number of Speex Packets that are to be put in every Ogg Page. This value must be less than 256 as the value is encoded in 1 byte in the Ogg Header (just before the array of packet sizes)- Parameters:
packetsPerOggPage
-- See Also:
-
setComment
Sets the comment for the Ogg Comment Header.- Parameters:
comment
-appendVersion
-
-
setQuality
public void setQuality(int quality) Sets the Speex encoder Quality.- Parameters:
quality
-
-
setVbr
public void setVbr(boolean vbr) Sets whether of not the encoder is to use VBR.- Parameters:
vbr
-
-
getEncoder
Returns the Encoder.- Returns:
- the Encoder.
-
fill
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:
IOException
-
available
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
) and the result of calling theavailable
method of the underlying inputstream.- Overrides:
available
in classFilteredAudioInputStream
- Returns:
- the number of bytes that can be read from this inputstream without blocking.
- Throws:
IOException
- if an I/O error occurs.- See Also:
-
writeOggPageHeader
private void writeOggPageHeader(int packets, int headertype) Write an OGG page header.- Parameters:
packets
- - the number of packets in the Ogg Page (must be between 1 and 255)headertype
- - 2=bos: beginning of sream, 4=eos: end of sream
-
writeOggPageChecksum
private void writeOggPageChecksum()Calculate and write the OGG page checksum. This now closes the Ogg page. -
writeHeaderFrames
private void writeHeaderFrames()Write the OGG Speex header then the comment header.
-