From f12614234a02bee3daa118d429bc37e5be4b932c Mon Sep 17 00:00:00 2001 From: Joerg Mueller Date: Wed, 13 Jul 2011 12:16:45 +0000 Subject: [PATCH] 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) --- intern/audaspace/FX/AUD_DoubleReader.cpp | 3 -- intern/audaspace/FX/AUD_LimiterReader.cpp | 2 -- intern/audaspace/OpenAL/AUD_OpenALDevice.cpp | 8 +++-- .../intern/AUD_ChannelMapperReader.cpp | 6 ++-- intern/audaspace/intern/AUD_Mixer.cpp | 2 +- intern/audaspace/intern/AUD_Reference.h | 29 +++++++++++++++++++ .../audaspace/intern/AUD_SoftwareDevice.cpp | 14 +++++---- 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 -static const char* specs_error = "AUD_DoubleReader: Both readers have to have " - "the same specs."; - AUD_DoubleReader::AUD_DoubleReader(AUD_Reference reader1, AUD_Reference 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 - AUD_LimiterReader::AUD_LimiterReader(AUD_Reference 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 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 - 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 +#ifdef MEM_DEBUG +#include +#include +#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 @@ -106,6 +119,10 @@ public: m_original = ref.get(); m_reference = dynamic_cast(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 - 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 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;