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)
This commit is contained in:
Joerg Mueller 2011-07-13 12:16:45 +00:00
parent fa78d3271f
commit f12614234a
7 changed files with 48 additions and 16 deletions

@ -33,9 +33,6 @@
#include <cstring> #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_DoubleReader::AUD_DoubleReader(AUD_Reference<AUD_IReader> reader1,
AUD_Reference<AUD_IReader> reader2) : AUD_Reference<AUD_IReader> reader2) :
m_reader1(reader1), m_reader2(reader2), m_finished1(false) m_reader1(reader1), m_reader2(reader2), m_finished1(false)

@ -32,8 +32,6 @@
#include "AUD_LimiterReader.h" #include "AUD_LimiterReader.h"
#include "AUD_Buffer.h" #include "AUD_Buffer.h"
#include <iostream>
AUD_LimiterReader::AUD_LimiterReader(AUD_Reference<AUD_IReader> reader, AUD_LimiterReader::AUD_LimiterReader(AUD_Reference<AUD_IReader> reader,
float start, float end) : float start, float end) :
AUD_EffectReader(reader), AUD_EffectReader(reader),

@ -178,10 +178,14 @@ bool AUD_OpenALDevice::AUD_OpenALHandle::stop()
m_device->lock(); 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) if(m_status == AUD_STATUS_PLAYING)
m_device->m_playingSounds.remove(this); m_device->m_playingSounds.remove(This);
else else
m_device->m_pausedSounds.remove(this); m_device->m_pausedSounds.remove(This);
m_device->unlock(); m_device->unlock();

@ -60,6 +60,8 @@ void AUD_ChannelMapperReader::setChannels(AUD_Channels channels)
void AUD_ChannelMapperReader::setMonoAngle(float angle) void AUD_ChannelMapperReader::setMonoAngle(float angle)
{ {
if(std::isnan(angle))
angle = 0;
m_mono_angle = angle; m_mono_angle = angle;
if(m_source_channels == AUD_CHANNELS_MONO) if(m_source_channels == AUD_CHANNELS_MONO)
calculateMapping(); calculateMapping();
@ -75,8 +77,6 @@ float AUD_ChannelMapperReader::angleDistance(float alpha, float beta)
return alpha; return alpha;
} }
#include <iostream>
void AUD_ChannelMapperReader::calculateMapping() void AUD_ChannelMapperReader::calculateMapping()
{ {
if(m_map_size < m_source_channels * m_target_channels) 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++) for(int j = 0; j < m_target_channels; j++)
{ {
if(j == lfe)
continue;
angle = angleDistance(source_angles[i], target_angles[j]); angle = angleDistance(source_angles[i], target_angles[j]);
if(angle < angle_min1) if(angle < angle_min1)
{ {

@ -92,7 +92,7 @@ void AUD_Mixer::mix(sample_t* buffer, int start, int length, float volume)
sample_t* out = m_buffer.getBuffer(); sample_t* out = m_buffer.getBuffer();
length = (AUD_MIN(m_length, length + start) - start) * m_specs.channels; 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++) for(int i = 0; i < length; i++)
out[i + start] += buffer[i] * volume; out[i + start] += buffer[i] * volume;

@ -33,6 +33,11 @@
#include <map> #include <map>
#ifdef MEM_DEBUG
#include <iostream>
#include <typeinfo>
#endif
class AUD_ReferenceHandler class AUD_ReferenceHandler
{ {
private: private:
@ -88,6 +93,10 @@ public:
{ {
m_original = m_reference = reference; m_original = m_reference = reference;
AUD_ReferenceHandler::incref(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; m_original = m_reference = ref.m_reference;
AUD_ReferenceHandler::incref(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> template <class U>
@ -106,6 +119,10 @@ public:
m_original = ref.get(); m_original = ref.get();
m_reference = dynamic_cast<T*>(ref.get()); m_reference = dynamic_cast<T*>(ref.get());
AUD_ReferenceHandler::incref(m_original); 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() ~AUD_Reference()
{ {
#ifdef MEM_DEBUG
if(m_reference != 0)
std::cerr << "-" << typeid(*m_reference).name() << std::endl;
#endif
if(AUD_ReferenceHandler::decref(m_original)) if(AUD_ReferenceHandler::decref(m_original))
delete m_reference; delete m_reference;
} }
@ -127,12 +148,20 @@ public:
if(&ref == this) if(&ref == this)
return *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)) if(AUD_ReferenceHandler::decref(m_original))
delete m_reference; delete m_reference;
m_original = ref.m_original; m_original = ref.m_original;
m_reference = ref.m_reference; m_reference = ref.m_reference;
AUD_ReferenceHandler::incref(m_original); AUD_ReferenceHandler::incref(m_original);
#ifdef MEM_DEBUG
if(m_reference != 0)
std::cerr << "+" << typeid(*m_reference).name() << std::endl;
#endif
return *this; return *this;
} }

@ -65,8 +65,6 @@ AUD_SoftwareDevice::AUD_SoftwareHandle::AUD_SoftwareHandle(AUD_SoftwareDevice* d
{ {
} }
#include <iostream>
void AUD_SoftwareDevice::AUD_SoftwareHandle::update() void AUD_SoftwareDevice::AUD_SoftwareHandle::update()
{ {
int flags = 0; int flags = 0;
@ -170,7 +168,7 @@ void AUD_SoftwareDevice::AUD_SoftwareHandle::update()
{ {
AUD_Vector3 SZ = m_orientation.getLookAt(); 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); float t = (phi - m_cone_angle_inner)/(m_cone_angle_outer - m_cone_angle_inner);
if(t > 0) if(t > 0)
@ -202,7 +200,7 @@ void AUD_SoftwareDevice::AUD_SoftwareHandle::update()
if(Asquare > 0) 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) if(N.cross(Z) * A > 0)
phi = -phi; phi = -phi;
@ -268,15 +266,19 @@ bool AUD_SoftwareDevice::AUD_SoftwareHandle::stop()
m_device->lock(); 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) if(m_status == AUD_STATUS_PLAYING)
{ {
m_device->m_playingSounds.remove(this); m_device->m_playingSounds.remove(This);
if(m_device->m_playingSounds.empty()) if(m_device->m_playingSounds.empty())
m_device->playing(m_device->m_playback = false); m_device->playing(m_device->m_playback = false);
} }
else else
m_device->m_pausedSounds.remove(this); m_device->m_pausedSounds.remove(This);
m_device->unlock(); m_device->unlock();
m_status = AUD_STATUS_INVALID; m_status = AUD_STATUS_INVALID;