VACoreImpl.cpp 141 KB
Newer Older
Jonas Stienen's avatar
Jonas Stienen committed
1
/*
2
 *  --------------------------------------------------------------------------------------------
Jonas Stienen's avatar
Jonas Stienen committed
3
 *
4
5
6
7
8
9
10
11
 *    VVV        VVV A           Virtual Acoustics (VA) | http://www.virtualacoustics.org
 *     VVV      VVV AAA          Licensed under the Apache License, Version 2.0
 *      VVV    VVV   AAA
 *       VVV  VVV     AAA        Copyright 2015-2017
 *        VVVVVV       AAA       Institute of Technical Acoustics (ITA)
 *         VVVV         AAA      RWTH Aachen University
 *
 *  --------------------------------------------------------------------------------------------
Jonas Stienen's avatar
Jonas Stienen committed
12
 */
13

Jonas Stienen's avatar
Jonas Stienen committed
14
15
16
#include "VACoreImpl.h"

// VA base
17
#include <VA.h>
Jonas Stienen's avatar
Jonas Stienen committed
18
19
20
21
22
23
24
25

// VA includes
#include "Audiosignals/VAAudioSignalSourceManager.h"
#include "Audiosignals/VAAudiofileSignalSource.h"
#include "Audiosignals/VAAudiofileSignalSource.h"
#include "Audiosignals/VAEngineSignalSource.h"
#include "Audiosignals/VAMachineSignalSource.h"
#include "Audiosignals/VASequencerSignalSource.h"
26
#include "directivities/VADirectivityManager.h"
Jonas Stienen's avatar
Jonas Stienen committed
27
28
#include "Rendering/VAAudioRenderer.h"
#include "Rendering/VAAudioRendererRegistry.h"
29
30
#include "Reproduction/VAAudioReproduction.h"
#include "Reproduction/VAAudioReproductionRegistry.h"
Jonas Stienen's avatar
Jonas Stienen committed
31
32
33
34
35
36
37
38
39
40
41
42
#include "Scene/VAScene.h"
#include "Scene/VASoundSourceDesc.h"
#include "Scene/VAListenerDesc.h"
#include "Utils/VADebug.h"
#include "Utils/VAUtils.h"
#include "VAAudiostreamTracker.h"
#include "VALog.h"
#include "VACoreEventManager.h"
#include "VACoreFactory.h"
#include "VACoreThread.h"
#include "VASourceListenerMetrics.h"

43
#include "Drivers/Audio/VAAudioDriverBackend.h"
44
#include "Drivers/Audio/VAAudioDriverConfig.h"
45
46
47
48
49
50
51
52

#ifdef VACORE_WITH_AUDIO_BACKEND_ASIO
#include "Drivers/Audio/VAASIOBackend.h"
#endif
#ifdef VACORE_WITH_AUDIO_BACKEND_PORTAUDIO
#include "Drivers/Audio/VAPortaudioBackend.h"
#endif

Jonas Stienen's avatar
Jonas Stienen committed
53
54
55
56
// ITA includes
#include <ITAASCIITable.h>
#include <ITAClock.h>
#include <ITAException.h>
57
#include <ITAFileSystemUtils.h>
Jonas Stienen's avatar
Jonas Stienen committed
58
#include <ITAFunctors.h>
59
#include <ITAStreamDetector.h>
Jonas Stienen's avatar
Jonas Stienen committed
60
61
62
63
#include <ITASoundSample.h>
#include <ITASoundSampler.h>
#include <ITASoundSamplePool.h>
#include <ITAStreamAmplifier.h>
64
#include <ITAStreamPatchBay.h>
Jonas Stienen's avatar
Jonas Stienen committed
65
66
67
68
69
70
71
72
73
74
75
76
#include <ITAStreamProbe.h>
#include <ITAStringUtils.h>

// Vista includes
#include <VistaTools/VistaFileSystemFile.h>
#include <VistaTools/VistaFileSystemDirectory.h>

// 3rdParty includes
#include <DAFF.h>

// STL includes
#include <algorithm>
77
#include <iomanip>
Jonas Stienen's avatar
Jonas Stienen committed
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>

/*

	Informationen
	=-=-=-=-=-=-=

	Thread-safety & locking

	Alle durch die Schnittstelle nach aussen angebotenen Funktionen, werden
	gegen Reentrance grob-granular mittels eines kritischen Bereiches gesperrt.
	Damit sind auch parallele Calls auf unterschiedliche Methoden der Klasse
90
	unterbunden. Sollte dies zu Performance-Problemen fhren, kann ein
Jonas Stienen's avatar
Jonas Stienen committed
91
92
93
94
95
	verfeinerter Locking-Mechanismus entwickelt werden. Zunchst mal aber so.


	TODO: berall sicherstellen, das ITAExceptions zu VAExceptions umgebaut werden!!!

96
	*/
Jonas Stienen's avatar
Jonas Stienen committed
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121


// --= Hilfsmakros =--

// berprfung ob Initialisiert
#define VA_CHECK_INITIALIZED \
{ if (m_iState != VA_CORESTATE_READY) VA_EXCEPT2(MODAL_ERROR, "Core not initialized"); }

// Mutex-Lock welches parallelen Methoden-Mehrfracheintritt (reentrance) im Methoden-Scope verhindert
#define VA_NO_REENTRANCE \
ITACriticalSectionLock oReentranceLock(m_csReentrance)

// Manuelles das Lock gegen parallelen Methoden-Mehrfracheintritt (reentrance) holen
#define VA_LOCK_REENTRANCE \
m_csReentrance.enter()

// Manuelle das Lock gegen parallelen Methoden-Mehrfracheintritt (reentrance) freigeben 
#define VA_UNLOCK_REENTRANCE \
m_csReentrance.leave()

/*

	Sichere Ausnahmebehandlung

	Problem: Intern knnen auch andere Typen von Ausnahmen als
122
123
	CVAException geworfen werden. Nach aussen hin drfen
	aber NUR CVAExceptions geworfen werden (Konsistent)
Jonas Stienen's avatar
Jonas Stienen committed
124
125

	Lsung: TRY-/CATCH-Makros fr abgesicherte Bereiche in allen Methoden
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
	der externen Schnittstelle. Zweistufiger Aufbau.
	1. (innen) Fange alle Exception-Typen und konvertiere sie in CVAExceptions
	2. (aussen) Fange die einzig mgl. CVAExceptions und biete
	gemeinsamen Catch-Weg zur Problemlsung (Aufrumen) an

	try {
	try {
	// Code ...
	} catch (ITAException& e) {
	// Konvertiere zu CVAException
	} catch (VistaExceptionBase& e) {
	// Konvertiere zu CVAException
	} catch (...)
	// Generiere unerwartete CVAException
	}
	} catch (CVAException& e) {
	// Gemeinsames Aufrumen
	}
Jonas Stienen's avatar
Jonas Stienen committed
144
145

	Beispiel:
146
147
148
149
150
151

	VA_TRY {
	// Code ..
	} VA_CATCH {
	// Mach was ...
	}
Jonas Stienen's avatar
Jonas Stienen committed
152
153
154

	Hinweis: Initiale/finale Geschweifte Klammer fehlen, da diese hinter die Makros geschrieben werden

155
	*/
Jonas Stienen's avatar
Jonas Stienen committed
156
157

