Make Create methods for structs with flexible array members ...

... that are used with unique_ptr.
This commit is contained in:
Chris Robinson
2019-01-08 23:44:08 -08:00
parent bc1eeb5df0
commit 673983dc5d
3 changed files with 19 additions and 8 deletions
+16 -6
View File
@@ -47,9 +47,17 @@ struct HrtfHandle {
HrtfEntry *entry{nullptr};
char filename[];
static std::unique_ptr<HrtfHandle> Create(size_t fname_len);
DEF_PLACE_NEWDEL()
};
std::unique_ptr<HrtfHandle> HrtfHandle::Create(size_t fname_len)
{
void *ptr{al_calloc(DEF_ALIGN, FAM_SIZE(HrtfHandle, filename, fname_len))};
return std::unique_ptr<HrtfHandle>{new (ptr) HrtfHandle{}};
}
namespace {
using HrtfHandlePtr = std::unique_ptr<HrtfHandle>;
@@ -273,6 +281,12 @@ void GetHrtfCoeffs(const HrtfEntry *Hrtf, ALfloat elevation, ALfloat azimuth, AL
}
std::unique_ptr<DirectHrtfState> DirectHrtfState::Create(ALsizei num_chans)
{
void *ptr{al_calloc(16, FAM_SIZE(DirectHrtfState, Chan, num_chans))};
return std::unique_ptr<DirectHrtfState>{new (ptr) DirectHrtfState{}};
}
void BuildBFormatHrtf(const HrtfEntry *Hrtf, DirectHrtfState *state, const ALsizei NumChannels, const AngularPoint *AmbiPoints, const ALfloat (*RESTRICT AmbiMatrix)[MAX_AMBI_COEFFS], const ALsizei AmbiCount, const ALfloat *RESTRICT AmbiOrderHFGain)
{
static constexpr int OrderFromChan[MAX_AMBI_COEFFS]{
@@ -980,9 +994,7 @@ void AddFileEntry(al::vector<EnumeratedHrtf> &list, const std::string &filename)
{
TRACE("Got new file \"%s\"\n", filename.c_str());
LoadedHrtfs.emplace_back(HrtfHandlePtr{new
(al_calloc(DEF_ALIGN, FAM_SIZE(HrtfHandle, filename, filename.length()+1)))
HrtfHandle{}});
LoadedHrtfs.emplace_back(HrtfHandle::Create(filename.length()+1));
loaded_entry = LoadedHrtfs.end()-1;
strcpy((*loaded_entry)->filename, filename.c_str());
}
@@ -1042,9 +1054,7 @@ void AddBuiltInEntry(al::vector<EnumeratedHrtf> &list, const std::string &filena
TRACE("Got new file \"%s\"\n", filename.c_str());
LoadedHrtfs.emplace_back(HrtfHandlePtr{new
(al_calloc(DEF_ALIGN, FAM_SIZE(HrtfHandle, filename, namelen)))
HrtfHandle{}});
LoadedHrtfs.emplace_back(HrtfHandle::Create(namelen));
loaded_entry = LoadedHrtfs.end()-1;
snprintf((*loaded_entry)->filename, namelen, "!%u_%s",
residx, filename.c_str());
+2
View File
@@ -1,6 +1,7 @@
#ifndef ALC_HRTF_H
#define ALC_HRTF_H
#include <memory>
#include <string>
#include "AL/al.h"
@@ -64,6 +65,7 @@ struct DirectHrtfState {
} Chan[];
DirectHrtfState() noexcept { }
static std::unique_ptr<DirectHrtfState> Create(ALsizei num_chans);
DEF_PLACE_NEWDEL()
};
+1 -2
View File
@@ -697,8 +697,7 @@ void InitHrtfPanning(ALCdevice *device)
count = static_cast<ALsizei>(COUNTOF(IndexMap));
}
device->mHrtfState.reset(
new (al_calloc(16, FAM_SIZE(DirectHrtfState, Chan, count))) DirectHrtfState{});
device->mHrtfState = DirectHrtfState::Create(count);
std::transform(std::begin(IndexMap), std::begin(IndexMap)+count, std::begin(device->Dry.AmbiMap),
[](const ALsizei &index) noexcept { return BFChannelConfig{1.0f, index}; }