🛠️🐜 Antkeeper superbuild with dependencies included https://antkeeper.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1462 lines
49 KiB

  1. #include "config.h"
  2. #include "hrtf.h"
  3. #include <algorithm>
  4. #include <array>
  5. #include <cassert>
  6. #include <cctype>
  7. #include <cmath>
  8. #include <cstdint>
  9. #include <cstdio>
  10. #include <cstring>
  11. #include <fstream>
  12. #include <iterator>
  13. #include <memory>
  14. #include <mutex>
  15. #include <numeric>
  16. #include <type_traits>
  17. #include <utility>
  18. #include "albit.h"
  19. #include "albyte.h"
  20. #include "alfstream.h"
  21. #include "almalloc.h"
  22. #include "alnumbers.h"
  23. #include "alnumeric.h"
  24. #include "aloptional.h"
  25. #include "alspan.h"
  26. #include "ambidefs.h"
  27. #include "filters/splitter.h"
  28. #include "helpers.h"
  29. #include "logging.h"
  30. #include "mixer/hrtfdefs.h"
  31. #include "opthelpers.h"
  32. #include "polyphase_resampler.h"
  33. #include "vector.h"
  34. namespace {
  35. struct HrtfEntry {
  36. std::string mDispName;
  37. std::string mFilename;
  38. };
  39. struct LoadedHrtf {
  40. std::string mFilename;
  41. std::unique_ptr<HrtfStore> mEntry;
  42. };
  43. /* Data set limits must be the same as or more flexible than those defined in
  44. * the makemhr utility.
  45. */
  46. constexpr uint MinFdCount{1};
  47. constexpr uint MaxFdCount{16};
  48. constexpr uint MinFdDistance{50};
  49. constexpr uint MaxFdDistance{2500};
  50. constexpr uint MinEvCount{5};
  51. constexpr uint MaxEvCount{181};
  52. constexpr uint MinAzCount{1};
  53. constexpr uint MaxAzCount{255};
  54. constexpr uint MaxHrirDelay{HrtfHistoryLength - 1};
  55. constexpr uint HrirDelayFracBits{2};
  56. constexpr uint HrirDelayFracOne{1 << HrirDelayFracBits};
  57. constexpr uint HrirDelayFracHalf{HrirDelayFracOne >> 1};
  58. static_assert(MaxHrirDelay*HrirDelayFracOne < 256, "MAX_HRIR_DELAY or DELAY_FRAC too large");
  59. constexpr char magicMarker00[8]{'M','i','n','P','H','R','0','0'};
  60. constexpr char magicMarker01[8]{'M','i','n','P','H','R','0','1'};
  61. constexpr char magicMarker02[8]{'M','i','n','P','H','R','0','2'};
  62. constexpr char magicMarker03[8]{'M','i','n','P','H','R','0','3'};
  63. /* First value for pass-through coefficients (remaining are 0), used for omni-
  64. * directional sounds. */
  65. constexpr auto PassthruCoeff = static_cast<float>(1.0/al::numbers::sqrt2);
  66. std::mutex LoadedHrtfLock;
  67. al::vector<LoadedHrtf> LoadedHrtfs;
  68. std::mutex EnumeratedHrtfLock;
  69. al::vector<HrtfEntry> EnumeratedHrtfs;
  70. class databuf final : public std::streambuf {
  71. int_type underflow() override
  72. { return traits_type::eof(); }
  73. pos_type seekoff(off_type offset, std::ios_base::seekdir whence, std::ios_base::openmode mode) override
  74. {
  75. if((mode&std::ios_base::out) || !(mode&std::ios_base::in))
  76. return traits_type::eof();
  77. char_type *cur;
  78. switch(whence)
  79. {
  80. case std::ios_base::beg:
  81. if(offset < 0 || offset > egptr()-eback())
  82. return traits_type::eof();
  83. cur = eback() + offset;
  84. break;
  85. case std::ios_base::cur:
  86. if((offset >= 0 && offset > egptr()-gptr()) ||
  87. (offset < 0 && -offset > gptr()-eback()))
  88. return traits_type::eof();
  89. cur = gptr() + offset;
  90. break;
  91. case std::ios_base::end:
  92. if(offset > 0 || -offset > egptr()-eback())
  93. return traits_type::eof();
  94. cur = egptr() + offset;
  95. break;
  96. default:
  97. return traits_type::eof();
  98. }
  99. setg(eback(), cur, egptr());
  100. return cur - eback();
  101. }
  102. pos_type seekpos(pos_type pos, std::ios_base::openmode mode) override
  103. {
  104. // Simplified version of seekoff
  105. if((mode&std::ios_base::out) || !(mode&std::ios_base::in))
  106. return traits_type::eof();
  107. if(pos < 0 || pos > egptr()-eback())
  108. return traits_type::eof();
  109. setg(eback(), eback() + static_cast<size_t>(pos), egptr());
  110. return pos;
  111. }
  112. public:
  113. databuf(const char_type *start_, const char_type *end_) noexcept
  114. {
  115. setg(const_cast<char_type*>(start_), const_cast<char_type*>(start_),
  116. const_cast<char_type*>(end_));
  117. }
  118. };
  119. class idstream final : public std::istream {
  120. databuf mStreamBuf;
  121. public:
  122. idstream(const char *start_, const char *end_)
  123. : std::istream{nullptr}, mStreamBuf{start_, end_}
  124. { init(&mStreamBuf); }
  125. };
  126. struct IdxBlend { uint idx; float blend; };
  127. /* Calculate the elevation index given the polar elevation in radians. This
  128. * will return an index between 0 and (evcount - 1).
  129. */
  130. IdxBlend CalcEvIndex(uint evcount, float ev)
  131. {
  132. ev = (al::numbers::pi_v<float>*0.5f + ev) * static_cast<float>(evcount-1) /
  133. al::numbers::pi_v<float>;
  134. uint idx{float2uint(ev)};
  135. return IdxBlend{minu(idx, evcount-1), ev-static_cast<float>(idx)};
  136. }
  137. /* Calculate the azimuth index given the polar azimuth in radians. This will
  138. * return an index between 0 and (azcount - 1).
  139. */
  140. IdxBlend CalcAzIndex(uint azcount, float az)
  141. {
  142. az = (al::numbers::pi_v<float>*2.0f + az) * static_cast<float>(azcount) /
  143. (al::numbers::pi_v<float>*2.0f);
  144. uint idx{float2uint(az)};
  145. return IdxBlend{idx%azcount, az-static_cast<float>(idx)};
  146. }
  147. } // namespace
  148. /* Calculates static HRIR coefficients and delays for the given polar elevation
  149. * and azimuth in radians. The coefficients are normalized.
  150. */
  151. void GetHrtfCoeffs(const HrtfStore *Hrtf, float elevation, float azimuth, float distance,
  152. float spread, HrirArray &coeffs, const al::span<uint,2> delays)
  153. {
  154. const float dirfact{1.0f - (al::numbers::inv_pi_v<float>/2.0f * spread)};
  155. const auto *field = Hrtf->field;
  156. const auto *field_end = field + Hrtf->fdCount-1;
  157. size_t ebase{0};
  158. while(distance < field->distance && field != field_end)
  159. {
  160. ebase += field->evCount;
  161. ++field;
  162. }
  163. /* Calculate the elevation indices. */
  164. const auto elev0 = CalcEvIndex(field->evCount, elevation);
  165. const size_t elev1_idx{minu(elev0.idx+1, field->evCount-1)};
  166. const size_t ir0offset{Hrtf->elev[ebase + elev0.idx].irOffset};
  167. const size_t ir1offset{Hrtf->elev[ebase + elev1_idx].irOffset};
  168. /* Calculate azimuth indices. */
  169. const auto az0 = CalcAzIndex(Hrtf->elev[ebase + elev0.idx].azCount, azimuth);
  170. const auto az1 = CalcAzIndex(Hrtf->elev[ebase + elev1_idx].azCount, azimuth);
  171. /* Calculate the HRIR indices to blend. */
  172. const size_t idx[4]{
  173. ir0offset + az0.idx,
  174. ir0offset + ((az0.idx+1) % Hrtf->elev[ebase + elev0.idx].azCount),
  175. ir1offset + az1.idx,
  176. ir1offset + ((az1.idx+1) % Hrtf->elev[ebase + elev1_idx].azCount)
  177. };
  178. /* Calculate bilinear blending weights, attenuated according to the
  179. * directional panning factor.
  180. */
  181. const float blend[4]{
  182. (1.0f-elev0.blend) * (1.0f-az0.blend) * dirfact,
  183. (1.0f-elev0.blend) * ( az0.blend) * dirfact,
  184. ( elev0.blend) * (1.0f-az1.blend) * dirfact,
  185. ( elev0.blend) * ( az1.blend) * dirfact
  186. };
  187. /* Calculate the blended HRIR delays. */
  188. float d{Hrtf->delays[idx[0]][0]*blend[0] + Hrtf->delays[idx[1]][0]*blend[1] +
  189. Hrtf->delays[idx[2]][0]*blend[2] + Hrtf->delays[idx[3]][0]*blend[3]};
  190. delays[0] = fastf2u(d * float{1.0f/HrirDelayFracOne});
  191. d = Hrtf->delays[idx[0]][1]*blend[0] + Hrtf->delays[idx[1]][1]*blend[1] +
  192. Hrtf->delays[idx[2]][1]*blend[2] + Hrtf->delays[idx[3]][1]*blend[3];
  193. delays[1] = fastf2u(d * float{1.0f/HrirDelayFracOne});
  194. /* Calculate the blended HRIR coefficients. */
  195. float *coeffout{al::assume_aligned<16>(&coeffs[0][0])};
  196. coeffout[0] = PassthruCoeff * (1.0f-dirfact);
  197. coeffout[1] = PassthruCoeff * (1.0f-dirfact);
  198. std::fill_n(coeffout+2, size_t{HrirLength-1}*2, 0.0f);
  199. for(size_t c{0};c < 4;c++)
  200. {
  201. const float *srccoeffs{al::assume_aligned<16>(Hrtf->coeffs[idx[c]][0].data())};
  202. const float mult{blend[c]};
  203. auto blend_coeffs = [mult](const float src, const float coeff) noexcept -> float
  204. { return src*mult + coeff; };
  205. std::transform(srccoeffs, srccoeffs + HrirLength*2, coeffout, coeffout, blend_coeffs);
  206. }
  207. }
  208. std::unique_ptr<DirectHrtfState> DirectHrtfState::Create(size_t num_chans)
  209. { return std::unique_ptr<DirectHrtfState>{new(FamCount(num_chans)) DirectHrtfState{num_chans}}; }
  210. void DirectHrtfState::build(const HrtfStore *Hrtf, const uint irSize,
  211. const al::span<const AngularPoint> AmbiPoints, const float (*AmbiMatrix)[MaxAmbiChannels],
  212. const float XOverFreq, const al::span<const float,MaxAmbiOrder+1> AmbiOrderHFGain)
  213. {
  214. using double2 = std::array<double,2>;
  215. struct ImpulseResponse {
  216. const ConstHrirSpan hrir;
  217. uint ldelay, rdelay;
  218. };
  219. const double xover_norm{double{XOverFreq} / Hrtf->sampleRate};
  220. for(size_t i{0};i < mChannels.size();++i)
  221. {
  222. const size_t order{AmbiIndex::OrderFromChannel()[i]};
  223. mChannels[i].mSplitter.init(static_cast<float>(xover_norm));
  224. mChannels[i].mHfScale = AmbiOrderHFGain[order];
  225. }
  226. uint min_delay{HrtfHistoryLength*HrirDelayFracOne}, max_delay{0};
  227. al::vector<ImpulseResponse> impres; impres.reserve(AmbiPoints.size());
  228. auto calc_res = [Hrtf,&max_delay,&min_delay](const AngularPoint &pt) -> ImpulseResponse
  229. {
  230. auto &field = Hrtf->field[0];
  231. const auto elev0 = CalcEvIndex(field.evCount, pt.Elev.value);
  232. const size_t elev1_idx{minu(elev0.idx+1, field.evCount-1)};
  233. const size_t ir0offset{Hrtf->elev[elev0.idx].irOffset};
  234. const size_t ir1offset{Hrtf->elev[elev1_idx].irOffset};
  235. const auto az0 = CalcAzIndex(Hrtf->elev[elev0.idx].azCount, pt.Azim.value);
  236. const auto az1 = CalcAzIndex(Hrtf->elev[elev1_idx].azCount, pt.Azim.value);
  237. const size_t idx[4]{
  238. ir0offset + az0.idx,
  239. ir0offset + ((az0.idx+1) % Hrtf->elev[elev0.idx].azCount),
  240. ir1offset + az1.idx,
  241. ir1offset + ((az1.idx+1) % Hrtf->elev[elev1_idx].azCount)
  242. };
  243. const std::array<double,4> blend{{
  244. (1.0-elev0.blend) * (1.0-az0.blend),
  245. (1.0-elev0.blend) * ( az0.blend),
  246. ( elev0.blend) * (1.0-az1.blend),
  247. ( elev0.blend) * ( az1.blend)
  248. }};
  249. /* The largest blend factor serves as the closest HRIR. */
  250. const size_t irOffset{idx[std::max_element(blend.begin(), blend.end()) - blend.begin()]};
  251. ImpulseResponse res{Hrtf->coeffs[irOffset],
  252. Hrtf->delays[irOffset][0], Hrtf->delays[irOffset][1]};
  253. min_delay = minu(min_delay, minu(res.ldelay, res.rdelay));
  254. max_delay = maxu(max_delay, maxu(res.ldelay, res.rdelay));
  255. return res;
  256. };
  257. std::transform(AmbiPoints.begin(), AmbiPoints.end(), std::back_inserter(impres), calc_res);
  258. auto hrir_delay_round = [](const uint d) noexcept -> uint
  259. { return (d+HrirDelayFracHalf) >> HrirDelayFracBits; };
  260. TRACE("Min delay: %.2f, max delay: %.2f, FIR length: %u\n",
  261. min_delay/double{HrirDelayFracOne}, max_delay/double{HrirDelayFracOne}, irSize);
  262. const bool per_hrir_min{mChannels.size() > AmbiChannelsFromOrder(1)};
  263. auto tmpres = al::vector<std::array<double2,HrirLength>>(mChannels.size());
  264. max_delay = 0;
  265. for(size_t c{0u};c < AmbiPoints.size();++c)
  266. {
  267. const ConstHrirSpan hrir{impres[c].hrir};
  268. const uint base_delay{per_hrir_min ? minu(impres[c].ldelay, impres[c].rdelay) : min_delay};
  269. const uint ldelay{hrir_delay_round(impres[c].ldelay - base_delay)};
  270. const uint rdelay{hrir_delay_round(impres[c].rdelay - base_delay)};
  271. max_delay = maxu(max_delay, maxu(impres[c].ldelay, impres[c].rdelay) - base_delay);
  272. for(size_t i{0u};i < mChannels.size();++i)
  273. {
  274. const double mult{AmbiMatrix[c][i]};
  275. const size_t numirs{HrirLength - maxz(ldelay, rdelay)};
  276. size_t lidx{ldelay}, ridx{rdelay};
  277. for(size_t j{0};j < numirs;++j)
  278. {
  279. tmpres[i][lidx++][0] += hrir[j][0] * mult;
  280. tmpres[i][ridx++][1] += hrir[j][1] * mult;
  281. }
  282. }
  283. }
  284. impres.clear();
  285. for(size_t i{0u};i < mChannels.size();++i)
  286. {
  287. auto copy_arr = [](const double2 &in) noexcept -> float2
  288. { return float2{{static_cast<float>(in[0]), static_cast<float>(in[1])}}; };
  289. std::transform(tmpres[i].cbegin(), tmpres[i].cend(), mChannels[i].mCoeffs.begin(),
  290. copy_arr);
  291. }
  292. tmpres.clear();
  293. const uint max_length{minu(hrir_delay_round(max_delay) + irSize, HrirLength)};
  294. TRACE("New max delay: %.2f, FIR length: %u\n", max_delay/double{HrirDelayFracOne},
  295. max_length);
  296. mIrSize = max_length;
  297. }
  298. namespace {
  299. std::unique_ptr<HrtfStore> CreateHrtfStore(uint rate, ushort irSize,
  300. const al::span<const HrtfStore::Field> fields,
  301. const al::span<const HrtfStore::Elevation> elevs, const HrirArray *coeffs,
  302. const ubyte2 *delays, const char *filename)
  303. {
  304. const size_t irCount{size_t{elevs.back().azCount} + elevs.back().irOffset};
  305. size_t total{sizeof(HrtfStore)};
  306. total = RoundUp(total, alignof(HrtfStore::Field)); /* Align for field infos */
  307. total += sizeof(std::declval<HrtfStore&>().field[0])*fields.size();
  308. total = RoundUp(total, alignof(HrtfStore::Elevation)); /* Align for elevation infos */
  309. total += sizeof(std::declval<HrtfStore&>().elev[0])*elevs.size();
  310. total = RoundUp(total, 16); /* Align for coefficients using SIMD */
  311. total += sizeof(std::declval<HrtfStore&>().coeffs[0])*irCount;
  312. total += sizeof(std::declval<HrtfStore&>().delays[0])*irCount;
  313. void *ptr{al_calloc(16, total)};
  314. std::unique_ptr<HrtfStore> Hrtf{al::construct_at(static_cast<HrtfStore*>(ptr))};
  315. if(!Hrtf)
  316. ERR("Out of memory allocating storage for %s.\n", filename);
  317. else
  318. {
  319. InitRef(Hrtf->mRef, 1u);
  320. Hrtf->sampleRate = rate;
  321. Hrtf->irSize = irSize;
  322. Hrtf->fdCount = static_cast<uint>(fields.size());
  323. /* Set up pointers to storage following the main HRTF struct. */
  324. char *base = reinterpret_cast<char*>(Hrtf.get());
  325. size_t offset{sizeof(HrtfStore)};
  326. offset = RoundUp(offset, alignof(HrtfStore::Field)); /* Align for field infos */
  327. auto field_ = reinterpret_cast<HrtfStore::Field*>(base + offset);
  328. offset += sizeof(field_[0])*fields.size();
  329. offset = RoundUp(offset, alignof(HrtfStore::Elevation)); /* Align for elevation infos */
  330. auto elev_ = reinterpret_cast<HrtfStore::Elevation*>(base + offset);
  331. offset += sizeof(elev_[0])*elevs.size();
  332. offset = RoundUp(offset, 16); /* Align for coefficients using SIMD */
  333. auto coeffs_ = reinterpret_cast<HrirArray*>(base + offset);
  334. offset += sizeof(coeffs_[0])*irCount;
  335. auto delays_ = reinterpret_cast<ubyte2*>(base + offset);
  336. offset += sizeof(delays_[0])*irCount;
  337. if(unlikely(offset != total))
  338. throw std::runtime_error{"HrtfStore allocation size mismatch"};
  339. /* Copy input data to storage. */
  340. std::uninitialized_copy(fields.cbegin(), fields.cend(), field_);
  341. std::uninitialized_copy(elevs.cbegin(), elevs.cend(), elev_);
  342. std::uninitialized_copy_n(coeffs, irCount, coeffs_);
  343. std::uninitialized_copy_n(delays, irCount, delays_);
  344. /* Finally, assign the storage pointers. */
  345. Hrtf->field = field_;
  346. Hrtf->elev = elev_;
  347. Hrtf->coeffs = coeffs_;
  348. Hrtf->delays = delays_;
  349. }
  350. return Hrtf;
  351. }
  352. void MirrorLeftHrirs(const al::span<const HrtfStore::Elevation> elevs, HrirArray *coeffs,
  353. ubyte2 *delays)
  354. {
  355. for(const auto &elev : elevs)
  356. {
  357. const ushort evoffset{elev.irOffset};
  358. const ushort azcount{elev.azCount};
  359. for(size_t j{0};j < azcount;j++)
  360. {
  361. const size_t lidx{evoffset + j};
  362. const size_t ridx{evoffset + ((azcount-j) % azcount)};
  363. const size_t irSize{coeffs[ridx].size()};
  364. for(size_t k{0};k < irSize;k++)
  365. coeffs[ridx][k][1] = coeffs[lidx][k][0];
  366. delays[ridx][1] = delays[lidx][0];
  367. }
  368. }
  369. }
  370. template<size_t num_bits, typename T>
  371. constexpr std::enable_if_t<std::is_signed<T>::value && num_bits < sizeof(T)*8,
  372. T> fixsign(T value) noexcept
  373. {
  374. constexpr auto signbit = static_cast<T>(1u << (num_bits-1));
  375. return static_cast<T>((value^signbit) - signbit);
  376. }
  377. template<size_t num_bits, typename T>
  378. constexpr std::enable_if_t<!std::is_signed<T>::value || num_bits == sizeof(T)*8,
  379. T> fixsign(T value) noexcept
  380. { return value; }
  381. template<typename T, size_t num_bits=sizeof(T)*8>
  382. inline std::enable_if_t<al::endian::native == al::endian::little,
  383. T> readle(std::istream &data)
  384. {
  385. static_assert((num_bits&7) == 0, "num_bits must be a multiple of 8");
  386. static_assert(num_bits <= sizeof(T)*8, "num_bits is too large for the type");
  387. T ret{};
  388. if(!data.read(reinterpret_cast<char*>(&ret), num_bits/8))
  389. return static_cast<T>(EOF);
  390. return fixsign<num_bits>(ret);
  391. }
  392. template<typename T, size_t num_bits=sizeof(T)*8>
  393. inline std::enable_if_t<al::endian::native == al::endian::big,
  394. T> readle(std::istream &data)
  395. {
  396. static_assert((num_bits&7) == 0, "num_bits must be a multiple of 8");
  397. static_assert(num_bits <= sizeof(T)*8, "num_bits is too large for the type");
  398. T ret{};
  399. al::byte b[sizeof(T)]{};
  400. if(!data.read(reinterpret_cast<char*>(b), num_bits/8))
  401. return static_cast<T>(EOF);
  402. std::reverse_copy(std::begin(b), std::end(b), reinterpret_cast<al::byte*>(&ret));
  403. return fixsign<num_bits>(ret);
  404. }
  405. template<>
  406. inline uint8_t readle<uint8_t,8>(std::istream &data)
  407. { return static_cast<uint8_t>(data.get()); }
  408. std::unique_ptr<HrtfStore> LoadHrtf00(std::istream &data, const char *filename)
  409. {
  410. uint rate{readle<uint32_t>(data)};
  411. ushort irCount{readle<uint16_t>(data)};
  412. ushort irSize{readle<uint16_t>(data)};
  413. ubyte evCount{readle<uint8_t>(data)};
  414. if(!data || data.eof())
  415. {
  416. ERR("Failed reading %s\n", filename);
  417. return nullptr;
  418. }
  419. if(irSize < MinIrLength || irSize > HrirLength)
  420. {
  421. ERR("Unsupported HRIR size, irSize=%d (%d to %d)\n", irSize, MinIrLength, HrirLength);
  422. return nullptr;
  423. }
  424. if(evCount < MinEvCount || evCount > MaxEvCount)
  425. {
  426. ERR("Unsupported elevation count: evCount=%d (%d to %d)\n",
  427. evCount, MinEvCount, MaxEvCount);
  428. return nullptr;
  429. }
  430. auto elevs = al::vector<HrtfStore::Elevation>(evCount);
  431. for(auto &elev : elevs)
  432. elev.irOffset = readle<uint16_t>(data);
  433. if(!data || data.eof())
  434. {
  435. ERR("Failed reading %s\n", filename);
  436. return nullptr;
  437. }
  438. for(size_t i{1};i < evCount;i++)
  439. {
  440. if(elevs[i].irOffset <= elevs[i-1].irOffset)
  441. {
  442. ERR("Invalid evOffset: evOffset[%zu]=%d (last=%d)\n", i, elevs[i].irOffset,
  443. elevs[i-1].irOffset);
  444. return nullptr;
  445. }
  446. }
  447. if(irCount <= elevs.back().irOffset)
  448. {
  449. ERR("Invalid evOffset: evOffset[%zu]=%d (irCount=%d)\n",
  450. elevs.size()-1, elevs.back().irOffset, irCount);
  451. return nullptr;
  452. }
  453. for(size_t i{1};i < evCount;i++)
  454. {
  455. elevs[i-1].azCount = static_cast<ushort>(elevs[i].irOffset - elevs[i-1].irOffset);
  456. if(elevs[i-1].azCount < MinAzCount || elevs[i-1].azCount > MaxAzCount)
  457. {
  458. ERR("Unsupported azimuth count: azCount[%zd]=%d (%d to %d)\n",
  459. i-1, elevs[i-1].azCount, MinAzCount, MaxAzCount);
  460. return nullptr;
  461. }
  462. }
  463. elevs.back().azCount = static_cast<ushort>(irCount - elevs.back().irOffset);
  464. if(elevs.back().azCount < MinAzCount || elevs.back().azCount > MaxAzCount)
  465. {
  466. ERR("Unsupported azimuth count: azCount[%zu]=%d (%d to %d)\n",
  467. elevs.size()-1, elevs.back().azCount, MinAzCount, MaxAzCount);
  468. return nullptr;
  469. }
  470. auto coeffs = al::vector<HrirArray>(irCount, HrirArray{});
  471. auto delays = al::vector<ubyte2>(irCount);
  472. for(auto &hrir : coeffs)
  473. {
  474. for(auto &val : al::span<float2>{hrir.data(), irSize})
  475. val[0] = readle<int16_t>(data) / 32768.0f;
  476. }
  477. for(auto &val : delays)
  478. val[0] = readle<uint8_t>(data);
  479. if(!data || data.eof())
  480. {
  481. ERR("Failed reading %s\n", filename);
  482. return nullptr;
  483. }
  484. for(size_t i{0};i < irCount;i++)
  485. {
  486. if(delays[i][0] > MaxHrirDelay)
  487. {
  488. ERR("Invalid delays[%zd]: %d (%d)\n", i, delays[i][0], MaxHrirDelay);
  489. return nullptr;
  490. }
  491. delays[i][0] <<= HrirDelayFracBits;
  492. }
  493. /* Mirror the left ear responses to the right ear. */
  494. MirrorLeftHrirs({elevs.data(), elevs.size()}, coeffs.data(), delays.data());
  495. const HrtfStore::Field field[1]{{0.0f, evCount}};
  496. return CreateHrtfStore(rate, irSize, field, {elevs.data(), elevs.size()}, coeffs.data(),
  497. delays.data(), filename);
  498. }
  499. std::unique_ptr<HrtfStore> LoadHrtf01(std::istream &data, const char *filename)
  500. {
  501. uint rate{readle<uint32_t>(data)};
  502. ushort irSize{readle<uint8_t>(data)};
  503. ubyte evCount{readle<uint8_t>(data)};
  504. if(!data || data.eof())
  505. {
  506. ERR("Failed reading %s\n", filename);
  507. return nullptr;
  508. }
  509. if(irSize < MinIrLength || irSize > HrirLength)
  510. {
  511. ERR("Unsupported HRIR size, irSize=%d (%d to %d)\n", irSize, MinIrLength, HrirLength);
  512. return nullptr;
  513. }
  514. if(evCount < MinEvCount || evCount > MaxEvCount)
  515. {
  516. ERR("Unsupported elevation count: evCount=%d (%d to %d)\n",
  517. evCount, MinEvCount, MaxEvCount);
  518. return nullptr;
  519. }
  520. auto elevs = al::vector<HrtfStore::Elevation>(evCount);
  521. for(auto &elev : elevs)
  522. elev.azCount = readle<uint8_t>(data);
  523. if(!data || data.eof())
  524. {
  525. ERR("Failed reading %s\n", filename);
  526. return nullptr;
  527. }
  528. for(size_t i{0};i < evCount;++i)
  529. {
  530. if(elevs[i].azCount < MinAzCount || elevs[i].azCount > MaxAzCount)
  531. {
  532. ERR("Unsupported azimuth count: azCount[%zd]=%d (%d to %d)\n", i, elevs[i].azCount,
  533. MinAzCount, MaxAzCount);
  534. return nullptr;
  535. }
  536. }
  537. elevs[0].irOffset = 0;
  538. for(size_t i{1};i < evCount;i++)
  539. elevs[i].irOffset = static_cast<ushort>(elevs[i-1].irOffset + elevs[i-1].azCount);
  540. const ushort irCount{static_cast<ushort>(elevs.back().irOffset + elevs.back().azCount)};
  541. auto coeffs = al::vector<HrirArray>(irCount, HrirArray{});
  542. auto delays = al::vector<ubyte2>(irCount);
  543. for(auto &hrir : coeffs)
  544. {
  545. for(auto &val : al::span<float2>{hrir.data(), irSize})
  546. val[0] = readle<int16_t>(data) / 32768.0f;
  547. }
  548. for(auto &val : delays)
  549. val[0] = readle<uint8_t>(data);
  550. if(!data || data.eof())
  551. {
  552. ERR("Failed reading %s\n", filename);
  553. return nullptr;
  554. }
  555. for(size_t i{0};i < irCount;i++)
  556. {
  557. if(delays[i][0] > MaxHrirDelay)
  558. {
  559. ERR("Invalid delays[%zd]: %d (%d)\n", i, delays[i][0], MaxHrirDelay);
  560. return nullptr;
  561. }
  562. delays[i][0] <<= HrirDelayFracBits;
  563. }
  564. /* Mirror the left ear responses to the right ear. */
  565. MirrorLeftHrirs({elevs.data(), elevs.size()}, coeffs.data(), delays.data());
  566. const HrtfStore::Field field[1]{{0.0f, evCount}};
  567. return CreateHrtfStore(rate, irSize, field, {elevs.data(), elevs.size()}, coeffs.data(),
  568. delays.data(), filename);
  569. }
  570. std::unique_ptr<HrtfStore> LoadHrtf02(std::istream &data, const char *filename)
  571. {
  572. constexpr ubyte SampleType_S16{0};
  573. constexpr ubyte SampleType_S24{1};
  574. constexpr ubyte ChanType_LeftOnly{0};
  575. constexpr ubyte ChanType_LeftRight{1};
  576. uint rate{readle<uint32_t>(data)};
  577. ubyte sampleType{readle<uint8_t>(data)};
  578. ubyte channelType{readle<uint8_t>(data)};
  579. ushort irSize{readle<uint8_t>(data)};
  580. ubyte fdCount{readle<uint8_t>(data)};
  581. if(!data || data.eof())
  582. {
  583. ERR("Failed reading %s\n", filename);
  584. return nullptr;
  585. }
  586. if(sampleType > SampleType_S24)
  587. {
  588. ERR("Unsupported sample type: %d\n", sampleType);
  589. return nullptr;
  590. }
  591. if(channelType > ChanType_LeftRight)
  592. {
  593. ERR("Unsupported channel type: %d\n", channelType);
  594. return nullptr;
  595. }
  596. if(irSize < MinIrLength || irSize > HrirLength)
  597. {
  598. ERR("Unsupported HRIR size, irSize=%d (%d to %d)\n", irSize, MinIrLength, HrirLength);
  599. return nullptr;
  600. }
  601. if(fdCount < 1 || fdCount > MaxFdCount)
  602. {
  603. ERR("Unsupported number of field-depths: fdCount=%d (%d to %d)\n", fdCount, MinFdCount,
  604. MaxFdCount);
  605. return nullptr;
  606. }
  607. auto fields = al::vector<HrtfStore::Field>(fdCount);
  608. auto elevs = al::vector<HrtfStore::Elevation>{};
  609. for(size_t f{0};f < fdCount;f++)
  610. {
  611. const ushort distance{readle<uint16_t>(data)};
  612. const ubyte evCount{readle<uint8_t>(data)};
  613. if(!data || data.eof())
  614. {
  615. ERR("Failed reading %s\n", filename);
  616. return nullptr;
  617. }
  618. if(distance < MinFdDistance || distance > MaxFdDistance)
  619. {
  620. ERR("Unsupported field distance[%zu]=%d (%d to %d millimeters)\n", f, distance,
  621. MinFdDistance, MaxFdDistance);
  622. return nullptr;
  623. }
  624. if(evCount < MinEvCount || evCount > MaxEvCount)
  625. {
  626. ERR("Unsupported elevation count: evCount[%zu]=%d (%d to %d)\n", f, evCount,
  627. MinEvCount, MaxEvCount);
  628. return nullptr;
  629. }
  630. fields[f].distance = distance / 1000.0f;
  631. fields[f].evCount = evCount;
  632. if(f > 0 && fields[f].distance <= fields[f-1].distance)
  633. {
  634. ERR("Field distance[%zu] is not after previous (%f > %f)\n", f, fields[f].distance,
  635. fields[f-1].distance);
  636. return nullptr;
  637. }
  638. const size_t ebase{elevs.size()};
  639. elevs.resize(ebase + evCount);
  640. for(auto &elev : al::span<HrtfStore::Elevation>(elevs.data()+ebase, evCount))
  641. elev.azCount = readle<uint8_t>(data);
  642. if(!data || data.eof())
  643. {
  644. ERR("Failed reading %s\n", filename);
  645. return nullptr;
  646. }
  647. for(size_t e{0};e < evCount;e++)
  648. {
  649. if(elevs[ebase+e].azCount < MinAzCount || elevs[ebase+e].azCount > MaxAzCount)
  650. {
  651. ERR("Unsupported azimuth count: azCount[%zu][%zu]=%d (%d to %d)\n", f, e,
  652. elevs[ebase+e].azCount, MinAzCount, MaxAzCount);
  653. return nullptr;
  654. }
  655. }
  656. }
  657. elevs[0].irOffset = 0;
  658. std::partial_sum(elevs.cbegin(), elevs.cend(), elevs.begin(),
  659. [](const HrtfStore::Elevation &last, const HrtfStore::Elevation &cur)
  660. -> HrtfStore::Elevation
  661. {
  662. return HrtfStore::Elevation{cur.azCount,
  663. static_cast<ushort>(last.azCount + last.irOffset)};
  664. });
  665. const auto irTotal = static_cast<ushort>(elevs.back().azCount + elevs.back().irOffset);
  666. auto coeffs = al::vector<HrirArray>(irTotal, HrirArray{});
  667. auto delays = al::vector<ubyte2>(irTotal);
  668. if(channelType == ChanType_LeftOnly)
  669. {
  670. if(sampleType == SampleType_S16)
  671. {
  672. for(auto &hrir : coeffs)
  673. {
  674. for(auto &val : al::span<float2>{hrir.data(), irSize})
  675. val[0] = readle<int16_t>(data) / 32768.0f;
  676. }
  677. }
  678. else if(sampleType == SampleType_S24)
  679. {
  680. for(auto &hrir : coeffs)
  681. {
  682. for(auto &val : al::span<float2>{hrir.data(), irSize})
  683. val[0] = static_cast<float>(readle<int,24>(data)) / 8388608.0f;
  684. }
  685. }
  686. for(auto &val : delays)
  687. val[0] = readle<uint8_t>(data);
  688. if(!data || data.eof())
  689. {
  690. ERR("Failed reading %s\n", filename);
  691. return nullptr;
  692. }
  693. for(size_t i{0};i < irTotal;++i)
  694. {
  695. if(delays[i][0] > MaxHrirDelay)
  696. {
  697. ERR("Invalid delays[%zu][0]: %d (%d)\n", i, delays[i][0], MaxHrirDelay);
  698. return nullptr;
  699. }
  700. delays[i][0] <<= HrirDelayFracBits;
  701. }
  702. /* Mirror the left ear responses to the right ear. */
  703. MirrorLeftHrirs({elevs.data(), elevs.size()}, coeffs.data(), delays.data());
  704. }
  705. else if(channelType == ChanType_LeftRight)
  706. {
  707. if(sampleType == SampleType_S16)
  708. {
  709. for(auto &hrir : coeffs)
  710. {
  711. for(auto &val : al::span<float2>{hrir.data(), irSize})
  712. {
  713. val[0] = readle<int16_t>(data) / 32768.0f;
  714. val[1] = readle<int16_t>(data) / 32768.0f;
  715. }
  716. }
  717. }
  718. else if(sampleType == SampleType_S24)
  719. {
  720. for(auto &hrir : coeffs)
  721. {
  722. for(auto &val : al::span<float2>{hrir.data(), irSize})
  723. {
  724. val[0] = static_cast<float>(readle<int,24>(data)) / 8388608.0f;
  725. val[1] = static_cast<float>(readle<int,24>(data)) / 8388608.0f;
  726. }
  727. }
  728. }
  729. for(auto &val : delays)
  730. {
  731. val[0] = readle<uint8_t>(data);
  732. val[1] = readle<uint8_t>(data);
  733. }
  734. if(!data || data.eof())
  735. {
  736. ERR("Failed reading %s\n", filename);
  737. return nullptr;
  738. }
  739. for(size_t i{0};i < irTotal;++i)
  740. {
  741. if(delays[i][0] > MaxHrirDelay)
  742. {
  743. ERR("Invalid delays[%zu][0]: %d (%d)\n", i, delays[i][0], MaxHrirDelay);
  744. return nullptr;
  745. }
  746. if(delays[i][1] > MaxHrirDelay)
  747. {
  748. ERR("Invalid delays[%zu][1]: %d (%d)\n", i, delays[i][1], MaxHrirDelay);
  749. return nullptr;
  750. }
  751. delays[i][0] <<= HrirDelayFracBits;
  752. delays[i][1] <<= HrirDelayFracBits;
  753. }
  754. }
  755. if(fdCount > 1)
  756. {
  757. auto fields_ = al::vector<HrtfStore::Field>(fields.size());
  758. auto elevs_ = al::vector<HrtfStore::Elevation>(elevs.size());
  759. auto coeffs_ = al::vector<HrirArray>(coeffs.size());
  760. auto delays_ = al::vector<ubyte2>(delays.size());
  761. /* Simple reverse for the per-field elements. */
  762. std::reverse_copy(fields.cbegin(), fields.cend(), fields_.begin());
  763. /* Each field has a group of elevations, which each have an azimuth
  764. * count. Reverse the order of the groups, keeping the relative order
  765. * of per-group azimuth counts.
  766. */
  767. auto elevs__end = elevs_.end();
  768. auto copy_azs = [&elevs,&elevs__end](const ptrdiff_t ebase, const HrtfStore::Field &field)
  769. -> ptrdiff_t
  770. {
  771. auto elevs_src = elevs.begin()+ebase;
  772. elevs__end = std::copy_backward(elevs_src, elevs_src+field.evCount, elevs__end);
  773. return ebase + field.evCount;
  774. };
  775. (void)std::accumulate(fields.cbegin(), fields.cend(), ptrdiff_t{0}, copy_azs);
  776. assert(elevs_.begin() == elevs__end);
  777. /* Reestablish the IR offset for each elevation index, given the new
  778. * ordering of elevations.
  779. */
  780. elevs_[0].irOffset = 0;
  781. std::partial_sum(elevs_.cbegin(), elevs_.cend(), elevs_.begin(),
  782. [](const HrtfStore::Elevation &last, const HrtfStore::Elevation &cur)
  783. -> HrtfStore::Elevation
  784. {
  785. return HrtfStore::Elevation{cur.azCount,
  786. static_cast<ushort>(last.azCount + last.irOffset)};
  787. });
  788. /* Reverse the order of each field's group of IRs. */
  789. auto coeffs_end = coeffs_.end();
  790. auto delays_end = delays_.end();
  791. auto copy_irs = [&elevs,&coeffs,&delays,&coeffs_end,&delays_end](
  792. const ptrdiff_t ebase, const HrtfStore::Field &field) -> ptrdiff_t
  793. {
  794. auto accum_az = [](int count, const HrtfStore::Elevation &elev) noexcept -> int
  795. { return count + elev.azCount; };
  796. const auto elevs_mid = elevs.cbegin() + ebase;
  797. const auto elevs_end = elevs_mid + field.evCount;
  798. const int abase{std::accumulate(elevs.cbegin(), elevs_mid, 0, accum_az)};
  799. const int num_azs{std::accumulate(elevs_mid, elevs_end, 0, accum_az)};
  800. coeffs_end = std::copy_backward(coeffs.cbegin() + abase,
  801. coeffs.cbegin() + (abase+num_azs), coeffs_end);
  802. delays_end = std::copy_backward(delays.cbegin() + abase,
  803. delays.cbegin() + (abase+num_azs), delays_end);
  804. return ebase + field.evCount;
  805. };
  806. (void)std::accumulate(fields.cbegin(), fields.cend(), ptrdiff_t{0}, copy_irs);
  807. assert(coeffs_.begin() == coeffs_end);
  808. assert(delays_.begin() == delays_end);
  809. fields = std::move(fields_);
  810. elevs = std::move(elevs_);
  811. coeffs = std::move(coeffs_);
  812. delays = std::move(delays_);
  813. }
  814. return CreateHrtfStore(rate, irSize, {fields.data(), fields.size()},
  815. {elevs.data(), elevs.size()}, coeffs.data(), delays.data(), filename);
  816. }
  817. std::unique_ptr<HrtfStore> LoadHrtf03(std::istream &data, const char *filename)
  818. {
  819. constexpr ubyte ChanType_LeftOnly{0};
  820. constexpr ubyte ChanType_LeftRight{1};
  821. uint rate{readle<uint32_t>(data)};
  822. ubyte channelType{readle<uint8_t>(data)};
  823. ushort irSize{readle<uint8_t>(data)};
  824. ubyte fdCount{readle<uint8_t>(data)};
  825. if(!data || data.eof())
  826. {
  827. ERR("Failed reading %s\n", filename);
  828. return nullptr;
  829. }
  830. if(channelType > ChanType_LeftRight)
  831. {
  832. ERR("Unsupported channel type: %d\n", channelType);
  833. return nullptr;
  834. }
  835. if(irSize < MinIrLength || irSize > HrirLength)
  836. {
  837. ERR("Unsupported HRIR size, irSize=%d (%d to %d)\n", irSize, MinIrLength, HrirLength);
  838. return nullptr;
  839. }
  840. if(fdCount < 1 || fdCount > MaxFdCount)
  841. {
  842. ERR("Unsupported number of field-depths: fdCount=%d (%d to %d)\n", fdCount, MinFdCount,
  843. MaxFdCount);
  844. return nullptr;
  845. }
  846. auto fields = al::vector<HrtfStore::Field>(fdCount);
  847. auto elevs = al::vector<HrtfStore::Elevation>{};
  848. for(size_t f{0};f < fdCount;f++)
  849. {
  850. const ushort distance{readle<uint16_t>(data)};
  851. const ubyte evCount{readle<uint8_t>(data)};
  852. if(!data || data.eof())
  853. {
  854. ERR("Failed reading %s\n", filename);
  855. return nullptr;
  856. }
  857. if(distance < MinFdDistance || distance > MaxFdDistance)
  858. {
  859. ERR("Unsupported field distance[%zu]=%d (%d to %d millimeters)\n", f, distance,
  860. MinFdDistance, MaxFdDistance);
  861. return nullptr;
  862. }
  863. if(evCount < MinEvCount || evCount > MaxEvCount)
  864. {
  865. ERR("Unsupported elevation count: evCount[%zu]=%d (%d to %d)\n", f, evCount,
  866. MinEvCount, MaxEvCount);
  867. return nullptr;
  868. }
  869. fields[f].distance = distance / 1000.0f;
  870. fields[f].evCount = evCount;
  871. if(f > 0 && fields[f].distance > fields[f-1].distance)
  872. {
  873. ERR("Field distance[%zu] is not before previous (%f <= %f)\n", f, fields[f].distance,
  874. fields[f-1].distance);
  875. return nullptr;
  876. }
  877. const size_t ebase{elevs.size()};
  878. elevs.resize(ebase + evCount);
  879. for(auto &elev : al::span<HrtfStore::Elevation>(elevs.data()+ebase, evCount))
  880. elev.azCount = readle<uint8_t>(data);
  881. if(!data || data.eof())
  882. {
  883. ERR("Failed reading %s\n", filename);
  884. return nullptr;
  885. }
  886. for(size_t e{0};e < evCount;e++)
  887. {
  888. if(elevs[ebase+e].azCount < MinAzCount || elevs[ebase+e].azCount > MaxAzCount)
  889. {
  890. ERR("Unsupported azimuth count: azCount[%zu][%zu]=%d (%d to %d)\n", f, e,
  891. elevs[ebase+e].azCount, MinAzCount, MaxAzCount);
  892. return nullptr;
  893. }
  894. }
  895. }
  896. elevs[0].irOffset = 0;
  897. std::partial_sum(elevs.cbegin(), elevs.cend(), elevs.begin(),
  898. [](const HrtfStore::Elevation &last, const HrtfStore::Elevation &cur)
  899. -> HrtfStore::Elevation
  900. {
  901. return HrtfStore::Elevation{cur.azCount,
  902. static_cast<ushort>(last.azCount + last.irOffset)};
  903. });
  904. const auto irTotal = static_cast<ushort>(elevs.back().azCount + elevs.back().irOffset);
  905. auto coeffs = al::vector<HrirArray>(irTotal, HrirArray{});
  906. auto delays = al::vector<ubyte2>(irTotal);
  907. if(channelType == ChanType_LeftOnly)
  908. {
  909. for(auto &hrir : coeffs)
  910. {
  911. for(auto &val : al::span<float2>{hrir.data(), irSize})
  912. val[0] = static_cast<float>(readle<int,24>(data)) / 8388608.0f;
  913. }
  914. for(auto &val : delays)
  915. val[0] = readle<uint8_t>(data);
  916. if(!data || data.eof())
  917. {
  918. ERR("Failed reading %s\n", filename);
  919. return nullptr;
  920. }
  921. for(size_t i{0};i < irTotal;++i)
  922. {
  923. if(delays[i][0] > MaxHrirDelay<<HrirDelayFracBits)
  924. {
  925. ERR("Invalid delays[%zu][0]: %f (%d)\n", i,
  926. delays[i][0] / float{HrirDelayFracOne}, MaxHrirDelay);
  927. return nullptr;
  928. }
  929. }
  930. /* Mirror the left ear responses to the right ear. */
  931. MirrorLeftHrirs({elevs.data(), elevs.size()}, coeffs.data(), delays.data());
  932. }
  933. else if(channelType == ChanType_LeftRight)
  934. {
  935. for(auto &hrir : coeffs)
  936. {
  937. for(auto &val : al::span<float2>{hrir.data(), irSize})
  938. {
  939. val[0] = static_cast<float>(readle<int,24>(data)) / 8388608.0f;
  940. val[1] = static_cast<float>(readle<int,24>(data)) / 8388608.0f;
  941. }
  942. }
  943. for(auto &val : delays)
  944. {
  945. val[0] = readle<uint8_t>(data);
  946. val[1] = readle<uint8_t>(data);
  947. }
  948. if(!data || data.eof())
  949. {
  950. ERR("Failed reading %s\n", filename);
  951. return nullptr;
  952. }
  953. for(size_t i{0};i < irTotal;++i)
  954. {
  955. if(delays[i][0] > MaxHrirDelay<<HrirDelayFracBits)
  956. {
  957. ERR("Invalid delays[%zu][0]: %f (%d)\n", i,
  958. delays[i][0] / float{HrirDelayFracOne}, MaxHrirDelay);
  959. return nullptr;
  960. }
  961. if(delays[i][1] > MaxHrirDelay<<HrirDelayFracBits)
  962. {
  963. ERR("Invalid delays[%zu][1]: %f (%d)\n", i,
  964. delays[i][1] / float{HrirDelayFracOne}, MaxHrirDelay);
  965. return nullptr;
  966. }
  967. }
  968. }
  969. return CreateHrtfStore(rate, irSize, {fields.data(), fields.size()},
  970. {elevs.data(), elevs.size()}, coeffs.data(), delays.data(), filename);
  971. }
  972. bool checkName(const std::string &name)
  973. {
  974. auto match_name = [&name](const HrtfEntry &entry) -> bool { return name == entry.mDispName; };
  975. auto &enum_names = EnumeratedHrtfs;
  976. return std::find_if(enum_names.cbegin(), enum_names.cend(), match_name) != enum_names.cend();
  977. }
  978. void AddFileEntry(const std::string &filename)
  979. {
  980. /* Check if this file has already been enumerated. */
  981. auto enum_iter = std::find_if(EnumeratedHrtfs.cbegin(), EnumeratedHrtfs.cend(),
  982. [&filename](const HrtfEntry &entry) -> bool
  983. { return entry.mFilename == filename; });
  984. if(enum_iter != EnumeratedHrtfs.cend())
  985. {
  986. TRACE("Skipping duplicate file entry %s\n", filename.c_str());
  987. return;
  988. }
  989. /* TODO: Get a human-readable name from the HRTF data (possibly coming in a
  990. * format update). */
  991. size_t namepos{filename.find_last_of('/')+1};
  992. if(!namepos) namepos = filename.find_last_of('\\')+1;
  993. size_t extpos{filename.find_last_of('.')};
  994. if(extpos <= namepos) extpos = std::string::npos;
  995. const std::string basename{(extpos == std::string::npos) ?
  996. filename.substr(namepos) : filename.substr(namepos, extpos-namepos)};
  997. std::string newname{basename};
  998. int count{1};
  999. while(checkName(newname))
  1000. {
  1001. newname = basename;
  1002. newname += " #";
  1003. newname += std::to_string(++count);
  1004. }
  1005. EnumeratedHrtfs.emplace_back(HrtfEntry{newname, filename});
  1006. const HrtfEntry &entry = EnumeratedHrtfs.back();
  1007. TRACE("Adding file entry \"%s\"\n", entry.mFilename.c_str());
  1008. }
  1009. /* Unfortunate that we have to duplicate AddFileEntry to take a memory buffer
  1010. * for input instead of opening the given filename.
  1011. */
  1012. void AddBuiltInEntry(const std::string &dispname, uint residx)
  1013. {
  1014. const std::string filename{'!'+std::to_string(residx)+'_'+dispname};
  1015. auto enum_iter = std::find_if(EnumeratedHrtfs.cbegin(), EnumeratedHrtfs.cend(),
  1016. [&filename](const HrtfEntry &entry) -> bool
  1017. { return entry.mFilename == filename; });
  1018. if(enum_iter != EnumeratedHrtfs.cend())
  1019. {
  1020. TRACE("Skipping duplicate file entry %s\n", filename.c_str());
  1021. return;
  1022. }
  1023. /* TODO: Get a human-readable name from the HRTF data (possibly coming in a
  1024. * format update). */
  1025. std::string newname{dispname};
  1026. int count{1};
  1027. while(checkName(newname))
  1028. {
  1029. newname = dispname;
  1030. newname += " #";
  1031. newname += std::to_string(++count);
  1032. }
  1033. EnumeratedHrtfs.emplace_back(HrtfEntry{newname, filename});
  1034. const HrtfEntry &entry = EnumeratedHrtfs.back();
  1035. TRACE("Adding built-in entry \"%s\"\n", entry.mFilename.c_str());
  1036. }
  1037. #define IDR_DEFAULT_HRTF_MHR 1
  1038. #ifndef ALSOFT_EMBED_HRTF_DATA
  1039. al::span<const char> GetResource(int /*name*/)
  1040. { return {}; }
  1041. #else
  1042. #include "hrtf_default.h"
  1043. al::span<const char> GetResource(int name)
  1044. {
  1045. if(name == IDR_DEFAULT_HRTF_MHR)
  1046. return {reinterpret_cast<const char*>(hrtf_default), sizeof(hrtf_default)};
  1047. return {};
  1048. }
  1049. #endif
  1050. } // namespace
  1051. al::vector<std::string> EnumerateHrtf(al::optional<std::string> pathopt)
  1052. {
  1053. std::lock_guard<std::mutex> _{EnumeratedHrtfLock};
  1054. EnumeratedHrtfs.clear();
  1055. bool usedefaults{true};
  1056. if(pathopt)
  1057. {
  1058. const char *pathlist{pathopt->c_str()};
  1059. while(pathlist && *pathlist)
  1060. {
  1061. const char *next, *end;
  1062. while(isspace(*pathlist) || *pathlist == ',')
  1063. pathlist++;
  1064. if(*pathlist == '\0')
  1065. continue;
  1066. next = strchr(pathlist, ',');
  1067. if(next)
  1068. end = next++;
  1069. else
  1070. {
  1071. end = pathlist + strlen(pathlist);
  1072. usedefaults = false;
  1073. }
  1074. while(end != pathlist && isspace(*(end-1)))
  1075. --end;
  1076. if(end != pathlist)
  1077. {
  1078. const std::string pname{pathlist, end};
  1079. for(const auto &fname : SearchDataFiles(".mhr", pname.c_str()))
  1080. AddFileEntry(fname);
  1081. }
  1082. pathlist = next;
  1083. }
  1084. }
  1085. if(usedefaults)
  1086. {
  1087. for(const auto &fname : SearchDataFiles(".mhr", "openal/hrtf"))
  1088. AddFileEntry(fname);
  1089. if(!GetResource(IDR_DEFAULT_HRTF_MHR).empty())
  1090. AddBuiltInEntry("Built-In HRTF", IDR_DEFAULT_HRTF_MHR);
  1091. }
  1092. al::vector<std::string> list;
  1093. list.reserve(EnumeratedHrtfs.size());
  1094. for(auto &entry : EnumeratedHrtfs)
  1095. list.emplace_back(entry.mDispName);
  1096. return list;
  1097. }
  1098. HrtfStorePtr GetLoadedHrtf(const std::string &name, const uint devrate)
  1099. {
  1100. std::lock_guard<std::mutex> _{EnumeratedHrtfLock};
  1101. auto entry_iter = std::find_if(EnumeratedHrtfs.cbegin(), EnumeratedHrtfs.cend(),
  1102. [&name](const HrtfEntry &entry) -> bool { return entry.mDispName == name; });
  1103. if(entry_iter == EnumeratedHrtfs.cend())
  1104. return nullptr;
  1105. const std::string &fname = entry_iter->mFilename;
  1106. std::lock_guard<std::mutex> __{LoadedHrtfLock};
  1107. auto hrtf_lt_fname = [](LoadedHrtf &hrtf, const std::string &filename) -> bool
  1108. { return hrtf.mFilename < filename; };
  1109. auto handle = std::lower_bound(LoadedHrtfs.begin(), LoadedHrtfs.end(), fname, hrtf_lt_fname);
  1110. while(handle != LoadedHrtfs.end() && handle->mFilename == fname)
  1111. {
  1112. HrtfStore *hrtf{handle->mEntry.get()};
  1113. if(hrtf && hrtf->sampleRate == devrate)
  1114. {
  1115. hrtf->add_ref();
  1116. return HrtfStorePtr{hrtf};
  1117. }
  1118. ++handle;
  1119. }
  1120. std::unique_ptr<std::istream> stream;
  1121. int residx{};
  1122. char ch{};
  1123. if(sscanf(fname.c_str(), "!%d%c", &residx, &ch) == 2 && ch == '_')
  1124. {
  1125. TRACE("Loading %s...\n", fname.c_str());
  1126. al::span<const char> res{GetResource(residx)};
  1127. if(res.empty())
  1128. {
  1129. ERR("Could not get resource %u, %s\n", residx, name.c_str());
  1130. return nullptr;
  1131. }
  1132. stream = std::make_unique<idstream>(res.begin(), res.end());
  1133. }
  1134. else
  1135. {
  1136. TRACE("Loading %s...\n", fname.c_str());
  1137. auto fstr = std::make_unique<al::ifstream>(fname.c_str(), std::ios::binary);
  1138. if(!fstr->is_open())
  1139. {
  1140. ERR("Could not open %s\n", fname.c_str());
  1141. return nullptr;
  1142. }
  1143. stream = std::move(fstr);
  1144. }
  1145. std::unique_ptr<HrtfStore> hrtf;
  1146. char magic[sizeof(magicMarker03)];
  1147. stream->read(magic, sizeof(magic));
  1148. if(stream->gcount() < static_cast<std::streamsize>(sizeof(magicMarker03)))
  1149. ERR("%s data is too short (%zu bytes)\n", name.c_str(), stream->gcount());
  1150. else if(memcmp(magic, magicMarker03, sizeof(magicMarker03)) == 0)
  1151. {
  1152. TRACE("Detected data set format v3\n");
  1153. hrtf = LoadHrtf03(*stream, name.c_str());
  1154. }
  1155. else if(memcmp(magic, magicMarker02, sizeof(magicMarker02)) == 0)
  1156. {
  1157. TRACE("Detected data set format v2\n");
  1158. hrtf = LoadHrtf02(*stream, name.c_str());
  1159. }
  1160. else if(memcmp(magic, magicMarker01, sizeof(magicMarker01)) == 0)
  1161. {
  1162. TRACE("Detected data set format v1\n");
  1163. hrtf = LoadHrtf01(*stream, name.c_str());
  1164. }
  1165. else if(memcmp(magic, magicMarker00, sizeof(magicMarker00)) == 0)
  1166. {
  1167. TRACE("Detected data set format v0\n");
  1168. hrtf = LoadHrtf00(*stream, name.c_str());
  1169. }
  1170. else
  1171. ERR("Invalid header in %s: \"%.8s\"\n", name.c_str(), magic);
  1172. stream.reset();
  1173. if(!hrtf)
  1174. {
  1175. ERR("Failed to load %s\n", name.c_str());
  1176. return nullptr;
  1177. }
  1178. if(hrtf->sampleRate != devrate)
  1179. {
  1180. TRACE("Resampling HRTF %s (%uhz -> %uhz)\n", name.c_str(), hrtf->sampleRate, devrate);
  1181. /* Calculate the last elevation's index and get the total IR count. */
  1182. const size_t lastEv{std::accumulate(hrtf->field, hrtf->field+hrtf->fdCount, size_t{0},
  1183. [](const size_t curval, const HrtfStore::Field &field) noexcept -> size_t
  1184. { return curval + field.evCount; }
  1185. ) - 1};
  1186. const size_t irCount{size_t{hrtf->elev[lastEv].irOffset} + hrtf->elev[lastEv].azCount};
  1187. /* Resample all the IRs. */
  1188. std::array<std::array<double,HrirLength>,2> inout;
  1189. PPhaseResampler rs;
  1190. rs.init(hrtf->sampleRate, devrate);
  1191. for(size_t i{0};i < irCount;++i)
  1192. {
  1193. HrirArray &coeffs = const_cast<HrirArray&>(hrtf->coeffs[i]);
  1194. for(size_t j{0};j < 2;++j)
  1195. {
  1196. std::transform(coeffs.cbegin(), coeffs.cend(), inout[0].begin(),
  1197. [j](const float2 &in) noexcept -> double { return in[j]; });
  1198. rs.process(HrirLength, inout[0].data(), HrirLength, inout[1].data());
  1199. for(size_t k{0};k < HrirLength;++k)
  1200. coeffs[k][j] = static_cast<float>(inout[1][k]);
  1201. }
  1202. }
  1203. rs = {};
  1204. /* Scale the delays for the new sample rate. */
  1205. float max_delay{0.0f};
  1206. auto new_delays = al::vector<float2>(irCount);
  1207. const float rate_scale{static_cast<float>(devrate)/static_cast<float>(hrtf->sampleRate)};
  1208. for(size_t i{0};i < irCount;++i)
  1209. {
  1210. for(size_t j{0};j < 2;++j)
  1211. {
  1212. const float new_delay{std::round(hrtf->delays[i][j] * rate_scale) /
  1213. float{HrirDelayFracOne}};
  1214. max_delay = maxf(max_delay, new_delay);
  1215. new_delays[i][j] = new_delay;
  1216. }
  1217. }
  1218. /* If the new delays exceed the max, scale it down to fit (essentially
  1219. * shrinking the head radius; not ideal but better than a per-delay
  1220. * clamp).
  1221. */
  1222. float delay_scale{HrirDelayFracOne};
  1223. if(max_delay > MaxHrirDelay)
  1224. {
  1225. WARN("Resampled delay exceeds max (%.2f > %d)\n", max_delay, MaxHrirDelay);
  1226. delay_scale *= float{MaxHrirDelay} / max_delay;
  1227. }
  1228. for(size_t i{0};i < irCount;++i)
  1229. {
  1230. ubyte2 &delays = const_cast<ubyte2&>(hrtf->delays[i]);
  1231. for(size_t j{0};j < 2;++j)
  1232. delays[j] = static_cast<ubyte>(float2int(new_delays[i][j]*delay_scale + 0.5f));
  1233. }
  1234. /* Scale the IR size for the new sample rate and update the stored
  1235. * sample rate.
  1236. */
  1237. const float newIrSize{std::round(static_cast<float>(hrtf->irSize) * rate_scale)};
  1238. hrtf->irSize = static_cast<uint>(minf(HrirLength, newIrSize));
  1239. hrtf->sampleRate = devrate;
  1240. }
  1241. TRACE("Loaded HRTF %s for sample rate %uhz, %u-sample filter\n", name.c_str(),
  1242. hrtf->sampleRate, hrtf->irSize);
  1243. handle = LoadedHrtfs.emplace(handle, LoadedHrtf{fname, std::move(hrtf)});
  1244. return HrtfStorePtr{handle->mEntry.get()};
  1245. }
  1246. void HrtfStore::add_ref()
  1247. {
  1248. auto ref = IncrementRef(mRef);
  1249. TRACE("HrtfStore %p increasing refcount to %u\n", decltype(std::declval<void*>()){this}, ref);
  1250. }
  1251. void HrtfStore::release()
  1252. {
  1253. auto ref = DecrementRef(mRef);
  1254. TRACE("HrtfStore %p decreasing refcount to %u\n", decltype(std::declval<void*>()){this}, ref);
  1255. if(ref == 0)
  1256. {
  1257. std::lock_guard<std::mutex> _{LoadedHrtfLock};
  1258. /* Go through and remove all unused HRTFs. */
  1259. auto remove_unused = [](LoadedHrtf &hrtf) -> bool
  1260. {
  1261. HrtfStore *entry{hrtf.mEntry.get()};
  1262. if(entry && ReadRef(entry->mRef) == 0)
  1263. {
  1264. TRACE("Unloading unused HRTF %s\n", hrtf.mFilename.data());
  1265. hrtf.mEntry = nullptr;
  1266. return true;
  1267. }
  1268. return false;
  1269. };
  1270. auto iter = std::remove_if(LoadedHrtfs.begin(), LoadedHrtfs.end(), remove_unused);
  1271. LoadedHrtfs.erase(iter, LoadedHrtfs.end());
  1272. }
  1273. }