#define VA_TRY \
158
try { try
Jonas Stienen's avatar
Jonas Stienen committed
159
160

#define VA_CATCH(EXPR) \
161
162
163
164
165
catch( CVAException& e ) { throw e; } \
catch( ITAException& e ) { throw convert2VAException( e ); } \
catch( VistaExceptionBase& e ) { throw convert2VAException( e ); } \
catch( ... ) { throw getDefaultUnexpectedVAException(); } \
} catch( CVAException& EXPR )
Jonas Stienen's avatar
Jonas Stienen committed
166
167

#define VA_FINALLY \
168
169
170
171
172
catch( CVAException& e ) { throw e; } \
catch( ITAException& e ) { throw convert2VAException( e ); } \
catch( VistaExceptionBase& e ) { throw convert2VAException(e); } \
catch( ... ) { throw getDefaultUnexpectedVAException(); } \
} catch( ... )
Jonas Stienen's avatar
Jonas Stienen committed
173
174

#define VA_RETHROW \
175
176
177
178
179
catch( CVAException& e ) { throw e; } \
catch( ITAException& e ) { throw convert2VAException( e ); } \
catch( VistaExceptionBase& e ) { throw convert2VAException( e ); } \
catch( ... ) { throw getDefaultUnexpectedVAException(); } \
} catch( ... ) { throw; }
Jonas Stienen's avatar
Jonas Stienen committed
180
181


182
IVAInterface* VACore::CreateCoreInstance( const CVAStruct& oArgs )
Jonas Stienen's avatar
Jonas Stienen committed
183
{
184
	VA_TRACE( "Config", oArgs );
Jonas Stienen's avatar
Jonas Stienen committed
185
186
187
	return new CVACoreImpl( oArgs );
}

188
189
190
191
192
193
void VACore::StoreCoreConfigToFile( const CVAStruct& oConfig, const std::string& sConfigFilePath )
{
	StoreStructToINIFile( sConfigFilePath, oConfig );
}

CVAStruct VACore::LoadCoreConfigFromFile( const std::string& sConfigFilePath )
194
{
Jonas Stienen's avatar
Jonas Stienen committed
195
196
197
	CVAStruct oFinalCoreConfigStruct, oCurrentConfig;
	std::list< VistaFileSystemFile > voConfigFiles;
	std::vector< VistaFileSystemDirectory > voIncludePaths;
198
	voConfigFiles.push_back( VistaFileSystemFile( sConfigFilePath ) );
Jonas Stienen's avatar
Jonas Stienen committed
199

200
201
	VA_PRINT( "VA working directory: '" << VistaFileSystemDirectory::GetCurrentWorkingDirectory() << "'" );

Jonas Stienen's avatar
Jonas Stienen committed
202
203
204
205
206
207
208
	while( voConfigFiles.empty() == false )
	{
		VistaFileSystemFile oCurrentConfigFile( voConfigFiles.front() );
		voConfigFiles.pop_front();

		if( oCurrentConfigFile.Exists() == false )
		{
209
			for( size_t n = 0; n < voIncludePaths.size(); n++ )
Jonas Stienen's avatar
Jonas Stienen committed
210
			{
211
				std::string sCombinedFilePath = voIncludePaths[ n ].GetName() + PATH_SEPARATOR + oCurrentConfigFile.GetLocalName();
Jonas Stienen's avatar
Jonas Stienen committed
212
213
214
				oCurrentConfigFile.SetName( sCombinedFilePath );
				if( oCurrentConfigFile.Exists() && oCurrentConfigFile.IsFile() )
				{
215
					VA_INFO( "Config", "Including further configuration file '" + oCurrentConfigFile.GetLocalName() +
216
						"' from include path '" + voIncludePaths[ n ].GetName() + "'" );
Jonas Stienen's avatar
Jonas Stienen committed
217
218
219
220
221
222
223
224
225
					break;
				}
			}

			if( !oCurrentConfigFile.Exists() )
			{
				VA_EXCEPT2( FILE_NOT_FOUND, "Configuration file '" + oCurrentConfigFile.GetLocalName() + "' not found, aborting." );
			}
		}
226

227
		VA_VERBOSE( "Config", std::string( "Reading INI file '" ) + oCurrentConfigFile.GetLocalName() + "'" );
228
		LoadStructFromINIFIle( oCurrentConfigFile.GetName(), oCurrentConfig );
229

Jonas Stienen's avatar
Jonas Stienen committed
230
231
232
233
234
235
		if( oCurrentConfig.HasKey( "paths" ) )
		{
			const CVAStruct& oPaths( oCurrentConfig[ "paths" ] );
			CVAStruct::const_iterator it = oPaths.Begin();
			while( it != oPaths.End() )
			{
236
				const CVAStructValue& oIncludePath( ( it++ )->second );
Jonas Stienen's avatar
Jonas Stienen committed
237
238
239
240
241
242
243
244
245
246
247
248
				VistaFileSystemDirectory oNewPathDir( oIncludePath );
				if( oNewPathDir.Exists() && oNewPathDir.IsDirectory() )
					voIncludePaths.push_back( oNewPathDir );
			}
		}

		if( oCurrentConfig.HasKey( "files" ) )
		{
			const CVAStruct& oPaths( oCurrentConfig[ "files" ] );
			CVAStruct::const_iterator it = oPaths.Begin();
			while( it != oPaths.End() )
			{
249
250
				const CVAStructValue& oIncludeFile( ( it++ )->second );

Jonas Stienen's avatar
Jonas Stienen committed
251
252
253
254
255
256
257
258
259
260
				voConfigFiles.push_back( VistaFileSystemFile( oIncludeFile ) );
			}
		}

		oCurrentConfig.RemoveKey( "files" );

		// Merge structs (check for uniqueness)
		oFinalCoreConfigStruct.Merge( oCurrentConfig, true );
	}

261
	return oFinalCoreConfigStruct;
Jonas Stienen's avatar
Jonas Stienen committed
262
263
}

264
#ifdef WIN32
Jonas Stienen's avatar
Jonas Stienen committed
265
266
// Trick um DLL-Pfad zu ermitteln
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
267
#endif
Jonas Stienen's avatar
Jonas Stienen committed
268

269
std::string VACore::GetCoreLibFilePath()
Jonas Stienen's avatar
Jonas Stienen committed
270
{
271
#ifdef WIN32
Jonas Stienen's avatar
Jonas Stienen committed
272
	CHAR pszPath[ MAX_PATH + 1 ] = { 0 };
273
	GetModuleFileNameA( ( HINSTANCE ) &__ImageBase, pszPath, _countof( pszPath ) );
Jonas Stienen's avatar
Jonas Stienen committed
274
	return std::string( pszPath );
275
276
#else
	VA_EXCEPT2( NOT_IMPLEMENTED, "This function is not implemented for your platform. Sorry." );
Jonas Stienen's avatar
Jonas Stienen committed
277
	return "";
278
#endif // WIN32
Jonas Stienen's avatar
Jonas Stienen committed
279
280
}

281
282
283
284
CVACoreImpl::CVACoreImpl( const CVAStruct& oArgs )
	: m_pAudioDriverBackend( nullptr ),
	m_pGlobalSamplePool( nullptr ),
	m_pGlobalSampler( nullptr ),
285
286
287
	m_pSignalSourceManager( nullptr ),
	m_pDirectivityManager( nullptr ),
	m_pSceneManager( nullptr ),
