Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorJoerg Mueller <nexyon@gmail.com>2011-07-13 16:16:45 +0400
committerJoerg Mueller <nexyon@gmail.com>2011-07-13 16:16:45 +0400
commitf12614234a02bee3daa118d429bc37e5be4b932c (patch)
tree2bb1ba15c086ce267b5ebb396f40a7b2fff1bd02 /intern
parentfa78d3271f538199332984cac8b98386ec17845e (diff)
3D Audio GSoC:
* Fixed a warning in AUD_DoubleReader.cpp * Removed some unneeded includes * Fixed a bug resulting in a crash when stopping a sound * Fixed a bug where a NaN resulted in a horrible memory error * Fixed a typo bug which caused crackling in audio playback and export * Added memory debugging code (ifdefed)
Diffstat (limited to 'intern')
-rw-r--r--intern/audaspace/FX/AUD_DoubleReader.cpp3
-rw-r--r--intern/audaspace/FX/AUD_LimiterReader.cpp2
-rw-r--r--intern/audaspace/OpenAL/AUD_OpenALDevice.cpp8
-rw-r--r--intern/audaspace/intern/AUD_ChannelMapperReader.cpp6
-rw-r--r--intern/audaspace/intern/AUD_Mixer.cpp2
-rw-r--r--intern/audaspace/intern/AUD_Reference.h29
-rw-r--r--intern/audaspace/intern/AUD_SoftwareDevice.cpp14
7 files changed, 48 insertions, 16 deletions
diff --git a/intern/audaspace/FX/AUD_DoubleReader.cpp b/intern/audaspace/FX/AUD_DoubleReader.cpp
index fd2419a86e8..96352b0963c 100644
--- a/intern/audaspace/FX/AUD_DoubleReader.cpp
+++ b/intern/audaspace/FX/AUD_DoubleReader.cpp
@@ -33,9 +33,6 @@
#include <cstring>
-static const char* specs_error = "AUD_DoubleReader: Both readers have to have "
- "the same specs.";
-
AUD_DoubleReader::AUD_DoubleReader(AUD_Reference<AUD_IReader> reader1,
AUD_Reference<AUD_IReader> reader2) :
m_reader1(reader1), m_reader2(reader2), m_finished1(false)
diff --git a/intern/audaspace/FX/AUD_LimiterReader.cpp b/intern/audaspace/FX/AUD_LimiterReader.cpp
index 92feac8a6a3..dc31477d2eb 100644
--- a/intern/audaspace/FX/AUD_LimiterReader.cpp
+++ b/intern/audaspace/FX/AUD_LimiterReader.cpp
@@ -32,8 +32,6 @@
#include "AUD_LimiterReader.h"
#include "AUD_Buffer.h"
-#include <iostream>
-
AUD_LimiterReader::AUD_LimiterReader(AUD_Reference<AUD_IReader> reader,
float start, float end) :
AUD_EffectReader(reader),
diff --git a/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp b/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
index 3b306d89d7b..65b1d3f3b64 100644
--- a/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
+++ b/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
@@ -178,10 +178,14 @@ bool AUD_OpenALDevice::AUD_OpenALHandle::stop()
m_device->lock();
+ // AUD_XXX Create a reference of our own object so that it doesn't get
+ // deleted before the end of this function
+ AUD_Reference<AUD_OpenALHandle> This = this;
+
if(m_status == AUD_STATUS_PLAYING)
- m_device->m_playingSounds.remove(this);
+ m_device->m_playingSounds.remove(This);
else
- m_device->m_pausedSounds.remove(this);
+ m_device->m_pausedSounds.remove(This);
m_device->unlock();
diff --git a/intern/audaspace/intern/AUD_ChannelMapperReader.cpp b/intern/audaspace/intern/AUD_ChannelMapperReader.cpp
index 56c45da3fe4..dd6f5b43953 100644
--- a/intern/audaspace/intern/AUD_ChannelMapperReader.cpp
+++ b/intern/audaspace/intern/AUD_ChannelMapperReader.cpp
@@ -60,6 +60,8 @@ void AUD_ChannelMapperReader::setChannels(AUD_Channels channels)
void AUD_ChannelMapperReader::setMonoAngle(float angle)
{
+ if(std::isnan(angle))
+ angle = 0;
m_mono_angle = angle;
if(m_source_channels == AUD_CHANNELS_MONO)
calculateMapping();
@@ -75,8 +77,6 @@ float AUD_ChannelMapperReader::angleDistance(float alpha, float beta)
return alpha;
}
-#include <iostream>
-
void AUD_ChannelMapperReader::calculateMapping()
{
if(m_map_size < m_source_channels * m_target_channels)
@@ -127,6 +127,8 @@ void AUD_ChannelMapperReader::calculateMapping()
for(int j = 0; j < m_target_channels; j++)
{
+ if(j == lfe)
+ continue;
angle = angleDistance(source_angles[i], target_angles[j]);
if(angle < angle_min1)
{
diff --git a/intern/audaspace/intern/AUD_Mixer.cpp b/intern/audaspace/intern/AUD_Mixer.cpp
index cfdf2b0e60a..74ff180627a 100644
--- a/intern/audaspace/intern/AUD_Mixer.cpp
+++ b/intern/audaspace/intern/AUD_Mixer.cpp
@@ -92,7 +92,7 @@ void AUD_Mixer::mix(sample_t* buffer, int start, int length, float volume)
sample_t* out = m_buffer.getBuffer();
length = (AUD_MIN(m_length, length + start) - start) * m_specs.channels;
- start += m_specs.channels;
+ start *= m_specs.channels;
for(int i = 0; i < length; i++)
out[i + start] += buffer[i] * volume;
diff --git a/intern/audaspace/intern/AUD_Reference.h b/intern/audaspace/intern/AUD_Reference.h
index f9716b76fe2..3ddeab2eff1 100644
--- a/intern/audaspace/intern/AUD_Reference.h
+++ b/intern/audaspace/intern/AUD_Reference.h
@@ -33,6 +33,11 @@
#include <map>
+#ifdef MEM_DEBUG
+#include <iostream>
+#include <typeinfo>
+#endif
+
class AUD_ReferenceHandler
{
private:
@@ -88,6 +93,10 @@ public:
{
m_original = m_reference = reference;
AUD_ReferenceHandler::incref(reference);
+#ifdef MEM_DEBUG
+ if(m_reference != 0)
+ std::cerr << "+" << typeid(*m_reference).name() << std::endl;
+#endif
}
/**
@@ -98,6 +107,10 @@ public:
{
m_original = m_reference = ref.m_reference;
AUD_ReferenceHandler::incref(m_reference);
+#ifdef MEM_DEBUG
+ if(m_reference != 0)
+ std::cerr << "+" << typeid(*m_reference).name() << std::endl;
+#endif
}
template <class U>
@@ -106,6 +119,10 @@ public:
m_original = ref.get();
m_reference = dynamic_cast<T*>(ref.get());
AUD_ReferenceHandler::incref(m_original);
+#ifdef MEM_DEBUG
+ if(m_reference != 0)
+ std::cerr << "+" << typeid(*m_reference).name() << std::endl;
+#endif
}
/**
@@ -114,6 +131,10 @@ public:
*/
~AUD_Reference()
{
+#ifdef MEM_DEBUG
+ if(m_reference != 0)
+ std::cerr << "-" << typeid(*m_reference).name() << std::endl;
+#endif
if(AUD_ReferenceHandler::decref(m_original))
delete m_reference;
}
@@ -127,12 +148,20 @@ public:
if(&ref == this)
return *this;
+#ifdef MEM_DEBUG
+ if(m_reference != 0)
+ std::cerr << "-" << typeid(*m_reference).name() << std::endl;
+#endif
if(AUD_ReferenceHandler::decref(m_original))
delete m_reference;
m_original = ref.m_original;
m_reference = ref.m_reference;
AUD_ReferenceHandler::incref(m_original);
+#ifdef MEM_DEBUG
+ if(m_reference != 0)
+ std::cerr << "+" << typeid(*m_reference).name() << std::endl;
+#endif
return *this;
}
diff --git a/intern/audaspace/intern/AUD_SoftwareDevice.cpp b/intern/audaspace/intern/AUD_SoftwareDevice.cpp
index c19f65afc6d..5e430860704 100644
--- a/intern/audaspace/intern/AUD_SoftwareDevice.cpp
+++ b/intern/audaspace/intern/AUD_SoftwareDevice.cpp
@@ -65,8 +65,6 @@ AUD_SoftwareDevice::AUD_SoftwareHandle::AUD_SoftwareHandle(AUD_SoftwareDevice* d
{
}
-#include <iostream>
-
void AUD_SoftwareDevice::AUD_SoftwareHandle::update()
{
int flags = 0;
@@ -170,7 +168,7 @@ void AUD_SoftwareDevice::AUD_SoftwareHandle::update()
{
AUD_Vector3 SZ = m_orientation.getLookAt();
- float phi = acos(SZ * SL / (SZ.length() * SL.length()));
+ float phi = acos(float(SZ * SL / (SZ.length() * SL.length())));
float t = (phi - m_cone_angle_inner)/(m_cone_angle_outer - m_cone_angle_inner);
if(t > 0)
@@ -202,7 +200,7 @@ void AUD_SoftwareDevice::AUD_SoftwareHandle::update()
if(Asquare > 0)
{
- float phi = acos(Z * A/ (Z.length() * sqrt(Asquare)));
+ float phi = acos(float(Z * A / (Z.length() * sqrt(Asquare))));
if(N.cross(Z) * A > 0)
phi = -phi;
@@ -268,15 +266,19 @@ bool AUD_SoftwareDevice::AUD_SoftwareHandle::stop()
m_device->lock();
+ // AUD_XXX Create a reference of our own object so that it doesn't get
+ // deleted before the end of this function
+ AUD_Reference<AUD_SoftwareHandle> This = this;
+
if(m_status == AUD_STATUS_PLAYING)
{
- m_device->m_playingSounds.remove(this);
+ m_device->m_playingSounds.remove(This);
if(m_device->m_playingSounds.empty())
m_device->playing(m_device->m_playback = false);
}
else
- m_device->m_pausedSounds.remove(this);
+ m_device->m_pausedSounds.remove(This);
m_device->unlock();
m_status = AUD_STATUS_INVALID;