Revision: 21987
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21987
Author:   nexyon
Date:     2009-07-28 20:42:26 +0200 (Tue, 28 Jul 2009)

Log Message:
-----------
Sound Branch

Sequencer audio update, still not perfect, but improving.

Modified Paths:
--------------
    branches/soundsystem/CMakeLists.txt
    branches/soundsystem/intern/audaspace/AUD_C-API.h
    branches/soundsystem/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
    branches/soundsystem/intern/audaspace/OpenAL/AUD_OpenALDevice.h
    branches/soundsystem/intern/audaspace/intern/AUD_C-API.cpp
    branches/soundsystem/intern/audaspace/intern/AUD_IDevice.h
    branches/soundsystem/intern/audaspace/intern/AUD_NULLDevice.cpp
    branches/soundsystem/intern/audaspace/intern/AUD_NULLDevice.h
    branches/soundsystem/intern/audaspace/intern/AUD_SoftwareDevice.cpp
    branches/soundsystem/intern/audaspace/intern/AUD_SoftwareDevice.h
    branches/soundsystem/source/blender/blenkernel/BKE_sequence.h
    branches/soundsystem/source/blender/blenkernel/BKE_sound.h
    branches/soundsystem/source/blender/blenkernel/intern/library.c
    branches/soundsystem/source/blender/blenkernel/intern/packedFile.c
    branches/soundsystem/source/blender/blenkernel/intern/scene.c
    branches/soundsystem/source/blender/blenkernel/intern/sequence.c
    branches/soundsystem/source/blender/blenkernel/intern/sound.c
    branches/soundsystem/source/blender/blenloader/intern/readfile.c
    branches/soundsystem/source/blender/editors/animation/anim_ops.c
    branches/soundsystem/source/blender/editors/screen/screen_ops.c
    branches/soundsystem/source/blender/editors/space_sequencer/sequencer_add.c
    branches/soundsystem/source/blender/editors/space_sequencer/sequencer_edit.c
    branches/soundsystem/source/blender/makesdna/DNA_scene_types.h
    branches/soundsystem/source/blender/makesdna/DNA_sequence_types.h
    branches/soundsystem/source/blender/makesdna/DNA_sound_types.h
    branches/soundsystem/source/blender/windowmanager/intern/wm_init_exit.c

