Revision: 26693
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26693
Author:   nexyon
Date:     2010-02-08 00:41:17 +0100 (Mon, 08 Feb 2010)

Log Message:
-----------
2.5 Audio:

- recode of the whole sequencer audio handling
- encode audio flag removed, instead you choose None as audio codec, added None 
for video codec too
- ffmpeg formats/codecs: enabled: theora, ogg, vorbis; added: matroska, flac 
(not working, who can fix?), mp3, wav
- sequencer wave drawing
- volume animation (now also working when mixing down to a file!)
- made sequencer strip position and length values unanimatable

Modified Paths:
--------------
    trunk/blender/intern/audaspace/FX/AUD_LoopReader.cpp
    trunk/blender/intern/audaspace/FX/AUD_LoopReader.h
    trunk/blender/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
    trunk/blender/intern/audaspace/intern/AUD_C-API.cpp
    trunk/blender/intern/audaspace/intern/AUD_C-API.h
    trunk/blender/intern/audaspace/intern/AUD_Mixer.cpp
    trunk/blender/intern/audaspace/intern/AUD_Mixer.h
    trunk/blender/intern/audaspace/intern/AUD_SoftwareDevice.cpp
    trunk/blender/intern/audaspace/intern/AUD_Space.h
    trunk/blender/release/scripts/ui/properties_render.py
    trunk/blender/source/blender/blenkernel/BKE_sequencer.h
    trunk/blender/source/blender/blenkernel/BKE_sound.h
    trunk/blender/source/blender/blenkernel/BKE_writeffmpeg.h
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/blenkernel/intern/sequencer.c
    trunk/blender/source/blender/blenkernel/intern/sound.c
    trunk/blender/source/blender/blenkernel/intern/writeffmpeg.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/editors/animation/anim_ops.c
    trunk/blender/source/blender/editors/screen/screen_ops.c
    trunk/blender/source/blender/editors/sound/sound_ops.c
    trunk/blender/source/blender/editors/space_graph/graph_ops.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_add.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/makesdna/DNA_sequence_types.h
    trunk/blender/source/blender/makesdna/DNA_sound_types.h
    trunk/blender/source/blender/makesrna/intern/rna_scene.c
    trunk/blender/source/blender/makesrna/intern/rna_sequencer.c
    trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SoundActuator.cpp

Added Paths:
-----------
    trunk/blender/intern/audaspace/intern/AUD_SequencerFactory.cpp
    trunk/blender/intern/audaspace/intern/AUD_SequencerFactory.h
    trunk/blender/intern/audaspace/intern/AUD_SequencerReader.cpp
    trunk/blender/intern/audaspace/intern/AUD_SequencerReader.h

Modified: trunk/blender/intern/audaspace/FX/AUD_LoopReader.cpp
===================================================================
--- trunk/blender/intern/audaspace/FX/AUD_LoopReader.cpp        2010-02-07 
23:39:44 UTC (rev 26692)
+++ trunk/blender/intern/audaspace/FX/AUD_LoopReader.cpp        2010-02-07 
23:41:17 UTC (rev 26693)
@@ -31,6 +31,7 @@
 AUD_LoopReader::AUD_LoopReader(AUD_IReader* reader, int loop) :
                AUD_EffectReader(reader), m_loop(loop)
 {
+       m_samples = -1;
        m_buffer = new AUD_Buffer(); AUD_NEW("buffer")
 }
 
