Use an intrusive_ptr for the device's HrtfStore

This commit is contained in:
Chris Robinson
2020-03-01 17:16:09 -08:00
parent a01617904c
commit 3e1a2c0f77
6 changed files with 23 additions and 30 deletions
-2
View File
@@ -2447,8 +2447,6 @@ ALCdevice::~ALCdevice()
if(count > 0)
WARN("%zu Filter%s not deleted\n", count, (count==1)?"":"s");
if(mHrtf)
mHrtf->DecRef();
mHrtf = nullptr;
auto *oldarray = mContexts.exchange(nullptr, std::memory_order_relaxed);
+1 -1
View File
@@ -304,7 +304,7 @@ struct ALCdevice : public al::intrusive_ref<ALCdevice> {
/* HRTF state and info */
std::unique_ptr<DirectHrtfState> mHrtfState;
HrtfStore *mHrtf{nullptr};
al::intrusive_ptr<HrtfStore> mHrtf;
/* Ambisonic-to-UHJ encoder */
std::unique_ptr<Uhj2Encoder> Uhj_Encoder;
+2 -2
View File
@@ -1007,7 +1007,7 @@ void CalcPanningAndFilters(ALvoice *voice, const ALfloat xpos, const ALfloat ypo
/* Get the HRIR coefficients and delays just once, for the given
* source direction.
*/
GetHrtfCoeffs(Device->mHrtf, ev, az, Distance, Spread,
GetHrtfCoeffs(Device->mHrtf.get(), ev, az, Distance, Spread,
voice->mChans[0].mDryParams.Hrtf.Target.Coeffs,
voice->mChans[0].mDryParams.Hrtf.Target.Delay);
voice->mChans[0].mDryParams.Hrtf.Target.Gain = DryGain.Base * downmix_gain;
@@ -1054,7 +1054,7 @@ void CalcPanningAndFilters(ALvoice *voice, const ALfloat xpos, const ALfloat ypo
/* Get the HRIR coefficients and delays for this channel
* position.
*/
GetHrtfCoeffs(Device->mHrtf, chans[c].elevation, chans[c].angle,
GetHrtfCoeffs(Device->mHrtf.get(), chans[c].elevation, chans[c].angle,
std::numeric_limits<float>::infinity(), Spread,
voice->mChans[c].mDryParams.Hrtf.Target.Coeffs,
voice->mChans[c].mDryParams.Hrtf.Target.Delay);
+8 -8
View File
@@ -1355,7 +1355,7 @@ al::vector<std::string> EnumerateHrtf(const char *devname)
return list;
}
HrtfStore *GetLoadedHrtf(const std::string &name, const char *devname, const ALuint devrate)
HrtfStorePtr GetLoadedHrtf(const std::string &name, const char *devname, const ALuint devrate)
{
std::lock_guard<std::mutex> _{EnumeratedHrtfLock};
auto entry_iter = std::find_if(EnumeratedHrtfs.cbegin(), EnumeratedHrtfs.cend(),
@@ -1374,8 +1374,8 @@ HrtfStore *GetLoadedHrtf(const std::string &name, const char *devname, const ALu
HrtfStore *hrtf{handle->mEntry.get()};
if(hrtf && hrtf->sampleRate == devrate)
{
hrtf->IncRef();
return hrtf;
hrtf->add_ref();
return HrtfStorePtr{hrtf};
}
++handle;
}
@@ -1519,20 +1519,20 @@ HrtfStore *GetLoadedHrtf(const std::string &name, const char *devname, const ALu
hrtf->sampleRate, hrtf->irSize);
handle = LoadedHrtfs.emplace(handle, LoadedHrtf{fname, std::move(hrtf)});
return handle->mEntry.get();
return HrtfStorePtr{handle->mEntry.get()};
}
void HrtfStore::IncRef()
void HrtfStore::add_ref()
{
auto ref = IncrementRef(mRef);
TRACE("HrtfEntry %p increasing refcount to %u\n", decltype(std::declval<void*>()){this}, ref);
TRACE("HrtfStore %p increasing refcount to %u\n", decltype(std::declval<void*>()){this}, ref);
}
void HrtfStore::DecRef()
void HrtfStore::release()
{
auto ref = DecrementRef(mRef);
TRACE("HrtfEntry %p decreasing refcount to %u\n", decltype(std::declval<void*>()){this}, ref);
TRACE("HrtfStore %p decreasing refcount to %u\n", decltype(std::declval<void*>()){this}, ref);
if(ref == 0)
{
std::lock_guard<std::mutex> _{LoadedHrtfLock};
+5 -3
View File
@@ -12,6 +12,7 @@
#include "alspan.h"
#include "ambidefs.h"
#include "atomic.h"
#include "intrusive_ptr.h"
#include "vector.h"
@@ -54,11 +55,12 @@ struct HrtfStore {
const HrirArray *coeffs;
const ubyte2 *delays;
void IncRef();
void DecRef();
void add_ref();
void release();
DEF_PLACE_NEWDEL()
};
using HrtfStorePtr = al::intrusive_ptr<HrtfStore>;
struct HrtfFilter {
@@ -88,7 +90,7 @@ struct AngularPoint {
al::vector<std::string> EnumerateHrtf(const char *devname);
HrtfStore *GetLoadedHrtf(const std::string &name, const char *devname, const ALuint devrate);
HrtfStorePtr GetLoadedHrtf(const std::string &name, const char *devname, const ALuint devrate);
void GetHrtfCoeffs(const HrtfStore *Hrtf, float elevation, float azimuth, float distance,
float spread, HrirArray &coeffs, const al::span<ALuint,2> delays);
+7 -14
View File
@@ -659,10 +659,9 @@ void InitHrtfPanning(ALCdevice *device)
);
AllocChannels(device, static_cast<ALuint>(count), device->channelsFromFmt());
BuildBFormatHrtf(device->mHrtf, device->mHrtfState.get(), AmbiPoints, AmbiMatrix,
AmbiOrderHFGain);
HrtfStore *Hrtf{device->mHrtf.get()};
BuildBFormatHrtf(Hrtf, device->mHrtfState.get(), AmbiPoints, AmbiMatrix, AmbiOrderHFGain);
HrtfStore *Hrtf{device->mHrtf};
InitNearFieldCtrl(device, Hrtf->field[0].distance, ambi_order, true);
}
@@ -686,7 +685,7 @@ void InitUhjPanning(ALCdevice *device)
void aluInitRenderer(ALCdevice *device, ALint hrtf_id, HrtfRequestMode hrtf_appreq, HrtfRequestMode hrtf_userreq)
{
/* Hold the HRTF the device last used, in case it's used again. */
HrtfStore *old_hrtf{device->mHrtf};
HrtfStorePtr old_hrtf{std::move(device->mHrtf)};
device->mHrtfState = nullptr;
device->mHrtf = nullptr;
@@ -695,8 +694,6 @@ void aluInitRenderer(ALCdevice *device, ALint hrtf_id, HrtfRequestMode hrtf_appr
if(device->FmtChans != DevFmtStereo)
{
if(old_hrtf)
old_hrtf->DecRef();
old_hrtf = nullptr;
if(hrtf_appreq == Hrtf_Enable)
device->HrtfStatus = ALC_HRTF_UNSUPPORTED_FORMAT_SOFT;
@@ -792,9 +789,9 @@ void aluInitRenderer(ALCdevice *device, ALint hrtf_id, HrtfRequestMode hrtf_appr
{
const char *devname{device->DeviceName.c_str()};
const std::string &hrtfname = device->HrtfList[static_cast<ALuint>(hrtf_id)];
if(HrtfStore *hrtf{GetLoadedHrtf(hrtfname, devname, device->Frequency)})
if(HrtfStorePtr hrtf{GetLoadedHrtf(hrtfname, devname, device->Frequency)})
{
device->mHrtf = hrtf;
device->mHrtf = std::move(hrtf);
device->HrtfName = hrtfname;
}
}
@@ -804,9 +801,9 @@ void aluInitRenderer(ALCdevice *device, ALint hrtf_id, HrtfRequestMode hrtf_appr
const char *devname{device->DeviceName.c_str()};
auto find_hrtf = [device,devname](const std::string &hrtfname) -> bool
{
HrtfStore *hrtf{GetLoadedHrtf(hrtfname, devname, device->Frequency)};
HrtfStorePtr hrtf{GetLoadedHrtf(hrtfname, devname, device->Frequency)};
if(!hrtf) return false;
device->mHrtf = hrtf;
device->mHrtf = std::move(hrtf);
device->HrtfName = hrtfname;
return true;
};
@@ -815,8 +812,6 @@ void aluInitRenderer(ALCdevice *device, ALint hrtf_id, HrtfRequestMode hrtf_appr
if(device->mHrtf)
{
if(old_hrtf)
old_hrtf->DecRef();
old_hrtf = nullptr;
InitHrtfPanning(device);
@@ -826,8 +821,6 @@ void aluInitRenderer(ALCdevice *device, ALint hrtf_id, HrtfRequestMode hrtf_appr
device->HrtfStatus = ALC_HRTF_UNSUPPORTED_FORMAT_SOFT;
no_hrtf:
if(old_hrtf)
old_hrtf->DecRef();
old_hrtf = nullptr;
device->mRenderMode = StereoPair;