Modified: branches/soundsystem/CMakeLists.txt
===================================================================
--- branches/soundsystem/CMakeLists.txt 2009-07-28 18:25:02 UTC (rev 21986)
+++ branches/soundsystem/CMakeLists.txt 2009-07-28 18:42:26 UTC (rev 21987)
@@ -63,11 +63,10 @@
 OPTION(WITH_DDS                        "Enable DDS Support"                    
                ON)
 OPTION(WITH_FFMPEG             "Enable FFMPeg 
Support(http://ffmpeg.mplayerhq.hu/)"    ON)
 OPTION(WITH_PYTHON             "Enable Embedded Python API"                    
        ON)
-OPTION(WITH_SDL                        "Enable SDL for sound and joystick 
support"                             ON)
+OPTION(WITH_SDL                        "Enable SDL for sound and joystick 
support"             ON)
 OPTION(WITH_OPENJPEG           "Enable OpenJpeg Support 
(http://www.openjpeg.org/)"    OFF)
 OPTION(WITH_OPENAL             "Enable OpenAL Support (http://www.openal.org)" 
        ON)
 OPTION(WITH_OPENMP             "Enable OpenMP (has to be supported by the 
compiler)"   OFF)
-OPTION(WITH_SDL                "Enable SDL Support(http://www.libsdl.org/)"    
ON)
 OPTION(WITH_WEBPLUGIN          "Enable Web Plugin (Unix only)"                 
        OFF)
 
 IF(NOT WITH_GAMEENGINE AND WITH_PLAYER)

Modified: branches/soundsystem/intern/audaspace/AUD_C-API.h
===================================================================
--- branches/soundsystem/intern/audaspace/AUD_C-API.h   2009-07-28 18:25:02 UTC 
(rev 21986)
+++ branches/soundsystem/intern/audaspace/AUD_C-API.h   2009-07-28 18:42:26 UTC 
(rev 21987)
@@ -72,6 +72,16 @@
 extern void AUD_exit();
 
 /**
+ * Locks the playback device.
+ */
+extern void AUD_lock();
+
+/**
+ * Unlocks the device.
+ */
+extern void AUD_unlock();
+
+/**
  * Returns information about a sound.
  * \param sound The sound to get the info about.
  * \return The AUD_SoundInfo structure with filled in data.
@@ -192,6 +202,13 @@
 extern int AUD_seek(AUD_Handle* handle, float seekTo);
 
 /**
+ * Retrieves the playback position of a handle.
+ * \return The current playback position in seconds or 0.0 if the handle is
+ *         invalid.
+ */
+extern float AUD_getPosition(AUD_Handle* handle);
+
+/**
  * Returns the status of a playing, paused or stopped sound.
  * \param handle The handle to the sound.
  * \return The status of the sound behind the handle.

Modified: branches/soundsystem/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
===================================================================
--- branches/soundsystem/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp   
2009-07-28 18:25:02 UTC (rev 21986)
+++ branches/soundsystem/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp   
2009-07-28 18:42:26 UTC (rev 21987)
@@ -204,7 +204,7 @@
                        // check if the sound has been stopped
                        alGetSourcei(sound->source, AL_SOURCE_STATE, &info);
 
-                       if(info == AL_STOPPED)
+                       if(info != AL_PLAYING)
                        {
                                // if it really stopped
                                if(sound->data_end)
@@ -538,11 +538,6 @@
                                        alSourcei(sound->source, AL_BUFFER, 
(*i)->buffer);
                                        if(alGetError() != AL_NO_ERROR)
                                                AUD_THROW(AUD_ERROR_OPENAL);
-
-                                       alSourcePlay(sound->source);
-
-                                       if(alGetError() != AL_NO_ERROR)
-                                               AUD_THROW(AUD_ERROR_OPENAL);
                                }
                                catch(AUD_Exception e)
                                {
@@ -645,11 +640,6 @@
                                alSourceQueueBuffers(sound->source, 3, 
sound->buffers);
                                if(alGetError() != AL_NO_ERROR)
                                        AUD_THROW(AUD_ERROR_OPENAL);
-
-                               alSourcePlay(sound->source);
-
-                               if(alGetError() != AL_NO_ERROR)
-                                       AUD_THROW(AUD_ERROR_OPENAL);
                        }
                        catch(AUD_Exception e)
                        {
@@ -715,20 +705,6 @@
                if(*i == handle)
                {
                        m_playingSounds->push_back(*i);
-
-                       alGetSourcei((*i)->source, AL_SOURCE_STATE, &info);
-
-                       switch(info)
-                       {
-                       case AL_PLAYING:
-                               break;
-                       case AL_STOPPED:
-//                             alSourceRewind((*i)->source);
-                       default:
-//                             alSourcePlay((*i)->source);
-                               break;
-                       }
-
                        start();
                        m_pausedSounds->erase(i);
                        unlock();
@@ -835,6 +811,41 @@
                        alhandle->reader->seek((int)(position *
                                                                                
 alhandle->reader->getSpecs().rate));
                        alhandle->data_end = false;
+
+                       ALint info;
+
+                       alGetSourcei(alhandle->source, AL_SOURCE_STATE, &info);
+
+                       if(info != AL_PLAYING)
+                       {
+                               if(info != AL_STOPPED)
+                                       alSourceStop(alhandle->source);
+
+                               alSourceUnqueueBuffers(alhandle->source, 3, 
alhandle->buffers);
+                               if(alGetError() == AL_NO_ERROR)
+                               {
+                                       sample_t* buf;
+                                       int length;
+                                       AUD_Specs specs = 
alhandle->reader->getSpecs();
+
+                                       for(int i=0; i<3; i++)
+                                       {
+                                               length = m_buffersize;
+                                               alhandle->reader->read(length, 
buf);
+                                               
alBufferData(alhandle->buffers[i], alhandle->format,
+                                                                        buf, 
length * AUD_SAMPLE_SIZE(specs),
+                                                                        
specs.rate);
+
+                                               if(alGetError() != AL_NO_ERROR)
+                                                       break;
+                                       }
+
+                                       alSourceQueueBuffers(alhandle->source, 
3,
+                                                                               
 alhandle->buffers);
+                               }
+
+                               alSourceRewind(alhandle->source);
+                       }
                }
                unlock();
                return true;
@@ -844,6 +855,26 @@
        return false;
 }
 
+float AUD_OpenALDevice::getPosition(AUD_Handle* handle)
+{
+       lock();
+
+       float position = 0.0;
+
+       if(isValid(handle))
+       {
+               AUD_OpenALHandle* h = (AUD_OpenALHandle*)handle;
+               if(h->isBuffered)
+                       alGetSourcef(h->source, AL_SEC_OFFSET, &position);
+               else
+                       position = h->reader->getPosition() /
+                                          (float)h->reader->getSpecs().rate;
+       }
+
+       unlock();
+       return position;
+}
+
 AUD_Status AUD_OpenALDevice::getStatus(AUD_Handle* handle)
 {
        lock();

Modified: branches/soundsystem/intern/audaspace/OpenAL/AUD_OpenALDevice.h
===================================================================
--- branches/soundsystem/intern/audaspace/OpenAL/AUD_OpenALDevice.h     
2009-07-28 18:25:02 UTC (rev 21986)
+++ branches/soundsystem/intern/audaspace/OpenAL/AUD_OpenALDevice.h     
2009-07-28 18:42:26 UTC (rev 21987)
@@ -149,6 +149,7 @@
        virtual bool setKeep(AUD_Handle* handle, bool keep);
        virtual bool sendMessage(AUD_Handle* handle, AUD_Message &message);
        virtual bool seek(AUD_Handle* handle, float position);
+       virtual float getPosition(AUD_Handle* handle);
        virtual AUD_Status getStatus(AUD_Handle* handle);
        virtual void lock();
        virtual void unlock();

Modified: branches/soundsystem/intern/audaspace/intern/AUD_C-API.cpp
===================================================================
--- branches/soundsystem/intern/audaspace/intern/AUD_C-API.cpp  2009-07-28 
18:25:02 UTC (rev 21986)
+++ branches/soundsystem/intern/audaspace/intern/AUD_C-API.cpp  2009-07-28 
18:42:26 UTC (rev 21987)
@@ -133,6 +133,18 @@
        AUD_3ddevice = NULL;
 }
 
+void AUD_lock()
+{
+       assert(AUD_device);
+       AUD_device->lock();
+}
+
+void AUD_unlock()
+{
+       assert(AUD_device);
+       AUD_device->unlock();
+}
+
 AUD_SoundInfo AUD_getInfo(AUD_Sound* sound)
 {
        assert(sound);
@@ -300,8 +312,9 @@
 
 int AUD_stop(AUD_Handle* handle)
 {
-       assert(AUD_device);
-       return AUD_device->stop(handle);
+       if(AUD_device)
+               return AUD_device->stop(handle);
+       return false;
 }
 
 int AUD_setKeep(AUD_Handle* handle, int keep)
@@ -316,6 +329,12 @@
        return AUD_device->seek(handle, seekTo);
 }
 
+float AUD_getPosition(AUD_Handle* handle)
+{
+       assert(AUD_device);
+       return AUD_device->getPosition(handle);
+}
+
 AUD_Status AUD_getStatus(AUD_Handle* handle)
 {
        assert(AUD_device);

Modified: branches/soundsystem/intern/audaspace/intern/AUD_IDevice.h
===================================================================
--- branches/soundsystem/intern/audaspace/intern/AUD_IDevice.h  2009-07-28 
18:25:02 UTC (rev 21986)
+++ branches/soundsystem/intern/audaspace/intern/AUD_IDevice.h  2009-07-28 
18:42:26 UTC (rev 21987)
@@ -127,6 +127,14 @@
        virtual bool seek(AUD_Handle* handle, float position)=0;
 
        /**
+        * Retrieves the current playback position of a sound.
+        * \param handle The handle returned by the play function.
+        * \return The playback position in seconds, or 0.0 if the handle is
+        *         invalid.
+        */
+       virtual float getPosition(AUD_Handle* handle)=0;
+
+       /**
         * Returns the status of a played back sound.
         * \param handle The handle returned by the play function.
         * \return

Modified: branches/soundsystem/intern/audaspace/intern/AUD_NULLDevice.cpp
===================================================================
--- branches/soundsystem/intern/audaspace/intern/AUD_NULLDevice.cpp     
2009-07-28 18:25:02 UTC (rev 21986)
+++ branches/soundsystem/intern/audaspace/intern/AUD_NULLDevice.cpp     
2009-07-28 18:42:26 UTC (rev 21987)
@@ -74,6 +74,11 @@
        return false;
 }
 
+float AUD_NULLDevice::getPosition(AUD_Handle* handle)
+{
+       return 0.0f;
+}
+
 AUD_Status AUD_NULLDevice::getStatus(AUD_Handle* handle)
 {
        return AUD_STATUS_INVALID;

Modified: branches/soundsystem/intern/audaspace/intern/AUD_NULLDevice.h
===================================================================
--- branches/soundsystem/intern/audaspace/intern/AUD_NULLDevice.h       
2009-07-28 18:25:02 UTC (rev 21986)
+++ branches/soundsystem/intern/audaspace/intern/AUD_NULLDevice.h       
2009-07-28 18:42:26 UTC (rev 21987)
@@ -53,6 +53,7 @@
        virtual bool setKeep(AUD_Handle* handle, bool keep);
        virtual bool sendMessage(AUD_Handle* handle, AUD_Message &message);
        virtual bool seek(AUD_Handle* handle, float position);
+       virtual float getPosition(AUD_Handle* handle);
        virtual AUD_Status getStatus(AUD_Handle* handle);
        virtual void lock();
        virtual void unlock();

Modified: branches/soundsystem/intern/audaspace/intern/AUD_SoftwareDevice.cpp
===================================================================
--- branches/soundsystem/intern/audaspace/intern/AUD_SoftwareDevice.cpp 
2009-07-28 18:25:02 UTC (rev 21986)
+++ branches/soundsystem/intern/audaspace/intern/AUD_SoftwareDevice.cpp 
2009-07-28 18:42:26 UTC (rev 21987)
@@ -324,6 +324,22 @@
        return false;
 }
 
+float AUD_SoftwareDevice::getPosition(AUD_Handle* handle)
+{
+       lock();
+
+       float position = 0.0f;
+
+       if(isValid(handle))
+       {
+               AUD_SoftwareHandle* h = (AUD_SoftwareHandle*)handle;
+               position = h->reader->getPosition() / (float)m_specs.rate;
+       }
+
+       unlock();
+       return position;
+}
+
 AUD_Status AUD_SoftwareDevice::getStatus(AUD_Handle* handle)
 {
        lock();

Modified: branches/soundsystem/intern/audaspace/intern/AUD_SoftwareDevice.h
===================================================================
--- branches/soundsystem/intern/audaspace/intern/AUD_SoftwareDevice.h   
2009-07-28 18:25:02 UTC (rev 21986)
+++ branches/soundsystem/intern/audaspace/intern/AUD_SoftwareDevice.h   
2009-07-28 18:42:26 UTC (rev 21987)
@@ -125,6 +125,7 @@
        virtual bool setKeep(AUD_Handle* handle, bool keep);
        virtual bool sendMessage(AUD_Handle* handle, AUD_Message &message);
        virtual bool seek(AUD_Handle* handle, float position);
+       virtual float getPosition(AUD_Handle* handle);
        virtual AUD_Status getStatus(AUD_Handle* handle);
        virtual void lock();

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to