@@ -51,6 +52,7 @@
        if(message.type == AUD_MSG_LOOP)
        {
                m_loop = message.loopcount;
+               m_samples = message.time * m_reader->getSpecs().rate;
 
                m_reader->notify(message);
 
@@ -64,6 +66,13 @@
        AUD_Specs specs = m_reader->getSpecs();
        int samplesize = AUD_SAMPLE_SIZE(specs);
 
+       if(m_samples >= 0)
+       {
+               if(length > m_samples)
+                       length = m_samples;
+               m_samples -= length;
+       }
+
        int len = length;
 
        m_reader->read(len, buffer);

Modified: trunk/blender/intern/audaspace/FX/AUD_LoopReader.h
===================================================================
--- trunk/blender/intern/audaspace/FX/AUD_LoopReader.h  2010-02-07 23:39:44 UTC 
(rev 26692)
+++ trunk/blender/intern/audaspace/FX/AUD_LoopReader.h  2010-02-07 23:41:17 UTC 
(rev 26693)
@@ -46,6 +46,11 @@
         */
        int m_loop;
 
+       /**
+        * The left samples.
+        */
+       int m_samples;
+
 public:
        /**
         * Creates a new loop reader.

Modified: trunk/blender/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
===================================================================
--- trunk/blender/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp  2010-02-07 
23:39:44 UTC (rev 26692)
+++ trunk/blender/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp  2010-02-07 
23:41:17 UTC (rev 26693)
@@ -180,7 +180,7 @@
                                                                                
         AUD_DEVICE_SAMPLE_SIZE(specs),
                                                                                
         specs.rate);
 
-                                                               if(alGetError() 
!= AL_NO_ERROR)
+                                                               if((err = 
alGetError()) != AL_NO_ERROR)
                                                                {
                                                                        
sound->data_end = true;
                                                                        break;
@@ -839,13 +839,14 @@
 
                        if(info != AL_PLAYING)
                        {
-                               if(info != AL_STOPPED)
+                               if(info == AL_PAUSED)
                                        alSourceStop(alhandle->source);
 
-                               alSourceUnqueueBuffers(alhandle->source,
-                                                                          
AUD_OPENAL_CYCLE_BUFFERS,
-                                                                          
alhandle->buffers);
-                               if(alGetError() == AL_NO_ERROR)
+                               alSourcei(alhandle->source, AL_BUFFER, 0);
+                               alhandle->current = 0;
+
+                               ALenum err;
+                               if((err = alGetError()) == AL_NO_ERROR)
                                {
                                        sample_t* buf;
                                        int length;

Modified: trunk/blender/intern/audaspace/intern/AUD_C-API.cpp
===================================================================
--- trunk/blender/intern/audaspace/intern/AUD_C-API.cpp 2010-02-07 23:39:44 UTC 
(rev 26692)
+++ trunk/blender/intern/audaspace/intern/AUD_C-API.cpp 2010-02-07 23:41:17 UTC 
(rev 26693)
@@ -47,6 +47,7 @@
 #include "AUD_ReadDevice.h"
 #include "AUD_SourceCaps.h"
 #include "AUD_IReader.h"
+#include "AUD_SequencerFactory.h"
 
 #ifdef WITH_SDL
 #include "AUD_SDLDevice.h"
@@ -231,7 +232,7 @@
        }
 }
 
-extern AUD_Sound* AUD_limitSound(AUD_Sound* sound, float start, float end)
+AUD_Sound* AUD_limitSound(AUD_Sound* sound, float start, float end)
 {
        assert(sound);
 
@@ -273,13 +274,14 @@
        }
 }
 
-int AUD_stopLoop(AUD_Handle* handle)
+int AUD_setLoop(AUD_Handle* handle, int loops, float time)
 {
        if(handle)
        {
                AUD_Message message;
                message.type = AUD_MSG_LOOP;
-               message.loopcount = 0;
+               message.loopcount = loops;
+               message.time = time;
 
                try
                {
@@ -537,14 +539,16 @@
        }
 }
 
-AUD_Handle* AUD_playDevice(AUD_Device* device, AUD_Sound* sound)
+AUD_Handle* AUD_playDevice(AUD_Device* device, AUD_Sound* sound, float seek)
 {
        assert(device);
        assert(sound);
 
        try
        {
-               return device->play(sound);
+               AUD_Handle* handle = device->play(sound);
+               device->seek(handle, seek);
+               return handle;
        }
        catch(AUD_Exception)
        {
@@ -663,3 +667,97 @@
        *length = position;
        return result;
 }
+
+AUD_Sound* AUD_createSequencer(void* data, AUD_volumeFunction volume)
+{
+       if(AUD_device)
+       {
+               return new AUD_SequencerFactory(AUD_device->getSpecs().specs, 
data, volume);
+       }
+       else
+       {
+               AUD_Specs specs;
+               specs.channels = AUD_CHANNELS_STEREO;
+               specs.rate = AUD_RATE_44100;
+               return new AUD_SequencerFactory(specs, data, volume);
+       }
+}
+
+void AUD_destroySequencer(AUD_Sound* sequencer)
+{
+       delete ((AUD_SequencerFactory*)sequencer);
+}
+
+AUD_SequencerEntry* AUD_addSequencer(AUD_Sound** sequencer, AUD_Sound* sound,
+                                                                float begin, 
float end, float skip, void* data)
+{
+       return ((AUD_SequencerFactory*)sequencer)->add((AUD_IFactory**) sound, 
begin, end, skip, data);
+}
+
+void AUD_removeSequencer(AUD_Sound* sequencer, AUD_SequencerEntry* entry)
+{
+       ((AUD_SequencerFactory*)sequencer)->remove(entry);
+}
+
+void AUD_moveSequencer(AUD_Sound* sequencer, AUD_SequencerEntry* entry,
+                                  float begin, float end, float skip)
+{
+       ((AUD_SequencerFactory*)sequencer)->move(entry, begin, end, skip);
+}
+
+void AUD_muteSequencer(AUD_Sound* sequencer, AUD_SequencerEntry* entry, char 
mute)
+{
+       ((AUD_SequencerFactory*)sequencer)->mute(entry, mute);
+}
+
+int AUD_readSound(AUD_Sound* sound, sample_t* buffer, int length)
+{
+       AUD_IReader* reader = sound->createReader();
+       AUD_DeviceSpecs specs;
+       sample_t* buf;
+
+       specs.specs = reader->getSpecs();
+       specs.channels = AUD_CHANNELS_MONO;
+       specs.format = AUD_FORMAT_FLOAT32;
+
+       AUD_ChannelMapperFactory mapper(reader, specs);
+
+       if(!reader || reader->getType() != AUD_TYPE_BUFFER)
+               return -1;
+
+       reader = mapper.createReader();
+
+       if(!reader)
+               return -1;
+
+       int len = reader->getLength();
+       float samplejump = (float)len / (float)length;
+       float min, max;
+
+       for(int i = 0; i < length; i++)
+       {
+               len = floor(samplejump * (i+1)) - floor(samplejump * i);
+               reader->read(len, buf);
+
+               if(len < 1)
+               {
+                       length = i;
+                       break;
+               }
+
+               max = min = *buf;
+               for(int j = 1; j < len; j++)
+               {
+                       if(buf[j] < min)
+                               min = buf[j];
+                       if(buf[j] > max)
+                               max = buf[j];
+                       buffer[i * 2] = min;
+                       buffer[i * 2 + 1] = max;
+               }
+       }
+
+       delete reader; AUD_DELETE("reader")
+
+       return length;
+}

Modified: trunk/blender/intern/audaspace/intern/AUD_C-API.h
===================================================================
--- trunk/blender/intern/audaspace/intern/AUD_C-API.h   2010-02-07 23:39:44 UTC 
(rev 26692)
+++ trunk/blender/intern/audaspace/intern/AUD_C-API.h   2010-02-07 23:41:17 UTC 
(rev 26693)
@@ -50,6 +50,8 @@
        typedef void AUD_Sound;
        typedef void AUD_Handle;
        typedef void AUD_Device;
+       typedef void AUD_SequencerEntry;
+       typedef float (*AUD_volumeFunction)(void*, void*, float);
 #endif
 
 /**
@@ -143,11 +145,13 @@
 extern AUD_Sound* AUD_loopSound(AUD_Sound* sound);
 
 /**
- * Stops a looping sound when the current playback finishes.
+ * Sets a remaining loop count of a looping sound that currently plays.
  * \param handle The playback handle.
+ * \param loops The count of remaining loops, -1 for infinity.
+ * \param time The time after which playback should stop, -1 for infinity.
  * \return Whether the handle is valid.
  */
-extern int AUD_stopLoop(AUD_Handle* handle);
+extern int AUD_setLoop(AUD_Handle* handle, int loops, float time);
 
 /**
  * Rectifies a sound.
@@ -211,6 +215,7 @@
 
 /**
  * Retrieves the playback position of a handle.
+ * \param handle The handle to the sound.
  * \return The current playback position in seconds or 0.0 if the handle is
  *         invalid.
  */
@@ -318,9 +323,10 @@
  * Plays back a sound file through a read device.
  * \param device The read device.
  * \param sound The handle of the sound file.
+ * \param seek The position where the sound should be seeked to.
  * \return A handle to the played back sound.
  */
-extern AUD_Handle* AUD_playDevice(AUD_Device* device, AUD_Sound* sound);
+extern AUD_Handle* AUD_playDevice(AUD_Device* device, AUD_Sound* sound, float 
seek);
 
 /**
  * Sets the volume of a played back sound of a read device.
@@ -360,6 +366,23 @@
                                                                  float 
sthreshold, int samplerate,
                                                                  int* length);
 
+extern AUD_Sound* AUD_createSequencer(void* data, AUD_volumeFunction volume);
+
+extern void AUD_destroySequencer(AUD_Sound* sequencer);
+
+extern AUD_SequencerEntry* AUD_addSequencer(AUD_Sound** sequencer, AUD_Sound* 
sound,
+                                                                               
float begin, float end, float skip, void* data);
+
+extern void AUD_removeSequencer(AUD_Sound* sequencer, AUD_SequencerEntry* 
entry);
+
+extern void AUD_moveSequencer(AUD_Sound* sequencer, AUD_SequencerEntry* entry,
+                                                 float begin, float end, float 
skip);
+
+extern void AUD_muteSequencer(AUD_Sound* sequencer, AUD_SequencerEntry* entry,
+                                                 char mute);
+
+extern int AUD_readSound(AUD_Sound* sound, sample_t* buffer, int length);
+
 #ifdef __cplusplus
 }
 #endif

Modified: trunk/blender/intern/audaspace/intern/AUD_Mixer.cpp
===================================================================
--- trunk/blender/intern/audaspace/intern/AUD_Mixer.cpp 2010-02-07 23:39:44 UTC 
(rev 26692)
+++ trunk/blender/intern/audaspace/intern/AUD_Mixer.cpp 2010-02-07 23:41:17 UTC 
(rev 26693)
@@ -68,6 +68,11 @@
        return reader;
 }
 
+AUD_DeviceSpecs AUD_Mixer::getSpecs()
+{
+       return m_specs;
+}
+
 void AUD_Mixer::setSpecs(AUD_DeviceSpecs specs)
 {
        m_specs = specs;
@@ -115,10 +120,11 @@
        }
 }
 
-void AUD_Mixer::add(sample_t* buffer, int length, float volume)
+void AUD_Mixer::add(sample_t* buffer, int start, int length, float volume)
 {
        AUD_MixerBuffer buf;
        buf.buffer = buffer;
+       buf.start = start;
        buf.length = length;
        buf.volume = volume;
        m_buffers.push_back(buf);
@@ -145,11 +151,11 @@
                buf = m_buffers.front();
                m_buffers.pop_front();
 
-               end = buf.length*channels;
+               end = buf.length * channels;
                in = buf.buffer;
 
                for(int i = 0; i < end; i++)
-                       out[i] += in[i]*buf.volume * volume;
+                       out[i + buf.start * channels] += in[i] * buf.volume * 
volume;
        }
 
        m_convert(buffer, (data_t*) out, length * channels);

Modified: trunk/blender/intern/audaspace/intern/AUD_Mixer.h
===================================================================
--- trunk/blender/intern/audaspace/intern/AUD_Mixer.h   2010-02-07 23:39:44 UTC 
(rev 26692)
+++ trunk/blender/intern/audaspace/intern/AUD_Mixer.h   2010-02-07 23:41:17 UTC 
(rev 26693)
@@ -37,6 +37,7 @@
 struct AUD_MixerBuffer
 {
        sample_t* buffer;
+       int start;
        int length;
        float volume;
 };
@@ -99,6 +100,12 @@
        AUD_IReader* prepare(AUD_IReader* reader);
 
        /**
+        * Returns the target specification for superposing.
+        * \return The target specification.
+        */
+       AUD_DeviceSpecs getSpecs();
+
+       /**
         * Sets the target specification for superposing.

@@ 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