Commit 191f6370 authored by Jonas Stienen's avatar Jonas Stienen

Initial project checkin

parents
cmake_minimum_required( VERSION 2.8 )
project( ITACTC )
list( APPEND CMAKE_MODULE_PATH "$ENV{VISTA_CMAKE_COMMON}" )
include( VistaCommon )
# dependencies
vista_use_package( ITABase REQUIRED FIND_DEPENDENCIES )
vista_use_package( ITAFFT REQUIRED FIND_DEPENDENCIES )
vista_use_package( ITADataSources REQUIRED FIND_DEPENDENCIES )
vista_use_package( ITAConvolution REQUIRED FIND_DEPENDENCIES )
vista_use_package( OpenDAFF REQUIRED )
if( NOT DEFINED ITA_CTC_WITH_DUAL_CTC )
set( ITA_CTC_WITH_DUAL_CTC OFF CACHE BOOL "Build support for Crosstalk-Cancellation with arbitrary loudspeaker number and pose" )
endif( NOT DEFINED ITA_CTC_WITH_DUAL_CTC )
if( NOT DEFINED ITA_CTC_WITH_N_CTC )
set( ITA_CTC_WITH_N_CTC ON CACHE BOOL "Build support for two-loudspeaker Crosstalk-Cancellation (deprecated)" )
endif( NOT DEFINED ITA_CTC_WITH_N_CTC )
if( NOT DEFINED ITA_CTC_WITH_QUAD_CTC )
set( ITA_CTC_WITH_QUAD_CTC OFF CACHE BOOL "Build support for quad-loudspeaker Crosstalk-Cancellation (deprecated)" )
endif( NOT DEFINED ITA_CTC_WITH_QUAD_CTC )
# includes
include_directories( "include" )
# sources
set( ITACTCHeader
"include/ITACTCDefinitions.h"
"include/ITACTCUtils.h"
"include/ITAHDFTSpectra.h"
)
set( ITACTCSources
"src/ITACTCUtils.cpp"
"src/ITAHDFTSpectra.cpp"
)
if( ITA_CTC_WITH_DUAL_CTC )
set( ITACTCHeader "${ITACTCHeader}" "include/ITADualCTC.h" "include/ITADualCTCStreamFilter.h" )
set( ITACTCSources "${ITACTCSources}" "src/ITADualCTC.cpp" "src/ITADualCTCStreamFilter.cpp" )
endif( ITA_CTC_WITH_DUAL_CTC )
if( ITA_CTC_WITH_N_CTC )
set( ITACTCHeader "${ITACTCHeader}" "include/ITANCTC.h" "include/ITANCTCStreamFilter.h" )
set( ITACTCSources "${ITACTCSources}" "src/ITANCTC.cpp" "src/ITANCTCStreamFilter.cpp" )
endif( ITA_CTC_WITH_N_CTC )
if( ITA_CTC_WITH_QUAD_CTC )
set( ITACTCHeader "${ITACTCHeader}" "include/ITAQuadCTC.h" "include/ITAQuadCTCStreamFilter.h" )
set( ITACTCSources "${ITACTCSources}" "src/ITAQuadCTC.cpp" "src/ITAQuadCTCStreamFilter.cpp" )
endif( ITA_CTC_WITH_QUAD_CTC )
# compiler
add_definitions( -DITA_BASE_DLL -DITA_FFT_DLL -DITA_CONVOLUTION_DLL -DITA_CTC_DLL -DITA_CTC_EXPORT )
# linker
add_library( ITACTC SHARED ${ITACTCHeader} ${ITACTCSources} )
target_link_libraries( ITACTC ${VISTA_USE_PACKAGE_LIBRARIES} )
# configure
vista_configure_lib( ITACTC )
vista_install( ITACTC )
set( ITACTC_INCLUDE_OUTDIR "${CMAKE_CURRENT_SOURCE_DIR}/include" )
vista_create_cmake_configs( ITACTC )
vista_create_default_info_file( ITACTC )
set_property( TARGET ITACTC PROPERTY FOLDER "ITACoreLibs" )
# tests
set( ITACTC_COMMON_BUILD TRUE )
add_subdirectory( "${CMAKE_CURRENT_SOURCE_DIR}/tests" )
#
# ITAQuadCTC Beispiel-Konfigurationsdatei
# Autor: Frank Wefers
#
[Global]
# Schallgeschwindigkeit [m/s]
c = 344
# Beta-Wert für die Regularisierung (Standard: 0.1)
beta = 0.1
# Überblendfunktion für Sektoren (0=kein Fading, 90&180; 1=lin. Fading, 90&180; 2=sin. Fading, 90&180; 3=nur 90; 4=nur 180; 5=lin. Fading 180&180)
fading = 5
# Arbeitsbereich (Achsenbeschränkungen) [optional]
XRange = -1.797, +1.797
YRange = -3.00, +3.00
ZRange = 0, +2.50
# Minimal/maximal erlaubte Entfernung zwischen einem beliebigen Lautsprecher und dem Hörer [m]
L2SDistMin = 0.8
L2SDistMax = 3.0
[Listener]
# Vesatz zwischen Kopf-Bezugspunkt und Ohreingang linkes/rechtes Ohr [m]
# (Anmerkungen: Angaben beziehen sich auf den Kopf der geradeaus in negative Z-Richtung schaut)
LOffset = -0.08, -0.00, +0.00
ROffset = +0.08, -0.00, +0.00
[Sectors]
# Sektor-Grenzen für die zwei Betriebskonfigurationen.
# Konfiguration C90 = 90°-Anordnung der Lautsprecher (Winkelhalbierende/Mittelachse bei 45°)
# Konfiguration C180 = 180°-Anordnung der Lautsprecher (Winkelhalbierende/Mittelachse bei 90°)
# Die Winkelhalbierende stellt jeweils den Bezugswinkel für die folgenden Angaben dar.
#
# Der Arbeitsbereich (work) gibt die Winkelspanne (+/-) um den Bezugswinkel (Winkelhalbierende) an, in dem
# die Konfiguration mit stabilen Filters betrieben werden kann. Der Kern (core) ist der Winkelbereich, wo
# diese Konfiguration exklusiv genutzt wird. Außerhalb des Kernes wird zwischen den beiden Konfigurationen
# übergeblendet. (Wichtig: Die Kerne beider Modi dürfen nicht überlappen und sollten Raum zur Überblendung lassen)
Sector12Span = 20-120
Sector12Core = 30-92.4
Sector23Span = 20-20
Sector23Core = 20-20
Sector34Span = 20-20
Sector34Core = 20-20
Sector41Span = 20-20
Sector41Core = 20-20
Sector13Span = 20-20
Sector13Core = 20-20
Sector24Span = 20-20
Sector24Core = 20-20
Sector31Span = 20-20
Sector31Core = 20-43
Sector42Span = 20-344
Sector42Core = 20-19390
#
# Lautsprecher-Konfiguration für das VR-Labor im ITA
# Stand: 2011-06-15
# Author: Frank Wefers. Jonas Stienen
#
[Speaker1]
# Position (X,Y,Z) [m] im realen Koordinatensystem
Position = -1.527, 0.854, -1.527
Direction = -135.0, 20.0, 0.0
# Ausgabekanal auf der Audio-Hardware (1, 2, ..., N)
Channel = 1
[Speaker2]
Position = +1.527, 0.854, -1.527
Direction = +135.0, 20.0, 0.0
Channel = 2
[Speaker3]
Position = +1.527, 0.854, +1.527
Direction = +45.0, 20.0, 0.0
Channel = 3
[Speaker4]
Position = -1.527, 0.854, +1.527
Direction = -45.0, 20.0, 0.0
Channel = 4
[Speaker5]
Position = -1.527, 2.546, -1.527
Direction = -135.0, -20.0, 0.0
Channel = 5
[Speaker6]
Position = +1.527, 2.546, -1.527
Direction = +135.0, -20.0, 0.0
Channel = 6
[Speaker7]
Position = +1.527, 2.546, +1.527
Direction = +45.0, -20.0, 0.0
Channel = 7
[Speaker8]
Position = -1.527, 2.546, +1.527
Direction = -45.0, -20.0, 0.0
Channel = 8
#
# ITANCTC example configuration
# Authors: Jonas Stienen <stienen@akustik.rwth-aachen.de>
# Johannes Fundalewicz <johannes.fundalewicz@rwth-aachen.de>
#
#
[NCTC]
# Indices of configured loud speakers. Selected speaker order corresponds
# to input and output channels (HRIR and speaker setup)
SpeakerSelection = 1,2,3,4,5,6,7,8
# Use direct input file instead of input datasource (for testing)
DirectInput = 0
DirectInputFile = "ctc_direct_in.wav"
#Speed of sound
SpeedOfSound = 344
# Algorithm
# Regularized, WienerRegularized, WienerRegMinPhase
CTCAlgorithm = Regularized
# Beta for regularization [0 ... 1]
Beta = 0.001
# Forced delay to ensure causality [Samples]
Delay = 484
# Smoothing
Smoothing = false
# Smoothing type (Balasz, Gammatone, Lifter, Regular)
SmoothingType = Balasz
#####################################################################
#
# Speaker setup: position, direction
#
# Position (X,Y,Z) [m] in world coordinates
# Direction (yaw, pitch, roll) [] in world coordinates
[Speaker1]
Position = -1.527, 0.854, -1.527
Direction = -135.0, 20.0, 0.0
[Speaker2]
Position = +1.527, 0.854, -1.527
Direction = +135.0, 20.0, 0.0
[Speaker3]
Position = +1.527, 0.854, +1.527
Direction = +45.0, 20.0, 0.0
[Speaker4]
Position = -1.527, 0.854, +1.527
Direction = -45.0, 20.0, 0.0
[Speaker5]
Position = -1.527, 2.546, -1.527
Direction = -135.0, -20.0, 0.0
[Speaker6]
Position = +1.527, 2.546, -1.527
Direction = +135.0, -20.0, 0.0
[Speaker7]
Position = +1.527, 2.546, +1.527
Direction = +45.0, -20.0, 0.0
[Speaker8]
Position = -1.527, 2.546, +1.527
Direction = -45.0, -20.0, 0.0
#
# ITAQuadCTC Beispiel-Konfigurationsdatei
# Autor: Frank Wefers
#
[Global]
# Schallgeschwindigkeit [m/s]
c = 344
# Beta-Wert für die Regularisierung (Standard: 0.1)
beta = 0.1
# Überblendfunktion für Sektoren (0=kein Fading, 90&180; 1=lin. Fading, 90&180; 2=sin. Fading, 90&180; 3=nur 90; 4=nur 180; 5=lin. Fading 180&180)
fading = 5
# Arbeitsbereich (Achsenbeschränkungen) [optional]
XRange = -1.797, +1.797
YRange = 0, +2.40
ZRange = -1.352, +1.352
# Minimal/maximal erlaubte Entfernung zwischen einem beliebigen Lautsprecher und dem Hörer [m]
L2SDistMin = 0.8
L2SDistMax = 4.00
# Use direct input file instead of input datasource (for testing)
DirectInput = false
DirectInputFile = "direct_in.wav"
[Listener]
# Vesatz zwischen Kopf-Bezugspunkt und Ohreingang linkes/rechtes Ohr [m]
# (Anmerkungen: Angaben beziehen sich auf den Kopf der geradeaus in negative Z-Richtung schaut)
LOffset = -0.08, -0.00, +0.00
ROffset = +0.08, -0.00, +0.00
[Sectors]
# Sektor-Grenzen für die zwei Betriebskonfigurationen.
# Konfiguration C90 = 90°-Anordnung der Lautsprecher (Winkelhalbierende/Mittelachse bei 45°)
# Konfiguration C180 = 180°-Anordnung der Lautsprecher (Winkelhalbierende/Mittelachse bei 90°)
# Die Winkelhalbierende stellt jeweils den Bezugswinkel für die folgenden Angaben dar.
#
# Der Arbeitsbereich (work) gibt die Winkelspanne (+/-) um den Bezugswinkel (Winkelhalbierende) an, in dem
# die Konfiguration mit stabilen Filters betrieben werden kann. Der Kern (core) ist der Winkelbereich, wo
# diese Konfiguration exklusiv genutzt wird. Außerhalb des Kernes wird zwischen den beiden Konfigurationen
# übergeblendet. (Wichtig: Die Kerne beider Modi dürfen nicht überlappen und sollten Raum zur Überblendung lassen)
Sector12Span = 20-120
Sector12Core = 30-92.4
Sector23Span = 20-20
Sector23Core = 20-20
Sector34Span = 20-20
Sector34Core = 20-20
Sector41Span = 20-20
Sector41Core = 20-20
Sector13Span = 20-20
Sector13Core = 20-20
Sector24Span = 20-20
Sector24Core = 20-20
Sector31Span = 20-20
Sector31Core = 20-43
Sector42Span = 20-344
Sector42Core = 20-19390
#
# Lautsprecher-Konfiguration für die alte CAVE im ReZe
# Stand: 2012-06-23
# Author: Frank Wefers
#
[Speaker1]
# Position (X,Y,Z) [m] im realen Koordinatensystem
Position = -1.797, 3.00, 0
Direction = -90.0, 20.0, 0.0
# Ausgabekanal auf der Audio-Hardware (1, 2, ..., N)
Channel = 1
[Speaker2]
Position = 0, 3.02, -1.352
Direction = +180, 20.0, 0.0
Channel = 2
[Speaker3]
Position = +1.797, 3.00, 0
Direction = +90.0, 20.0, 0.0
Channel = 3
[Speaker4]
Position = 0, 2.85, 1.352
Direction = 0, 20.0, 0.0
Channel = 4
#
# ITAQuadCTC Beispiel-Konfigurationsdatei
# Autor: Frank Wefers
#
[Global]
# Schallgeschwindigkeit [m/s]
c = 344
# Beta-Wert für die Regularisierung (Standard: 0.1)
beta = 0.1
# Überblendfunktion für Sektoren (0=kein Fading, 90&180; 1=lin. Fading, 90&180; 2=sin. Fading, 90&180; 3=nur 90; 4=nur 180; 5=lin. Fading 180&180)
fading = 5
# Arbeitsbereich (Achsenbeschränkungen) [optional]
XRange = -1.797, +1.797
YRange = -3.00, +3.00
ZRange = 0, +2.50
# Minimal/maximal erlaubte Entfernung zwischen einem beliebigen Lautsprecher und dem Hörer [m]
L2SDistMin = 0.8
L2SDistMax = 3.0
# Use direct input file instead of input datasource (for testing)
DirectInput = false
DirectInputFile = "direct_in.wav"
[Listener]
# Vesatz zwischen Kopf-Bezugspunkt und Ohreingang linkes/rechtes Ohr [m]
# (Anmerkungen: Angaben beziehen sich auf den Kopf der geradeaus in negative Z-Richtung schaut)
LOffset = -0.08, -0.00, +0.00
ROffset = +0.08, -0.00, +0.00
[Sectors]
# Sektor-Grenzen für die zwei Betriebskonfigurationen.
# Konfiguration C90 = 90°-Anordnung der Lautsprecher (Winkelhalbierende/Mittelachse bei 45°)
# Konfiguration C180 = 180°-Anordnung der Lautsprecher (Winkelhalbierende/Mittelachse bei 90°)
# Die Winkelhalbierende stellt jeweils den Bezugswinkel für die folgenden Angaben dar.
#
# Der Arbeitsbereich (work) gibt die Winkelspanne (+/-) um den Bezugswinkel (Winkelhalbierende) an, in dem
# die Konfiguration mit stabilen Filters betrieben werden kann. Der Kern (core) ist der Winkelbereich, wo
# diese Konfiguration exklusiv genutzt wird. Außerhalb des Kernes wird zwischen den beiden Konfigurationen
# übergeblendet. (Wichtig: Die Kerne beider Modi dürfen nicht überlappen und sollten Raum zur Überblendung lassen)
Sector12Span = 20-120
Sector12Core = 30-92.4
Sector23Span = 20-20
Sector23Core = 20-20
Sector34Span = 20-20
Sector34Core = 20-20
Sector41Span = 20-20
Sector41Core = 20-20
Sector13Span = 20-20
Sector13Core = 20-20
Sector24Span = 20-20
Sector24Core = 20-20
Sector31Span = 20-20
Sector31Core = 20-43
Sector42Span = 20-344
Sector42Core = 20-19390
#
# Lautsprecher-Konfiguration für das VR-Labor im ITA
# Stand: 2011-06-15
# Author: Frank Wefers. Jonas Stienen
#
[Speaker1]
# Position (X,Y,Z) [m] im realen Koordinatensystem
Position = -1.527, 0.854, -1.527
Direction = -135.0, 20.0, 0.0
# Ausgabekanal auf der Audio-Hardware (1, 2, ..., N)
Channel = 1
[Speaker2]
Position = +1.527, 0.854, -1.527
Direction = +135.0, 20.0, 0.0
Channel = 2
[Speaker3]
Position = +1.527, 0.854, +1.527
Direction = +45.0, 20.0, 0.0
Channel = 3
[Speaker4]
Position = -1.527, 0.854, +1.527
Direction = -45.0, 20.0, 0.0
Channel = 4
[Speaker5]
Position = -1.527, 2.546, -1.527
Direction = -135.0, -20.0, 0.0
Channel = 5
[Speaker6]
Position = +1.527, 2.546, -1.527
Direction = +135.0, -20.0, 0.0
Channel = 6
[Speaker7]
Position = +1.527, 2.546, +1.527
Direction = +45.0, -20.0, 0.0
Channel = 7
[Speaker8]
Position = -1.527, 2.546, +1.527
Direction = -45.0, -20.0, 0.0
Channel = 8
// $Id: AngularRange.h,v 1.1 2008-09-10 22:38:11 fwefers Exp $
#ifndef __ANGULAR_RANGE_H__
#define __ANGULAR_RANGE_H__
#include <string>
/**
* Diese Klasse bildet Winkelbereiche ab und stellt Methoden zur Arbeit mit diesen bereit.
* Der Winkelbereich ist [Startwinkel, Endwinkel] markiert durch einen Start- und Endwinkel,
* d.h. es werden ausschließlich geschlossene Intervalle unterstützt. Wird ein Intervall
* mit gleichem Start- und Endwinkel spezifiziert, so wird dies als vollständiges Intervall
* [0°, 360°) interpretiert. Als Konsequenz kann die Klasse keine leeren Intervalle darstellen.
* Der Standardkonstruktor erzeugt immer ein vollständiges Intervall.
*
* Wichtig: Alle Winkelangaben sind in Grad (nicht Bogengrad)
*/
class AngularRange {
public:
//! Standardkonstruktor
AngularRange();
//! Initialisierungskonstruktor (geschlossenes Winkelintervall)
AngularRange(float fLower, float fUpper);
//! Unteren Bereichswinkel zurückgeben
float getLowerAngle() const;
//! Oberen Bereichswinkel zurückgeben
float getUpperAngle() const;
//! Unteren Bereichswinkel setzen
void setLowerAngle(float fLower);
//! Unteren Bereichswinkel setzen
void setUpperAngle(float fUpper);
//! Winkelbereich setzen (geschlossenes Winkelintervall)
void setRange(float fLower, float fUpper);
//! Zurückgeben ob ein Winkel im Intervall liegt
bool contains(float fAngle) const;
//! Zurückgeben ob das Intervall ein anderes Intervall schneidet
bool intersects(const AngularRange& dest) const;
//! Zurückgeben ob das Intervall den vollständigen Bereich [0°, 360°) abdeckt
bool complete() const;
//! Repräsentation als Zeichenkette zurückgeben
std::string toString() const;
protected:
float m_fLower, m_fUpper;
};
#endif // __ANGULAR_RANGE_H__
\ No newline at end of file
/*
* ----------------------------------------------------------------
*
* ITA core libs
* (c) Copyright Institute of Technical Acoustics (ITA)
* RWTH Aachen University, Germany, 2015-2016
*
* ----------------------------------------------------------------
* ____ __________ _______
* // / //__ ___/ // _ |
* // / // / // /_| |
* // / // / // ___ |
* //__/ //__/ //__/ |__|
*
* ----------------------------------------------------------------
*
*/
// $Id: ITACTCDefinitions.h 2900 2012-09-17 08:42:42Z stienen $
#ifndef INCLUDE_WATCHER_ITA_CTC_DEFINITIONS
#define INCLUDE_WATCHER_ITA_CTC_DEFINITIONS
#ifdef ITA_CTC_DLL
#ifdef ITA_CTC_EXPORT
#define ITA_CTC_API __declspec(dllexport)
#else
#define ITA_CTC_API __declspec(dllimport)
#endif
#else
#define ITA_CTC_API
#endif
#endif // INCLUDE_WATCHER_ITA_CTC_DEFINITIONS
/*
* ----------------------------------------------------------------
*
* ITA core libs
* (c) Copyright Institute of Technical Acoustics (ITA)
* RWTH Aachen University, Germany, 2015-2016
*
* ----------------------------------------------------------------
* ____ __________ _______
* // / //__ ___/ // _ |
* // / // / // /_| |
* // / // / // ___ |
* //__/ //__/ //__/ |__|
*
* ----------------------------------------------------------------
*
*/
// $Id: ITACTCHelper.h 2395 2012-04-20 06:58:52Z stienen $
#ifndef INCLUDE_WATCHER_ITA_CTC_UTILS
#define INCLUDE_WATCHER_ITA_CTC_UTILS
#include <ITACTCDefinitions.h>
class ITAHDFTSpectrum;
#include <string>
// Helper
ITA_CTC_API void Export( const ITAHDFTSpectrum* pSpectrum, const std::string& sFilePath );
#endif // INCLUDE_WATCHER_ITA_CTC_UTILS
// $Id: ITADualCTC.h,v 1.10 2008-12-02 22:31:36 fwefers Exp $
#ifndef __ITA_DUALCTC_H__
#define __ITA_DUALCTC_H__
// STL Includes
#include <string>
#include <vector>
// ITA Includes
#include <ITAFFT.h>
#include <ITAHDFTSpectrum.h>
#include <ITAStopwatch.h>
#include <RG_LocalCS.h>
#include <VistaInterProcComm/Concurrency/VistaMutex.h>
#include <VistaInterProcComm/Concurrency/VistaThreadEvent.h>
#include <VistaInterProcComm/Concurrency/VistaThreadLoop.h>
#include <AngularRange.h>
// Vorwrtsdeklarationen
class ITADatasource;
class ITADualCTCStreamfilter;
class DAFFContentIR;
class DAFFContentDFT;
class DAFFReader;
class ITADualCTC : public VistaThreadLoop {
public:
ITADualCTC(double dSamplerate,
int iBlocklength,
const std::string& sConfigurationFile,
DAFFContentIR* pHRIR=NULL);
~ITADualCTC();
// Eingangsaudiodatenquelle setzen
// (Hinweis: Muss genau zwei Kanle haben)
void setInputDatasource(ITADatasource* pdsInput);
// Ausgabeaudiodatenquelle zurckgeben
ITADatasource* getOutputDatasource() const;
// Liefert die Lautsprecher-Kanle der Audio-Hardware zurck,
// auf welchen die CTC ausgegeben werden soll.
// Diese Information stammt aus der CTC-Konfigurationsdatei.
void getPhysicalOutputChannels(std::vector<int>& viChannels) const;
// Positionen und Orientierungen der Lautsprecher abfragen
void getLoudspeakerPositionOrientation(int iSpeaker, RG_Vector& vPos, RG_Vector& vView, RG_Vector& vUp) const;
// Zustand der Lautsprecher zurckgeben
void getLoudspeakerStates(std::vector<int>& viStates);
// -= Abstrakte Methoden der Klasse "ITADualCTC" =-
void testLS2H(RG_Vector& vPos);
void testHRIR();
double getLatency();
void updateHeadPosition(const RG_Vector& vPos, const RG_Vector& vView, const RG_Vector& vUp, bool bForceFilterUpdate=false);
// Alternative Methode zum Setzen der Kopfposition (mit Winkeln, zum Debuggen)
void updateHeadPosition(const float fX, const float fY, const float fZ, const float fPhiDEG, const float fThetaDEG, const float fRhoDEG, bool bForceFilterUpdate=false);
// Diese Methode entscheiden ob fr eine neue Kopfposition die CTC-Filter neu berechnet werden
bool mustRecalculateFilters(const RG_Vector& vPos, const RG_Vector& vView, const RG_Vector& vUp);
// CTC-Filter (neu)berechnen
void calculateFilters();
// -= Definition der virtuellen Methoden in VistaThread =-
void PreLoop();
void PostLoop();
bool LoopBody();
private:
class PositionViewUp {
public:
RG_Vector m_vPos, m_vView, m_vUp;
PositionViewUp(const RG_Vector& vPos,
const RG_Vector& vView,
const RG_Vector& vUp)
: m_vPos(vPos), m_vView(vView), m_vUp(vUp) {}
};
VistaThreadEvent m_evHeadDataAvail; // Thread-Event: Berechnung starten
std::vector<PositionViewUp> m_vHeadData; // Eingabe-Queue fr Kopfdaten
bool m_bForceFilterUpdate; // Filterneuberechnung erzwingen
bool m_bStopThread;
VistaMutex m_mxHeadData; // Mutex: Exklusiver Zugriff auf Eingabe-Queue
DAFFContentIR* m_pHRIRDatabase; // Hear-related impulse response (HRIR) database
int m_iHRIRLength; // Lnge der HRIRs (Anzahl Filterkoeffizienten)
float m_fHRIRDelay; // Anzahl Taps bis zur Mitte der HRIRs
double m_dSamplerate; // Abtastrate [Hz]
int m_iBlocklength; // Streaming-Blocklnge
ITADatasource* m_pdsInput; // Eingangs-seitige Datenquelle
ITADualCTCStreamfilter* m_psfFilter; // Streaming-Filter
std::vector<int> m_viSpeakerChannels; // Ausgabekanle der Lautsprecher auf der Audio-Hardware
float m_fc; // Schallgeschwindigkeit [m/s]
RG_LocalCS m_csHead; // Kopf-bezogenes Koordinatensystem
RG_LocalCS m_csSpeaker[2]; // Lautsprecher-bezogene Koordinatensysteme
int m_iCTCFilterLength; // Anzahl Filterkoeffizienten der Cancellation-Filter (Zeitbereich)
int m_iOrder; // Ordnung der CTC (Grte Potenz von K)
double m_dUpperLimitFrequency; // Obere Grenzfrequenz fr Tiefpassfilterung [Hz]
double m_dLatency; // Gesamtlatenz der CTC [s]
RG_Vector m_pvEarOffset[2]; // Versatz Kopf-Bezugspunkt -> Ohreingang (Links / Rechts)
float m_fL2SDistMin, m_fL2SDistMax; // Minimal-/Maximalabstand zu den Lautsprechern
int m_iLowpassDelay; // Verzgerung aufgrund des kausalen FIR-Tiefpasses [Samples]
int m_iFlexDelay; // TODO: Dokumentieren
int m_iOnset; // Onset der CTC-Filter (Zustzlicher Platz am Anfang)
std::