288
	m_pNewSceneState( nullptr ),
Dipl.-Ing. Jonas Stienen's avatar
Dipl.-Ing. Jonas Stienen committed
289
290
291
	m_iCurActiveSoundReceiver( -1 ),
	m_iNewActiveSoundReceiver( -1 ),
	m_iUpdActiveSoundReceiver( -1 ),
292
	m_pEventManager( nullptr ),
293
294
295
296
	m_pCoreThread( nullptr ),
	m_pInputAmp( nullptr ),
	m_pR2RPatchbay( nullptr ),
	m_pOutputPatchbay( nullptr ),
297
298
	m_pInputStreamDetector( nullptr ),
	m_pOutputStreamDetector( nullptr ),
299
300
301
302
303
304
305
306
307
308
309
	m_pOutputTracker( nullptr ),
	m_pStreamProbeDeviceInput( nullptr ),
	m_pStreamProbeFinal( nullptr ),
	m_pCurSceneState( nullptr ),
	m_pClock( ITAClock::getDefaultClock() ),
	m_pTicker( NULL ),
	m_lSyncModOwner( -1 ),
	m_lSyncModSpinCount( 0 ),
	m_iState( VA_CORESTATE_CREATED ),

	// TODO: Welche Default-Wert mssen erst in Initialize gesetzt werden?
310
	m_iGlobalAuralizationMode( IVAInterface::VA_AURAMODE_ALL ),
311
312
313
314
315
316
	m_dOutputGain( 1 ), m_dInputGain( 1 ),
	m_bOutputMuted( false ), m_bInputMuted( false ),
	m_dStreamClockOffset( 0 ), m_fCoreClockOffset( 0 ),

	// --= Profiling =--
	m_pmCoreThreadLoopTotalDuration( "Core thread loop" )
Jonas Stienen's avatar
Jonas Stienen committed
317
318
319
{
	VA_NO_REENTRANCE;

320
321
322
323
	VA_TRY
	{
		// read configuration
		m_oCoreConfig.Init( oArgs );
Jonas Stienen's avatar
Jonas Stienen committed
324

325
		// register core itself as a module
Jonas Stienen's avatar
Jonas Stienen committed
326
327
		SetObjectName( "VACore" );
		m_oModules.RegisterObject( this );
328
		VA_VERBOSE( "Core", "Registered core module with name '" << GetObjectName() << "'" );
Jonas Stienen's avatar
Jonas Stienen committed
329
330
331

		// Der Event-Manager muss immer verfgbar sein,
		// unabhnging davon ob der Core initialisiert wurde oder nicht.
332
		m_pEventManager = new CVACoreEventManager;
333

Jonas Stienen's avatar
Jonas Stienen committed
334
335
		m_iState = VA_CORESTATE_CREATED;

336
		VA_TRACE( "Core", "CVACoreImpl instance created [" << this << "]" );
Jonas Stienen's avatar
Jonas Stienen committed
337

338
339
	}
	VA_RETHROW;
Jonas Stienen's avatar
Jonas Stienen committed
340
341
}

342
343
CVACoreImpl::~CVACoreImpl()
{
Jonas Stienen's avatar
Jonas Stienen committed
344
345
346
	VA_NO_REENTRANCE;

	// Implizit finalisieren, falls dies nicht durch den Benutzer geschah
347
348
349
350
	if( m_iState == VA_CORESTATE_READY )
	{
		VA_TRY
		{
Jonas Stienen's avatar
Jonas Stienen committed
351
			Finalize();
352
		}
353
			VA_FINALLY
354
		{
Jonas Stienen's avatar
Jonas Stienen committed
355
356
357
358
359
			// Fehler beim Finalisieren ignorieren
		};
	}

	// Nachricht senden [blocking], das die Kerninstanz gelscht wird.
360
361
	CVAEvent ev;
	ev.iEventType = CVAEvent::VA_EVENT_DESTROY;
Jonas Stienen's avatar
Jonas Stienen committed
362
	ev.pSender = this;
363
	m_pEventManager->BroadcastEvent( ev );
Jonas Stienen's avatar
Jonas Stienen committed
364
365
366
367
368

	// Module deregistrieren
	m_oModules.Clear();

	// Nachrichten-Manager freigeben
369
370
	VA_TRY
	{
371
		delete m_pEventManager;
372
373
	}
	VA_RETHROW;
Jonas Stienen's avatar
Jonas Stienen committed
374

375
	VA_TRACE( "Core", "CVACoreImpl instance deleted [" << this << "]" );
Jonas Stienen's avatar
Jonas Stienen committed
376
377

	// Profiling ausgeben
378
	VA_VERBOSE( "Core", m_pmCoreThreadLoopTotalDuration.ToString() );
Jonas Stienen's avatar
Jonas Stienen committed
379
380
}

381
void CVACoreImpl::SetOutputStream( std::ostream* posDebug )
382
{
383
384
	VALog_setOutputStream( posDebug );
	VALog_setErrorStream( posDebug );
Jonas Stienen's avatar
Jonas Stienen committed
385
386
}

387
void CVACoreImpl::GetVersionInfo( CVAVersionInfo* pVersionInfo ) const
Jonas Stienen's avatar
Jonas Stienen committed
388
389
390
391
392
{
	if( !pVersionInfo )
		return;

	std::stringstream ss;
393
	ss << VACORE_VERSION_MAJOR << "." << VACORE_VERSION_MINOR;
Jonas Stienen's avatar
Jonas Stienen committed
394
	pVersionInfo->sVersion = ss.str();
395
396
397
398
	ss.clear();
#ifdef VACORE_CMAKE_DATE
	ss << VACORE_CMAKE_DATE;
#else
399
	ss << "Unkown date";
400
401
#endif
	pVersionInfo->sDate = ss.str();
Jonas Stienen's avatar
Jonas Stienen committed
402
	pVersionInfo->sFlags = "";
403

Jonas Stienen's avatar
Jonas Stienen committed
404
#ifdef DEBUG
405
	pVersionInfo->sComments = "debug";
Jonas Stienen's avatar
Jonas Stienen committed
406
#else
407
	pVersionInfo->sComments = "release";
Jonas Stienen's avatar
Jonas Stienen committed
408
409
410
#endif
}

411
412
void CVACoreImpl::AttachEventHandler( IVAEventHandler* pCoreEventHandler )
{
Jonas Stienen's avatar
Jonas Stienen committed
413
414
415
	VA_TRY
	{
		// Immer mglich. Unabhngig vom Zustand. Thread-safety wird im Manager geregelt.
416
		m_pEventManager->AttachHandler( pCoreEventHandler );
417
418
	}
	VA_RETHROW;
Jonas Stienen's avatar
Jonas Stienen committed
419
420
}

421
422
423
424
void CVACoreImpl::DetachEventHandler( IVAEventHandler* pCoreEventHandler )
{
	VA_TRY
	{
Jonas Stienen's avatar
Jonas Stienen committed
425
		// Immer mglich. Unabhngig vom Zustand. Thread-safety wird im Manager geregelt.
426
		m_pEventManager->DetachHandler( pCoreEventHandler );
427
428
	}
	VA_RETHROW;
Jonas Stienen's avatar
Jonas Stienen committed
429
430
}

