From 26dd91ffa3e757c8aed59f5933195429d28c02a2 Mon Sep 17 00:00:00 2001 From: Danilo Date: Fri, 24 May 2024 23:12:29 -0300 Subject: [PATCH] Corrige SoundEffect --- framework/platform/soundeffect-dx.cpp | 67 ++++++++++++++++----------- inc/audio/soundeffect.hpp | 40 ++++++++++------ inc/platform-dx/implementations.hpp | 9 ++++ inc/platform-dx/soundeffect-dx.hpp | 37 --------------- inc/platform-dx/xna-dx.hpp | 1 - 5 files changed, 74 insertions(+), 80 deletions(-) delete mode 100644 inc/platform-dx/soundeffect-dx.hpp diff --git a/framework/platform/soundeffect-dx.cpp b/framework/platform/soundeffect-dx.cpp index cdc1df9..d8a1c30 100644 --- a/framework/platform/soundeffect-dx.cpp +++ b/framework/platform/soundeffect-dx.cpp @@ -1,94 +1,105 @@ -#include "platform-dx/soundeffect-dx.hpp" #include "platform-dx/implementations.hpp" using DxSoundEffect = DirectX::SoundEffect; namespace xna { + SoundEffectInstance::SoundEffectInstance() { + impl = unew(); + } + + SoundEffectInstance::~SoundEffectInstance() { + impl = nullptr; + } + SoundEffect::SoundEffect(AudioEngine& audioEngine, String const& fileName) { if (!audioEngine.impl->_dxAudioEngine) return; const auto file = XnaHToWString(fileName); - _dxSoundEffect = New(audioEngine.impl->_dxAudioEngine.get(), file.c_str()); + impl->_dxSoundEffect = unew(audioEngine.impl->_dxAudioEngine.get(), file.c_str()); + } + + SoundEffect::~SoundEffect() { + impl = nullptr; } void SoundEffect::Play() { - if (!_dxSoundEffect) + if (!impl->_dxSoundEffect) return; - _dxSoundEffect->Play(); + impl->_dxSoundEffect->Play(); } void SoundEffect::Play(float volume, float pitch, float pan) { - if (!_dxSoundEffect) + if (!impl->_dxSoundEffect) return; - _dxSoundEffect->Play(volume, pitch, pan); + impl->_dxSoundEffect->Play(volume, pitch, pan); } - SoundEffectInstance SoundEffect::CreateInstance() { - if (!_dxSoundEffect) - return SoundEffectInstance(); + uptr SoundEffect::CreateInstance() { + if (!impl->_dxSoundEffect) + return unew(); - SoundEffectInstance i{}; - i._dxInstance = _dxSoundEffect->CreateInstance(); + auto instance = unew(); + instance->impl->_dxInstance = impl->_dxSoundEffect->CreateInstance(); - return i; + return instance; } void SoundEffectInstance::Play(bool loop) { - if (!_dxInstance) + if (!impl->_dxInstance) return; - _dxInstance->Play(loop); + impl->_dxInstance->Play(loop); } void SoundEffectInstance::Stop(bool immediate) { - if (!_dxInstance) + if (!impl->_dxInstance) return; - _dxInstance->Stop(immediate); + impl->_dxInstance->Stop(immediate); } void SoundEffectInstance::Pause() { - if (!_dxInstance) + if (!impl->_dxInstance) return; - _dxInstance->Pause(); + impl->_dxInstance->Pause(); } void SoundEffectInstance::Resume() { - if (!_dxInstance) + if (!impl->_dxInstance) return; - _dxInstance->Resume(); + impl->_dxInstance->Resume(); } void SoundEffectInstance::Volume(float volume) { - if (!_dxInstance) + if (!impl->_dxInstance) return; - _dxInstance->SetVolume(volume); + impl->_dxInstance->SetVolume(volume); } void SoundEffectInstance::Pitch(float pitch) { - if (!_dxInstance) + if (!impl->_dxInstance) return; - _dxInstance->SetPitch(pitch); + impl->_dxInstance->SetPitch(pitch); } void SoundEffectInstance::Pan(float pan) { - if (!_dxInstance) + if (!impl->_dxInstance) return; - _dxInstance->SetPan(pan); + impl->_dxInstance->SetPan(pan); } bool SoundEffectInstance::IsLooped() { - if (!_dxInstance) + if (!impl->_dxInstance) return false; - return _dxInstance->IsLooped(); + return impl->_dxInstance->IsLooped(); } } \ No newline at end of file diff --git a/inc/audio/soundeffect.hpp b/inc/audio/soundeffect.hpp index 1cd3533..94c0e4d 100644 --- a/inc/audio/soundeffect.hpp +++ b/inc/audio/soundeffect.hpp @@ -4,24 +4,36 @@ #include "../default.hpp" namespace xna { - struct ISoundEffectInstance { + struct SoundEffectInstance { public: - virtual void Play(bool loop = false) = 0; - virtual void Stop(bool immediate = true) = 0; - virtual void Pause() = 0; - virtual void Resume() = 0; - virtual void Volume(float volume) = 0; - virtual void Pitch(float pitch) = 0; - virtual void Pan(float pan) = 0; - virtual bool IsLooped() = 0; + SoundEffectInstance(); + ~SoundEffectInstance(); + + void Play(bool loop = false); + void Stop(bool immediate = true); + void Pause(); + void Resume(); + void Volume(float volume); + void Pitch(float pitch); + void Pan(float pan); + bool IsLooped(); + + public: + struct PlatformImplementation; + uptr impl = nullptr; }; - class ISoundEffect { + class SoundEffect { public: - virtual ~ISoundEffect(){} - virtual void Play() = 0; - virtual void Play(float volume, float pitch, float pan) = 0; - virtual SoundEffectInstance CreateInstance() = 0; + SoundEffect(AudioEngine& audioEngine, String const& fileName); + ~SoundEffect(); + void Play(); + void Play(float volume, float pitch, float pan); + uptr CreateInstance(); + + public: + struct PlatformImplementation; + uptr impl = nullptr; }; } diff --git a/inc/platform-dx/implementations.hpp b/inc/platform-dx/implementations.hpp index 17b8c72..f96041f 100644 --- a/inc/platform-dx/implementations.hpp +++ b/inc/platform-dx/implementations.hpp @@ -22,6 +22,7 @@ #include "graphics/rendertarget.hpp" #include "game/window.hpp" #include "audio/audioengine.hpp" +#include "audio/soundeffect.hpp" #include "graphics/viewport.hpp" #include "common/color.hpp" #include "game/game.hpp" @@ -470,6 +471,14 @@ namespace xna { DX::StepTimer _stepTimer{}; }; + struct SoundEffectInstance::PlatformImplementation { + uptr _dxInstance = nullptr; + }; + + struct SoundEffect::PlatformImplementation { + uptr _dxSoundEffect = nullptr; + }; + template inline bool IndexBuffer::Initialize(std::vector const& data, xna_error_ptr_arg) { if (!impl || !m_device || !m_device->impl->_device || data.empty()) { diff --git a/inc/platform-dx/soundeffect-dx.hpp b/inc/platform-dx/soundeffect-dx.hpp deleted file mode 100644 index a202ffb..0000000 --- a/inc/platform-dx/soundeffect-dx.hpp +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef XNA_PLATFORM_SOUNDEFFECT_DX_HPP -#define XNA_PLATFORM_SOUNDEFFECT_DX_HPP - -#include "../audio/soundeffect.hpp" -#include - -namespace xna { - struct SoundEffectInstance : public ISoundEffectInstance { - public: - SoundEffectInstance() = default; - - virtual void Play(bool loop = false) override; - virtual void Stop(bool immediate = true) override; - virtual void Pause() override; - virtual void Resume() override; - virtual void Volume(float volume) override; - virtual void Pitch(float pitch) override; - virtual void Pan(float pan) override; - virtual bool IsLooped() override; - - public: - uptr _dxInstance = nullptr; - }; - - class SoundEffect : public ISoundEffect { - public: - SoundEffect(AudioEngine& audioEngine, String const& fileName); - virtual void Play() override; - virtual void Play(float volume, float pitch, float pan) override; - virtual SoundEffectInstance CreateInstance() override; - - public: - sptr _dxSoundEffect = nullptr; - }; -} - -#endif \ No newline at end of file diff --git a/inc/platform-dx/xna-dx.hpp b/inc/platform-dx/xna-dx.hpp index ee3e379..b6f645e 100644 --- a/inc/platform-dx/xna-dx.hpp +++ b/inc/platform-dx/xna-dx.hpp @@ -2,5 +2,4 @@ #include "dx/StepTimer.hpp" #include "dxheaders.hpp" #include "init-dx.hpp" -#include "soundeffect-dx.hpp" #include "implementations.hpp" \ No newline at end of file