Use an intrusive_ptr for the device's HrtfStore
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user