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
......
......@@ -120,9 +120,9 @@ private:
int m_iIRFilterLengthSamples; //!< Length of the HRIR filter DSP module
int m_iNumChannels; //!< Number of channels per sound path
int m_iFilterDelaySamples; //!< Filter delay in samples
bool m_bOutputMonitoring; //!< Shows output infos / warnings if the overall listener output is zero (no filter loaded)
ITADatasourceRealization* m_pOutput;
ITASampleBuffer m_sfTempBuffer;
class CVAPTGPUpdateMessage : public CVAPoolObject
{
......@@ -179,6 +179,7 @@ private:
void UpdateGenericSoundPath( int iListenerID, int iSourceID, int iChannel, const std::string& sIRFilePath );
void UpdateGenericSoundPath( int iListenerID, int iSourceID, ITASampleFrame& sfIR );
void UpdateGenericSoundPath( int iListenerID, int iSourceID, int iChannel, ITASampleBuffer& sbIR );
void UpdateGenericSoundPath( const int iListenerID, const int iSourceID, const double dDelaySeconds );
friend class CVAPTGenericSoundPath;
friend class CVAPTGPListenerPoolFactory;
......
......@@ -405,7 +405,7 @@ void CVAPTHearingAidRenderer::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();
......
......@@ -39,6 +39,7 @@ public:
bool bRecordOutputEnabled; //!< Renderer output recording and storing flag
std::string sRecordOutputFilePath; //!< Renderer output recording and storing file path
bool bOutputLevelMeterEnabled; //!< Renderer output level meter will be used (uses a little bit CPU resources)
bool bOfflineRendering; //!< Offline rendering indicator (using a virtual audio device and external trigger)
};
//! Audio renderer interface
......
......@@ -49,8 +49,8 @@
#ifdef VACORE_WITH_AUDIO_BACKEND_PORTAUDIO
#include "Drivers/Audio/VAPortaudioBackend.h"
#endif
#ifdef VACORE_WITH_AUDIO_BACKEND_DUMMY
#include "Drivers/Audio/VADummyAudioDriverBackend.h"
#ifdef VACORE_WITH_AUDIO_BACKEND_VIRTUAL
#include "Drivers/Audio/VAVirtualAudioDriverBackend.h"
#endif
// ITA includes
......@@ -494,6 +494,7 @@ void CVACoreImpl::Initialize() {
SetProgress( "Setting up resource managers", "", 2 );
assert( m_oCoreConfig.oAudioDriverConfig.iInputChannels >= 0 );
m_pSignalSourceManager = new CVAAudioSignalSourceManager( this, m_oCoreConfig.oAudioDriverConfig, pInputTail );
m_pGlobalSamplePool = ITASoundSamplePool::Create( 1, m_oCoreConfig.oAudioDriverConfig.dSampleRate );
m_pGlobalSampler = ITASoundSampler::Create( 1, m_oCoreConfig.oAudioDriverConfig.dSampleRate, m_oCoreConfig.oAudioDriverConfig.iBuffersize, m_pGlobalSamplePool );
......@@ -761,7 +762,8 @@ void CVACoreImpl::Finalize()
VA_TRY
{
// Mehrfaches Finialisieren fhrt nicht zu Fehlern
if( m_iState == VA_CORESTATE_CREATED ) return;
if( m_iState == VA_CORESTATE_CREATED )
return;
if( m_iState == VA_CORESTATE_FAIL )
VA_EXCEPT2( MODAL_ERROR, "Core corrupted, finalization impossible" );
......@@ -4327,17 +4329,32 @@ void CVACoreImpl::InitializeAudioDriver()
if( m_oCoreConfig.oAudioDriverConfig.sDriver == "Portaudio" )
m_pAudioDriverBackend = new CVAPortaudioBackend( &m_oCoreConfig.oAudioDriverConfig );
#endif
#ifdef VACORE_WITH_AUDIO_BACKEND_DUMMY
if( m_oCoreConfig.oAudioDriverConfig.sDriver == "Dummy" )
#ifdef VACORE_WITH_AUDIO_BACKEND_VIRTUAL
if( m_oCoreConfig.oAudioDriverConfig.sDriver == "Virtual" )
{
CVADummyAudioDriverBackend* pAudioDriverBackend = new CVADummyAudioDriverBackend( &m_oCoreConfig.oAudioDriverConfig );
if( m_oCoreConfig.oAudioDriverConfig.iBuffersize == -1 )
VA_EXCEPT2( INVALID_PARAMETER, "For a virtual audio device, the buffer size has to be set (AUTO detect not possible)" );
if( m_oCoreConfig.oAudioDriverConfig.iOutputChannels == -1 )
VA_EXCEPT2( INVALID_PARAMETER, "For a virtual audio device, the output channel number has to be set (AUTO detect not possible)" );
m_oCoreConfig.oAudioDriverConfig.iInputChannels = 0; // not allowed, override
CVAVirtualAudioDriverBackend* pAudioDriverBackend = new CVAVirtualAudioDriverBackend( &m_oCoreConfig.oAudioDriverConfig );
RegisterModule( pAudioDriverBackend );
m_pAudioDriverBackend = pAudioDriverBackend;
// Overwride default block pointer by manual clock
CVAVirtualAudioDriverBackend::ManualClock* pManualClock = new CVAVirtualAudioDriverBackend::ManualClock();
RegisterModule( pManualClock );
m_pClock = pManualClock;
}
#else
#endif
if( m_pAudioDriverBackend == nullptr )
VA_ERROR( "Core", "Unkown or unsupported audio driver backend '" << m_oCoreConfig.oAudioDriverConfig.sDriver << "'" );
VA_EXCEPT2( INVALID_PARAMETER, "Unkown, uninitializable or unsupported audio driver backend '" + m_oCoreConfig.oAudioDriverConfig.sDriver + "'" );
try
{
......@@ -4445,6 +4462,7 @@ void CVACoreImpl::InitializeAudioRenderers()
oParams.sClass = sClass;
oParams.pCore = this;
oParams.pConfig = &cit->second.GetStruct();
oParams.bOfflineRendering = ( m_oCoreConfig.oAudioDriverConfig.sDriver == "Virtual" ) ? true : false;
conf.ReqStringListRegex( "Reproductions", oParams.vsReproductions, "\\s*,\\s*" );
std::unique( oParams.vsReproductions.begin(), oParams.vsReproductions.end() );
......
......@@ -61,4 +61,14 @@ vista_configure_app( NetworkStreamAudioSignalSourceTest )
vista_install( NetworkStreamAudioSignalSourceTest )
vista_create_default_info_file( NetworkStreamAudioSignalSourceTest )
set_property( TARGET NetworkStreamAudioSignalSourceTest PROPERTY FOLDER "VA/Tests/VABase" )
set_property( TARGET NetworkStreamAudioSignalSourceTest PROPERTY FOLDER "VA/Tests/VACore" )
add_executable( OfflineSimulationVirtualDeviceTest OfflineSimulationVirtualDeviceTest.cpp )
target_link_libraries( OfflineSimulationVirtualDeviceTest ${VISTA_USE_PACKAGE_LIBRARIES} ${VISTAINTERPROCCOMM_ADDITIONAL_DEPENDENCIES} )
vista_configure_app( OfflineSimulationVirtualDeviceTest )
#vista_install( OfflineSimulationVirtualDeviceTest )
#vista_create_default_info_file( OfflineSimulationVirtualDeviceTest )
set_property( TARGET OfflineSimulationVirtualDeviceTest PROPERTY FOLDER "VA/Tests/VACore" )
......@@ -132,13 +132,13 @@ CVAStruct GetCoreConfig()
CVAStruct oRenderer1;
oRenderer1[ "class" ] = "BinauralFreeField";
oRenderer1[ "outputs" ] = "MyTalkthroughHeadphones";
oRenderer1[ "Reproductions" ] = "MyTalkthroughHeadphones";
oConfig[ "Renderer:BFF_CoreTest" ] = oRenderer1;
CVAStruct oRenderer2;
oRenderer2[ "class" ] = "PrototypeGenericPath";
oRenderer2[ "numchannels" ] = 2;
oRenderer2[ "outputs" ] = "MyTalkthroughHeadphones";
oRenderer2[ "Reproductions" ] = "MyTalkthroughHeadphones";
oConfig[ "Renderer:PTGP_CoreTest" ] = oRenderer2;
return oConfig;
......
#include <VA.h>
#include <VACore.h>
#include <iostream>
#include <VistaBase/VistaTimeUtils.h>
using namespace std;
IVAInterface* pCore = NULL;
const int g_iBlockLength = 128;
const double g_dSampleRate = 44100.0f;
//! Trigger virtual audio device block increment in audio processing thread
/**
* A special prototype call to control the virtual audio device and increment a block
* of the audio processing by user. Produces one more block of audio samples and increments
* the pCore time by user-defined time steps.
*/
void TriggerVirtualAudioDeviceBlockIncrement();
//! Manually update the core clock
/**
* ... used for scene modification time stamps. This lets the user control the
* asynchronous update beaviour independent from the audio processing thread.
*/
void ManualCoreClockUpdate( const double );
void TestOfflineSimulationVirtualAudioDevice()
{
// Load directivity
int iHRTFID = pCore->CreateDirectivityFromFile( "ITA_Artificial_Head_5x5_44kHz_128.v17.ir.daff" );
// Set up scene
int iListenerID = pCore->CreateSoundReceiver( "Listener with HRTF" );
pCore->SetSoundReceiverPosition( iListenerID, VAVec3( 0, 1.7, 0 ) );
pCore->SetActiveSoundReceiver( iListenerID );
pCore->SetSoundReceiverDirectivity( iListenerID, iHRTFID );
int iSourceID = pCore->CreateSoundSource( "Source" );
// Load input data & start playback
string sFileSignalID = pCore->CreateSignalSourceBufferFromFile( "WelcomeToVA.wav" );
pCore->SetSignalSourceBufferPlaybackAction( sFileSignalID, IVAInterface::VA_PLAYBACK_ACTION_PLAY );
pCore->SetSignalSourceBufferLooping( sFileSignalID, true );
pCore->SetSoundSourceSignalSource( iSourceID, sFileSignalID );
// --- Simulation loop using time steps and synchronized scene & audio updates --- //
const int iNumSteps = 3445; // will produce 10 seconds of scene updates & audio processing