Skip to content

Commit

Permalink
Merge pull request #284 from Laguna1989/feature/soundfades
Browse files Browse the repository at this point in the history
Improve Sound Fades
  • Loading branch information
Laguna1989 authored Mar 25, 2023
2 parents 2b02483 + 77c4657 commit a64e8f1
Show file tree
Hide file tree
Showing 61 changed files with 252 additions and 85 deletions.
8 changes: 5 additions & 3 deletions impl/game/main.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
#include "main.hpp"
#include <action_commands/action_command_manager.hpp>
#include <action_commands/basic_action_commands.hpp>
#include <audio/audio_impl.hpp>
#include <audio/logging_audio.hpp>
#include <audio/audio/audio_impl.hpp>
#include <audio/audio/logging_audio.hpp>
#include <audio/fades/logging_sound_fade_manager.hpp>
#include <cache_impl.hpp>
#include <camera.hpp>
#include <game.hpp>
Expand Down Expand Up @@ -54,7 +55,8 @@ int main()
auto const gamepad0 = std::make_shared<jt::GamepadInput>(0);
jt::InputManager input { mouse, keyboard, { gamepad0 } };

jt::AudioImpl audio;
jt::SoundFadeManager fades;
jt::AudioImpl audio { std::make_unique<jt::LoggingSoundFadeManager>(fades, logger) };
jt::LoggingAudio loggingAudio { audio, logger };

jt::StateManager stateManager { std::make_shared<StateIntro>() };
Expand Down
11 changes: 6 additions & 5 deletions impl/gamelib/player/sound/sound_component_impl.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
#include "sound_component_impl.hpp"
#include <audio/logging_sound.hpp>
#include <audio/sound.hpp>
#include <audio/sound_group.hpp>
#include <audio/sound_null.hpp>
#include <audio/sound/logging_sound.hpp>
#include <audio/sound/sound.hpp>
#include <audio/sound/sound_group.hpp>
#include <audio/sound/sound_null.hpp>

SoundComponentImpl::SoundComponentImpl(jt::AudioInterface& /*audio*/, jt::LoggerInterface& /*logger*/)
SoundComponentImpl::SoundComponentImpl(
jt::AudioInterface& /*audio*/, jt::LoggerInterface& /*logger*/)
{
// TODO load Sounds
}
Expand Down
2 changes: 1 addition & 1 deletion impl/gamelib/player/sound/sound_component_impl.hpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#ifndef GAME_PLAYER_SOUND_COMPONENT_HPP
#define GAME_PLAYER_SOUND_COMPONENT_HPP

#include <audio/audio_interface.hpp>
#include <audio/audio/audio_interface.hpp>
#include <log/logger_interface.hpp>
#include <player/sound/sound_component_interface.hpp>

Expand Down
4 changes: 2 additions & 2 deletions impl/gamelib/state_intro.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#include "state_intro.hpp"
#include <audio/sound.hpp>
#include <audio/sound/sound.hpp>
#include <game_interface.hpp>
#include <game_properties.hpp>
#include <state_menu.hpp>
Expand All @@ -22,7 +22,7 @@ void StateIntro::onEnter()
jt::Vector2f const endPos { GP::GetScreenSize().x / 2, GP::GetScreenSize().y / 2 };
m_sprite->setPosition(startPos);
m_sprite->update(0.0f);

auto twp = jt::TweenPosition::create(m_sprite, 0.8f, startPos, endPos);
add(twp);

Expand Down
2 changes: 1 addition & 1 deletion impl/gamelib/state_intro.hpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#ifndef JAMTEMPLATE_STATE_INTRO_HPP
#define JAMTEMPLATE_STATE_INTRO_HPP

#include <audio/sound_interface.hpp>
#include <audio/sound/sound_interface.hpp>
#include <game_state.hpp>
#include <sprite.hpp>
#include <memory>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
#include "audio_impl.hpp"
#include <audio/intro_looping_sound_with_effect.hpp>
#include <audio/sound.hpp>
#include <audio/sound_group.hpp>
#include <audio/sound_with_effect.hpp>
#include <audio/sound/intro_looping_sound_with_effect.hpp>
#include <audio/sound/sound.hpp>
#include <audio/sound/sound_group.hpp>
#include <audio/sound/sound_with_effect.hpp>
#include <random/random.hpp>
#include <algorithm>

