Revision: 37717
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37717
Author:   nexyon
Date:     2011-06-21 20:39:41 +0000 (Tue, 21 Jun 2011)
Log Message:
-----------
3D Audio GSoC:
- Sequencer dynamics: Now it's possible to change the output channels and the 
resampling quality also increased (previously maximum quality was 44,1 kHz)
- Changed two buffers to use ffmpeg allocation, not sure if that helps somehow.

Modified Paths:
--------------
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.cpp
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.h
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_ChannelMapperReader.cpp
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_ChannelMapperReader.h
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_Mixer.cpp
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_Mixer.h
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerFactory.cpp
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerFactory.h
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerReader.cpp
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerReader.h
    branches/soc-2011-pepper/release/scripts/presets/ffmpeg/DV.py
    branches/soc-2011-pepper/release/scripts/presets/ffmpeg/DVD.py
    branches/soc-2011-pepper/release/scripts/presets/ffmpeg/SVCD.py
    branches/soc-2011-pepper/release/scripts/presets/ffmpeg/VCD.py
    branches/soc-2011-pepper/release/scripts/startup/bl_ui/properties_render.py
    branches/soc-2011-pepper/source/blender/blenkernel/intern/scene.c
    branches/soc-2011-pepper/source/blender/blenkernel/intern/sound.c
    branches/soc-2011-pepper/source/blender/blenkernel/intern/writeffmpeg.c
    branches/soc-2011-pepper/source/blender/blenloader/intern/readfile.c
    branches/soc-2011-pepper/source/blender/makesdna/DNA_scene_types.h
    branches/soc-2011-pepper/source/blender/makesrna/intern/rna_scene.c

Modified: branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.cpp
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.cpp      
2011-06-21 20:35:09 UTC (rev 37716)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.cpp      
2011-06-21 20:39:41 UTC (rev 37717)
@@ -882,16 +882,11 @@
 
 AUD_Sound* AUD_createSequencer(int muted, void* data, AUD_volumeFunction 
volume)
 {
-/* AUD_XXX should be this: but AUD_createSequencer is called before the device
- * is initialized.
-
-       return new AUD_SequencerFactory(AUD_device->getSpecs().specs, data, 
volume);
-*/
+       // specs are changed at a later point!
        AUD_Specs specs;
        specs.channels = AUD_CHANNELS_STEREO;
        specs.rate = AUD_RATE_44100;
        AUD_Reference<AUD_SequencerFactory>* sequencer = new 
AUD_Reference<AUD_SequencerFactory>(new AUD_SequencerFactory(specs, muted, 
data, volume));
-       (*sequencer)->setThis(sequencer);
        return reinterpret_cast<AUD_Sound*>(sequencer);
 }
 
@@ -928,6 +923,16 @@
        ((AUD_SequencerFactory*)sequencer->get())->mute(*entry, mute);
 }
 
+void AUD_setSequencerDeviceSpecs(AUD_Sound* sequencer)
+{
+       
((AUD_SequencerFactory*)sequencer->get())->setSpecs(AUD_device->getSpecs().specs);
+}
+
+void AUD_setSequencerSpecs(AUD_Sound* sequencer, AUD_Specs specs)
+{
+       ((AUD_SequencerFactory*)sequencer->get())->setSpecs(specs);
+}
+
 int AUD_readSound(AUD_Sound* sound, sample_t* buffer, int length)
 {
        AUD_DeviceSpecs specs;

Modified: branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.h
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.h        
2011-06-21 20:35:09 UTC (rev 37716)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.h        
2011-06-21 20:39:41 UTC (rev 37717)
@@ -469,6 +469,10 @@
 extern void AUD_muteSequencer(AUD_Sound* sequencer, AUD_SEntry* entry,
                                                  char mute);
 
+extern void AUD_setSequencerDeviceSpecs(AUD_Sound* sequencer);
+
+extern void AUD_setSequencerSpecs(AUD_Sound* sequencer, AUD_Specs specs);
+
 extern int AUD_readSound(AUD_Sound* sound, sample_t* buffer, int length);
 
 extern void AUD_startPlayback(void);

Modified: 
branches/soc-2011-pepper/intern/audaspace/intern/AUD_ChannelMapperReader.cpp
===================================================================
--- 
branches/soc-2011-pepper/intern/audaspace/intern/AUD_ChannelMapperReader.cpp    
    2011-06-21 20:35:09 UTC (rev 37716)
+++ 
branches/soc-2011-pepper/intern/audaspace/intern/AUD_ChannelMapperReader.cpp    
    2011-06-21 20:39:41 UTC (rev 37717)
@@ -44,6 +44,12 @@
        delete[] m_mapping;
 }
 