431
432
433
int CVACoreImpl::GetState() const
{
	VA_VERBOSE( "Core", "Core state requested, current state is " << m_iState );
Jonas Stienen's avatar
Jonas Stienen committed
434
435
436
437
438
439
440
441
	return m_iState;
}

void CVACoreImpl::Initialize() {
	VA_NO_REENTRANCE;

	// TODO: Prfen ob im Fehlerfall zurck in den sauberen Grundzustand [WICHTIG!]

442
	VA_VERBOSE( "Core", "Initializing core" );
Jonas Stienen's avatar
Jonas Stienen committed
443

444
445
	VA_TRY
	{
446
447
		if( m_iState == VA_CORESTATE_READY )
		VA_EXCEPT2( MODAL_ERROR, "Core already initialized." );
Jonas Stienen's avatar
Jonas Stienen committed
448

449
450
		if( m_iState == VA_CORESTATE_FAIL )
			VA_EXCEPT2( MODAL_ERROR, "Core corrupted, reinitialization impossible" );
Jonas Stienen's avatar
Jonas Stienen committed
451

452
		m_pCoreThread = new CVACoreThread( this );
Jonas Stienen's avatar
Jonas Stienen committed
453

454
		SetProgress( "Setting up audio hardware", "", 1 );
Jonas Stienen's avatar
Jonas Stienen committed
455
456
		InitializeAudioDriver();

457
		m_pR2RPatchbay = new ITAStreamPatchbay( m_oCoreConfig.oAudioDriverConfig.dSampleRate, m_oCoreConfig.oAudioDriverConfig.iBuffersize );
Jonas Stienen's avatar
Jonas Stienen committed
458
459

		// Create output patch bay with a single output that uses all available physical audio outputs from sound card
460
		m_pOutputPatchbay = new ITAStreamPatchbay( m_oCoreConfig.oAudioDriverConfig.dSampleRate, m_oCoreConfig.oAudioDriverConfig.iBuffersize );
Jonas Stienen's avatar
Jonas Stienen committed
461
462
463
464
465
		int iPhysicalHardwareOutput = m_pOutputPatchbay->AddOutput( m_oCoreConfig.oAudioDriverConfig.iOutputChannels );
		m_pOutputPatchbay->SetOutputGain( iPhysicalHardwareOutput, m_dOutputGain );

		m_iGlobalAuralizationMode = VA_AURAMODE_ALL;

466
		// Set up input stream network
Jonas Stienen's avatar
Jonas Stienen committed
467
		ITADatasource* pInputTail = nullptr;
468
469
		if( m_oCoreConfig.oAudioDriverConfig.iInputChannels > 0 )
		{
Jonas Stienen's avatar
Jonas Stienen committed
470
			pInputTail = m_pAudioDriverBackend->getInputStreamDatasource();
471
472
			if( pInputTail )
			{
473
				m_pInputAmp = new ITAStreamAmplifier( pInputTail, ( float ) m_dInputGain );
474
475
				m_pInputStreamDetector = new ITAStreamDetector( m_pInputAmp );
				pInputTail = m_pInputStreamDetector;
Jonas Stienen's avatar
Jonas Stienen committed
476

477
478
479
480
481
				if( m_oCoreConfig.bRecordDeviceInputEnabled )
				{
					m_pStreamProbeDeviceInput = new ITAStreamProbe( pInputTail, m_oCoreConfig.sRecordDeviceInputFilePath );
					pInputTail = m_pStreamProbeDeviceInput;
				}
Jonas Stienen's avatar
Jonas Stienen committed
482
483
484
			}
		}

485
		SetProgress( "Setting up resource managers", "", 2 );
Jonas Stienen's avatar
Jonas Stienen committed
486

487
		m_pSignalSourceManager = new CVAAudioSignalSourceManager( this, m_oCoreConfig.oAudioDriverConfig, pInputTail );
488
489
		m_pGlobalSamplePool = ITASoundSamplePool::Create( 1, m_oCoreConfig.oAudioDriverConfig.dSampleRate );
		m_pGlobalSampler = ITASoundSampler::Create( 1, m_oCoreConfig.oAudioDriverConfig.dSampleRate, m_oCoreConfig.oAudioDriverConfig.iBuffersize, m_pGlobalSamplePool );
Jonas Stienen's avatar
Jonas Stienen committed
490
		m_pGlobalSampler->AddMonoTrack();
491

492
493
		m_pDirectivityManager = new CVADirectivityManager( this, m_oCoreConfig.oAudioDriverConfig.dSampleRate );
		m_pDirectivityManager->Initialize();
Jonas Stienen's avatar
Jonas Stienen committed
494

495

496
		SetProgress( "Setting up scene management", "", 3 );
Jonas Stienen's avatar
Jonas Stienen committed
497

498
499
500
		m_pSceneManager = new CVASceneManager( m_pClock );
		m_pSceneManager->Initialize();
		m_pCurSceneState = m_pSceneManager->GetHeadSceneState();
501

502
503
504
505
506
507
508
		SetProgress( "Setting up medium environment", "", 4 );

		oHomogeneousMedium = m_oCoreConfig.oInitialHomogeneousMedium;


		SetProgress( "Initializing rendering modules", "", 5 );

509
		// Register all renderers and initialize
510
		CVAAudioRendererRegistry::GetInstance()->RegisterInternalCoreFactoryMethods();
Jonas Stienen's avatar
Jonas Stienen committed
511
512
		InitializeAudioRenderers();

513
		if( m_voRenderers.empty() )
Jonas Stienen's avatar
Jonas Stienen committed
514
515
			VA_EXCEPT1( "No audio renderers created" );

516

517
		SetProgress( "Initializing reproduction modules", "", 6 );
518

519
		// Register all reproductions and initialize
520
		CVAAudioReproductionRegistry::GetInstance()->RegisterInternalCoreFactoryMethods();
Jonas Stienen's avatar
Jonas Stienen committed
521
522
		InitializeReproductionModules();

523
		if( m_voReproductionModules.empty() )
Jonas Stienen's avatar
Jonas Stienen committed
524
			VA_EXCEPT1( "No audio reproduction modules created" );
525

526
527
528

		SetProgress( "Patching audio i/o of rendering and reproduction modules", "", 7 );

Jonas Stienen's avatar
Jonas Stienen committed
529
530
531
532
533
534
535
536
		// Patch renderer and reproduction modules
		PatchRendererToReproductionModules();

		// Patch audio reproduction to output
		PatchReproductionModulesToOutput();


		// Create output peak detector that uses patch bay output stream
537
		m_pOutputStreamDetector = new ITAStreamDetector( m_pOutputPatchbay->GetOutputDatasource( iPhysicalHardwareOutput ) );
538

Jonas Stienen's avatar
Jonas Stienen committed
539
		// Setup output dump (if set)
540
		ITADatasource* pOutputTail = m_pOutputStreamDetector;
541
		if( m_oCoreConfig.bRecordDeviceOutputEnabled )
Jonas Stienen's avatar
Jonas Stienen committed
542
		{
543
			m_pStreamProbeFinal = new ITAStreamProbe( pOutputTail, m_oCoreConfig.sRecordFinalOutputFilePath );
Jonas Stienen's avatar
Jonas Stienen committed
544
545
546
547
			pOutputTail = m_pStreamProbeFinal;
		}

		// Attach the stream tracker
548
		m_pOutputTracker = new CVAAudiostreamTracker( pOutputTail, m_pClock, &m_fCoreClockOffset, &m_lSyncModOwner, m_pSignalSourceManager );
Jonas Stienen's avatar
Jonas Stienen committed
549
550
551
552
553
554
555
		pOutputTail = m_pOutputTracker;

		// Give output stream datasource to audio driver
		m_pAudioDriverBackend->setOutputStreamDatasource( pOutputTail );

		// Core-Clock auf 0 initialisieren
		double dNow = m_pClock->getTime();
556
		m_fCoreClockOffset = ( float ) dNow;
Jonas Stienen's avatar
Jonas Stienen committed
557
558
559
		m_dStreamClockOffset = -1;

		// Timer erzeugen und konfigurieren (wird fr Peak-Events benutzt)
560
		m_pTicker = new VistaTicker();
561
		m_pTicker->AddTrigger( new VistaTicker::TriggerContext( m_oCoreConfig.iTriggerUpdateMilliseconds, true ) );
562
		m_pTicker->SetAfterPulseFunctor( this );
Jonas Stienen's avatar
Jonas Stienen committed
563
564

		// Audio-Streaming starten
565
		SetProgress( "Starting audio streaming", "", 8 );
Jonas Stienen's avatar
Jonas Stienen committed
566
567
568
		m_pAudioDriverBackend->startStreaming();

		// Timer fr Peak-Events starten
569
		m_pTicker->StartTicker();
Jonas Stienen's avatar
Jonas Stienen committed
570
571
572
573

		// Initialisierung erfolgreich!
		m_iState = VA_CORESTATE_READY;

574
		SetProgress( "Initialization finished", "", 9 );
Jonas Stienen's avatar
Jonas Stienen committed
575
576
		FinishProgress();

Dipl.-Ing. Jonas Stienen's avatar
Dipl.-Ing. Jonas Stienen committed
577
	}
578
		VA_FINALLY
Dipl.-Ing. Jonas Stienen's avatar
Dipl.-Ing. Jonas Stienen committed
579
	{
Jonas Stienen's avatar
Jonas Stienen committed
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
		// Aufrumen und Exception weiterwerfen
		Tidyup();
		throw;
	}
}

