forked from bartvdbraak/blender
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:
parent
fa78d3271f
commit
f12614234a
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user