jt::AudioImpl::AudioImpl(std::unique_ptr<SoundFadeManagerInterface> soundFadeManager)
: m_fades { std::move(soundFadeManager) }
{
if (!m_fades) {
m_fades = std::make_unique<SoundFadeManager>();
}
}

jt::AudioImpl::~AudioImpl() { m_temporarySounds.clear(); }

void jt::AudioImpl::update(float elapsed)
Expand Down Expand Up @@ -105,5 +113,5 @@ std::shared_ptr<jt::SoundInterface> jt::AudioImpl::addTemporarySoundGroup(
return group;
}

jt::SoundFadeManager& jt::AudioImpl::fades() { return *m_fades; }
jt::SoundFadeManagerInterface& jt::AudioImpl::fades() { return *m_fades; }
jt::GroupVolumeSetterInterface& jt::AudioImpl::groups() { return m_volumeGroups; }
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
#ifndef JAMTEMPLATE_AUDIO_IMPL_HPP
#define JAMTEMPLATE_AUDIO_IMPL_HPP

#include <audio/audio_interface.hpp>
#include <audio/group_volume_manager.hpp>
#include <audio/audio/audio_interface.hpp>
#include <audio/fades/sound_fade_manager.hpp>
#include <audio/sound_groups/group_volume_manager.hpp>
#include <oalpp/sound_context.hpp>
#include <map>
#include <vector>