void CVACoreImpl::Reset()
{
	VA_CHECK_INITIALIZED;

	// Wait for core thread
	while( !m_pCoreThread->TryBreak() )
		VASleep( 20 );

	VA_NO_REENTRANCE;

596
	if( GetUpdateLocked() )
Jonas Stienen's avatar
Jonas Stienen committed
597
	{
598
		VA_WARN( "Core", "Encountered locked scene during reset. Please unlock before resetting, skipping." );
Jonas Stienen's avatar
Jonas Stienen committed
599
600
601
602
603
		m_pCoreThread->Continue();
	}

	VA_TRY
	{
604
		VA_INFO( "Core", "Resetting core" );
Jonas Stienen's avatar
Jonas Stienen committed
605
606

		// Reset audio renderers
607
608
		std::vector< CVAAudioRendererDesc >::iterator it = m_voRenderers.begin();
		while( it != m_voRenderers.end() )
Jonas Stienen's avatar
Jonas Stienen committed
609
610
611
612
		{
			CVAAudioRendererDesc& oRend( *it++ );
			oRend.pInstance->Reset();
		}
613

Jonas Stienen's avatar
Jonas Stienen committed
614
615
616
		if( m_pCurSceneState )
		{
			// Referenz entfernen welche in CoreThreadLoop hinzugefgt wurde
617
			m_pCurSceneState->RemoveReference();
Jonas Stienen's avatar
Jonas Stienen committed
618
619
620
621
			m_pCurSceneState = nullptr;
		}

		// Alle Szenenobjekte lschen
622
623
624
		m_pSceneManager->Reset();
		m_pSignalSourceManager->Reset();
		m_pDirectivityManager->Reset();
Jonas Stienen's avatar
Jonas Stienen committed
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640

		// TODO: Check if the pool and sampler must really be recreated
		/*
		delete m_pGlobalSamplePool;
		m_pGlobalSamplePool = nullptr;
		m_pGlobalSamplePool = ITASoundSamplePool::Create(1, m_oCoreConfig.oAudioDriverConfig.dSamplerate);

		// This causes a crash in patch bay
		delete m_pGlobalSampler;
		m_pGlobalSampler = nullptr;
		m_pGlobalSampler = ITASoundSampler::Create(1, m_oCoreConfig.oAudioDriverConfig.dSamplerate, m_oCoreConfig.oAudioDriverConfig.iBuffersize, m_pGlobalSamplePool);
		m_pGlobalSampler->AddMonoTrack();
		*/
		//m_pGlobalSampler->RemoveAllPlaybacks();

		// Werte neusetzen
641
		m_pCurSceneState = m_pSceneManager->GetHeadSceneState();
Dipl.-Ing. Jonas Stienen's avatar
Dipl.-Ing. Jonas Stienen committed
642
643
		m_iCurActiveSoundReceiver = -1;
		m_iNewActiveSoundReceiver = -1;
Jonas Stienen's avatar
Jonas Stienen committed
644
645
646
647
648
649
650

		m_pCoreThread;

		// Core-Thread fortsetzen
		m_pCoreThread->Continue();

		// Ereignis generieren, wenn Operation erfolgreich
651
652
		CVAEvent ev;
		ev.iEventType = CVAEvent::VA_EVENT_RESET;
Jonas Stienen's avatar
Jonas Stienen committed
653
		ev.pSender = this;
654
		m_pEventManager->BroadcastEvent( ev );
Jonas Stienen's avatar
Jonas Stienen committed
655
656

	}
657
		VA_FINALLY
Jonas Stienen's avatar
Jonas Stienen committed
658
659
660
661
662
663
664
665
	{
		Tidyup();
		throw;
	}
}

void CVACoreImpl::Tidyup() {
	/*
666
	 *  Hinweis: Diese Hilfsmethode wird nur innerhalb des Reentrance-Locks
Jonas Stienen's avatar
Jonas Stienen committed
667
668
	 *           aufgerufen - daher keine weiter Absicherung ntig.
	 */
669

Jonas Stienen's avatar
Jonas Stienen committed
670
671
	VA_TRY
	{
672
673
674
675
676
		if( m_pTicker )
		{
			m_pTicker->StopTicker();
			m_pTicker->SetAfterPulseFunctor( NULL );
		}
Jonas Stienen's avatar
Jonas Stienen committed
677
678

		FinalizeAudioDriver();
679
680
		FinalizeRenderingModules();
		FinalizeReproductionModules();
Jonas Stienen's avatar
Jonas Stienen committed
681

682
683
		delete m_pTicker;
		m_pTicker = nullptr;
Jonas Stienen's avatar
Jonas Stienen committed
684
685
686
687
688
689
690

		delete m_pCoreThread;
		m_pCoreThread = nullptr;

		delete m_pInputAmp;
		m_pInputAmp = nullptr;

691
692
		delete m_pInputStreamDetector;
		m_pInputStreamDetector = nullptr;
Jonas Stienen's avatar
Jonas Stienen committed
693
694
695
696
697
698
699

		delete m_pR2RPatchbay;
		m_pR2RPatchbay = nullptr;

		delete m_pOutputPatchbay;
		m_pOutputPatchbay = nullptr;

700
701
		delete m_pOutputStreamDetector;
		m_pOutputStreamDetector = nullptr;
Jonas Stienen's avatar
Jonas Stienen committed
702
703
704

		delete m_pOutputTracker;
		m_pOutputTracker = nullptr;
705

Jonas Stienen's avatar
Jonas Stienen committed
706
707
708
709
710
711
		delete m_pStreamProbeDeviceInput;
		m_pStreamProbeDeviceInput = nullptr;

		delete m_pStreamProbeFinal;
		m_pStreamProbeFinal = nullptr;

712
713
		delete m_pSignalSourceManager;
		m_pSignalSourceManager = nullptr;
Jonas Stienen's avatar
Jonas Stienen committed
714
715
716
717
718
719
720

		delete m_pGlobalSampler;
		m_pGlobalSampler = nullptr;

		delete m_pGlobalSamplePool;
		m_pGlobalSamplePool = nullptr;

721
722
723
724
		if( m_pDirectivityManager )
			m_pDirectivityManager->Finalize();
		delete m_pDirectivityManager;
		m_pDirectivityManager = nullptr;
Jonas Stienen's avatar
Jonas Stienen committed
725
726


727
728
729
730
		if( m_pSceneManager )
			m_pSceneManager->Finalize();
		delete m_pSceneManager;
		m_pSceneManager = nullptr;
Jonas Stienen's avatar
Jonas Stienen committed
731
732
733
734

		m_iState = VA_CORESTATE_CREATED;

	}
735
		VA_FINALLY
Jonas Stienen's avatar
Jonas Stienen committed
736
737
738
739
740
	{
		m_iState = VA_CORESTATE_FAIL;
	}
}

