Revision: 38331
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38331
Author:   nexyon
Date:     2011-07-12 13:11:00 +0000 (Tue, 12 Jul 2011)
Log Message:
-----------
3D Audio GSoC:
Software 3D Audio implementation.

Modified Paths:
--------------
    branches/soc-2011-pepper/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_3DMath.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_SoftwareDevice.cpp
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_SoftwareDevice.h

Modified: branches/soc-2011-pepper/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp       
2011-07-12 13:09:22 UTC (rev 38330)
+++ branches/soc-2011-pepper/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp       
2011-07-12 13:11:00 UTC (rev 38331)
@@ -492,10 +492,10 @@
 
 bool AUD_OpenALDevice::AUD_OpenALHandle::isRelative()
 {
-       int result = std::numeric_limits<float>::quiet_NaN();
+       int result;
 
        if(!m_status)
-               return result;
+               return false;
 
        m_device->lock();
 

Modified: branches/soc-2011-pepper/intern/audaspace/intern/AUD_3DMath.h
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_3DMath.h       
2011-07-12 13:09:22 UTC (rev 38330)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_3DMath.h       
2011-07-12 13:11:00 UTC (rev 38331)
@@ -32,15 +32,16 @@
 #ifndef AUD_3DMATH
 #define AUD_3DMATH
 
-class AUD_Quaternion
+#include <cmath>
+
+class AUD_Vector3
 {
 private:
        union
        {
-               float m_v[4];
+               float m_v[3];
                struct
                {
-                       float m_w;
                        float m_x;
                        float m_y;
                        float m_z;
@@ -49,28 +50,18 @@
 
 public:
        /**
-        * Creates a new quaternion.
-        * \param w The w component.
+        * Creates a new 3 dimensional vector.
         * \param x The x component.
         * \param y The y component.
         * \param z The z component.
         */
-       inline AUD_Quaternion(float w, float x, float y, float z) :
-               m_w(w), m_x(x), m_y(y), m_z(z)
+       inline AUD_Vector3(float x = 0, float y = 0, float z = 0) :
+               m_x(x), m_y(y), m_z(z)
        {
        }
 
        /**
-        * Retrieves the w component of the quarternion.
-        * \return The w component.
-        */
-       inline const float& w() const
-       {
-               return m_w;
-       }
-
-       /**
-        * Retrieves the x component of the quarternion.
+        * Retrieves the x component of the vector.
         * \return The x component.
         */
        inline const float& x() const
@@ -79,7 +70,7 @@
        }
 
        /**
-        * Retrieves the y component of the quarternion.
+        * Retrieves the y component of the vector.
         * \return The y component.
         */
        inline const float& y() const
@@ -88,7 +79,7 @@
        }
 
        /**
-        * Retrieves the z component of the quarternion.
+        * Retrieves the z component of the vector.
         * \return The z component.
         */
        inline const float& z() const
@@ -98,34 +89,80 @@
 
        /**
         * Retrieves the components of the vector.
-        * \param destination Where the 4 float values should be saved to.
+        * \param destination Where the 3 float values should be saved to.
         */
        inline void get(float* destination) const
        {
-               destination[0] = m_w;
-               destination[1] = m_x;
-               destination[2] = m_y;
-               destination[3] = m_z;
+               destination[0] = m_x;
+               destination[1] = m_y;
+               destination[2] = m_z;
        }
 
        /**
         * Retrieves the components of the vector.
-        * \return The components as float[4].
+        * \return The components as float[3].
         */
        inline const float* get() const
        {
                return m_v;
        }
+
+       /**
+        * Retrieves the length of the vector.
+        * \return The length of the vector.
+        */
+       inline float length() const
+       {
+               return sqrt(m_x*m_x + m_y*m_y + m_z*m_z);
+       }
+
+       inline AUD_Vector3 cross(const AUD_Vector3& op) const
+       {
+               return AUD_Vector3(m_y * op.m_z - m_z * op.m_y,
+                                                  m_z * op.m_x - m_x * op.m_z,
+                                                  m_x * op.m_y - m_y * op.m_x);
+       }
+
+       /**
+        * Retrieves the dot product.
+        * \param op The second operand.
+        * \return The dot product of the two vectors.
+        */
+       inline float operator*(const AUD_Vector3& op) const
+       {
+               return m_x * op.m_x + m_y * op.m_y + m_z * op.m_z;
+       }
+
+       inline AUD_Vector3 operator*(const float& op) const
+       {
+               return AUD_Vector3(m_x * op, m_y * op, m_z * op);
+       }
+
+       inline AUD_Vector3 operator+(const AUD_Vector3& op) const
+       {
+               return AUD_Vector3(m_x + op.m_x, m_y + op.m_y, m_z + op.m_z);
+       }
+
+       inline AUD_Vector3 operator-(const AUD_Vector3& op) const
+       {
+               return AUD_Vector3(m_x - op.m_x, m_y - op.m_y, m_z - op.m_z);
+       }
+
+       inline AUD_Vector3 operator-() const
+       {
+               return AUD_Vector3(-m_x, -m_y, -m_z);
+       }
 };
 
-class AUD_Vector3
+class AUD_Quaternion
 {
 private:
        union
        {
-               float m_v[3];
+               float m_v[4];
                struct
                {
+                       float m_w;
                        float m_x;
                        float m_y;
                        float m_z;
@@ -134,18 +171,28 @@
 
 public:
        /**
-        * Creates a new 3 dimensional vector.
+        * Creates a new quaternion.
+        * \param w The w component.
         * \param x The x component.
         * \param y The y component.
         * \param z The z component.
         */
-       inline AUD_Vector3(float x, float y, float z) :
-               m_x(x), m_y(y), m_z(z)
+       inline AUD_Quaternion(float w = 1, float x = 0, float y = 0, float z = 
0) :
+               m_w(w), m_x(x), m_y(y), m_z(z)
        {
        }
 
        /**
-        * Retrieves the x component of the vector.
+        * Retrieves the w component of the quarternion.
+        * \return The w component.
+        */
+       inline const float& w() const
+       {
+               return m_w;
+       }
+
+       /**
+        * Retrieves the x component of the quarternion.
         * \return The x component.
         */
        inline const float& x() const
@@ -154,7 +201,7 @@
        }
 
        /**
-        * Retrieves the y component of the vector.
+        * Retrieves the y component of the quarternion.
         * \return The y component.
         */
        inline const float& y() const
@@ -163,7 +210,7 @@
        }
 
        /**
-        * Retrieves the z component of the vector.
+        * Retrieves the z component of the quarternion.
         * \return The z component.
         */
        inline const float& z() const
@@ -173,23 +220,38 @@
 
        /**
         * Retrieves the components of the vector.
-        * \param destination Where the 3 float values should be saved to.
+        * \param destination Where the 4 float values should be saved to.
         */
        inline void get(float* destination) const
        {
-               destination[0] = m_x;
-               destination[1] = m_y;
-               destination[2] = m_z;
+               destination[0] = m_w;
+               destination[1] = m_x;
+               destination[2] = m_y;
+               destination[3] = m_z;
        }
 
        /**
         * Retrieves the components of the vector.
-        * \return The components as float[3].
+        * \return The components as float[4].
         */
        inline const float* get() const
        {
                return m_v;
        }
+
+       inline AUD_Vector3 getLookAt() const
+       {
+               return AUD_Vector3(-2 * (m_w * m_y + m_x * m_z),
+                                                       2 * (m_x * m_w - m_z * 
m_y),
+                                                       2 * (m_x * m_x + m_y * 
m_y) - 1);
+       }
+
+       inline AUD_Vector3 getUp() const
+       {
+               return AUD_Vector3(2 * (m_x * m_y - m_w * m_z),
+                                                       1 - 2 * (m_x * m_x + 
m_z * m_z),
+                                                       2 * (m_w * m_x + m_y * 
m_z));
+       }
 };
 
 #endif //AUD_3DMATH

Modified: 
branches/soc-2011-pepper/intern/audaspace/intern/AUD_ChannelMapperReader.cpp
===================================================================
--- 
branches/soc-2011-pepper/intern/audaspace/intern/AUD_ChannelMapperReader.cpp    
    2011-07-12 13:09:22 UTC (rev 38330)
+++ 
branches/soc-2011-pepper/intern/audaspace/intern/AUD_ChannelMapperReader.cpp    
    2011-07-12 13:11:00 UTC (rev 38331)
@@ -43,7 +43,7 @@
 AUD_ChannelMapperReader::AUD_ChannelMapperReader(AUD_Reference<AUD_IReader> 
reader,
                                                                                
                 AUD_Channels channels) :
                AUD_EffectReader(reader), m_target_channels(channels),
-       m_source_channels(AUD_CHANNELS_INVALID), m_mapping(0)
+       m_source_channels(AUD_CHANNELS_INVALID), m_mapping(0), m_map_size(0), 
m_mono_angle(0)
 {
 }
 
@@ -58,6 +58,13 @@
        calculateMapping();
 }
 
