Allocate device buffer when setting the channel counts

This commit is contained in:
Chris Robinson
2019-07-03 22:32:39 -07:00
parent 61ba455edd
commit 0a0704071a
2 changed files with 33 additions and 35 deletions
-18
View File
@@ -2008,24 +2008,6 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
device->Frequency, device->UpdateSize, device->BufferSize);
aluInitRenderer(device, hrtf_id, hrtf_appreq, hrtf_userreq);
TRACE("Channel config, Main: %u, Real: %u\n", device->Dry.NumChannels,
device->RealOut.NumChannels);
/* Allocate extra channels for any post-filter output. */
const ALuint num_chans{device->Dry.NumChannels + device->RealOut.NumChannels};
TRACE("Allocating %u channels, %zu bytes\n", num_chans,
num_chans*sizeof(device->MixBuffer[0]));
device->MixBuffer.resize(num_chans);
device->Dry.Buffer = device->MixBuffer.data();
if(device->RealOut.NumChannels != 0)
device->RealOut.Buffer = device->Dry.Buffer + device->Dry.NumChannels;
else
{
device->RealOut.Buffer = device->Dry.Buffer;
device->RealOut.NumChannels = device->Dry.NumChannels;
}
device->NumAuxSends = new_sends;
TRACE("Max sources: %d (%d + %d), effect slots: %d, sends: %d\n",
+33 -17
View File
@@ -106,6 +106,32 @@ inline const char *GetLabelFromChannel(Channel channel)
}
void AllocChannels(ALCdevice *device, const ALuint main_chans, const ALuint real_chans)
{
TRACE("Channel config, Main: %u, Real: %u\n", main_chans, real_chans);
/* Allocate extra channels for any post-filter output. */
const ALuint num_chans{main_chans + real_chans};
TRACE("Allocating %u channels, %zu bytes\n", num_chans,
num_chans*sizeof(device->MixBuffer[0]));
device->MixBuffer.resize(num_chans);
device->Dry.Buffer = device->MixBuffer.data();
device->Dry.NumChannels = main_chans;
if(real_chans != 0)
{
device->RealOut.Buffer = device->Dry.Buffer + device->Dry.NumChannels;
device->RealOut.NumChannels = real_chans;
}
else
{
device->RealOut.Buffer = device->Dry.Buffer;
device->RealOut.NumChannels = device->Dry.NumChannels;
}
}
struct ChannelMap {
Channel ChanName;
ALfloat Config[MAX_AMBI2D_CHANNELS];
@@ -380,7 +406,7 @@ void InitPanning(ALCdevice *device)
[&n3dscale](const ALsizei &acn) noexcept -> BFChannelConfig
{ return BFChannelConfig{1.0f/n3dscale[acn], acn}; }
);
device->Dry.NumChannels = static_cast<ALuint>(count);
AllocChannels(device, static_cast<ALuint>(count), 0);
ALfloat nfc_delay{ConfigValueFloat(devname, "decoder", "nfc-ref-delay").value_or(0.0f)};
if(nfc_delay > 0.0f)
@@ -390,8 +416,6 @@ void InitPanning(ALCdevice *device)
InitNearFieldCtrl(device, nfc_delay * SPEEDOFSOUNDMETRESPERSEC, device->mAmbiOrder,
chans_per_order);
}
device->RealOut.NumChannels = 0;
}
else
{
@@ -420,7 +444,7 @@ void InitPanning(ALCdevice *device)
std::begin(device->Dry.AmbiMap),
[](const ALsizei &index) noexcept { return BFChannelConfig{1.0f, index}; }
);
device->Dry.NumChannels = coeffcount;
AllocChannels(device, coeffcount, device->channelsFromFmt());
TRACE("Enabling %s-order%s ambisonic decoder\n",
(coeffcount > 5) ? "third" :
@@ -429,8 +453,6 @@ void InitPanning(ALCdevice *device)
);
device->AmbiDecoder = al::make_unique<BFormatDec>(coeffcount,
static_cast<ALsizei>(chanmap.size()), chancoeffs, idxmap);
device->RealOut.NumChannels = device->channelsFromFmt();
}
}
@@ -464,7 +486,7 @@ void InitCustomPanning(ALCdevice *device, bool hqdec, const AmbDecConf *conf, co
[](const ALsizei &index) noexcept { return BFChannelConfig{1.0f, index}; }
);
}
device->Dry.NumChannels = count;
AllocChannels(device, count, device->channelsFromFmt());
TRACE("Enabling %s-band %s-order%s ambisonic decoder\n",
(!hqdec || conf->FreqBands == 1) ? "single" : "dual",
@@ -475,8 +497,6 @@ void InitCustomPanning(ALCdevice *device, bool hqdec, const AmbDecConf *conf, co
device->AmbiDecoder = al::make_unique<BFormatDec>(conf, hqdec, count, device->Frequency,
speakermap);
device->RealOut.NumChannels = device->channelsFromFmt();
auto accum_spkr_dist = std::bind(std::plus<float>{}, _1,
std::bind(std::mem_fn(&AmbDecConf::SpeakerConf::Distance), _2));
const ALfloat avg_dist{
@@ -604,12 +624,10 @@ void InitHrtfPanning(ALCdevice *device)
std::begin(device->Dry.AmbiMap),
[](const ALsizei &index) noexcept { return BFChannelConfig{1.0f, index}; }
);
device->Dry.NumChannels = static_cast<ALuint>(count);
AllocChannels(device, static_cast<ALuint>(count), device->channelsFromFmt());
device->RealOut.NumChannels = device->channelsFromFmt();
BuildBFormatHrtf(device->mHrtf, device->mHrtfState.get(), device->Dry.NumChannels, AmbiPoints,
AmbiMatrix, al::size(AmbiPoints), AmbiOrderHFGain);
BuildBFormatHrtf(device->mHrtf, device->mHrtfState.get(), static_cast<ALuint>(count),
AmbiPoints, AmbiMatrix, al::size(AmbiPoints), AmbiOrderHFGain);
HrtfEntry *Hrtf{device->mHrtf};
InitNearFieldCtrl(device, Hrtf->field[0].distance, ambi_order, ChansPerOrder);
@@ -627,9 +645,7 @@ void InitUhjPanning(ALCdevice *device)
[](const ALsizei &acn) noexcept -> BFChannelConfig
{ return BFChannelConfig{1.0f/AmbiScale::FromFuMa[acn], acn}; }
);
device->Dry.NumChannels = count;
device->RealOut.NumChannels = device->channelsFromFmt();
AllocChannels(device, ALuint{count}, device->channelsFromFmt());
}
} // namespace