741
742
void CVACoreImpl::Finalize()
{
Jonas Stienen's avatar
Jonas Stienen committed
743
744
745
	VA_NO_REENTRANCE;

	//VA_TRACE("Core", __FUNCTION__ << " entry");
746
	VA_INFO( "Core", "Finalizing core" );
Jonas Stienen's avatar
Jonas Stienen committed
747

748
749
	VA_TRY
	{
Jonas Stienen's avatar
Jonas Stienen committed
750
		// Mehrfaches Finialisieren fhrt nicht zu Fehlern
751
752
753
754
		if( m_iState == VA_CORESTATE_CREATED ) return;

		if( m_iState == VA_CORESTATE_FAIL )
			VA_EXCEPT2( MODAL_ERROR, "Core corrupted, finalization impossible" );
Jonas Stienen's avatar
Jonas Stienen committed
755
756
757
758
759
760
761
762

		// Core-Thread anhalten (wenn frei ist)
		while( !m_pCoreThread->TryBreak() )
			VASleep( 10 );
		//m_pCoreThread->Break(); << deadlock

		// Alle Filterketten lschen und warten bis Zustand sicher bernommen
		// Wichtig: Dies muss vor dem Beenden des Streamings geschehen
763

Jonas Stienen's avatar
Jonas Stienen committed
764
		// Reset audio renderers
765
		for( std::vector<CVAAudioRendererDesc>::iterator it = m_voRenderers.begin(); it != m_voRenderers.end(); ++it )
Jonas Stienen's avatar
Jonas Stienen committed
766
767
768
			it->pInstance->Reset();

		// Peak-Nachrichten stoppen
769
		m_pTicker->StopTicker();
Jonas Stienen's avatar
Jonas Stienen committed
770
771
772
773

		// Audio-Streaming beenden
		m_pAudioDriverBackend->stopStreaming();

774
		InitProgress( "Stopping auralization threads", "", 2 );
Jonas Stienen's avatar
Jonas Stienen committed
775

776
777
778
779
		// Stop and delete ticker
		m_pTicker->SetAfterPulseFunctor( NULL );
		delete m_pTicker;
		m_pTicker = NULL;
Jonas Stienen's avatar
Jonas Stienen committed
780
781
782
783
784

		// Hauptthread beenden und freigeben
		delete m_pCoreThread;
		m_pCoreThread = nullptr;

785
		SetProgress( "Releasing audio hardware", "", 1 );
Jonas Stienen's avatar
Jonas Stienen committed
786
		FinalizeAudioDriver();
787
788
		FinalizeRenderingModules();
		FinalizeReproductionModules();
Jonas Stienen's avatar
Jonas Stienen committed
789

790
		SetProgress( "Cleaning up resources", "", 2 );
Jonas Stienen's avatar
Jonas Stienen committed
791
792
793
		delete m_pInputAmp;
		m_pInputAmp = nullptr;

794
795
		delete m_pInputStreamDetector;
		m_pInputStreamDetector = nullptr;
Jonas Stienen's avatar
Jonas Stienen committed
796

797
		m_voReproductionModules.clear();
Jonas Stienen's avatar
Jonas Stienen committed
798
799
800
801
802
803
804

		delete m_pR2RPatchbay;
		m_pR2RPatchbay = nullptr;

		delete m_pOutputPatchbay;
		m_pOutputPatchbay = nullptr;

805
806
		delete m_pOutputStreamDetector;
		m_pOutputStreamDetector = nullptr;
Jonas Stienen's avatar
Jonas Stienen committed
807
808
809
810
811
812
813
814
815
816

		delete m_pOutputTracker;
		m_pOutputTracker = nullptr;

		delete m_pStreamProbeDeviceInput;
		m_pStreamProbeDeviceInput = nullptr;

		delete m_pStreamProbeFinal;
		m_pStreamProbeFinal = nullptr;

817
818
		delete m_pSignalSourceManager;
		m_pSignalSourceManager = nullptr;
Jonas Stienen's avatar
Jonas Stienen committed
819
820
821
822
823
824
825

		delete m_pGlobalSampler;
		m_pGlobalSampler = nullptr;

		delete m_pGlobalSamplePool;
		m_pGlobalSamplePool = nullptr;

826
827
828
		m_pDirectivityManager->Finalize();
		delete m_pDirectivityManager;
		m_pDirectivityManager = nullptr;
Jonas Stienen's avatar
Jonas Stienen committed
829

830
831
832
		m_pSceneManager->Finalize();
		delete m_pSceneManager;
		m_pSceneManager = nullptr;
Jonas Stienen's avatar
Jonas Stienen committed
833
834
835
836
837
838

		// Finalisierung erfolgreich. Nun wieder im Grundzustand!
		m_iState = VA_CORESTATE_CREATED;

		FinishProgress();

839
840
841
	}
		VA_FINALLY
	{
Jonas Stienen's avatar
Jonas Stienen committed
842
843
844
845
846
847
848
849
850
851
852
853
		// Nochmals versuchen aufzurumen
		Tidyup();

		// Allgemein: Fehler beim Finalisieren? => Core im Sack
		m_iState = VA_CORESTATE_FAIL;

		// VAExceptions unverndert nach aussen leiten
		throw;
	}
}


854
void CVACoreImpl::RegisterModule( CVAObject* pModule )
Jonas Stienen's avatar
Jonas Stienen committed
855
{
856
	m_oModules.RegisterObject( pModule );
Jonas Stienen's avatar
Jonas Stienen committed
857
858
}

