Browse Source

Don't reset song counter (for tell) when the decoder loops, but when the song does (bug #251)

Bart van Strien 14 years ago
parent
commit
e72f84e7fd
2 changed files with 22 additions and 4 deletions
  1. 20 4
      src/modules/audio/openal/Source.cpp
  2. 2 0
      src/modules/audio/openal/Source.h

+ 20 - 4
src/modules/audio/openal/Source.cpp

@@ -34,7 +34,8 @@ namespace openal
 
 	Source::Source(Pool * pool, love::sound::SoundData * soundData)
 		: love::audio::Source(Source::TYPE_STATIC), pool(pool), valid(false),
-		pitch(1.0f), volume(1.0f), looping(false), offsetSamples(0), offsetSeconds(0), decoder(0)
+		pitch(1.0f), volume(1.0f), looping(false), offsetSamples(0), offsetSeconds(0),
+		decoder(0), toLoop(0)
 	{
 		alGenBuffers(1, buffers);
 		ALenum fmt = getFormat(soundData->getChannels(), soundData->getBits());
@@ -49,7 +50,8 @@ namespace openal
 
 	Source::Source(Pool * pool, love::sound::Decoder * decoder)
 		: love::audio::Source(Source::TYPE_STREAM), pool(pool), valid(false),
-		pitch(1.0f), volume(1.0f), looping(false), offsetSamples(0), offsetSeconds(0), decoder(decoder)
+		pitch(1.0f), volume(1.0f), looping(false), offsetSamples(0), offsetSeconds(0),
+		decoder(decoder), toLoop(0)
 	{
 		decoder->retain();
 		alGenBuffers(MAX_BUFFERS, buffers);
@@ -496,11 +498,25 @@ namespace openal
 			alBufferData(buffer, fmt, d->getBuffer(), decoded, d->getSampleRate());
 
 		if(decoder->isFinished() && isLooping()) {
-			offsetSamples = 0;
-			offsetSeconds = 0;
+			int queued, processed;
+			alGetSourcei(source, AL_BUFFERS_QUEUED, &queued);
+			alGetSourcei(source, AL_BUFFERS_PROCESSED, &processed);
+			if (queued > processed)
+				toLoop = queued-processed;
+			else
+				toLoop = MAX_BUFFERS-processed;
 			d->rewind();
 		}
 
+		if (toLoop > 0)
+		{
+			if (--toLoop == 0)
+			{
+				offsetSamples = 0;
+				offsetSeconds = 0;
+			}
+		}
+
 		return decoded;
 	}
 

+ 2 - 0
src/modules/audio/openal/Source.h

@@ -68,6 +68,8 @@ namespace openal
 
 		love::sound::Decoder * decoder;
 
+		unsigned int toLoop;
+
 	public:
 		Source(Pool * pool, love::sound::SoundData * soundData);
 		Source(Pool * pool, love::sound::Decoder * decoder);