diff --git a/src/audio/AL/ALAudio.cpp b/src/audio/AL/ALAudio.cpp index afce8fd0..b33aebf4 100644 --- a/src/audio/AL/ALAudio.cpp +++ b/src/audio/AL/ALAudio.cpp @@ -207,10 +207,10 @@ ALSpeaker::~ALSpeaker() { } } -void ALSpeaker::update(const Channel* channel, float masterVolume) { +void ALSpeaker::update(const Channel* channel) { if (source == 0) return; - float gain = this->volume * channel->getVolume()*masterVolume; + float gain = this->volume * channel->getVolume(); AL_CHECK(alSourcef(source, AL_GAIN, gain)); if (!paused) { @@ -471,6 +471,7 @@ void ALAudio::setListener(glm::vec3 position, glm::vec3 velocity, glm::vec3 at, AL_CHECK(alListener3f(AL_POSITION, position.x, position.y, position.z)); AL_CHECK(alListener3f(AL_VELOCITY, velocity.x, velocity.y, velocity.z)); AL_CHECK(alListenerfv(AL_ORIENTATION, listenerOri)); + AL_CHECK(alListenerf(AL_GAIN, get_channel(0)->getVolume())); } void ALAudio::update(double delta) { diff --git a/src/audio/AL/ALAudio.h b/src/audio/AL/ALAudio.h index 2250088e..bcf6c4cf 100644 --- a/src/audio/AL/ALAudio.h +++ b/src/audio/AL/ALAudio.h @@ -91,7 +91,7 @@ namespace audio { ALSpeaker(ALAudio* al, uint source, int priority, int channel); ~ALSpeaker(); - void update(const Channel* channel, float masterVolume) override; + void update(const Channel* channel) override; int getChannel() const override; State getState() const override; diff --git a/src/audio/audio.cpp b/src/audio/audio.cpp index b85e4eb1..f666bc19 100644 --- a/src/audio/audio.cpp +++ b/src/audio/audio.cpp @@ -383,13 +383,12 @@ void audio::update(double delta) { entry.second->update(delta); } - float masterVolume = channels.at(0)->getVolume(); for (auto it = speakers.begin(); it != speakers.end();) { auto speaker = it->second.get(); int speakerChannel = speaker->getChannel(); auto channel = get_channel(speakerChannel); if (channel != nullptr) { - speaker->update(channel, speakerChannel == 0 ? 1.0f : masterVolume); + speaker->update(channel); } if (speaker->isStopped()) { streams.erase(it->first); diff --git a/src/audio/audio.h b/src/audio/audio.h index 12abf9d7..64fb99e2 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -235,8 +235,7 @@ namespace audio { /// @brief Synchronize the speaker with channel settings /// @param channel speaker channel - /// @param masterVolume volume of the master channel - virtual void update(const Channel* channel, float masterVolume) = 0; + virtual void update(const Channel* channel) = 0; /// @brief Check speaker channel index virtual int getChannel() const = 0; diff --git a/src/engine.cpp b/src/engine.cpp index 8f5f998a..cbf12069 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -46,6 +46,15 @@ void addWorldGenerators() { WorldGenerators::addGenerator("core:flat"); } +inline void create_channel(std::string name, NumberSetting& setting) { + if (name != "master") { + audio::create_channel(name); + } + setting.observe([=](auto value) { + audio::get_channel(name)->setVolume(value*value); + }); +} + Engine::Engine(EngineSettings& settings, EnginePaths* paths) : settings(settings), settingsHandler(settings), paths(paths) { @@ -53,32 +62,16 @@ Engine::Engine(EngineSettings& settings, EnginePaths* paths) throw initialize_error("could not initialize window"); } audio::initialize(settings.audio.enabled); - audio::create_channel("regular"); - audio::create_channel("music"); - audio::create_channel("ambient"); - audio::create_channel("ui"); - - settings.audio.volumeMaster.observe([=](auto value) { - audio::get_channel("master")->setVolume(value*value); - }); - settings.audio.volumeRegular.observe([=](auto value) { - audio::get_channel("regular")->setVolume(value*value); - }); - settings.audio.volumeUI.observe([=](auto value) { - audio::get_channel("ui")->setVolume(value*value); - }); - settings.audio.volumeAmbient.observe([=](auto value) { - audio::get_channel("ambient")->setVolume(value*value); - }); - settings.audio.volumeMusic.observe([=](auto value) { - audio::get_channel("music")->setVolume(value*value); - }); + create_channel("master", settings.audio.volumeMaster); + create_channel("regular", settings.audio.volumeRegular); + create_channel("music", settings.audio.volumeMusic); + create_channel("ambient", settings.audio.volumeAmbient); + create_channel("ui", settings.audio.volumeUI); auto resdir = paths->getResources(); logger.info() << "loading assets"; std::vector roots {resdir}; - resPaths = std::make_unique(resdir, roots); try { loadAssets();