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

Log Message:
-----------
Initial (ugly) sequencer sound support.

Modified Paths:
--------------
    branches/soundsystem/intern/audaspace/AUD_C-API.h
    branches/soundsystem/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
    branches/soundsystem/intern/audaspace/intern/AUD_BufferReader.cpp
    branches/soundsystem/intern/audaspace/intern/AUD_C-API.cpp
    branches/soundsystem/source/blender/blenkernel/BKE_sequence.h
    branches/soundsystem/source/blender/blenkernel/BKE_sound.h
    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/CMakeLists.txt
    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/SConscript
    branches/soundsystem/source/blender/editors/space_sequencer/sequencer_add.c
    branches/soundsystem/source/blender/editors/space_sequencer/sequencer_draw.c

Modified: branches/soundsystem/intern/audaspace/AUD_C-API.h
===================================================================
--- branches/soundsystem/intern/audaspace/AUD_C-API.h   2009-07-24 17:17:04 UTC 
(rev 21862)
+++ branches/soundsystem/intern/audaspace/AUD_C-API.h   2009-07-24 18:28:09 UTC 
(rev 21863)
@@ -39,6 +39,12 @@
        AUD_OPENAL_DEVICE
 } AUD_DeviceType;
 
+typedef struct
+{
+       AUD_Specs specs;
+       float length;
+} AUD_SoundInfo;
+
 #ifndef AUD_CAPI_IMPLEMENTATION
        typedef void AUD_Sound;
        typedef void AUD_Handle;
@@ -66,6 +72,13 @@
 extern void AUD_exit();
 
 /**
+ * Returns information about a sound.
+ * \param sound The sound to get the info about.
+ * \return The AUD_SoundInfo structure with filled in data.
+ */
+extern AUD_SoundInfo AUD_getInfo(AUD_Sound* sound);
+
+/**
  * Loads a sound file.
  * \param filename The filename of the sound file.
  * \return A handle of the sound file.
@@ -174,11 +187,9 @@
  * Seeks a playing or paused sound.
  * \param handle The handle to the sound.
  * \param seekTo From where the sound file should be played back in seconds.
- *               A negative value indicates the seconds that should be waited
- *               before playback starts.
  * \return Whether the handle has been valid or not.
  */
