mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 02:15:43 -04:00
openal: Don't assume alSourceUnqueueBuffers is FIFO
This commit is contained in:
parent
89799bc024
commit
1862100bac
@ -446,10 +446,25 @@ pull_used_buffers() {
|
|||||||
int err = alGetError();
|
int err = alGetError();
|
||||||
if (err == AL_NO_ERROR) {
|
if (err == AL_NO_ERROR) {
|
||||||
if (_stream_queued[0]._buffer != buffer) {
|
if (_stream_queued[0]._buffer != buffer) {
|
||||||
|
// This is certainly atypical: most implementations of OpenAL unqueue
|
||||||
|
// buffers in FIFO order. However, some (e.g. Apple's) can unqueue
|
||||||
|
// buffers out-of-order if playback is interrupted. So, we don't freak
|
||||||
|
// out unless `buffer` isn't in _stream_queued at all.
|
||||||
|
bool found_culprit = false;
|
||||||
|
for (auto it = _stream_queued.begin(); it != _stream_queued.end(); ++it) {
|
||||||
|
if (it->_buffer == buffer) {
|
||||||
|
// Phew. Found it. Just remove that.
|
||||||
|
_stream_queued.erase(it);
|
||||||
|
found_culprit = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found_culprit) {
|
||||||
audio_error("corruption in stream queue");
|
audio_error("corruption in stream queue");
|
||||||
cleanup();
|
cleanup();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
_stream_queued.pop_front();
|
_stream_queued.pop_front();
|
||||||
if (_stream_queued.size()) {
|
if (_stream_queued.size()) {
|
||||||
double al = _stream_queued[0]._time_offset + _stream_queued[0]._loop_index * _length;
|
double al = _stream_queued[0]._time_offset + _stream_queued[0]._loop_index * _length;
|
||||||
@ -459,6 +474,7 @@ pull_used_buffers() {
|
|||||||
if (buffer != _sd->_sample) {
|
if (buffer != _sd->_sample) {
|
||||||
alDeleteBuffers(1,&buffer);
|
alDeleteBuffers(1,&buffer);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user