859
void CVACoreImpl::GetModules( std::vector< CVAModuleInfo >& viModuleInfos ) const
860
{
Jonas Stienen's avatar
Jonas Stienen committed
861
862
863
	VA_NO_REENTRANCE;
	VA_CHECK_INITIALIZED;

864
#ifdef VACORE_MODULE_INTERFACE_ENABLED
865
866
	VA_TRY
	{
Jonas Stienen's avatar
Jonas Stienen committed
867
		std::vector<CVAObjectInfo> v;
868
		m_oModules.GetObjectInfos( v );
Jonas Stienen's avatar
Jonas Stienen committed
869

870
		VA_PRINT( "Available modules (" << v.size() << ")" );
Jonas Stienen's avatar
Jonas Stienen committed
871
872
873

		viModuleInfos.clear();
		viModuleInfos.resize( v.size() );
874
875
876
877
878
		for( size_t i = 0; i < v.size(); i++ )
		{
			VA_PRINT( "'" << v[ i ].sName << "'\t\t\t" << v[ i ].sDesc );
			viModuleInfos[ i ].sName = v[ i ].sName;
			viModuleInfos[ i ].sDesc = v[ i ].sDesc;
Jonas Stienen's avatar
Jonas Stienen committed
879
		}
880
881
882
	}
	VA_RETHROW;

883
#else // VACORE_MODULE_INTERFACE_ENABLED
884

885
886
	VA_EXCEPT1( "This VACore version does not provide modules" );

887
#endif // VACORE_MODULE_INTERFACE_ENABLED
888

889
}
Jonas Stienen's avatar
Jonas Stienen committed
890

891
CVAStruct CVACoreImpl::CallModule( const std::string& sModuleName, const CVAStruct& oArgs )
892
{
Jonas Stienen's avatar
Jonas Stienen committed
893
894
895
	VA_NO_REENTRANCE;
	VA_CHECK_INITIALIZED;

896
#ifdef VACORE_MODULE_INTERFACE_ENABLED
897
898
899

	VA_TRY
	{
900
		CVAObject* pModule = m_oModules.FindObjectByName( sModuleName );
901
		if( !pModule )
902
		{
903
			VA_EXCEPT2( INVALID_PARAMETER, "Module '" + sModuleName + "' not found" );
904
		}
905
906
907

#ifdef VACORE_MODULE_INTERFACE_MECHANISM_EVENT_BASED

908
909
		CVAEvent ev;
		ev.iEventType = CVAEvent::VA_EVENT_SIGNALSOURCE_STATE_CHANGED;
910
911
912
		ev.pSender = this;
		ev.sObjectID = sModuleName;
		ev;
913
914
		m_pEventManager->BroadcastEvent( ev );
		m_pEventManager->
915
916
917

#else // not VACORE_MODULE_INTERFACE_MECHANISM_EVENT_BASED

918
		return pModule->CallObject( oArgs );
919
920

#endif // VACORE_MODULE_INTERFACE_MECHANISM_EVENT_BASED
Jonas Stienen's avatar
Jonas Stienen committed
921

922
923
	}
	VA_RETHROW;
924

925
#else // VACORE_MODULE_INTERFACE_ENABLED
926

927
#ifdef VACORE_NO_MODULE_INTERFACE_THROW_EXCEPTION
928
	VA_EXCEPT1( "This VACore version does not provide modules" );
929
930
#endif // VACORE_NO_MODULE_INTERFACE_THROW_EXCEPTION

931
#endif // VACORE_MODULE_INTERFACE_ENABLED
932
}
Jonas Stienen's avatar
Jonas Stienen committed
933

934
935
936
937
938
939
940
941
942
943
944
945
CVAStruct CVACoreImpl::GetSearchPaths() const
{
	VA_NO_REENTRANCE;
	VA_CHECK_INITIALIZED;

	CVAStruct oSearchPaths;
	for( size_t i = 0; i < m_oCoreConfig.vsSearchPaths.size(); i++ )
		oSearchPaths[ "path_" + std::to_string( long( i ) ) ] = m_oCoreConfig.vsSearchPaths[ i ];

	return oSearchPaths;
}

946
947
948
949
950
CVAStruct CVACoreImpl::GetCoreConfiguration( const bool bFilterEnabled ) const
{
	VA_NO_REENTRANCE;
	VA_CHECK_INITIALIZED;

951
952
	CVAStruct oCoreConfig;

953
954
955
956
957
	if( bFilterEnabled )
	{
		CVAStruct::const_iterator cit = m_oCoreConfig.GetStruct().Begin();
		while( cit != m_oCoreConfig.GetStruct().End() )
		{
958
959
960
961
			const std::string sKey( cit->first );
			const CVAStructValue& oVal( cit->second );
			++cit;

962
963
964
965
966
967
			if( oVal.IsStruct() )
			{
				const CVAStruct& oSection( oVal.GetStruct() );
				if( oSection.HasKey( "enabled" ) )
					if( bool( oSection[ "enabled" ] ) == false )
						continue; // Only skip if explicitly not enabled
968
				oCoreConfig[ sKey ] = oVal;
969
970
			}
		}
971

972
973
974
	}
	else
	{
975
		oCoreConfig = m_oCoreConfig.GetStruct();
976
	}
977
978

	return oCoreConfig;
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
}

CVAStruct CVACoreImpl::GetHardwareConfiguration() const
{
	VA_NO_REENTRANCE;
	VA_CHECK_INITIALIZED;
	return m_oCoreConfig.oHardwareSetup.GetStruct();
}

CVAStruct CVACoreImpl::GetFileList( const bool bRecursive, const std::string& sFileSuffixFilter ) const
{
	VA_NO_REENTRANCE;
	VA_CHECK_INITIALIZED;

	CVAStruct oFileList;
	for( size_t i = 0; i < m_oCoreConfig.vsSearchPaths.size(); i++ )
	{
		if( bRecursive )
		{
			RecursiveFileList( m_oCoreConfig.vsSearchPaths[ i ], oFileList, sFileSuffixFilter );
		}
		else
		{
			std::vector< std::string > vsFileList;
			FileList( m_oCoreConfig.vsSearchPaths[ i ], vsFileList, sFileSuffixFilter );

			CVAStruct oMoreFiles;
			for( size_t j = 0; j < vsFileList.size(); j++ )
				oMoreFiles[ std::to_string( long( j ) ) ] = vsFileList[ j ];

			oFileList[ m_oCoreConfig.vsSearchPaths[ i ] ] = oMoreFiles;
		}
	}
	return oFileList;
}

1015
int CVACoreImpl::CreateDirectivityFromParameters( const CVAStruct& oParams, const std::string& sName )
Jonas Stienen's avatar
Jonas Stienen committed
1016
1017
1018
1019
1020
1021
{
	VA_NO_REENTRANCE;
	VA_CHECK_INITIALIZED;

	VA_TRY
	{
1022
		int iDirID = m_pDirectivityManager->CreateDirectivity( oParams, sName );
Jonas Stienen's avatar
Jonas Stienen committed
1023

1024
		assert( iDirID != -1 );
Jonas Stienen's avatar
Jonas Stienen committed
1025

1026
1027
1028
1029
		CVAEvent ev;
		ev.iEventType = CVAEvent::VA_EVENT_DIRECTIVITY_LOADED;
		ev.pSender = this;
		ev.iObjectID = iDirID;
1030
		m_pEventManager->BroadcastEvent( ev );
Jonas Stienen's avatar
Jonas Stienen committed
1031

1032
		VA_INFO( "Core", "Directivity successfully loaded, assigned directivity ID " << iDirID );
Jonas Stienen's avatar
Jonas Stienen committed
1033

1034
		return iDirID;
Jonas Stienen's avatar
Jonas Stienen committed
1035
1036
1037
1038

	} VA_RETHROW;
}

