From: plassy <pl...@us...> - 2010-01-31 11:32:33
|
Update of /cvsroot/arianne/stendhal/src/games/stendhal/client/sound/system/processors In directory sfp-cvsdas-1.v30.ch3.sourceforge.com:/tmp/cvs-serv13554 Modified Files: OggVorbisDecoder.java Log Message: fix bug #2941861 - small ogg files are not playing Index: OggVorbisDecoder.java =================================================================== RCS file: /cvsroot/arianne/stendhal/src/games/stendhal/client/sound/system/processors/OggVorbisDecoder.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** OggVorbisDecoder.java 29 Dec 2009 00:40:55 -0000 1.1 --- OggVorbisDecoder.java 31 Jan 2010 11:32:20 -0000 1.2 *************** *** 30,45 **** private int mReadPos = 0; private boolean mEndOfStream = true; private boolean mDecoderIsOpened = false; protected void init(InputStream stream, int inputBufferSize, int outputNumSamplesPerChannel) throws IOException { ! mOggStreamState = new StreamState(); ! mOggSyncState = new SyncState(); ! mVorbisDspState = new DspState(); ! mVorbisBlock = new Block(mVorbisDspState); ! mVorbisComment = new Comment(); ! mVorbisInfo = new Info(); ! mReadPos = 0; ! mEndOfStream = false; mOggSyncState.init(); --- 30,47 ---- private int mReadPos = 0; private boolean mEndOfStream = true; + private boolean mLastPageWasRead = false; private boolean mDecoderIsOpened = false; protected void init(InputStream stream, int inputBufferSize, int outputNumSamplesPerChannel) throws IOException { ! mOggStreamState = new StreamState(); ! mOggSyncState = new SyncState(); ! mVorbisDspState = new DspState(); ! mVorbisBlock = new Block(mVorbisDspState); ! mVorbisComment = new Comment(); ! mVorbisInfo = new Info(); ! mReadPos = 0; ! mEndOfStream = false; ! mLastPageWasRead = false; mOggSyncState.init(); *************** *** 92,96 **** if(oggPage.eos() != 0) ! mEndOfStream = true; return oggPage; --- 94,98 ---- if(oggPage.eos() != 0) ! mLastPageWasRead = true; return oggPage; *************** *** 163,166 **** --- 165,171 ---- protected int read() throws IOException { + if(reachedEndOfStream()) // no more pcm data to read + return 0; + int outputBufferSize = mOutputBuffer.length; int outputNumSamplesPerChannel = outputBufferSize / mVorbisInfo.channels; *************** *** 177,186 **** if(sampleIdx >= receivedNumSamples) { - //System.out.println("range: " + receivedNumSamples); mVorbisDspState.synthesis_read(receivedNumSamples); // tell dsp-state that we read all samples - if(reachedEndOfStream()) // no more pcm data to get - break; - // receive the next chunk of uniform pcm data receivedNumSamples = mVorbisDspState.synthesis_pcmout(uniformPCMData, PCMIndex); --- 182,187 ---- *************** *** 192,195 **** --- 193,202 ---- Packet oggPacket = readPacket(true); + if(oggPacket == null && mLastPageWasRead) + { + mEndOfStream = true; + return 0; + } + if(oggPacket == null || mVorbisBlock.synthesis(oggPacket) != 0) continue; // if the packet we read from the stream is corrupted or has no audio data, we ignore it *************** *** 212,216 **** } } ! mVorbisDspState.synthesis_read(sampleIdx); return numSamplesReadPerChannel; --- 219,223 ---- } } ! mVorbisDspState.synthesis_read(sampleIdx); return numSamplesReadPerChannel; *************** *** 225,237 **** protected boolean generate() { - if(reachedEndOfStream()) - { - super.quit(); - return false; - } - try { int numSamples = read(); super.propagate(mOutputBuffer, numSamples, getNumChannels(), getSampleRate()); } --- 232,245 ---- protected boolean generate() { try { int numSamples = read(); + + if(reachedEndOfStream()) + { + super.quit(); + return false; + } + super.propagate(mOutputBuffer, numSamples, getNumChannels(), getSampleRate()); } |