-extern int AUD_seek(AUD_Handle* handle, int seekTo);
+extern int AUD_seek(AUD_Handle* handle, float seekTo);
 
 /**
  * Returns the status of a playing, paused or stopped sound.

Modified: branches/soundsystem/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
===================================================================
--- branches/soundsystem/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp   
2009-07-24 17:17:04 UTC (rev 21862)
+++ branches/soundsystem/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp   
2009-07-24 18:28:09 UTC (rev 21863)
@@ -61,6 +61,9 @@
 
        /// The first buffer to be read next.
        int current;
+
+       /// Whether the stream doesn't return any more data.
+       bool data_end;
 };
 
 struct AUD_OpenALBufferedFactory
@@ -145,7 +148,7 @@
                                        while(info--)
                                        {
                                                // if there's still data to 
play back
-                                               if(sound->current >= 0)
+                                               if(!sound->data_end)
                                                {
                                                        // read data
                                                        length = m_buffersize;
@@ -154,7 +157,7 @@
                                                        // read nothing?
                                                        if(length == 0)
                                                        {
-                                                               sound->current 
= -1;
+                                                               sound->data_end 
= true;
                                                                break;
                                                        }
 
@@ -164,7 +167,7 @@
                                                        ALenum err;
                                                        if((err = alGetError()) 
!= AL_NO_ERROR)
                                                        {
-                                                               sound->current 
= -1;
+                                                               sound->data_end 
= true;
                                                                break;
                                                        }
 
@@ -177,7 +180,7 @@
 
                                                        if(alGetError() != 
AL_NO_ERROR)
                                                        {
-                                                               sound->current 
= -1;
+                                                               sound->data_end 
= true;
                                                                break;
                                                        }
 
@@ -186,7 +189,7 @@
                                                                                
        &sound->buffers[sound->current]);
                                                        if(alGetError() != 
AL_NO_ERROR)
                                                        {
-                                                               sound->current 
= -1;
+                                                               sound->data_end 
= true;
                                                                break;
                                                        }
 
@@ -204,14 +207,11 @@
                        if(info == AL_STOPPED)
                        {
                                // if it really stopped
-                               if(sound->current < 0)
+                               if(sound->data_end)
                                {
                                        // pause or
                                        if(sound->keep)
-                                       {
-                                               alSourceRewind(sound->source);
                                                pause(sound);
-                                       }
                                        // stop
                                        else
                                                stop(sound);
@@ -332,7 +332,6 @@
                delete sound; AUD_DELETE("handle")
                m_playingSounds->erase(m_playingSounds->begin());
        }
-       delete m_playingSounds; AUD_DELETE("list")
 
        // delete all paused sounds
        while(!m_pausedSounds->empty())
@@ -347,7 +346,6 @@
                delete sound; AUD_DELETE("handle")
                m_pausedSounds->erase(m_pausedSounds->begin());
        }
-       delete m_pausedSounds; AUD_DELETE("list")
 
        // delete all buffered factories
        while(!m_bufferedFactories->empty())
@@ -356,11 +354,14 @@
                delete *m_bufferedFactories->begin(); 
AUD_DELETE("bufferedfactory");
                m_bufferedFactories->erase(m_bufferedFactories->begin());
        }
-       delete m_bufferedFactories; AUD_DELETE("list")
 
        alcProcessContext(m_context);
        unlock();
 
+       delete m_playingSounds; AUD_DELETE("list")
+       delete m_pausedSounds; AUD_DELETE("list")
+       delete m_bufferedFactories; AUD_DELETE("list")
+
        // wait for the thread to stop
        if(m_thread != 0)
                pthread_join(m_thread, NULL);
@@ -521,6 +522,7 @@
                        sound->keep = keep;
                        sound->current = -1;
                        sound->isBuffered = true;
+                       sound->data_end = true;
 
                        alcSuspendContext(m_context);
 
@@ -598,6 +600,7 @@
        sound->reader = reader;
        sound->current = 0;
        sound->isBuffered = false;
+       sound->data_end = false;
 
        valid &= getFormat(sound->format, specs);
 
@@ -702,15 +705,30 @@
 
 bool AUD_OpenALDevice::resume(AUD_Handle* handle)
 {
+       ALint info;
+       lock();
+
        // only songs that are paused can be resumed
-       lock();
        for(AUD_HandleIterator i = m_pausedSounds->begin();
                i != m_pausedSounds->end(); i++)
        {
                if(*i == handle)
                {
                        m_playingSounds->push_back(*i);
-                       alSourcePlay((*i)->source);
+
+                       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();
@@ -813,8 +831,11 @@
                if(alhandle->isBuffered)
                        alSourcef(alhandle->source, AL_SEC_OFFSET, position);
                else
+               {
                        alhandle->reader->seek((int)(position *
                                                                                
 alhandle->reader->getSpecs().rate));
+                       alhandle->data_end = false;
+               }
                unlock();
                return true;
        }
@@ -1098,6 +1119,8 @@
        alListenerfv(AL_POSITION, (ALfloat*)data.position);
        alListenerfv(AL_VELOCITY, (ALfloat*)data.velocity);
        alListenerfv(AL_ORIENTATION, (ALfloat*)&(data.orientation[3]));
+
+       return true;
 }
 
 bool AUD_OpenALDevice::setSetting(AUD_3DSetting setting, float value)
@@ -1162,8 +1185,6 @@
        return std::numeric_limits<float>::quiet_NaN();
 }
 
-#include <stdio.h>
-
 bool AUD_OpenALDevice::updateSource(AUD_Handle* handle, AUD_3DData &data)
 {
        lock();

Modified: branches/soundsystem/intern/audaspace/intern/AUD_BufferReader.cpp
===================================================================
--- branches/soundsystem/intern/audaspace/intern/AUD_BufferReader.cpp   
2009-07-24 17:17:04 UTC (rev 21862)
+++ branches/soundsystem/intern/audaspace/intern/AUD_BufferReader.cpp   
2009-07-24 18:28:09 UTC (rev 21863)
@@ -45,7 +45,7 @@
        if(position < 0)
                m_position = 0;
        else if(position > m_buffer.get()->getSize() / AUD_SAMPLE_SIZE(m_specs))
-               position = m_buffer.get()->getSize() / AUD_SAMPLE_SIZE(m_specs);
+               m_position = m_buffer.get()->getSize() / 
AUD_SAMPLE_SIZE(m_specs);
        else
                m_position = position;
 }

Modified: branches/soundsystem/intern/audaspace/intern/AUD_C-API.cpp
===================================================================
--- branches/soundsystem/intern/audaspace/intern/AUD_C-API.cpp  2009-07-24 
17:17:04 UTC (rev 21862)
+++ branches/soundsystem/intern/audaspace/intern/AUD_C-API.cpp  2009-07-24 
18:28:09 UTC (rev 21863)
@@ -36,13 +36,8 @@
 #include "AUD_LoopFactory.h"
 #include "AUD_ReadDevice.h"
 #include "AUD_SourceCaps.h"
+#include "AUD_IReader.h"
 
-/*
-#define WITH_SDL
-#define WITH_OPENAL
-#define WITH_FFMPEG
-//*/
-
 #ifdef WITH_SDL
 #include "AUD_SDLDevice.h"
 #include "AUD_FloatMixer.h"
