Browse Source

Query the Decoder instead of the current OpenAL buffer when getting the sample rate for calculations in streaming audio Sources.

Some OpenAL implementations return 0 for alGetSourcei(source, AL_BUFFER) if the source isn't static, which eventually results in returning 0 when querying the buffer's sample rate.
Alex Szpakowski 11 years ago
parent
commit
d7f1262e20
1 changed files with 4 additions and 19 deletions
  1. 4 19
      src/modules/audio/openal/Source.cpp

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

@@ -255,10 +255,7 @@ bool Source::update()
 
 
 			alGetSourcef(source, AL_SAMPLE_OFFSET, &curOffsetSamples);
 			alGetSourcef(source, AL_SAMPLE_OFFSET, &curOffsetSamples);
 
 
-			ALint b;
-			alGetSourcei(source, AL_BUFFER, &b);
-			int freq;
-			alGetBufferi(b, AL_FREQUENCY, &freq);
+			int freq = decoder->getSampleRate();
 			curOffsetSecs = curOffsetSamples / freq;
 			curOffsetSecs = curOffsetSamples / freq;
 
 
 			// Get a free buffer.
 			// Get a free buffer.
@@ -334,11 +331,7 @@ void Source::seekAtomic(float offset, void *unit)
 			if (type == TYPE_STREAM)
 			if (type == TYPE_STREAM)
 			{
 			{
 				offsetSamples = offset;
 				offsetSamples = offset;
-				ALint buffer;
-				alGetSourcei(source, AL_BUFFER, &buffer);
-				int freq;
-				alGetBufferi(buffer, AL_FREQUENCY, &freq);
-				offset /= freq;
+				offset /= decoder->getSampleRate();
 				offsetSeconds = offset;
 				offsetSeconds = offset;
 				decoder->seek(offset);
 				decoder->seek(offset);
 			}
 			}
@@ -353,11 +346,7 @@ void Source::seekAtomic(float offset, void *unit)
 			{
 			{
 				offsetSeconds = offset;
 				offsetSeconds = offset;
 				decoder->seek(offset);
 				decoder->seek(offset);
-				ALint buffer;
-				alGetSourcei(source, AL_BUFFER, &buffer);
-				int freq;
-				alGetBufferi(buffer, AL_FREQUENCY, &freq);
-				offsetSamples = offset*freq;
+				offsetSamples = offset * decoder->getSampleRate();
 			}
 			}
 			else
 			else
 			{
 			{
@@ -399,11 +388,7 @@ float Source::tellAtomic(void *unit) const
 		default:
 		default:
 			{
 			{
 				alGetSourcef(source, AL_SAMPLE_OFFSET, &offset);
 				alGetSourcef(source, AL_SAMPLE_OFFSET, &offset);
-				ALint buffer;
-				alGetSourcei(source, AL_BUFFER, &buffer);
-				int freq;
-				alGetBufferi(buffer, AL_FREQUENCY, &freq);
-				offset /= freq;
+				offset /= decoder->getSampleRate();
 				if (type == TYPE_STREAM) offset += offsetSeconds;
 				if (type == TYPE_STREAM) offset += offsetSeconds;
 			}
 			}
 			break;
 			break;