+void AUD_ChannelMapperReader::setMonoAngle(float angle)
+{
+       m_mono_angle = angle;
+       if(m_source_channels == AUD_CHANNELS_MONO)
+               calculateMapping();
+}
+
 float AUD_ChannelMapperReader::angleDistance(float alpha, float beta)
 {
        alpha = fabs(alpha - beta);
@@ -68,11 +75,20 @@
        return alpha;
 }
 
+#include <iostream>
+
 void AUD_ChannelMapperReader::calculateMapping()
 {
-       delete[] m_mapping;
-       m_mapping = new float[m_source_channels * m_target_channels];
+       if(m_map_size < m_source_channels * m_target_channels)
+       {
+               delete[] m_mapping;
+               m_mapping = new float[m_source_channels * m_target_channels];
+               m_map_size = m_source_channels * m_target_channels;
+       }
 
+       for(int i = 0; i < m_source_channels * m_target_channels; i++)
+               m_mapping[i] = 0;
+
        const AUD_Channel* source_channels = CHANNEL_MAPS[m_source_channels - 
1];
        const AUD_Channel* target_channels = CHANNEL_MAPS[m_target_channels - 
1];
 
@@ -90,6 +106,9 @@
        const float* source_angles = CHANNEL_ANGLES[m_source_channels - 1];
        const float* target_angles = CHANNEL_ANGLES[m_target_channels - 1];
 
+       if(m_source_channels == AUD_CHANNELS_MONO)
+               source_angles = &m_mono_angle;
+
        int channel_min1, channel_min2;
        float angle_min1, angle_min2, angle;
 
@@ -124,17 +143,26 @@
                        }
                }
 
