forked from bartvdbraak/blender
Fix: AUD_OpenALDevice::getPosition returns negative values
Reported by Antony Riakiotakis. The problem was the seeking code.
This commit is contained in:
parent
92f305a490
commit
770b109deb
@ -276,49 +276,48 @@ bool AUD_OpenALDevice::AUD_OpenALHandle::seek(float position)
|
|||||||
|
|
||||||
alGetSourcei(m_source, AL_SOURCE_STATE, &info);
|
alGetSourcei(m_source, AL_SOURCE_STATE, &info);
|
||||||
|
|
||||||
if(info != AL_PLAYING)
|
// we need to stop playing sounds as well to clear the buffers
|
||||||
|
// this might cause clicks, but fixes a bug regarding position determination
|
||||||
|
if(info == AL_PAUSED || info == AL_PLAYING)
|
||||||
|
alSourceStop(m_source);
|
||||||
|
|
||||||
|
alSourcei(m_source, AL_BUFFER, 0);
|
||||||
|
m_current = 0;
|
||||||
|
|
||||||
|
ALenum err;
|
||||||
|
if((err = alGetError()) == AL_NO_ERROR)
|
||||||
{
|
{
|
||||||
if(info == AL_PAUSED)
|
int length;
|
||||||
alSourceStop(m_source);
|
AUD_DeviceSpecs specs = m_device->m_specs;
|
||||||
|
specs.specs = m_reader->getSpecs();
|
||||||
|
m_device->m_buffer.assureSize(m_device->m_buffersize * AUD_DEVICE_SAMPLE_SIZE(specs));
|
||||||
|
|
||||||
alSourcei(m_source, AL_BUFFER, 0);
|
for(int i = 0; i < CYCLE_BUFFERS; i++)
|
||||||
m_current = 0;
|
|
||||||
|
|
||||||
ALenum err;
|
|
||||||
if((err = alGetError()) == AL_NO_ERROR)
|
|
||||||
{
|
{
|
||||||
int length;
|
length = m_device->m_buffersize;
|
||||||
AUD_DeviceSpecs specs = m_device->m_specs;
|
m_reader->read(length, m_eos, m_device->m_buffer.getBuffer());
|
||||||
specs.specs = m_reader->getSpecs();
|
|
||||||
m_device->m_buffer.assureSize(m_device->m_buffersize * AUD_DEVICE_SAMPLE_SIZE(specs));
|
|
||||||
|
|
||||||
for(int i = 0; i < CYCLE_BUFFERS; i++)
|
if(length == 0)
|
||||||
{
|
{
|
||||||
length = m_device->m_buffersize;
|
// AUD_XXX: TODO: don't fill all buffers and enqueue them later
|
||||||
m_reader->read(length, m_eos, m_device->m_buffer.getBuffer());
|
length = 1;
|
||||||
|
memset(m_device->m_buffer.getBuffer(), 0, length * AUD_DEVICE_SAMPLE_SIZE(specs));
|
||||||
if(length == 0)
|
|
||||||
{
|
|
||||||
// AUD_XXX: TODO: don't fill all buffers and enqueue them later
|
|
||||||
length = 1;
|
|
||||||
memset(m_device->m_buffer.getBuffer(), 0, length * AUD_DEVICE_SAMPLE_SIZE(specs));
|
|
||||||
}
|
|
||||||
|
|
||||||
alBufferData(m_buffers[i], m_format, m_device->m_buffer.getBuffer(),
|
|
||||||
length * AUD_DEVICE_SAMPLE_SIZE(specs), specs.rate);
|
|
||||||
|
|
||||||
if(alGetError() != AL_NO_ERROR)
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(m_loopcount != 0)
|
alBufferData(m_buffers[i], m_format, m_device->m_buffer.getBuffer(),
|
||||||
m_eos = false;
|
length * AUD_DEVICE_SAMPLE_SIZE(specs), specs.rate);
|
||||||
|
|
||||||
alSourceQueueBuffers(m_source, CYCLE_BUFFERS, m_buffers);
|
if(alGetError() != AL_NO_ERROR)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
alSourceRewind(m_source);
|
if(m_loopcount != 0)
|
||||||
|
m_eos = false;
|
||||||
|
|
||||||
|
alSourceQueueBuffers(m_source, CYCLE_BUFFERS, m_buffers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
alSourceRewind(m_source);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(m_status == AUD_STATUS_STOPPED)
|
if(m_status == AUD_STATUS_STOPPED)
|
||||||
@ -343,9 +342,14 @@ float AUD_OpenALDevice::AUD_OpenALHandle::getPosition()
|
|||||||
|
|
||||||
if(!m_isBuffered)
|
if(!m_isBuffered)
|
||||||
{
|
{
|
||||||
|
int queued;
|
||||||
|
|
||||||
|
// this usually always returns CYCLE_BUFFERS
|
||||||
|
alGetSourcei(m_source, AL_BUFFERS_QUEUED, &queued);
|
||||||
|
|
||||||
AUD_Specs specs = m_reader->getSpecs();
|
AUD_Specs specs = m_reader->getSpecs();
|
||||||
position += (m_reader->getPosition() - m_device->m_buffersize *
|
position += (m_reader->getPosition() - m_device->m_buffersize *
|
||||||
CYCLE_BUFFERS) / (float)specs.rate;
|
queued) / (float)specs.rate;
|
||||||
}
|
}
|
||||||
|
|
||||||
return position;
|
return position;
|
||||||
|
Loading…
Reference in New Issue
Block a user