#include "ship/audio/Audio.h" #include "ship/Context.h" #include "ship/controller/controldeck/ControlDeck.h" namespace Ship { Audio::~Audio() { SPDLOG_TRACE("destruct audio"); } void Audio::InitAudioPlayer() { switch (GetCurrentAudioBackend()) { #ifdef _WIN32 case AudioBackend::WASAPI: mAudioPlayer = std::make_shared(this->mAudioSettings); break; #endif case AudioBackend::SDL: mAudioPlayer = std::make_shared(this->mAudioSettings); break; default: mAudioPlayer = std::make_shared(this->mAudioSettings); break; } if (mAudioPlayer && !mAudioPlayer->Init()) { // Failed to initialize system audio player. // Fallback to Null if the native system player does not work. SetCurrentAudioBackend(AudioBackend::NUL); } } void Audio::Init() { mAvailableAudioBackends = std::make_shared>(); #ifdef _WIN32 mAvailableAudioBackends->push_back(AudioBackend::WASAPI); #endif mAvailableAudioBackends->push_back(AudioBackend::SDL); mAvailableAudioBackends->push_back(AudioBackend::NUL); SetCurrentAudioBackend(Context::GetInstance()->GetConfig()->GetCurrentAudioBackend()); } std::shared_ptr Audio::GetAudioPlayer() { return mAudioPlayer; } AudioBackend Audio::GetCurrentAudioBackend() { return mAudioBackend; } void Audio::SetCurrentAudioBackend(AudioBackend backend) { mAudioBackend = backend; Context::GetInstance()->GetConfig()->SetCurrentAudioBackend(GetCurrentAudioBackend()); Context::GetInstance()->GetConfig()->Save(); InitAudioPlayer(); } std::shared_ptr> Audio::GetAvailableAudioBackends() { return mAvailableAudioBackends; } void Audio::SetAudioChannels(AudioChannelsSetting channels) { if (mAudioSettings.ChannelSetting != channels) { mAudioSettings.ChannelSetting = channels; // Reinitialize the existing audio player with the new channel configuration if (mAudioPlayer) { mAudioPlayer->SetAudioChannels(channels); } } } AudioChannelsSetting Audio::GetAudioChannels() const { return mAudioSettings.ChannelSetting; } } // namespace Ship