Skip to content

Commit 87eb12f

Browse files
authored
Audio: Add HRTF control API (#3218)
1 parent a412534 commit 87eb12f

11 files changed

Lines changed: 378 additions & 231 deletions

File tree

axmol/audio/AudioEngine.cpp

Lines changed: 53 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -45,20 +45,14 @@ namespace ax
4545

4646
float AudioPlayerSettings::distanceScale = 1.f;
4747

48-
const int AudioEngine::INVALID_AUDIO_ID = -1;
49-
const float AudioEngine::TIME_UNKNOWN = -1.0f;
50-
5148
// audio file path,audio IDs
52-
tlx::string_map<std::list<AUDIO_ID>> AudioEngine::_audioPathIDMap;
49+
tlx::string_map<std::list<AudioId>> AudioEngine::_audioPathIDMap;
5350
// profileName,ProfileHelper
5451
tlx::string_map<AudioEngine::ProfileHelper> AudioEngine::_audioPathProfileHelperMap;
55-
unsigned int AudioEngine::_maxInstances = MAX_AUDIOINSTANCES;
52+
AudioEngineSettings AudioEngine::_settings;
5653
AudioEngine::ProfileHelper* AudioEngine::_defaultProfileHelper = nullptr;
57-
std::unordered_map<AUDIO_ID, AudioEngine::AudioInfo> AudioEngine::_audioIDInfoMap;
54+
std::unordered_map<AudioId, AudioEngine::AudioInfo> AudioEngine::_audioIDInfoMap;
5855
AudioEngineImpl* AudioEngine::_audioEngineImpl = nullptr;
59-
60-
bool AudioEngine::_isEnabled = true;
61-
6256
AudioEngine::AudioInfo::AudioInfo()
6357
: profileHelper(nullptr), volume(1.0f), loop(false), duration(TIME_UNKNOWN), state(AudioState::INITIALIZING)
6458
{}
@@ -71,8 +65,7 @@ void AudioEngine::end()
7165
// fix #127
7266
uncacheAll();
7367

74-
delete _audioEngineImpl;
75-
_audioEngineImpl = nullptr;
68+
AX_SAFE_RELEASE_NULL(_audioEngineImpl);
7669

7770
delete _defaultProfileHelper;
7871
_defaultProfileHelper = nullptr;
@@ -83,27 +76,24 @@ bool AudioEngine::lazyInit()
8376
if (_audioEngineImpl == nullptr)
8477
{
8578
_audioEngineImpl = new AudioEngineImpl();
86-
if (!_audioEngineImpl->init())
79+
if (!_audioEngineImpl->init(_settings))
8780
{
88-
delete _audioEngineImpl;
89-
_audioEngineImpl = nullptr;
81+
AX_SAFE_RELEASE(_audioEngineImpl);
9082
return false;
9183
}
9284
}
9385

9486
return true;
9587
}
9688

97-
AUDIO_ID AudioEngine::play2d(std::string_view filePath, bool loop, float volume, const AudioProfile* profile)
89+
AudioId AudioEngine::play2d(std::string_view filePath, bool loop, float volume, const AudioProfile* profile)
9890
{
9991
return play2d(filePath, ax::AudioPlayerSettings{loop, volume, 0.0f}, profile);
10092
}
10193

