Commit: 459b1a907ce542ec3f10a533d27832ac9dfbc92d
Author: Antony Riakiotakis
Date:   Mon Mar 16 11:50:17 2015 +0100
Branches: gooseberry
https://developer.blender.org/rB459b1a907ce542ec3f10a533d27832ac9dfbc92d

Better fix for animation returning negative values when AVsynch is on,
patch by Nexyon, thanks!

===================================================================

M       intern/audaspace/OpenAL/AUD_OpenALDevice.cpp

===================================================================

diff --git a/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp 
b/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
index d055c13..4934ae8 100644
--- a/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
+++ b/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
@@ -276,49 +276,46 @@ bool AUD_OpenALDevice::AUD_OpenALHandle::seek(float 
position)
 
                alGetSourcei(m_source, AL_SOURCE_STATE, &info);
 
-               if(info != AL_PLAYING)
-               {
-                       if(info == AL_PAUSED)
-                               alSourceStop(m_source);
+               if(info == AL_PAUSED || info == AL_PLAYING)
+                       alSourceStop(m_source);
+
+               alSourcei(m_source, AL_BUFFER, 0);
+               m_current = 0;
 
-                       alSourcei(m_source, AL_BUFFER, 0);
-                       m_current = 0;
+               ALenum err;
+               if((err = alGetError()) == AL_NO_ERROR)
+               {
+                       int length;
+                       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));
 
-                       ALenum err;
-                       if((err = alGetError()) == AL_NO_ERROR)
+                       for(int i = 0; i < CYCLE_BUFFERS; i++)
                        {
-                               int length;
-                               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));
+                               length = m_device->m_buffersize;
+                               m_reader->read(length, m_eos, 
m_device->m_buffer.getBuffer());
 
-                               for(int i = 0; i < CYCLE_BUFFERS; i++)
+                               if(length == 0)
                                {
-                                       length = m_device->m_buffersize;
-                                       m_reader->read(length, m_eos, 
m_device->m_buffer.getBuffer());
-
-                                       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;
+                                       // 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));
                                }
 
-                               if(m_loopcount != 0)
-                                       m_eos = false;
+                               alBufferData(m_buffers[i], m_format, 
m_device->m_buffer.getBuffer(),
+                                            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)
@@ -343,9 +340,12 @@ float AUD_OpenALDevice::AUD_OpenALHandle::getPosition()
 
        if(!m_isBuffered)
        {
+               int queued;
                AUD_Specs specs = m_reader->getSpecs();
+
+               alGetSourcei(m_source, AL_BUFFERS_QUEUED, &queued);
                position += (m_reader->getPosition() - m_device->m_buffersize *
-                                        CYCLE_BUFFERS) / (float)specs.rate;
+                                        queued) / (float)specs.rate;
        }
 
        return position;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to