diff --git a/build.cpp b/build.cpp index 26cc3f3..b12062b 100755 --- a/build.cpp +++ b/build.cpp @@ -48,6 +48,7 @@ DECLARE_BUILD_STAGE(install_game) filesystem2->CopyDirectory(CUtlString("%s/core/",szOutputDir.GetString()), "funnyassets/textures"); filesystem2->CopyDirectory(CUtlString("%s/core/",szOutputDir.GetString()), "funnyassets/physics"); filesystem2->CopyDirectory(CUtlString("%s/core/",szOutputDir.GetString()), "funnyassets/fonts"); + filesystem2->CopyDirectory(CUtlString("%s/core/",szOutputDir.GetString()), "funnyassets/sounds"); filesystem2->CopyFile(CUtlString("%s/core/",szOutputDir.GetString()), "funnyassets/default.cfg"); filesystem2->CopyDirectory(CUtlString("%s/core/",szOutputDir.GetString()), "build/funnygame/assets/shaders"); if (Target_t::DefaultTarget().kernel == TARGET_KERNEL_WINDOWS) diff --git a/engine/miniaudio.cpp b/engine/miniaudio.cpp index b0f4715..50b770a 100644 --- a/engine/miniaudio.cpp +++ b/engine/miniaudio.cpp @@ -1,25 +1,155 @@ #include "iaudio.h" +#include "tier0/lib.h" +#include "tier1/utlvector.h" +#include "tier1/utlstring.h" +#define MINIAUDIO_IMPLEMENTATION #include "miniaudio.h" -class CAudioPlayer +class CMiniAudio; +class CMiniAudioManager; + +class CMiniAudioPlayer: public IAudioPlayer { public: - virtual void StartAt( double fTime ) = 0; - virtual double GetPlayTime() = 0; - virtual double Stop() = 0; - virtual void Continue() = 0; + virtual void StartAt( double fTime ) override; + virtual double GetPlayTime() override; + virtual double Stop() override; + virtual void Continue() override; + + virtual void SetDirection( Vector v ) override; + virtual void SetVolume( float fValue ) override; + + ma_sound m_sound; + CMiniAudio *m_pAudio; + + bool m_bIsPlaying; }; -class CAudio +class CMiniAudio: public IAudio { public: - virtual IAudioPlayer *SpawnPlayer() = 0; + virtual IAudioPlayer *SpawnPlayer() override; + + CMiniAudioManager *m_pManager; + CUtlString m_szName; + ma_sound m_sound; + CUtlVector m_players; }; -class CAudioManager: public IAppSystem +class CMiniAudioManager: public IAudioManager { public: - virtual void CreateAudio( const char *szFile ) = 0; - virtual void SetEarsPosition( Vector v ) = 0; - virtual void SetEarsRotation( Quat q ) = 0; + virtual void Init() override; + virtual void Shutdown() override; + virtual void Frame() override; + virtual IAudio *CreateAudio( const char *szFile ) override; + virtual void DestroyAudio( IAudio *pAudio ) override; + + ma_engine m_engine; + CUtlVector m_audios; }; + +void CMiniAudioPlayer::StartAt( double fTime ) +{ + ma_sound_seek_to_second(&m_sound, -fTime*1000); + ma_sound_start(&m_sound); + +} + +double CMiniAudioPlayer::GetPlayTime() +{ + return ma_sound_get_time_in_milliseconds(&m_sound)/1000.0; + +} + +double CMiniAudioPlayer::Stop() +{ + ma_sound_stop(&m_sound); + return GetPlayTime(); +} + +void CMiniAudioPlayer::Continue() +{ + +} + +void CMiniAudioPlayer::SetDirection( Vector v ) +{ + +} + +void CMiniAudioPlayer::SetVolume( float fValue ) +{ + +} + +IAudioPlayer *CMiniAudio::SpawnPlayer() +{ + CMiniAudioPlayer *pPlayer; + ma_result r; + + pPlayer = new CMiniAudioPlayer; + r = ma_sound_init_from_file(&m_pManager->m_engine, m_szName, MA_SOUND_FLAG_DECODE | MA_SOUND_FLAG_WAIT_INIT, NULL, NULL, &pPlayer->m_sound); + if (r != MA_SUCCESS) + { + delete pPlayer; + return NULL; + } + m_players.AppendTail(pPlayer); + return pPlayer; +} + +void CMiniAudioManager::Init() +{ + ma_device_config config; + ma_result r; + + r = ma_engine_init(NULL, &m_engine); + if ( r != MA_SUCCESS ) + { + V_printf("ma_engine_init failed\n"); + } + r = ma_engine_start(&m_engine); + if ( r != MA_SUCCESS ) + { + V_printf("ma_engine_start failed\n"); + } +} + +void CMiniAudioManager::Shutdown() +{ + +} + +void CMiniAudioManager::Frame() +{ + +} + + +IAudio *CMiniAudioManager::CreateAudio( const char *szFile ) +{ + + ma_result r; + CMiniAudio *pAudio; + + pAudio = new CMiniAudio; + r = ma_sound_init_from_file(&m_engine, szFile, MA_SOUND_FLAG_DECODE | MA_SOUND_FLAG_ASYNC, NULL, NULL, &pAudio->m_sound); + if (r != MA_SUCCESS) + { + delete pAudio; + return NULL; + } + + pAudio->m_pManager = this; + pAudio->m_szName = szFile; + m_audios.AppendTail(pAudio); + return pAudio; +} + +void CMiniAudioManager::DestroyAudio( IAudio *pAudio ) +{ + +} + +EXPOSE_INTERFACE(CMiniAudioManager, IAudioManager, AUDIO_MANAGER_INTERFACE_VERSION); diff --git a/funnyassets/sounds/bonk.wav b/funnyassets/sounds/bonk.wav new file mode 100644 index 0000000..72274e6 Binary files /dev/null and b/funnyassets/sounds/bonk.wav differ diff --git a/game/client/game.cpp b/game/client/game.cpp index 15abef3..a9f84d2 100644 --- a/game/client/game.cpp +++ b/game/client/game.cpp @@ -70,8 +70,13 @@ void CFunnyGameBridge::Init() g_pHumanDeviceManager->SetDefaultInput(g_pMainInput); - CreateInterfaceFn fnEngineFactory = Sys_GetFactory("engine"); + CreateInterfaceFn fnEngineFactory = GetEngineFactory(); g_pKotUI = (IKotUIManager*)fnEngineFactory(KOT_UI_INTEFACE_VERSION, NULL); + g_pAudioManager = (IAudioManager*)fnEngineFactory(AUDIO_MANAGER_INTERFACE_VERSION, NULL); + g_pAudioManager->Init(); + IAudio *pAudio = g_pAudioManager->CreateAudio("game/core/sounds/bonk.wav"); + IAudioPlayer *pAudioPlayer = pAudio->SpawnPlayer(); + pAudioPlayer->StartAt(0.35); g_pKotUI->ConnectInterface(g_pRenderContext, RENDER_CONTEXT_INTERFACE_VERSION); g_pKotUI->Init(); diff --git a/game/shared/game.cpp b/game/shared/game.cpp index b8775d8..edcee56 100644 --- a/game/shared/game.cpp +++ b/game/shared/game.cpp @@ -22,6 +22,7 @@ IPhysics *g_pPhysics; IPhysicsWorld *g_pPhysicsWorld; IKotUIManager *g_pKotUI; +IAudioManager *g_pAudioManager; CreateInterfaceFn GetEngineFactory() { diff --git a/game/shared/game.h b/game/shared/game.h index fa7c974..762d9e3 100644 --- a/game/shared/game.h +++ b/game/shared/game.h @@ -10,6 +10,7 @@ #include "iphysics.h" #include "ihumandevice.h" #include "kottui/kottui.h" +#include "iaudio.h" class CEngineVars { @@ -42,6 +43,8 @@ extern IPhysicsWorld *g_pPhysicsWorld; extern IKotUIManager *g_pKotUI; +extern IAudioManager *g_pAudioManager; + #define FUNNY_SECURE_PORT 27015 #define FUNNY_QUERY_PORT 27016 diff --git a/public/iaudio.h b/public/iaudio.h index 92935a6..9356fbf 100644 --- a/public/iaudio.h +++ b/public/iaudio.h @@ -12,6 +12,9 @@ public: virtual double GetPlayTime() = 0; virtual double Stop() = 0; virtual void Continue() = 0; + + virtual void SetDirection( Vector v ) = 0; + virtual void SetVolume( float fValue ) = 0; }; abstract_class IAudio @@ -23,9 +26,11 @@ public: abstract_class IAudioManager: public IAppSystem { public: - virtual void CreateAudio( const char *szFile ) = 0; - virtual void SetEarsPosition( Vector v ) = 0; - virtual void SetEarsRotation( Quat q ) = 0; + virtual void Frame() = 0; + virtual IAudio *CreateAudio( const char *szFile ) = 0; + virtual void DestroyAudio( IAudio *pAudio ) = 0; }; +#define AUDIO_MANAGER_INTERFACE_VERSION "Audio001" + #endif