Add some preliminary fields for mix-time ambisonic upsampling

This commit is contained in:
Chris Robinson
2019-02-21 04:57:56 -08:00
parent 8ac2d34706
commit 169a11dffc
2 changed files with 23 additions and 4 deletions
+9 -4
View File
@@ -20,6 +20,7 @@
#include "logging.h"
#include "math_defs.h"
#include "filters/biquad.h"
#include "filters/splitter.h"
#include "filters/nfc.h"
#include "almalloc.h"
#include "alnumeric.h"
@@ -204,10 +205,11 @@ struct ALvoiceProps : public ALvoicePropsBase {
DEF_NEWDEL(ALvoiceProps)
};
#define VOICE_IS_STATIC (1<<0)
#define VOICE_IS_FADING (1<<1) /* Fading sources use gain stepping for smooth transitions. */
#define VOICE_HAS_HRTF (1<<2)
#define VOICE_HAS_NFC (1<<3)
#define VOICE_IS_STATIC (1u<<0)
#define VOICE_IS_FADING (1u<<1) /* Fading sources use gain stepping for smooth transitions. */
#define VOICE_IS_AMBISONIC (1u<<2) /* Voice needs HF scaling for ambisonic upsampling. */
#define VOICE_HAS_HRTF (1u<<3)
#define VOICE_HAS_NFC (1u<<4)
struct ALvoice {
std::atomic<ALvoiceProps*> Update{nullptr};
@@ -253,6 +255,9 @@ struct ALvoice {
InterpState ResampleState;
std::array<ALfloat,MAX_AMBI_ORDER+1> AmbiScales;
BandSplitter AmbiSplitter[MAX_INPUT_CHANNELS];
struct {
int FilterType;
DirectParams Params[MAX_INPUT_CHANNELS];
+14
View File
@@ -41,6 +41,7 @@
#include "alFilter.h"
#include "alAuxEffectSlot.h"
#include "ringbuffer.h"
#include "bformatdec.h"
#include "backends/base.h"
@@ -2828,6 +2829,19 @@ AL_API ALvoid AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources)
voice->Flags = start_fading ? VOICE_IS_FADING : 0;
if(source->SourceType == AL_STATIC) voice->Flags |= VOICE_IS_STATIC;
/* Don't need to set the VOICE_IS_AMBISONIC flag if the device is
* mixing in first order. No HF scaling is necessary to mix it.
*/
if(((*buffer)->mFmtChannels == FmtBFormat2D || (*buffer)->mFmtChannels == FmtBFormat3D) &&
device->mAmbiOrder > 1)
{
voice->AmbiScales = AmbiUpsampler::GetHFOrderScales(1, device->mAmbiOrder);
voice->AmbiSplitter[0].init(400.0f / static_cast<ALfloat>(device->Frequency));
for(ALsizei i{1};i < voice->NumChannels;++i)
voice->AmbiSplitter[i] = voice->AmbiSplitter[0];
voice->Flags |= VOICE_IS_AMBISONIC;
}
std::fill_n(std::begin(voice->Direct.Params), voice->NumChannels, DirectParams{});
std::for_each(voice->Send.begin(), voice->Send.end(),
[voice](ALvoice::SendData &send) -> void