+void AUD_ChannelMapperReader::setChannels(AUD_Channels channels)
+{
+       m_target_channels = channels;
+       calculateMapping();
+}
+
 float AUD_ChannelMapperReader::angleDistance(float alpha, float beta)
 {
        alpha = fabs(alpha - beta);

Modified: 
branches/soc-2011-pepper/intern/audaspace/intern/AUD_ChannelMapperReader.h
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_ChannelMapperReader.h  
2011-06-21 20:35:09 UTC (rev 37716)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_ChannelMapperReader.h  
2011-06-21 20:39:41 UTC (rev 37717)
@@ -109,6 +109,8 @@
         */
        ~AUD_ChannelMapperReader();
 
+       void setChannels(AUD_Channels channels);
+
        virtual AUD_Specs getSpecs() const;
        virtual void read(int& length, bool& eos, sample_t* buffer);
 };

Modified: branches/soc-2011-pepper/intern/audaspace/intern/AUD_Mixer.cpp
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_Mixer.cpp      
2011-06-21 20:35:09 UTC (rev 37716)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_Mixer.cpp      
2011-06-21 20:39:41 UTC (rev 37717)
@@ -73,6 +73,11 @@
        return m_specs;
 }
 
+void AUD_Mixer::setSpecs(AUD_Specs specs)
+{
+       m_specs.specs = specs;
+}
+
 void AUD_Mixer::clear(int length)
 {
        m_buffer.assureSize(length * m_specs.channels * 
AUD_SAMPLE_SIZE(m_specs));

Modified: branches/soc-2011-pepper/intern/audaspace/intern/AUD_Mixer.h
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_Mixer.h        
2011-06-21 20:35:09 UTC (rev 37716)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_Mixer.h        
2011-06-21 20:39:41 UTC (rev 37717)
@@ -47,7 +47,7 @@
        /**
         * The output specification.
         */
-       const AUD_DeviceSpecs m_specs;
+       AUD_DeviceSpecs m_specs;
 
        /**
         * The length of the mixing buffer.
@@ -82,6 +82,12 @@
        AUD_DeviceSpecs getSpecs() const;
 
        /**
+        * Sets the target specification for superposing.
+        * \param specs The target specification.
+        */
+       void setSpecs(AUD_Specs specs);
+
+       /**
         * Mixes a buffer.
         * \param buffer The buffer to superpose.
         * \param start The start sample of the buffer.

Modified: 
branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerFactory.cpp
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerFactory.cpp   
2011-06-21 20:35:09 UTC (rev 37716)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerFactory.cpp   
2011-06-21 20:39:41 UTC (rev 37717)
@@ -48,9 +48,12 @@
 {
 }
 
-void AUD_SequencerFactory::setThis(AUD_Reference<AUD_SequencerFactory>* self)
+void AUD_SequencerFactory::setSpecs(AUD_Specs specs)
 {
-       m_this = self;
+       m_specs = specs;
+
+       for(AUD_ReaderIterator i = m_readers.begin(); i != m_readers.end(); i++)
+               (*i)->setSpecs(m_specs);
 }
 
 void AUD_SequencerFactory::mute(bool muted)
@@ -103,7 +106,7 @@
 
 AUD_Reference<AUD_IReader> AUD_SequencerFactory::createReader()
 {
-       AUD_Reference<AUD_SequencerReader> reader = new 
AUD_SequencerReader(*m_this, m_entries,
+       AUD_Reference<AUD_SequencerReader> reader = new 
AUD_SequencerReader(this, m_entries,
                                                                                
                                  m_specs, m_data,
                                                                                
                                  m_volume);
        m_readers.push_front(reader);

Modified: 
branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerFactory.h
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerFactory.h     
2011-06-21 20:35:09 UTC (rev 37716)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerFactory.h     
2011-06-21 20:39:41 UTC (rev 37717)
@@ -66,7 +66,6 @@
        bool m_muted;
        void* m_data;
        AUD_volumeFunction m_volume;
-       AUD_Reference<AUD_SequencerFactory>* m_this;
 
        // hide copy constructor and operator=
        AUD_SequencerFactory(const AUD_SequencerFactory&);
@@ -76,7 +75,7 @@
        AUD_SequencerFactory(AUD_Specs specs, bool muted, void* data, 
AUD_volumeFunction volume);
        ~AUD_SequencerFactory();
 
-       void setThis(AUD_Reference<AUD_SequencerFactory>* self);
+       void setSpecs(AUD_Specs specs);
 
        void mute(bool muted);
        bool getMute() const;

Modified: 
branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerReader.cpp
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerReader.cpp    
2011-06-21 20:35:09 UTC (rev 37716)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerReader.cpp    
2011-06-21 20:39:41 UTC (rev 37717)
@@ -95,6 +95,22 @@
        }
 }
 
+void AUD_SequencerReader::setSpecs(AUD_Specs specs)
+{
+       m_mixer->setSpecs(specs);
+
+       AUD_Reference<AUD_SequencerStrip> strip;
+       for(AUD_StripIterator i = m_strips.begin(); i != m_strips.end(); i++)
+       {
+               strip = *i;
+               if(!strip->mapper.isNull())
+               {
+                       strip->mapper->setChannels(specs.channels);
+                       strip->resampler->setRate(specs.rate);
+               }
+       }
+}
+
 bool AUD_SequencerReader::isSeekable() const
 {
        return true;
@@ -149,24 +165,30 @@
                                                        strip->reader = 
(*strip->old_sound)->createReader();
                                                        // resample
                                                        #ifdef WITH_SAMPLERATE
-                                                               strip->reader = 
new AUD_SRCResampleReader(strip->reader, m_mixer->getSpecs().specs);
+                                                               
strip->resampler = new AUD_SRCResampleReader(strip->reader, 
m_mixer->getSpecs().specs);
                                                        #else
-                                                               strip->reader = 
new AUD_LinearResampleReader(strip->reader, m_mixer->getSpecs().specs);
+                                                               
strip->resampler = new AUD_LinearResampleReader(strip->reader, 
m_mixer->getSpecs().specs);
                                                        #endif
 
                                                        // rechannel
-                                                       strip->reader = new 
AUD_ChannelMapperReader(strip->reader, m_mixer->getSpecs().channels);
+                                                       strip->mapper = new 
AUD_ChannelMapperReader(AUD_Reference<AUD_IReader>(strip->resampler), 
m_mixer->getSpecs().channels);
                                                }
                                                catch(AUD_Exception)
                                                {
                                                        strip->reader = NULL;
+                                                       strip->resampler = NULL;
+                                                       strip->mapper = NULL;
                                                }
                                        }
                                        else
+                                       {
                                                strip->reader = NULL;
+                                               strip->resampler = NULL;
+                                               strip->mapper = NULL;
+                                       }
                                }
 
-                               if(!strip->reader.isNull())
+                               if(!strip->mapper.isNull())
                                {
                                        end = floor(strip->entry->end * rate);
                                        if(m_position < end)
@@ -185,9 +207,9 @@
                                                        current += 
strip->entry->skip * rate;
                                                        len = length > end - 
m_position ? end - m_position : length;
                                                        len -= skip;
-                                                       
if(strip->reader->getPosition() != current)
-                                                               
strip->reader->seek(current);
-                                                       
strip->reader->read(len, eos, m_buffer.getBuffer());
+                                                       
if(strip->mapper->getPosition() != current)
+                                                               
strip->mapper->seek(current);
+                                                       
strip->mapper->read(len, eos, m_buffer.getBuffer());
                                                        
m_mixer->mix(m_buffer.getBuffer(), skip, len, m_volume(m_data, 
strip->entry->data, (float)m_position / (float)rate));
                                                }
                                        }

Modified: branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerReader.h
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerReader.h      
2011-06-21 20:35:09 UTC (rev 37716)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerReader.h      
2011-06-21 20:39:41 UTC (rev 37717)
@@ -35,11 +35,15 @@
 #include "AUD_IReader.h"
 #include "AUD_SequencerFactory.h"
 #include "AUD_Buffer.h"
-class AUD_Mixer;
+#include "AUD_Mixer.h"
+#include "AUD_ResampleReader.h"
+#include "AUD_ChannelMapperReader.h"
 
 struct AUD_SequencerStrip
 {
        AUD_Reference<AUD_IReader> reader;
+       AUD_Reference<AUD_ResampleReader> resampler;
+       AUD_Reference<AUD_ChannelMapperReader> mapper;
        AUD_Reference<AUD_SequencerEntry> entry;
        AUD_Reference<AUD_IFactory>* old_sound;
 };
@@ -94,6 +98,7 @@
 
        void add(AUD_Reference<AUD_SequencerEntry> entry);
        void remove(AUD_Reference<AUD_SequencerEntry> entry);
+       void setSpecs(AUD_Specs specs);
 

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