102-
AUDIO_ID AudioEngine::play2d(std::string_view filePath,
103-
const AudioPlayerSettings& settings,
104-
const AudioProfile* profile)
94+
AudioId AudioEngine::play2d(std::string_view filePath, const AudioPlayerSettings& settings, const AudioProfile* profile)
10595
{
106-
AUDIO_ID ret = AudioEngine::INVALID_AUDIO_ID;
96+
AudioId ret = AudioEngine::INVALID_AUDIO_ID;
10797

10898
do
10999
{
@@ -130,7 +120,7 @@ AUDIO_ID AudioEngine::play2d(std::string_view filePath,
130120
profileHelper->profile = *profile;
131121
}
132122

133-
if (_audioIDInfoMap.size() >= _maxInstances)
123+
if (_audioIDInfoMap.size() >= _settings.maxInstances)
134124
{
135125
AXLOGE("Fail to play {} cause by limited max instance of AudioEngine", filePath);
136126
break;
@@ -197,11 +187,9 @@ int AudioEngine::play3d(std::string_view filePath,
197187
return play3d(filePath, ax::AudioPlayerSettings{loop, volume, 0.0f, position});
198188
}
199189

200-
AUDIO_ID AudioEngine::play3d(std::string_view filePath,
201-
const AudioPlayerSettings& settings,
202-
const AudioProfile* profile)
190+
AudioId AudioEngine::play3d(std::string_view filePath, const AudioPlayerSettings& settings, const AudioProfile* profile)
203191
{
204-
AUDIO_ID ret = AudioEngine::INVALID_AUDIO_ID;
192+
AudioId ret = AudioEngine::INVALID_AUDIO_ID;
205193

206194
do
207195
{
@@ -228,7 +216,7 @@ AUDIO_ID AudioEngine::play3d(std::string_view filePath,
228216
profileHelper->profile = *profile;
229217
}
230218

231-
if (_audioIDInfoMap.size() >= _maxInstances)
219+
if (_audioIDInfoMap.size() >= _settings.maxInstances)
232220
{
233221
AXLOGE("Fail to play {} cause by limited max instance of AudioEngine", filePath);
234222
break;
@@ -287,7 +275,7 @@ AUDIO_ID AudioEngine::play3d(std::string_view filePath,
287275
return ret;
288276
}
289277

290-
void AudioEngine::setLoop(AUDIO_ID audioID, bool loop)
278+
void AudioEngine::setLoop(AudioId audioID, bool loop)
291279
{
292280
auto it = _audioIDInfoMap.find(audioID);
293281
if (it != _audioIDInfoMap.end() && it->second.loop != loop)
@@ -297,7 +285,7 @@ void AudioEngine::setLoop(AUDIO_ID audioID, bool loop)
297285
}
298286
}
299287

300-
void AudioEngine::setVolume(AUDIO_ID audioID, float volume)
288+
void AudioEngine::setVolume(AudioId audioID, float volume)
301289
{
302290
auto it = _audioIDInfoMap.find(audioID);
303291
if (it != _audioIDInfoMap.end())
@@ -312,7 +300,7 @@ void AudioEngine::setVolume(AUDIO_ID audioID, float volume)
312300
}
313301
}
314302

315-
void AudioEngine::setPitch(AUDIO_ID audioID, float pitch)
303+
void AudioEngine::setPitch(AudioId audioID, float pitch)
316304
{
317305
auto it = _audioIDInfoMap.find(audioID);
318306
if (it != _audioIDInfoMap.end())
@@ -327,7 +315,7 @@ void AudioEngine::setPitch(AUDIO_ID audioID, float pitch)
327315
}
328316
}
329317

330-
float AudioEngine::getPitch(AUDIO_ID audioID)
318+
float AudioEngine::getPitch(AudioId audioID)
331319
{
332320
auto tmpIterator = _audioIDInfoMap.find(audioID);
333321
if (tmpIterator != _audioIDInfoMap.end())
@@ -339,7 +327,7 @@ float AudioEngine::getPitch(AUDIO_ID audioID)
339327
return 0.0f;
340328
}
341329

342-
void AudioEngine::pause(AUDIO_ID audioID)
330+
void AudioEngine::pause(AudioId audioID)
343331
{
344332
auto it = _audioIDInfoMap.find(audioID);
345333
if (it != _audioIDInfoMap.end() && it->second.state == AudioState::PLAYING)
@@ -362,7 +350,7 @@ void AudioEngine::pauseAll()
362350
}
363351
}
364352

365-
void AudioEngine::resume(AUDIO_ID audioID)
353+
void AudioEngine::resume(AudioId audioID)
366354
{
367355
auto it = _audioIDInfoMap.find(audioID);
368356
if (it != _audioIDInfoMap.end() && it->second.state == AudioState::PAUSED)
@@ -385,7 +373,7 @@ void AudioEngine::resumeAll()
385373
}
386374
}
387375

388-
void AudioEngine::stop(AUDIO_ID audioID)
376+
void AudioEngine::stop(AudioId audioID)
389377
{
390378
auto it = _audioIDInfoMap.find(audioID);
391379
if (it != _audioIDInfoMap.end())
@@ -396,7 +384,7 @@ void AudioEngine::stop(AUDIO_ID audioID)
396384
}
397385
}
398386