1039
1040
bool CVACoreImpl::DeleteDirectivity( const int iDirID )
{
Jonas Stienen's avatar
Jonas Stienen committed
1041
1042
1043
	VA_NO_REENTRANCE;
	VA_CHECK_INITIALIZED;

1044
1045
	VA_TRY
	{
1046
		bool bSuccess = m_pDirectivityManager->DeleteDirectivity( iDirID );
Jonas Stienen's avatar
Jonas Stienen committed
1047
1048
1049
		//assert( bSuccess );

		// Ereignis generieren, wenn Operation erfolgreich
1050
		CVAEvent ev;
1051
		ev.iEventType = CVAEvent::VA_EVENT_DIRECTIVITY_DELETED;
Jonas Stienen's avatar
Jonas Stienen committed
1052
1053
		ev.pSender = this;
		ev.iObjectID = iDirID;
1054
		m_pEventManager->BroadcastEvent( ev );
Jonas Stienen's avatar
Jonas Stienen committed
1055

1056
		VA_INFO( "Core", "FreeDirectivity successful, freed directivity " << iDirID );
Jonas Stienen's avatar
Jonas Stienen committed
1057
1058
1059
1060
1061
1062

		return bSuccess;

	} VA_RETHROW;
}

1063
CVADirectivityInfo CVACoreImpl::GetDirectivityInfo( int iDirID ) const {
Jonas Stienen's avatar
Jonas Stienen committed
1064
1065
1066
	VA_NO_REENTRANCE;
	VA_CHECK_INITIALIZED;

1067
	VA_TRY{
1068
		return m_pDirectivityManager->GetDirectivityInfo( iDirID );
Jonas Stienen's avatar
Jonas Stienen committed
1069
1070
	} VA_RETHROW;
}
1071

1072
1073
void CVACoreImpl::GetDirectivityInfos( std::vector<CVADirectivityInfo>& vdiDest ) const
{
1074
1075
	VA_NO_REENTRANCE;
	VA_CHECK_INITIALIZED;
Jonas Stienen's avatar
Jonas Stienen committed
1076

1077
1078
	VA_TRY
	{
1079
		m_pDirectivityManager->GetDirectivityInfos( vdiDest );
1080
1081
	}
	VA_RETHROW;
Jonas Stienen's avatar
Jonas Stienen committed
1082
1083
}

1084
1085
void CVACoreImpl::SetDirectivityName( const int iID, const std::string& sName )
{
1086
1087
1088
1089
1090
1091
1092
1093
1094
	VA_NO_REENTRANCE;
	VA_CHECK_INITIALIZED;

	VA_TRY
	{
		VA_EXCEPT_NOT_IMPLEMENTED_NEXT_VERSION;
		//m_pDirectivityManager->SetName( iID, sName );
	}
	VA_RETHROW;
1095
1096
1097
1098
}

std::string CVACoreImpl::GetDirectivityName( const int iID ) const
{
1099
1100
1101
1102
1103
1104
1105
1106
1107
	VA_NO_REENTRANCE;
	VA_CHECK_INITIALIZED;

	VA_TRY
	{
		CVADirectivityInfo oInfo = m_pDirectivityManager->GetDirectivityInfo( iID );
		return oInfo.sName;
	}
	VA_RETHROW;
1108
1109
1110
1111
1112
1113
1114
1115
1116
}

void CVACoreImpl::SetDirectivityParameters( const int iID, const CVAStruct& oParams )
{
	VA_NO_REENTRANCE;
	VA_CHECK_INITIALIZED;

	VA_TRY
	{
1117
1118
		VA_EXCEPT_NOT_IMPLEMENTED_NEXT_VERSION;
		//m_pDirectivityManager->SetParameters( iID, oParams );
1119
1120
1121
1122
	}
	VA_RETHROW;
}

1123
CVAStruct CVACoreImpl::GetDirectivityParameters( const int iID, const CVAStruct& ) const
1124
{
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
	VA_NO_REENTRANCE;
	VA_CHECK_INITIALIZED;

	VA_TRY
	{
		CVADirectivityInfo oInfo = m_pDirectivityManager->GetDirectivityInfo( iID );
		return oInfo.oParams;

		// @todo
		//return m_pDirectivityManager->GetDirectivityParameters( iID, oParams );
	}
	VA_RETHROW;
1137
1138
1139
1140
}

int CVACoreImpl::CreateAcousticMaterial( const CVAAcousticMaterial& oMaterial, const std::string& sName )
{
1141
	VA_EXCEPT_NOT_IMPLEMENTED_FUTURE_VERSION;
1142
1143
1144
1145
}

int CVACoreImpl::CreateAcousticMaterialFromParameters( const CVAStruct& oParams, const std::string& sName )
{
1146
	VA_EXCEPT_NOT_IMPLEMENTED_FUTURE_VERSION;
1147
1148
1149
1150
}

bool CVACoreImpl::DeleteAcousticMaterial( const int iID )
{
1151
	VA_EXCEPT_NOT_IMPLEMENTED_FUTURE_VERSION;
1152
1153
1154
1155
}

CVAAcousticMaterial CVACoreImpl::GetAcousticMaterialInfo( const int iID ) const
{
1156
	VA_EXCEPT_NOT_IMPLEMENTED_FUTURE_VERSION;
1157
1158
1159
1160
}

void CVACoreImpl::GetAcousticMaterialInfos( std::vector< CVAAcousticMaterial >& voDest ) const
{
1161
	VA_EXCEPT_NOT_IMPLEMENTED_FUTURE_VERSION;
1162
1163
1164
1165
}

void CVACoreImpl::SetAcousticMaterialName( const int iID, const std::string& sName )
{
1166
	VA_EXCEPT_NOT_IMPLEMENTED_FUTURE_VERSION;
1167
1168
1169
1170
}

std::string CVACoreImpl::GetAcousticMaterialName( const int iID ) const
{
1171
	VA_EXCEPT_NOT_IMPLEMENTED_FUTURE_VERSION;
1172
1173
1174
1175
}

void CVACoreImpl::SetAcousticMaterialParameters( const int iID, const CVAStruct& oParams )
{
1176
	VA_EXCEPT_NOT_IMPLEMENTED_FUTURE_VERSION;
1177
1178
1179
1180
}

CVAStruct CVACoreImpl::GetAcousticMaterialParameters( const int iID, const CVAStruct& oParams ) const
{
1181
	VA_EXCEPT_NOT_IMPLEMENTED_FUTURE_VERSION;
1182
1183
1184
1185
}

int CVACoreImpl::CreateGeometryMesh( const CVAGeometryMesh& oMesh, const std::string& sName )
{
1186
	VA_EXCEPT_NOT_IMPLEMENTED_FUTURE_VERSION;
1187
1188
1189
1190
}

int CVACoreImpl::CreateGeometryMeshFromParameters( const CVAStruct& oParams, const std::string& sName )
{
1191
	VA_EXCEPT_NOT_IMPLEMENTED_FUTURE_VERSION;
1192
1193
1194
1195
}

bool CVACoreImpl::DeleteGeometryMesh( const int iID )
{
1196
	VA_EXCEPT_NOT_IMPLEMENTED_FUTURE_VERSION;