Commit a206476d authored by Dipl.-Ing. Jonas Stienen's avatar Dipl.-Ing. Jonas Stienen

Finalizing merge for offline simulation feature

parents 2e7826d0 435ff750
......@@ -57,6 +57,10 @@ vista_use_package( Eigen REQUIRED )
# Optional packages
vista_find_package( RavenNet QUIET )
if( ITA_VA_CORE_LIBS_FFT_USES_FFTW3 )
set( ITA_VA_COPYING_GNU_GPL ON PARENT_SCOPE )
endif( )
if( NOT DEFINED ITA_VACORE_VERSION_MAJOR )
set( ITA_VACORE_VERSION_MAJOR "v2018" CACHE STRING "VACore version major (usually 'v' and year)" )
endif( )
......@@ -116,8 +120,8 @@ endif( )
if( NOT DEFINED ITA_VACORE_WITH_AUDIO_BACKEND_PORTAUDIO )
set( ITA_VACORE_WITH_AUDIO_BACKEND_PORTAUDIO ON CACHE BOOL "Build VACore with Portaudio audio backend support" )
endif( )
if( NOT DEFINED ITA_VACORE_WITH_AUDIO_BACKEND_DUMMY )
set( ITA_VACORE_WITH_AUDIO_BACKEND_DUMMY OFF CACHE BOOL "Build VACore with dummy audio backend support" )
if( NOT DEFINED ITA_VACORE_WITH_AUDIO_BACKEND_VIRTUAL )
set( ITA_VACORE_WITH_AUDIO_BACKEND_VIRTUAL OFF CACHE BOOL "Build VACore with virtual audio backend support (for offline simulations)" )
endif( )
......@@ -254,8 +258,8 @@ endif( )
if( ITA_VACORE_WITH_AUDIO_BACKEND_PORTAUDIO )
add_definitions( -DVACORE_WITH_AUDIO_BACKEND_PORTAUDIO )
endif( )
if( ITA_VACORE_WITH_AUDIO_BACKEND_DUMMY )
add_definitions( -DVACORE_WITH_AUDIO_BACKEND_DUMMY )
if( ITA_VACORE_WITH_AUDIO_BACKEND_VIRTUAL )
add_definitions( -DVACORE_WITH_AUDIO_BACKEND_VIRTUAL )
endif( )
# Rendering definitions
......
......@@ -36,9 +36,7 @@
#include <sstream>
CVAAudioSignalSourceManager::CVAAudioSignalSourceManager( CVACoreImpl* pParentCore,
const CVAAudioDriverConfig& oAudioDriverConfig,
ITADatasource* pDeviceInputSource )
CVAAudioSignalSourceManager::CVAAudioSignalSourceManager( CVACoreImpl* pParentCore, const CVAAudioDriverConfig& oAudioDriverConfig, ITADatasource* pDeviceInputSource )
: m_pParentCore( pParentCore ),
m_dSamplerate( oAudioDriverConfig.dSampleRate ),
m_iBlocklength( oAudioDriverConfig.iBuffersize ),
......
......@@ -35,8 +35,8 @@ void CVAAudioDriverConfig::Init( const CVAStruct& oArgs )
CVAConfigInterpreter conf( oArgs );
conf.OptNonEmptyString( "Driver", sDriver );
conf.OptString( "Device", sDevice, "AUTO" );
conf.OptNumber( "Samplerate", dSampleRate, DEFAULT_SAMPLERATE );
conf.OptInteger( "Buffersize", iBuffersize, AUTO, &lits );
conf.OptNumber( "SampleRate", dSampleRate, DEFAULT_SAMPLERATE );
conf.OptInteger( "BufferSize", iBuffersize, AUTO, &lits );
conf.OptInteger( "InputChannels", iInputChannels, AUTO, &lits );
conf.OptInteger( "OutputChannels", iOutputChannels, AUTO, &lits );
......@@ -48,9 +48,8 @@ void CVAAudioDriverConfig::Init( const CVAStruct& oArgs )
VA_EXCEPT1( "Invalid buffersize specified" );
if( ( iInputChannels < 0 ) && ( iInputChannels != AUTO ) )
VA_EXCEPT1( "Invalid number of input channels specified" );
VA_EXCEPT1( "Invalid number of input channels specified (autodetect = -1 or AUTO)" );
// @todo: really?! I don't see a point why single channel output shouldn't be supported.
if( ( iOutputChannels < 2 ) && ( iOutputChannels != AUTO ) )
VA_EXCEPT1( "Invalid number of output channels specified (at least two)" );
if( ( iOutputChannels < 1 ) && ( iOutputChannels != AUTO ) )
VA_EXCEPT1( "Invalid number of output channels specified (at least one required, if not using autodetect ... -1 or AUTO)" );
}
#include "VADummyAudioDriverBackend.h"
#include "VAVirtualAudioDriverBackend.h"
#include "../../Utils/VADebug.h"
#include <VAException.h>
#include <ITAException.h>
#include <ITANumericUtils.h>
......@@ -8,8 +9,8 @@
#include <cassert>
CVADummyAudioDriverBackend::CVADummyAudioDriverBackend( const CVAAudioDriverConfig* pConfig )
: CVAObject( "VirtualAudioDriver" )
CVAVirtualAudioDriverBackend::CVAVirtualAudioDriverBackend( const CVAAudioDriverConfig* pConfig )
: CVAObject( "VirtualAudioDevice" )
, m_oConfig( *pConfig )
, m_pDataSource( NULL )
, m_bStarted( false )
......@@ -19,72 +20,77 @@ CVADummyAudioDriverBackend::CVADummyAudioDriverBackend( const CVAAudioDriverConf
m_oOutputStreamProps.uiBlocklength = ( unsigned int ) m_oConfig.iBuffersize;
}
CVADummyAudioDriverBackend::~CVADummyAudioDriverBackend()
CVAVirtualAudioDriverBackend::~CVAVirtualAudioDriverBackend()
{
}
std::string CVADummyAudioDriverBackend::getDriverName() const
std::string CVAVirtualAudioDriverBackend::getDriverName() const
{
return "Dummy";
return "Virtual";
}
std::string CVADummyAudioDriverBackend::getDeviceName() const
std::string CVAVirtualAudioDriverBackend::getDeviceName() const
{
return "Dummy";
return "Trigger";
}
int CVADummyAudioDriverBackend::getNumberOfInputs() const
int CVAVirtualAudioDriverBackend::getNumberOfInputs() const
{
return m_oConfig.iInputChannels;
}
const ITAStreamProperties* CVADummyAudioDriverBackend::getOutputStreamProperties() const
const ITAStreamProperties* CVAVirtualAudioDriverBackend::getOutputStreamProperties() const
{
return &m_oOutputStreamProps;
}
void CVADummyAudioDriverBackend::setOutputStreamDatasource( ITADatasource* pDatasource )
void CVAVirtualAudioDriverBackend::setOutputStreamDatasource( ITADatasource* pDatasource )
{
m_pDataSource = pDatasource;
}
ITADatasource* CVADummyAudioDriverBackend::getInputStreamDatasource() const
ITADatasource* CVAVirtualAudioDriverBackend::getInputStreamDatasource() const
{
return nullptr;
}
void CVADummyAudioDriverBackend::initialize()
void CVAVirtualAudioDriverBackend::initialize()
{
}
void CVADummyAudioDriverBackend::finalize()
void CVAVirtualAudioDriverBackend::finalize()
{
}
void CVADummyAudioDriverBackend::startStreaming()
void CVAVirtualAudioDriverBackend::startStreaming()
{
m_bStarted = true;
}
bool CVADummyAudioDriverBackend::isStreaming()
bool CVAVirtualAudioDriverBackend::isStreaming()
{
return m_bStarted;
}
void CVADummyAudioDriverBackend::stopStreaming()
void CVAVirtualAudioDriverBackend::stopStreaming()
{
m_bStarted = false;
}
CVAStruct CVADummyAudioDriverBackend::CallObject( const CVAStruct& oArgs )
CVAStruct CVAVirtualAudioDriverBackend::CallObject( const CVAStruct& oArgs )
{
CVAStruct oReturn;
if( oArgs.HasKey( "trigger" ) && m_pDataSource )
{
// Trigger block pointer getter, then increment
for( int n = 0; n < (int) m_pDataSource->GetNumberOfChannels(); n++ )
m_pDataSource->GetBlockPointer( n, &m_oStreamInfo );
m_pDataSource->IncrementBlockPointer();
}
if( oArgs.HasKey( "help" ) || oArgs.HasKey( "info" ) )
{
......@@ -93,3 +99,48 @@ CVAStruct CVADummyAudioDriverBackend::CallObject( const CVAStruct& oArgs )
return oReturn;
}
CVAVirtualAudioDriverBackend::ManualClock::ManualClock()
: CVAObject( "ManualClock" )
, m_dTime( 0.0f )
{
}
CVAVirtualAudioDriverBackend::ManualClock::~ManualClock()
{
}
double CVAVirtualAudioDriverBackend::ManualClock::getTime()
{
m_csTime.enter();
double dTime = m_dTime;
m_csTime.leave();
return dTime;
}
void CVAVirtualAudioDriverBackend::ManualClock::SetTime( double dNow )
{
m_csTime.enter();
assert( m_dTime < dNow );
m_dTime = dNow;
m_csTime.leave();
}
CVAStruct CVAVirtualAudioDriverBackend::ManualClock::CallObject( const CVAStruct& oArgs )
{
if( oArgs.HasKey( "info" ) || oArgs.HasKey( "help" ) )
{
CVAStruct oRet;
oRet[ "usage" ] = "Set the manual clock with the key 'time' and a floating point value. Time has to be strict monotonously increasing";
return oRet;
}
else if( oArgs.HasKey( "time" ) )
{
SetTime( oArgs[ "time" ] );
return CVAStruct();
}
else
{
VA_EXCEPT2( INVALID_PARAMETER, "Could npt understand call, 'time' key missing. use 'help' for more information" );
}
}
......@@ -11,8 +11,8 @@
* --------------------------------------------------------------------------------------------
*/
#ifndef IW_VACORE_DUMMY_AUDIO_DRIVER_BACKEND
#define IW_VACORE_DUMMY_AUDIO_DRIVER_BACKEND
#ifndef IW_VACORE_VIRTUAL_AUDIO_DRIVER_BACKEND
#define IW_VACORE_VIRTUAL_AUDIO_DRIVER_BACKEND
#include "VAAudioDriverBackend.h"
#include "VAAudioDriverConfig.h"
......@@ -21,14 +21,17 @@
#include <ITAStreamProperties.h>
#include <ITADatasource.h>
#include <ITACriticalSection.h>
#include <ITAClock.h>
#include <ITAStreamInfo.h>
#pragma warning( disable : 4512 ) // yep no copy constructor
class CVADummyAudioDriverBackend : public IVAAudioDriverBackend, public CVAObject
class CVAVirtualAudioDriverBackend : public IVAAudioDriverBackend, public CVAObject
{
public:
CVADummyAudioDriverBackend( const CVAAudioDriverConfig* pConfig );
~CVADummyAudioDriverBackend();
CVAVirtualAudioDriverBackend( const CVAAudioDriverConfig* pConfig );
~CVAVirtualAudioDriverBackend();
std::string getDriverName() const;
std::string getDeviceName() const;
......@@ -45,11 +48,28 @@ public:
CVAStruct CallObject( const CVAStruct& oArgs );
class ManualClock : public ITAClock, public CVAObject
{
public:
ManualClock();
~ManualClock();
inline std::string getName() const { return "ManualClock"; };
inline double getResolution() const { return -1.0f; };
double getFrequency() const { return -1.0f; };
inline double getTime();
inline void SetTime( const double dManualNow );
CVAStruct CallObject( const CVAStruct& oArgs );
private:
ITACriticalSection m_csTime;
double m_dTime;
};
private:
const CVAAudioDriverConfig m_oConfig;
ITAStreamProperties m_oOutputStreamProps;
ITAStreamInfo m_oStreamInfo;
ITADatasource* m_pDataSource;
bool m_bStarted;
};
#endif // IW_VACORE_DUMMY_AUDIO_DRIVER_BACKEND
#endif // IW_VACORE_VIRTUAL_AUDIO_DRIVER_BACKEND
......@@ -17,8 +17,8 @@ endif( )
if( ITA_VACORE_WITH_AUDIO_BACKEND_PORTAUDIO )
list( APPEND DirFiles VAPortaudioBackend.cpp VAPortaudioBackend.h )
endif( )
if( ITA_VACORE_WITH_AUDIO_BACKEND_DUMMY )
list( APPEND DirFiles VADummyAudioDriverBackend.cpp VADummyAudioDriverBackend.h )
if( ITA_VACORE_WITH_AUDIO_BACKEND_VIRTUAL )
list( APPEND DirFiles VAVirtualAudioDriverBackend.cpp VAVirtualAudioDriverBackend.h )
endif( )
set( DirFiles_SourceGroup "${RelativeSourceGroup}" )
......
......@@ -334,7 +334,7 @@ void CVAAmbisonicsFreeFieldAudioRenderer::Reset()
VA_VERBOSE( "AmbisonicsFreeFieldAudioRenderer", "Received reset call, indicating reset now" );
ctxAudio.m_iResetFlag = 1; // Request reset
if( ctxAudio.m_iStatus == 0 )
if( ctxAudio.m_iStatus == 0 || m_oParams.bOfflineRendering )
{
VA_VERBOSE( "AmbisonicsFreeFieldAudioRenderer", "Was not streaming, will reset manually" );
// if no streaming active, reset manually
......
......@@ -410,7 +410,7 @@ void CVABinauralAirTrafficNoiseAudioRenderer::Reset()
{
ctxAudio.m_iResetFlag = 1; // Request reset
if( ctxAudio.m_iStatus == 0 )
if( ctxAudio.m_iStatus == 0 || m_oParams.bOfflineRendering )
{
// if no streaming active, reset manually
//SyncInternalData();
......
......@@ -491,7 +491,7 @@ void CVABinauralArtificialReverbAudioRenderer::Reset()
{
ctxAudio.m_iResetFlag = 1; // Request reset
if( ctxAudio.m_iStatus == 0 )
if( ctxAudio.m_iStatus == 0 || m_oParams.bOfflineRendering )
{
// if no streaming active, reset manually
ResetInternalData();
......
......@@ -188,19 +188,20 @@ private:
friend class CVABFFSoundPathFactory;
};
class CVABFFSoundPathFactory : public IVAPoolObjectFactory {
class CVABFFSoundPathFactory : public IVAPoolObjectFactory
{
public:
CVABFFSoundPathFactory( double dSamplerate, int iBlocklength, int iHRIRFilterLength, int iDirFilterLength )
: m_dSamplerate( dSamplerate )
, m_iBlocklength( iBlocklength )
, m_iHRIRFilterLength( iHRIRFilterLength )
, m_iDirFilterLength( iDirFilterLength )
{}
{};
CVAPoolObject* CreatePoolObject()
{
return new CVABFFSoundPath( m_dSamplerate, m_iBlocklength, m_iHRIRFilterLength, m_iDirFilterLength );
}
};
private:
double m_dSamplerate; //!< Abtastrate
......@@ -362,7 +363,7 @@ void CVABinauralFreeFieldAudioRenderer::Reset()
VA_VERBOSE( "BinauralFreeFieldAudioRenderer", "Received reset call, indicating reset now" );
ctxAudio.m_iResetFlag = 1; // Request reset
if( ctxAudio.m_iStatus == 0 )
if( ctxAudio.m_iStatus == 0 || m_oParams.bOfflineRendering )
{
VA_VERBOSE( "BinauralFreeFieldAudioRenderer", "Was not streaming, will reset manually" );
// if no streaming active, reset manually
......@@ -1391,6 +1392,17 @@ CVAStruct CVABinauralFreeFieldAudioRenderer::CallObject( const CVAStruct& oArgs
VA_EXCEPT2( INVALID_PARAMETER, "Invalid command (\"" + sCommandOrg + "\")" );
}
void CVABinauralFreeFieldAudioRenderer::SetParameters( const CVAStruct& oParams )
{
// Only delegate
CallObject( oParams );
}
CVAStruct CVABinauralFreeFieldAudioRenderer::GetParameters( const CVAStruct& )
{
return CVAStruct( *m_oParams.pConfig );
}
void CVABinauralFreeFieldAudioRenderer::onStartDumpListeners( const std::string& sFilenameFormat )
{
if( m_bDumpListeners )
......
......@@ -118,6 +118,8 @@ public:
// --= Module interface =--
CVAStruct CallObject( const CVAStruct& oArgs );
void SetParameters( const CVAStruct& oParams );
CVAStruct GetParameters( const CVAStruct& );
void onStartDumpListeners( const std::string& sFilenameFormat );
void onStopDumpListeners();
......
......@@ -370,7 +370,7 @@ void CVAPrototypeFreeFieldAudioRenderer::Reset()
VA_VERBOSE( "PrototypeFreeFieldAudioRenderer", "Received reset call, indicating reset now" );
ctxAudio.m_iResetFlag = 1; // Request reset
if( ctxAudio.m_iStatus == 0 )
if( ctxAudio.m_iStatus == 0 || m_oParams.bOfflineRendering )
{
VA_VERBOSE( "PrototypeFreeFieldAudioRenderer", "Was not streaming, will reset manually" );
// if no streaming active, reset manually
......
......@@ -29,6 +29,7 @@
#include <ITAUPFilterPool.h>
#include <ITAAtomicPrimitives.h>
#include <ITADataSourceRealization.h>
#include <ITAVariableDelayLine.h>
// Vista includes
#include <VistaInterProcComm/Concurrency/VistaThreadEvent.h>
......@@ -50,25 +51,30 @@ public:
CVAPTGenericPathAudioRenderer::CVAPTGPListener* pListener;
ITAAtomicBool bDelete;
CITAVariableDelayLine* pVariableDelayLine;
std::vector< ITAUPConvolution* > vpFIRConvolver; // N-channel convolver
inline void PreRequest()
{
{
pSource = nullptr;
pListener = nullptr;
for( size_t n=0; n < vpFIRConvolver.size(); n++ )
vpFIRConvolver[n]->clear();
pVariableDelayLine->Clear();
for( size_t n = 0; n < vpFIRConvolver.size(); n++ )
vpFIRConvolver[ n ]->clear();
};
private:
CVAPTGenericSoundPath();
CVAPTGenericSoundPath( double dSamplerate, int iBlocklength, int iNumChannels, int iIRFilterLength );
friend class CVAPTGenericSoundPathFactory;
};
class CVAPTGenericSoundPathFactory : public IVAPoolObjectFactory
{
public:
public:
inline CVAPTGenericSoundPathFactory( double dSampleRate, int iBlockLength, int iNumChannels, int iIRFilterLength )
: m_dSampleRate( dSampleRate )
, m_iBlockLength( iBlockLength )
......@@ -92,7 +98,7 @@ class CVAPTGPListenerPoolFactory : public IVAPoolObjectFactory
{
public:
inline CVAPTGPListenerPoolFactory( CVACoreImpl* pCore )
: m_pCore( pCore )
: m_pCore( pCore )
{
};
......@@ -131,40 +137,45 @@ CVAPTGenericSoundPath::CVAPTGenericSoundPath( double dSamplerate, int iBlockleng
if( iNumChannels < 1 )
ITA_EXCEPT1( INVALID_PARAMETER, "Number of channels must be positive" );
for( int n=0; n<iNumChannels; n++ )
const int iAlgorithm = CITAVariableDelayLine::CUBIC_SPLINE_INTERPOLATION;
pVariableDelayLine = new CITAVariableDelayLine( dSamplerate, iBlocklength, 6 * dSamplerate, iAlgorithm );
for( int n = 0; n < iNumChannels; n++ )
{
ITAUPConvolution* pFIRConvolver = new ITAUPConvolution( iBlocklength, iIRFilterLength );
pFIRConvolver->SetFilterExchangeMode( ITAUPConvolution::CROSSFADE_COSINE_SQUARE );
pFIRConvolver->SetFilterCrossfadeLength( (std::min)( iBlocklength, 32 ) );
pFIRConvolver->SetFilterCrossfadeLength( ( std::min )( iBlocklength, 32 ) );
pFIRConvolver->SetGain( 1.0f, true );
ITAUPFilter* pHRIRFilterChL = pFIRConvolver->RequestFilter();
pHRIRFilterChL->Zeros();
pFIRConvolver->ExchangeFilter( pHRIRFilterChL );
pFIRConvolver->ReleaseFilter( pHRIRFilterChL );
vpFIRConvolver.push_back( pFIRConvolver );
}
vpFIRConvolver.push_back( pFIRConvolver );
}
}
CVAPTGenericSoundPath::~CVAPTGenericSoundPath()
{
for( size_t n=0; n<vpFIRConvolver.size(); n++ )
delete vpFIRConvolver[n];
delete pVariableDelayLine;
for( size_t n = 0; n < vpFIRConvolver.size(); n++ )
delete vpFIRConvolver[ n ];
}
// Renderer
CVAPTGenericPathAudioRenderer::CVAPTGenericPathAudioRenderer( const CVAAudioRendererInitParams& oParams )
: m_pCore( oParams.pCore )
, m_pCurSceneState( nullptr )
, m_iIRFilterLengthSamples( -1 )
, m_iNumChannels( -1 )
, m_oParams( oParams )
: m_pCore( oParams.pCore )
, m_pCurSceneState( nullptr )
, m_iIRFilterLengthSamples( -1 )
, m_iNumChannels( -1 )
, m_oParams( oParams )
{
// read config
Init( *oParams.pConfig );
m_pOutput = new ITADatasourceRealization( m_iNumChannels, oParams.pCore->GetCoreConfig()->oAudioDriverConfig.dSampleRate, oParams.pCore->GetCoreConfig()->oAudioDriverConfig.iBuffersize );
m_pOutput->SetStreamEventHandler( this );
......@@ -174,7 +185,7 @@ CVAPTGenericPathAudioRenderer::CVAPTGenericPathAudioRenderer( const CVAAudioRend
IVAPoolObjectFactory* pSourceFactory = new CVAPTGPSourcePoolFactory();
m_pSourcePool = IVAObjectPool::Create( 16, 2, pSourceFactory, true );
m_pSoundPathFactory = new CVAPTGenericSoundPathFactory( m_pOutput->GetSampleRate(), m_pOutput->GetBlocklength(), m_iNumChannels, m_iIRFilterLengthSamples );
m_pSoundPathFactory = new CVAPTGenericSoundPathFactory( m_pOutput->GetSampleRate(), m_pOutput->GetBlocklength(), m_iNumChannels, m_iIRFilterLengthSamples );
m_pSoundPathPool = IVAObjectPool::Create( 64, 8, m_pSoundPathFactory, true );
......@@ -184,9 +195,11 @@ CVAPTGenericPathAudioRenderer::CVAPTGenericPathAudioRenderer( const CVAAudioRend
ctxAudio.m_iStatus = 0; // Stopped
m_iCurGlobalAuralizationMode = IVAInterface::VA_AURAMODE_DEFAULT;
m_sfTempBuffer.Init( oParams.pCore->GetCoreConfig()->oAudioDriverConfig.iBuffersize, true );
}
CVAPTGenericPathAudioRenderer::~CVAPTGenericPathAudioRenderer()
CVAPTGenericPathAudioRenderer::~CVAPTGenericPathAudioRenderer()
{
delete m_pSoundPathPool;
delete m_pUpdateMessagePool;
......@@ -200,25 +213,19 @@ void CVAPTGenericPathAudioRenderer::Init( const CVAStruct& oArgs )
conf.OptInteger( "IRFilterLengthSamples", m_iIRFilterLengthSamples, 1024 );
conf.OptInteger( "FilterDelaySamples", m_iFilterDelaySamples, 0 );
if( m_iIRFilterLengthSamples < 0 )
ITA_EXCEPT1( INVALID_PARAMETER, "IR filter size must be positive" );
if( m_iFilterDelaySamples >= m_iIRFilterLengthSamples )
ITA_EXCEPT1( INVALID_PARAMETER, "IR filter delay samples must be smaller than IR filter length" );
conf.OptBool( "OutputMonitoring", m_bOutputMonitoring, false );
return;
}
void CVAPTGenericPathAudioRenderer::Reset()
void CVAPTGenericPathAudioRenderer::Reset()
{
ctxAudio.m_iResetFlag = 1; // Request reset
if( ctxAudio.m_iStatus == 0 )
if( ctxAudio.m_iStatus == 0 || m_oParams.bOfflineRendering )
{
// if no streaming active, reset manually
//SyncInternalData();
......@@ -230,13 +237,13 @@ void CVAPTGenericPathAudioRenderer::Reset()
{
VASleep( 100 ); // Wait for acknowledge
}
// Iterate over sound pathes and free items
std::list< CVAPTGenericSoundPath* >::iterator it = m_lSoundPaths.begin();
while( it != m_lSoundPaths.end() )
{
CVAPTGenericSoundPath* pPath = *it;
int iNumRefs = pPath->GetNumReferences();
assert( iNumRefs == 1 );
pPath->RemoveReference();
......@@ -316,12 +323,12 @@ ITADatasource* CVAPTGenericPathAudioRenderer::GetOutputDatasource()
}
void CVAPTGenericPathAudioRenderer::ManageSoundPaths( const CVASceneState* pCurScene,
const CVASceneState* pNewScene,
const CVASceneStateDiff* pDiff )
const CVASceneState* pNewScene,
const CVASceneStateDiff* pDiff )
{
// Iterate over current paths and mark deleted (will be removed within internal sync of audio context thread)
std::list< CVAPTGenericSoundPath* >::iterator itp = m_lSoundPaths.begin();
while( itp != m_lSoundPaths.end() )
while( itp != m_lSoundPaths.end() )
{
CVAPTGenericSoundPath* pPath( *itp );
int iSourceID = pPath->pSource->pData->iID;
......@@ -403,12 +410,12 @@ void CVAPTGenericPathAudioRenderer::ManageSoundPaths( const CVASceneState* pCurS
while( citr != pDiff->viNewReceiverIDs.end() )
{
int iListenerID = ( *citr++ );
CVAPTGPListener* pListener<