399-
void AudioEngine::remove(AUDIO_ID audioID)
387+
void AudioEngine::remove(AudioId audioID)
400388
{
401389
auto it = _audioIDInfoMap.find(audioID);
402390
if (it != _audioIDInfoMap.end())
@@ -441,9 +429,9 @@ void AudioEngine::uncache(std::string_view filePath)
441429
//@Note: For safely iterating elements from the audioID list, we need to copy the list
442430
// since 'AudioEngine::remove' may be invoked in '_audioEngineImpl->stop' synchronously.
443431
// If this happens, it will break the iteration, and crash will appear on some devices.
444-
std::list<AUDIO_ID> copiedIDs(audioIDsIter->second);
432+
std::list<AudioId> copiedIDs(audioIDsIter->second);
445433

446-
for (AUDIO_ID audioID : copiedIDs)
434+
for (AudioId audioID : copiedIDs)
447435
{
448436
_audioEngineImpl->stop(audioID);
449437

@@ -476,7 +464,7 @@ void AudioEngine::uncacheAll()
476464
_audioEngineImpl->uncacheAll();
477465
}
478466

479-
float AudioEngine::getDuration(AUDIO_ID audioID)
467+
float AudioEngine::getDuration(AudioId audioID)
480468
{
481469
auto it = _audioIDInfoMap.find(audioID);
482470
if (it != _audioIDInfoMap.end() && it->second.state != AudioState::INITIALIZING)
@@ -491,7 +479,7 @@ float AudioEngine::getDuration(AUDIO_ID audioID)
491479
return TIME_UNKNOWN;
492480
}
493481

494-
bool AudioEngine::setCurrentTime(AUDIO_ID audioID, float time)
482+
bool AudioEngine::setCurrentTime(AudioId audioID, float time)
495483
{
496484
auto it = _audioIDInfoMap.find(audioID);
497485
if (it != _audioIDInfoMap.end() && it->second.state != AudioState::INITIALIZING)
@@ -502,7 +490,7 @@ bool AudioEngine::setCurrentTime(AUDIO_ID audioID, float time)
502490
return false;
503491
}
504492

505-
float AudioEngine::getCurrentTime(AUDIO_ID audioID)
493+
float AudioEngine::getCurrentTime(AudioId audioID)
506494
{
507495
auto it = _audioIDInfoMap.find(audioID);
508496
if (it != _audioIDInfoMap.end() && it->second.state != AudioState::INITIALIZING)
@@ -512,7 +500,7 @@ float AudioEngine::getCurrentTime(AUDIO_ID audioID)
512500
return 0.0f;
513501
}
514502

515-
void AudioEngine::setFinishCallback(AUDIO_ID audioID, const std::function<void(AUDIO_ID, std::string_view)>& callback)
503+
void AudioEngine::setFinishCallback(AudioId audioID, const std::function<void(AudioId, std::string_view)>& callback)
516504
{
517505
auto it = _audioIDInfoMap.find(audioID);
518506
if (it != _audioIDInfoMap.end())
@@ -525,14 +513,14 @@ bool AudioEngine::setMaxAudioInstance(int maxInstances)
525513
{
526514
if (maxInstances > 0 && maxInstances <= MAX_AUDIOINSTANCES)
527515
{
528-
_maxInstances = maxInstances;
516+
_settings.maxInstances = maxInstances;
529517
return true;
530518
}
531519

532520
return false;
533521
}
534522

535-
bool AudioEngine::isLoop(AUDIO_ID audioID)
523+
bool AudioEngine::isLoop(AudioId audioID)
536524
{
537525
auto tmpIterator = _audioIDInfoMap.find(audioID);
538526
if (tmpIterator != _audioIDInfoMap.end())
@@ -544,7 +532,7 @@ bool AudioEngine::isLoop(AUDIO_ID audioID)
544532
return false;
545533
}
546534

547-
float AudioEngine::getVolume(AUDIO_ID audioID)
535+
float AudioEngine::getVolume(AudioId audioID)
548536
{
549537
auto tmpIterator = _audioIDInfoMap.find(audioID);
550538
if (tmpIterator != _audioIDInfoMap.end())
@@ -556,7 +544,7 @@ float AudioEngine::getVolume(AUDIO_ID audioID)
556544
return 0.0f;
557545
}
558546

559-
AudioEngine::AudioState AudioEngine::getState(AUDIO_ID audioID)
547+
AudioEngine::AudioState AudioEngine::getState(AudioId audioID)
560548
{
561549
auto tmpIterator = _audioIDInfoMap.find(audioID);
562550
if (tmpIterator != _audioIDInfoMap.end())
@@ -567,7 +555,7 @@ AudioEngine::AudioState AudioEngine::getState(AUDIO_ID audioID)
567555
return AudioState::ERROR;
568556
}
569557

570-
AudioProfile* AudioEngine::getProfile(AUDIO_ID audioID)
558+
AudioProfile* AudioEngine::getProfile(AudioId audioID)
571559
{
572560
auto it = _audioIDInfoMap.find(audioID);
573561
if (it != _audioIDInfoMap.end())
@@ -637,13 +625,13 @@ int AudioEngine::getPlayingAudioCount()
637625
return static_cast<int>(_audioIDInfoMap.size());
638626
}
639627

640-
void AudioEngine::setEnabled(bool isEnabled)
628+
void AudioEngine::setEnabled(bool enabled)
641629
{
642-
if (_isEnabled != isEnabled)
630+
if (_settings.enabled != enabled)
643631
{
644-
_isEnabled = isEnabled;
632+
_settings.enabled = enabled;
645633

646-
if (!_isEnabled)
634+
if (!_settings.enabled)
647635
{
648636
stopAll();
649637
}
@@ -652,7 +640,7 @@ void AudioEngine::setEnabled(bool isEnabled)
652640

653641
bool AudioEngine::isEnabled()
654642
{
655-
return _isEnabled;
643+
return _settings.enabled;
656644
}
657645

658646
void AudioEngine::setPan(int audioId, float value, float distance)
@@ -737,4 +725,20 @@ void AudioEngine::setReverbProperties(int audioId, const ReverbProperties* rever
737725

738726
return _audioEngineImpl->setReverbProperties(audioId, reverbProperties);
739727
}
728+
729+
void AudioEngine::setHRTFEnabled(bool enabled)
730+
{
731+
#if AX_USE_ALSOFT
732+
if (_settings.hrtfEnabled == enabled)
733+
return;
734+
if (_audioEngineImpl && _audioEngineImpl->setHRTFEnabled(enabled))
735+
_settings.hrtfEnabled = enabled;
736+
#endif
737+
}
738+
739+
bool AudioEngine::isHRTFEnabled()
740+
{
741+
return _settings.hrtfEnabled;
742+
}
743+
740744
} // namespace ax

0 commit comments

Comments
 (0)