Fix seek and tell on streaming sounds (bugs #250 and #251)

This commit is contained in:
Bart van Strien
2011-07-22 16:20:51 +02:00
parent b1c5b948c3
commit 5192215122
2 changed files with 20 additions and 3 deletions
+19 -2
View File
@@ -228,11 +228,13 @@ namespace openal
switch (*((Source::Unit*) unit)) {
case Source::UNIT_SAMPLES:
if (type == TYPE_STREAM) {
offsetSamples = offset;
ALint buffer;
alGetSourcei(source, AL_BUFFER, &buffer);
int freq;
alGetBufferi(buffer, AL_FREQUENCY, &freq);
offset /= freq;
offsetSeconds = offset;
decoder->seek(offset);
} else {
alSourcef(source, AL_SAMPLE_OFFSET, offset);
@@ -241,12 +243,26 @@ namespace openal
case Source::UNIT_SECONDS:
default:
if (type == TYPE_STREAM) {
offsetSeconds = offset;
decoder->seek(offset);
ALint buffer;
alGetSourcei(source, AL_BUFFER, &buffer);
int freq;
alGetBufferi(buffer, AL_FREQUENCY, &freq);
offsetSamples = offset*freq;
} else {
alSourcef(source, AL_SEC_OFFSET, offset);
}
break;
}
if (type == TYPE_STREAM)
{
// Because we still have old data
// from before the seek in the buffers
// let's empty them.
stopAtomic(false);
playAtomic();
}
}
}
@@ -380,7 +396,7 @@ namespace openal
//but this prevents a horrible, horrible bug
}
void Source::stopAtomic()
void Source::stopAtomic(bool rewind)
{
if(valid)
{
@@ -404,7 +420,8 @@ namespace openal
alSourcei(source, AL_BUFFER, AL_NONE);
}
rewindAtomic();
if (rewind)
rewindAtomic();
valid = false;
}
+1 -1
View File
@@ -102,7 +102,7 @@ namespace openal
bool isStatic() const;
void playAtomic();
void stopAtomic();
void stopAtomic(bool rewind = true);
void pauseAtomic();
void resumeAtomic();
void rewindAtomic();