1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
/*############################################################################*/
/*# #*/
/*# Ambisonic C++ Library #*/
/*# CAmbisonicBinauralizer - Ambisonic Binauralizer #*/
/*# Copyright © 2007 Aristotel Digenis #*/
/*# Copyright © 2017 Videolabs #*/
/*# #*/
/*# Filename: AmbisonicBinauralizer.h #*/
/*# Version: 0.2 #*/
/*# Date: 19/05/2007 #*/
/*# Author(s): Aristotel Digenis, Peter Stitt #*/
/*# Licence: LGPL #*/
/*# #*/
/*############################################################################*/
#ifndef _AMBISONIC_BINAURALIZER_H
#define _AMBISONIC_BINAURALIZER_H
#include <string>
#include <vector>
#include "AmbisonicDecoder.h"
#include "AmbisonicEncoder.h"
#include "kiss_fftr.h"
#include "mit_hrtf.h"
#include "sofa_hrtf.h"
/// Ambisonic binauralizer
/** B-Format to binaural decoder. */
class CAmbisonicBinauralizer : public CAmbisonicBase
{
public:
CAmbisonicBinauralizer();
/**
Re-create the object for the given configuration. Previous data is
lost. The tailLength variable it updated with the number of taps
used for the processing, and this can be used to offset the delay
this causes. The function returns true if the call is successful.
*/
virtual bool Configure(unsigned nOrder,
bool b3D,
unsigned nSampleRate,
unsigned nBlockSize,
unsigned& tailLength,
std::string HRTFPath = "");
/**
Resets members.
*/
virtual void Reset();
/**
Refreshes coefficients.
*/
virtual void Refresh();
/**
Decode B-Format to binaural feeds. There is no arguement for the number
of samples to process, as this is determined by the nBlockSize argument
in the constructor and Configure() function. It is the responsibility of
program using this library to handle the blocks of the signal by FIFO
buffers or other means.
*/
void Process(CBFormat* pBFSrc, float** ppfDst);
protected:
CAmbisonicDecoder m_AmbDecoder;
unsigned m_nBlockSize;
unsigned m_nTaps;
unsigned m_nFFTSize;
unsigned m_nFFTBins;
float m_fFFTScaler;
unsigned m_nOverlapLength;
std::unique_ptr<struct kiss_fftr_state, decltype(&kiss_fftr_free)> m_pFFT_cfg;
std::unique_ptr<struct kiss_fftr_state, decltype(&kiss_fftr_free)> m_pIFFT_cfg;
std::vector<std::unique_ptr<kiss_fft_cpx[]>> m_ppcpFilters[2];
std::unique_ptr<kiss_fft_cpx[]> m_pcpScratch;
std::vector<float> m_pfScratchBufferA;
std::vector<float> m_pfScratchBufferB;
std::vector<float> m_pfScratchBufferC;
std::vector<float> m_pfOverlap[2];
HRTF *getHRTF(unsigned nSampleRate, std::string HRTFPath);
virtual void ArrangeSpeakers();
virtual void AllocateBuffers();
};
#endif // _AMBISONIC_BINAURALIZER_H
|