namespace jt {
class AudioImpl : public AudioInterface {
public:
AudioImpl(std::unique_ptr<SoundFadeManagerInterface> soundFadeManager = nullptr);
~AudioImpl();

void update(float elapsed) override;
Expand All @@ -35,7 +37,7 @@ class AudioImpl : public AudioInterface {

oalpp::SoundContextInterface& getContext() override;

SoundFadeManager& fades() override;
SoundFadeManagerInterface& fades() override;

GroupVolumeSetterInterface& groups() override;

Expand All @@ -45,7 +47,7 @@ class AudioImpl : public AudioInterface {
std::vector<std::weak_ptr<jt::SoundInterface>> m_temporarySounds {};
std::map<std::string, std::shared_ptr<jt::SoundInterface>> m_permanentSounds {};

std::unique_ptr<SoundFadeManager> m_fades { std::make_unique<SoundFadeManager>() };
std::unique_ptr<SoundFadeManagerInterface> m_fades;

GroupVolumeManager m_volumeGroups;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
#ifndef JAMTEMPLATE_AUDIO_INTERFACE_HPP
#define JAMTEMPLATE_AUDIO_INTERFACE_HPP

#include <audio/group_volume_setter_interface.hpp>
#include <audio/sound.hpp>
#include <audio/sound_fade_manager.hpp>
#include <audio/sound_interface.hpp>
#include <audio/sound_with_effect.hpp>
#include <audio/fades/sound_fade_manager_interface.hpp>
#include <audio/sound/sound.hpp>
#include <audio/sound/sound_interface.hpp>
#include <audio/sound/sound_with_effect.hpp>
#include <audio/sound_groups/group_volume_setter_interface.hpp>
#include <oalpp/sound_context/sound_context_interface.hpp>
#include <functional>
#include <memory>
Expand Down Expand Up @@ -86,7 +86,7 @@ class AudioInterface {

/// Get the SoundFadeManager
/// \return the SoundFadeManager
virtual jt::SoundFadeManager& fades() = 0;
virtual jt::SoundFadeManagerInterface& fades() = 0;

/// Get the GroupVolumes
/// \return the GroupVolumeSetter
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
#include "audio_null.hpp"
#include <audio/sound_group.hpp>
#include <audio/sound_null.hpp>
#include <audio/sound/sound_group.hpp>
#include <audio/sound/sound_null.hpp>

void jt::AudioNull::update(float /*elapsed*/) { }

oalpp::SoundContextInterface& jt::AudioNull::getContext() { return m_context; }

std::shared_ptr<jt::SoundInterface> jt::AudioNull::soundPool(
Expand Down Expand Up @@ -30,12 +31,14 @@ std::shared_ptr<jt::SoundInterface> jt::AudioNull::addPermanentSound(
{
return std::make_shared<jt::SoundNull>();
}

std::shared_ptr<jt::SoundInterface> jt::AudioNull::addPermanentSound(
std::string const& /*identifier*/, std::string const& /*fileName*/,
oalpp::effects::MonoEffectInterface& /*effect*/)
{
return std::make_shared<jt::SoundNull>();
}

std::shared_ptr<jt::SoundInterface> jt::AudioNull::addPermanentSound(
std::string const& /*identifier*/, std::string const& /*introFileName*/,
std::string const& /*loopingFileName*/, oalpp::effects::MonoEffectInterface& /*effect*/)
Expand All @@ -55,5 +58,5 @@ std::shared_ptr<jt::SoundInterface> jt::AudioNull::addTemporarySoundGroup(

return group;
}
jt::SoundFadeManager& jt::AudioNull::fades() { return m_fades; }
jt::SoundFadeManagerInterface& jt::AudioNull::fades() { return *m_fades; }
jt::GroupVolumeSetterInterface& jt::AudioNull::groups() { return m_groups; }
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
#ifndef JAMTEMPLATE_AUDIO_NULL_HPP
#define JAMTEMPLATE_AUDIO_NULL_HPP

#include <audio/audio_interface.hpp>
#include <audio/group_volume_manager.hpp>
#include <audio/audio/audio_interface.hpp>
#include <audio/fades/sound_fade_manager.hpp>
#include <audio/sound_groups/group_volume_manager.hpp>

namespace jt {

Expand Down Expand Up @@ -37,13 +38,13 @@ class AudioNull : public AudioInterface {
std::shared_ptr<jt::SoundInterface> addTemporarySoundGroup(
std::vector<std::shared_ptr<jt::SoundInterface>> const& sounds) override;

SoundFadeManager& fades() override;
SoundFadeManagerInterface& fades() override;
GroupVolumeSetterInterface& groups() override;

private:
null_objects::SoundContextNull m_context;

SoundFadeManager m_fades;
std::unique_ptr<SoundFadeManagerInterface> m_fades { std::make_unique<SoundFadeManager>() };
GroupVolumeManager m_groups;
};
} // namespace jt
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#include "logging_audio.hpp"
#include <audio/logging_sound.hpp>
#include <audio/sound/logging_sound.hpp>

jt::LoggingAudio::LoggingAudio(jt::AudioInterface& decoratee, jt::LoggerInterface& logger)
: m_decoratee { decoratee }
Expand Down Expand Up @@ -75,11 +75,13 @@ std::shared_ptr<jt::SoundInterface> jt::LoggingAudio::addTemporarySoundGroup(
{ "jt", "audio" });
return std::make_shared<jt::LoggingSound>(m_decoratee.addTemporarySoundGroup(sounds), m_logger);
}
jt::SoundFadeManager& jt::LoggingAudio::fades()

jt::SoundFadeManagerInterface& jt::LoggingAudio::fades()
{
m_logger.verbose("fades", { "jt", "audio" });
return m_decoratee.fades();
}

jt::GroupVolumeSetterInterface& jt::LoggingAudio::groups()
{
m_logger.verbose("groups", { "jt", "audio", "sound groups" });
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#ifndef JAMTEMPLATE_LOGGING_AUDIO_HPP
#define JAMTEMPLATE_LOGGING_AUDIO_HPP

#include <audio/audio_interface.hpp>
#include <audio/audio/audio_interface.hpp>
#include <log/logger_interface.hpp>

namespace jt {
Expand Down Expand Up @@ -32,7 +32,7 @@ class LoggingAudio : public AudioInterface {

oalpp::SoundContextInterface& getContext() override;

SoundFadeManager& fades() override;
SoundFadeManagerInterface& fades() override;
GroupVolumeSetterInterface& groups() override;

private:
Expand Down
23 changes: 23 additions & 0 deletions impl/jamtemplate/common/audio/fades/logging_sound_fade_manager.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#include "logging_sound_fade_manager.hpp"

jt::LoggingSoundFadeManager::LoggingSoundFadeManager(
SoundFadeManagerInterface& decoratee, LoggerInterface& logger)
: m_decoratee { decoratee }
, m_logger { logger }
{
}

void jt::LoggingSoundFadeManager::volumeFade(std::weak_ptr<SoundInterface> sound,
float durationInSeconds, float startVolume, float endVolume)
{
m_logger.info("Create sound fade", { "jt", "audio", "sound fade" });
m_decoratee.volumeFade(sound, durationInSeconds, startVolume, endVolume);
}

void jt::LoggingSoundFadeManager::update(float elapsed) {
m_logger.verbose("sound fade manager update", { "jt", "audio", "sound fade" });
m_decoratee.update(elapsed); }

size_t jt::LoggingSoundFadeManager::size() const {
m_logger.verbose("sound fade manager size", { "jt", "audio", "sound fade" });
return m_decoratee.size(); }
24 changes: 24 additions & 0 deletions impl/jamtemplate/common/audio/fades/logging_sound_fade_manager.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#ifndef JAMTEMPLATE_LOGGING_SOUND_FADE_MANAGER_HPP
#define JAMTEMPLATE_LOGGING_SOUND_FADE_MANAGER_HPP

#include <audio/fades/sound_fade_manager_interface.hpp>
#include <log/logger_interface.hpp>

namespace jt {

class LoggingSoundFadeManager : public jt::SoundFadeManagerInterface {
public:
LoggingSoundFadeManager(SoundFadeManagerInterface& decoratee, LoggerInterface& logger);
void volumeFade(std::weak_ptr<SoundInterface> sound, float durationInSeconds, float startVolume,
float endVolume) override;
void update(float elapsed) override;
size_t size() const override;

private:
SoundFadeManagerInterface& m_decoratee;
LoggerInterface& m_logger;
};

} // namespace jt

#endif // JAMTEMPLATE_LOGGING_SOUND_FADE_MANAGER_HPP
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,12 @@ void jt::SoundFadeInfo::update(float elapsed)
snd->setVolume(value);
}
}
bool jt::SoundFadeInfo::isAlive() const { return m_age < m_duration; }

bool jt::SoundFadeInfo::hasValidSound() const
{
if (m_sound.expired()) {
return false;
}
return true;
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,24 @@
#ifndef MYAWESOMEGAME_SOUND_FADE_INFO_HPP
#define MYAWESOMEGAME_SOUND_FADE_INFO_HPP

#include <audio/sound_interface.hpp>
#include <audio/sound/sound_interface.hpp>
#include <memory>

namespace jt {
class SoundFadeManager;

class SoundFadeInfo {
friend class SoundFadeManager;

public:
SoundFadeInfo(std::weak_ptr<jt::SoundInterface> const& sound, float duration, float startVolume,
float endVolume);

void update(float elapsed);

bool hasValidSound() const;
bool isAlive() const;

private:
std::weak_ptr<jt::SoundInterface> m_sound;
float m_startVolume { 0.0f };
float m_endVolume { 0.0f };
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,15 @@ void SoundFadeManager::volumeFade(std::weak_ptr<SoundInterface> sound, float dur
void SoundFadeManager::update(float elapsed)
{
m_fadeInfos.erase(std::remove_if(m_fadeInfos.begin(), m_fadeInfos.end(),
[](auto const& fadeInfo) { return fadeInfo.m_sound.expired(); }),
[](auto const& fadeInfo) { return !fadeInfo.hasValidSound(); }),
m_fadeInfos.end());

for (auto& fade : m_fadeInfos) {
fade.update(elapsed);
}

m_fadeInfos.erase(
std::remove_if(m_fadeInfos.begin(), m_fadeInfos.end(),
[](auto const& fadeInfo) { return fadeInfo.m_age >= fadeInfo.m_duration; }),
m_fadeInfos.erase(std::remove_if(m_fadeInfos.begin(), m_fadeInfos.end(),
[](auto const& fadeInfo) { return !fadeInfo.isAlive(); }),
m_fadeInfos.end());
}
std::size_t SoundFadeManager::size() const { return m_fadeInfos.size(); }
Expand Down
Loading

0 comments on commit a64e8f1

Please sign in to comment.