@@ -138,6 +133,30 @@
        AUD_3ddevice = NULL;
 }
 
+AUD_SoundInfo AUD_getInfo(AUD_Sound* sound)
+{
+       assert(sound);
+
+       AUD_IReader* reader = sound->createReader();
+
+       AUD_SoundInfo info;
+
+       if(reader)
+       {
+               info.specs = reader->getSpecs();
+               info.length = reader->getLength() / (float) info.specs.rate;
+       }
+       else
+       {
+               info.specs.channels = AUD_CHANNELS_INVALID;
+               info.specs.format = AUD_FORMAT_INVALID;
+               info.specs.rate = AUD_RATE_INVALID;
+               info.length = 0.0;
+       }
+
+       return info;
+}
+
 AUD_Sound* AUD_load(const char* filename)
 {
        assert(filename);
@@ -291,11 +310,10 @@
        return AUD_device->setKeep(handle, keep);
 }
 
-int AUD_seek(AUD_Handle* handle, double seekTo)
+int AUD_seek(AUD_Handle* handle, float seekTo)
 {
        assert(AUD_device);
-       int position = (int)(seekTo * AUD_device->getSpecs().rate);
-       return AUD_device->seek(handle, position);
+       return AUD_device->seek(handle, seekTo);
 }
 
 AUD_Status AUD_getStatus(AUD_Handle* handle)

Modified: branches/soundsystem/source/blender/blenkernel/BKE_sequence.h
===================================================================
--- branches/soundsystem/source/blender/blenkernel/BKE_sequence.h       
2009-07-24 17:17:04 UTC (rev 21862)
+++ branches/soundsystem/source/blender/blenkernel/BKE_sequence.h       
2009-07-24 18:28:09 UTC (rev 21863)
@@ -9,7 +9,7 @@
  * of the License, or (at your option) any later version. The Blender
  * Foundation also sells licenses for use in proprietary software under
  * the Blender License.  See http://www.blender.org/BL/ for information
- * about this. 
+ * about this.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -37,6 +37,7 @@
 struct StripElem;
 struct ImBuf;
 struct Scene;
+struct bContext;
 
 #define MAXSEQ          32
 
@@ -44,7 +45,6 @@
 #define BUILD_SEQAR_COUNT_CURRENT  1
 #define BUILD_SEQAR_COUNT_CHILDREN 2
 
-
 /* sequence iterator */
 
 typedef struct SeqIterator {
@@ -65,7 +65,7 @@
        SeqIterator iter;\
                for(seq_begin(ed, &iter, 1); iter.valid; seq_next(&iter)) { \
                        seq= iter.seq;
-                       
+
 #define SEQ_BEGIN(ed, seq) \
        { \
                SeqIterator iter;\
@@ -90,41 +90,41 @@
        /* init & init_plugin are _only_ called on first creation */
        void (*init)(struct Sequence *seq);
        void (*init_plugin)(struct Sequence *seq, const char *fname);
-       
-       /* number of input strips needed 
+
+       /* number of input strips needed
                (called directly after construction) */
        int (*num_inputs)();
-       
+
        /* load is called first time after readblenfile in
                get_sequence_effect automatically */
        void (*load)(struct Sequence *seq);
-       
+
        /* duplicate */
        void (*copy)(struct Sequence *dst, struct Sequence *src);
-       
+
        /* destruct */
        void (*free)(struct Sequence *seq);
-       
+
        /* returns: -1: no input needed,
-       0: no early out, 
-       1: out = ibuf1, 
+       0: no early out,
+       1: out = ibuf1,
        2: out = ibuf2 */
        int (*early_out)(struct Sequence *seq,
-                                        float facf0, float facf1); 
-       
+                                        float facf0, float facf1);
+
        /* stores the y-range of the effect IPO */
        void (*store_icu_yrange)(struct Sequence * seq,
                                                         short adrcode, float 
*ymin, float *ymax);
-       
+
        /* stores the default facf0 and facf1 if no IPO is present */
        void (*get_default_fac)(struct Sequence *seq, int cfra,
                                                        float * facf0, float * 
facf1);
-       
+
        /* execute the effect
                sequence effects are only required to either support

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to