-               if(channel_min2 == -1)
+               angle = angle_min1 + angle_min2;
+               if(channel_min2 == -1 || angle == 0)
                {
                        m_mapping[channel_min1 * m_source_channels + i] = 1;
                }
                else
                {
-                       angle = angle_min1 + angle_min2;
                        m_mapping[channel_min1 * m_source_channels + i] = 
cos(M_PI_2 * angle_min1 / angle);
                        m_mapping[channel_min2 * m_source_channels + i] = 
cos(M_PI_2 * angle_min2 / angle);
                }
        }
+
+       /* AUD_XXX for(int i = 0; i < m_source_channels; i++)
+       {
+               for(int j = 0; j < m_target_channels; j++)
+               {
+                       std::cout << m_mapping[i * m_source_channels + j] << " 
";
+               }
+               std::cout << std::endl;
+       }*/
 }
 
 AUD_Specs AUD_ChannelMapperReader::getSpecs() const

Modified: 
branches/soc-2011-pepper/intern/audaspace/intern/AUD_ChannelMapperReader.h
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_ChannelMapperReader.h  
2011-07-12 13:09:22 UTC (rev 38330)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_ChannelMapperReader.h  
2011-07-12 13:11:00 UTC (rev 38331)
@@ -62,6 +62,16 @@
         */
        float* m_mapping;
 
+       /**
+        * The size of the mapping.
+        */
+       int m_map_size;
+
+       /**
+        * The mono source angle.
+        */
+       float m_mono_angle;
+
        static const AUD_Channel MONO_MAP[];
        static const AUD_Channel STEREO_MAP[];
        static const AUD_Channel STEREO_LFE_MAP[];
@@ -111,6 +121,8 @@
 
        void setChannels(AUD_Channels channels);
 
+       void setMonoAngle(float angle);
+
        virtual AUD_Specs getSpecs() const;
        virtual void read(int& length, bool& eos, sample_t* buffer);
 };

Modified: 
branches/soc-2011-pepper/intern/audaspace/intern/AUD_SoftwareDevice.cpp
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_SoftwareDevice.cpp     
2011-07-12 13:09:22 UTC (rev 38330)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_SoftwareDevice.cpp     
2011-07-12 13:11:00 UTC (rev 38331)
@@ -38,17 +38,180 @@
 #else
 #include "AUD_LinearResampleReader.h"
 #endif
-#include "AUD_ChannelMapperReader.h"
 
 #include <cstring>
+#include <cmath>
 #include <limits>
 

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