Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Open sidebar
Institute of Technical Acoustics (ITA)
VACore
Commits
a206476d
Commit
a206476d
authored
Feb 27, 2018
by
Dipl.-Ing. Jonas Stienen
Browse files
Options
Browse Files
Download
Plain Diff
Finalizing merge for offline simulation feature
parents
2e7826d0
435ff750
Changes
20
Show whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
537 additions
and
135 deletions
+537
-135
CMakeLists.txt
CMakeLists.txt
+8
-4
src/Audiosignals/VAAudioSignalSourceManager.cpp
src/Audiosignals/VAAudioSignalSourceManager.cpp
+1
-3
src/Drivers/Audio/VAAudioDriverConfig.cpp
src/Drivers/Audio/VAAudioDriverConfig.cpp
+5
-6
src/Drivers/Audio/VAVirtualAudioDriverBackend.cpp
src/Drivers/Audio/VAVirtualAudioDriverBackend.cpp
+146
-0
src/Drivers/Audio/VAVirtualAudioDriverBackend.h
src/Drivers/Audio/VAVirtualAudioDriverBackend.h
+26
-6
src/Drivers/Audio/_SourceFiles.cmake
src/Drivers/Audio/_SourceFiles.cmake
+2
-2
src/Rendering/Ambisonics/Freefield/VAAmbisonicsFreefieldAudioRenderer.cpp
...bisonics/Freefield/VAAmbisonicsFreefieldAudioRenderer.cpp
+1
-1
src/Rendering/Binaural/AirTrafficNoise/VAAirTrafficNoiseAudioRenderer.cpp
...naural/AirTrafficNoise/VAAirTrafficNoiseAudioRenderer.cpp
+1
-1
src/Rendering/Binaural/ArtificialReverb/VABinauralArtificialReverb.cpp
.../Binaural/ArtificialReverb/VABinauralArtificialReverb.cpp
+1
-1
src/Rendering/Binaural/FreeField/VABinauralFreeFieldAudioRenderer.cpp
...g/Binaural/FreeField/VABinauralFreeFieldAudioRenderer.cpp
+16
-4
src/Rendering/Binaural/FreeField/VABinauralFreefieldAudioRenderer.h
...ing/Binaural/FreeField/VABinauralFreefieldAudioRenderer.h
+2
-0
src/Rendering/Prototyping/FreeField/VAPrototypeFreeFieldAudioRenderer.cpp
...ototyping/FreeField/VAPrototypeFreeFieldAudioRenderer.cpp
+1
-1
src/Rendering/Prototyping/GenericPath/VAPTGenericPathAudioRenderer.cpp
.../Prototyping/GenericPath/VAPTGenericPathAudioRenderer.cpp
+120
-94
src/Rendering/Prototyping/GenericPath/VAPTGenericPathAudioRenderer.h
...ng/Prototyping/GenericPath/VAPTGenericPathAudioRenderer.h
+2
-1
src/Rendering/Prototyping/HearingAid/VAPTHearingAidRenderer.cpp
...ndering/Prototyping/HearingAid/VAPTHearingAidRenderer.cpp
+1
-1
src/Rendering/VAAudioRenderer.h
src/Rendering/VAAudioRenderer.h
+1
-0
src/VACoreImpl.cpp
src/VACoreImpl.cpp
+25
-7
tests/CMakeLists.txt
tests/CMakeLists.txt
+11
-1
tests/CoreTest.cpp
tests/CoreTest.cpp
+2
-2
tests/OfflineSimulationVirtualDeviceTest.cpp
tests/OfflineSimulationVirtualDeviceTest.cpp
+165
-0
No files found.
CMakeLists.txt
View file @
a206476d
...
...
@@ -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
...
...
src/Audiosignals/VAAudioSignalSourceManager.cpp
View file @
a206476d
...
...
@@ -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
),
...
...
src/Drivers/Audio/VAAudioDriverConfig.cpp
View file @
a206476d
...
...
@@ -35,8 +35,8 @@ void CVAAudioDriverConfig::Init( const CVAStruct& oArgs )
CVAConfigInterpreter
conf
(
oArgs
);
conf
.
OptNonEmptyString
(
"Driver"
,
sDriver
);
conf
.
OptString
(
"Device"
,
sDevice
,
"AUTO"
);
conf
.
OptNumber
(
"Sample
r
ate"
,
dSampleRate
,
DEFAULT_SAMPLERATE
);
conf
.
OptInteger
(
"Buffer
s
ize"
,
iBuffersize
,
AUTO
,
&
lits
);
conf
.
OptNumber
(
"Sample
R
ate"
,
dSampleRate
,
DEFAULT_SAMPLERATE
);
conf
.
OptInteger
(
"Buffer
S
ize"
,
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)"
);
}
src/Drivers/Audio/VA
Dummy
AudioDriverBackend.cpp
→
src/Drivers/Audio/VA
Virtual
AudioDriverBackend.cpp
View file @
a206476d
#include "VA
Dummy
AudioDriverBackend.h"
#include "VA
Virtual
AudioDriverBackend.h"
#include "../../Utils/VADebug.h"
#include <VAException.h>
#include <ITAException.h>
#include <ITANumericUtils.h>
...
...
@@ -8,8 +9,8 @@
#include <cassert>
CVA
Dummy
AudioDriverBackend
::
CVA
Dummy
AudioDriverBackend
(
const
CVAAudioDriverConfig
*
pConfig
)
:
CVAObject
(
"VirtualAudioD
river
"
)
CVA
Virtual
AudioDriverBackend
::
CVA
Virtual
AudioDriverBackend
(
const
CVAAudioDriverConfig
*
pConfig
)
:
CVAObject
(
"VirtualAudioD
evice
"
)
,
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
;
}
CVA
Dummy
AudioDriverBackend
::~
CVA
Dummy
AudioDriverBackend
()
CVA
Virtual
AudioDriverBackend
::~
CVA
Virtual
AudioDriverBackend
()
{
}
std
::
string
CVA
Dummy
AudioDriverBackend
::
getDriverName
()
const
std
::
string
CVA
Virtual
AudioDriverBackend
::
getDriverName
()
const
{
return
"
Dummy
"
;
return
"
Virtual
"
;
}
std
::
string
CVA
Dummy
AudioDriverBackend
::
getDeviceName
()
const
std
::
string
CVA
Virtual
AudioDriverBackend
::
getDeviceName
()
const
{
return
"
Dummy
"
;
return
"
Trigger
"
;
}
int
CVA
Dummy
AudioDriverBackend
::
getNumberOfInputs
()
const
int
CVA
Virtual
AudioDriverBackend
::
getNumberOfInputs
()
const
{
return
m_oConfig
.
iInputChannels
;
}
const
ITAStreamProperties
*
CVA
Dummy
AudioDriverBackend
::
getOutputStreamProperties
()
const
const
ITAStreamProperties
*
CVA
Virtual
AudioDriverBackend
::
getOutputStreamProperties
()
const
{
return
&
m_oOutputStreamProps
;
}
void
CVA
Dummy
AudioDriverBackend
::
setOutputStreamDatasource
(
ITADatasource
*
pDatasource
)
void
CVA
Virtual
AudioDriverBackend
::
setOutputStreamDatasource
(
ITADatasource
*
pDatasource
)
{
m_pDataSource
=
pDatasource
;
}
ITADatasource
*
CVA
Dummy
AudioDriverBackend
::
getInputStreamDatasource
()
const
ITADatasource
*
CVA
Virtual
AudioDriverBackend
::
getInputStreamDatasource
()
const
{
return
nullptr
;
}
void
CVA
Dummy
AudioDriverBackend
::
initialize
()
void
CVA
Virtual
AudioDriverBackend
::
initialize
()
{
}
void
CVA
Dummy
AudioDriverBackend
::
finalize
()
void
CVA
Virtual
AudioDriverBackend
::
finalize
()
{
}
void
CVA
Dummy
AudioDriverBackend
::
startStreaming
()
void
CVA
Virtual
AudioDriverBackend
::
startStreaming
()
{
m_bStarted
=
true
;
}
bool
CVA
Dummy
AudioDriverBackend
::
isStreaming
()
bool
CVA
Virtual
AudioDriverBackend
::
isStreaming
()
{
return
m_bStarted
;
}
void
CVA
Dummy
AudioDriverBackend
::
stopStreaming
()
void
CVA
Virtual
AudioDriverBackend
::
stopStreaming
()
{
m_bStarted
=
false
;
}
CVAStruct
CVA
Dummy
AudioDriverBackend
::
CallObject
(
const
CVAStruct
&
oArgs
)
CVAStruct
CVA
Virtual
AudioDriverBackend
::
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.0
f
)
{
}
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"
);
}
}
src/Drivers/Audio/VA
Dummy
AudioDriverBackend.h
→
src/Drivers/Audio/VA
Virtual
AudioDriverBackend.h
View file @
a206476d
...
...
@@ -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
CVA
Dummy
AudioDriverBackend
:
public
IVAAudioDriverBackend
,
public
CVAObject
class
CVA
Virtual
AudioDriverBackend
:
public
IVAAudioDriverBackend
,
public
CVAObject
{
public:
CVA
Dummy
AudioDriverBackend
(
const
CVAAudioDriverConfig
*
pConfig
);
~
CVA
Dummy
AudioDriverBackend
();
CVA
Virtual
AudioDriverBackend
(
const
CVAAudioDriverConfig
*
pConfig
);
~
CVA
Virtual
AudioDriverBackend
();
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.0
f
;
};
double
getFrequency
()
const
{
return
-
1.0
f
;
};
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
src/Drivers/Audio/_SourceFiles.cmake
View file @
a206476d
...
...
@@ -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 VA
Dummy
AudioDriverBackend.cpp VA
Dummy
AudioDriverBackend.h
)
if
(
ITA_VACORE_WITH_AUDIO_BACKEND_
VIRTUAL
)
list
(
APPEND DirFiles VA
Virtual
AudioDriverBackend.cpp VA
Virtual
AudioDriverBackend.h
)
endif
(
)
set
(
DirFiles_SourceGroup
"
${
RelativeSourceGroup
}
"
)
...
...
src/Rendering/Ambisonics/Freefield/VAAmbisonicsFreefieldAudioRenderer.cpp
View file @
a206476d
...
...
@@ -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
...
...
src/Rendering/Binaural/AirTrafficNoise/VAAirTrafficNoiseAudioRenderer.cpp
View file @
a206476d
...
...
@@ -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();
...
...
src/Rendering/Binaural/ArtificialReverb/VABinauralArtificialReverb.cpp
View file @
a206476d
...
...
@@ -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
();
...
...
src/Rendering/Binaural/FreeField/VABinauralFreeFieldAudioRenderer.cpp
View file @
a206476d
...
...
@@ -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
)
...
...
src/Rendering/Binaural/FreeField/VABinauralFreefieldAudioRenderer.h
View file @
a206476d
...
...
@@ -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
();
...
...
src/Rendering/Prototyping/FreeField/VAPrototypeFreeFieldAudioRenderer.cpp
View file @
a206476d
...
...
@@ -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
...
...
src/Rendering/Prototyping/GenericPath/VAPTGenericPathAudioRenderer.cpp
View file @
a206476d
...
...
@@ -29,6 +29,7 @@
#include <ITAUPFilterPool.h>
#include <ITAAtomicPrimitives.h>
#include <ITADataSourceRealization.h>
#include <ITAVariableDelayLine.h>
// Vista includes
#include <VistaInterProcComm/Concurrency/VistaThreadEvent.h>
...
...
@@ -50,13 +51,18 @@ 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:
...
...
@@ -131,11 +137,14 @@ 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.0
f
,
true
);
ITAUPFilter
*
pHRIRFilterChL
=
pFIRConvolver
->
RequestFilter
();
pHRIRFilterChL
->
Zeros
();
...
...
@@ -148,19 +157,21 @@ CVAPTGenericSoundPath::CVAPTGenericSoundPath( double dSamplerate, int iBlockleng
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
);
...
...
@@ -184,6 +195,8 @@ 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
()
...
...
@@ -200,15 +213,9 @@ 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
;
...
...
@@ -218,7 +225,7 @@ 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();
...
...
@@ -403,12 +410,12 @@ void CVAPTGenericPathAudioRenderer::ManageSoundPaths( const CVASceneState* pCurS
while
(
citr
!=
pDiff
->
viNewReceiverIDs
.
end
()
)
{
int
iListenerID
=
(
*
citr
++
);
CVAPTGPListener
*
pListener
=
m_mListeners
[
iListenerID
];
CVAPTGPListener
*
pListener
=
m_mListeners
[
iListenerID
];
for
(
size_t
i
=
0
;
i
<
pDiff
->
viComSoundSourceIDs
.
size
();
i
++
)
for
(
size_t
i
=
0
;
i
<
pDiff
->
viComSoundSourceIDs
.
size
();
i
++
)
{
int
iSourceID
=
pDiff
->
viComSoundSourceIDs
[
i
];
CVAPTGPSource
*
pSource
=
m_mSources
[
iSourceID
];
int
iSourceID
=
pDiff
->
viComSoundSourceIDs
[
i
];
CVAPTGPSource
*
pSource
=
m_mSources
[
iSourceID
];
if
(
!
pSource
->
bDeleted
)
// only, if not marked for deletion
CVAPTGenericSoundPath
*
pPath
=
CreateSoundPath
(
pSource
,
pListener
);
}
...
...
@@ -419,12 +426,12 @@ void CVAPTGenericPathAudioRenderer::ManageSoundPaths( const CVASceneState* pCurS
while
(
cits
!=
pDiff
->
viNewSoundSourceIDs
.
end
()
)
{
const
int
&
iSourceID
(
*
cits
++
);
CVAPTGPSource
*
pSource
=
m_mSources
[
iSourceID
];
CVAPTGPSource
*
pSource
=
m_mSources
[
iSourceID
];
for
(
size_t
i
=
0
;
i
<
pDiff
->
viComReceiverIDs
.
size
();
i
++
)
for
(
size_t
i
=
0
;
i
<
pDiff
->
viComReceiverIDs
.
size
();
i
++
)
{
int
iListenerID
=
pDiff
->
viComReceiverIDs
[
i
];
CVAPTGPListener
*
pListener
=
m_mListeners
[
iListenerID
];
int
iListenerID
=
pDiff
->
viComReceiverIDs
[
i
];
CVAPTGPListener
*
pListener
=
m_mListeners
[
iListenerID
];
if
(
!
pListener
->
bDeleted
)
CVAPTGenericSoundPath
*
pPath
=
CreateSoundPath
(
pSource
,
pListener
);
}
...
...
@@ -435,13 +442,13 @@ void CVAPTGenericPathAudioRenderer::ManageSoundPaths( const CVASceneState* pCurS
while
(
cits
!=
pDiff
->
viNewSoundSourceIDs
.
end
()
)
{
const
int
&
iSourceID
(
*
cits
++
);
CVAPTGPSource
*
pSource
=
m_mSources
[
iSourceID
];
CVAPTGPSource
*
pSource
=
m_mSources
[
iSourceID
];
citr
=
pDiff
->
viNewReceiverIDs
.
begin
();
while
(
citr
!=
pDiff
->
viNewReceiverIDs
.
end
()
)
{
const
int
&
iListenerID
(
*
citr
++
);
CVAPTGPListener
*
pListener
=
m_mListeners
[
iListenerID
];
CVAPTGPListener
*
pListener
=
m_mListeners
[
iListenerID
];
CVAPTGenericSoundPath
*
pPath
=
CreateSoundPath
(
pSource
,
pListener
);
}
}
...
...
@@ -456,9 +463,9 @@ CVAPTGenericSoundPath* CVAPTGenericPathAudioRenderer::CreateSoundPath( CVAPTGPSo
assert
(
!
pSource
->
bDeleted
&&
!
pListener
->
bDeleted
);
VA_VERBOSE
(
"PTGenericPathAudioRenderer"
,
"Creating sound path from source "
<<
iSourceID
<<
" -> sound receiver "
<<
iListenerID
);
VA_VERBOSE
(
"PTGenericPathAudioRenderer"
,
"Creating sound path from source "
<<
iSourceID
<<
" -> sound receiver "
<<
iListenerID
);
CVAPTGenericSoundPath
*
pPath
=
dynamic_cast
<
CVAPTGenericSoundPath
*>
(
m_pSoundPathPool
->
RequestObject
()
);
CVAPTGenericSoundPath
*
pPath
=
dynamic_cast
<
CVAPTGenericSoundPath
*
>
(
m_pSoundPathPool
->
RequestObject
()
);
pPath
->
pSource
=
pSource
;
pPath
->
pListener
=
pListener
;
...
...
@@ -473,7 +480,7 @@ CVAPTGenericSoundPath* CVAPTGenericPathAudioRenderer::CreateSoundPath( CVAPTGPSo
void
CVAPTGenericPathAudioRenderer
::
DeleteSoundPath
(
CVAPTGenericSoundPath
*
pPath
)
{
VA_VERBOSE
(
"PTGenericPathAudioRenderer"
,
"Marking sound path from source "
<<
pPath
->
pSource
->
pData
->
iID
<<
" -> sound receiver "
<<
pPath
->
pListener
->
pData
->
iID
<<
" for deletion"
);
VA_VERBOSE
(
"PTGenericPathAudioRenderer"
,
"Marking sound path from source "
<<
pPath
->
pSource
->
pData
->
iID
<<
" -> sound receiver "
<<
pPath
->
pListener
->
pData
->
iID
<<
" for deletion"
);
pPath
->
bDelete
=
true
;
pPath
->
RemoveReference
();
...
...
@@ -523,7 +530,7 @@ CVAPTGenericPathAudioRenderer::CVAPTGPSource* CVAPTGenericPathAudioRenderer::Cre
VA_VERBOSE
(
"PTGenericPathAudioRenderer"
,
"Creating source with ID "
<<
iID
);
CVAPTGPSource
*
pSource
=
dynamic_cast
<
CVAPTGPSource
*
>
(
m_pSourcePool
->
RequestObject
()
);
pSource
->
pData
=
m_pCore
->
GetSceneManager
()
->
GetSoundSourceDesc
(
iID
);
pSource
->
pData
=
m_pCore
->
GetSceneManager
()
->
GetSoundSourceDesc
(
iID
);
pSource
->
pData
->
AddReference
();
pSource
->
bDeleted
=
false
;
...
...
@@ -623,8 +630,8 @@ void CVAPTGenericPathAudioRenderer::ResetInternalData()
}
ctxAudio
.
m_lSoundPaths
.
clear
();
std
::
list
<
CVAPTGPListener
*
>::
const_iterator
itl
=
ctxAudio
.
m_lListener
.
begin
();
while
(
itl
!=
ctxAudio
.
m_lListener
.
end
()
)
std
::
list
<
CVAPTGPListener
*
>::
const_iterator
itl
=
ctxAudio
.
m_lListener
.
begin
();