From 008ce7f5f7d55e1e4924227a0a3825937c699629 Mon Sep 17 00:00:00 2001 From: kotofyt Date: Wed, 27 May 2026 01:46:16 +0300 Subject: [PATCH] sound now works --- build.cpp | 1 + engine/miniaudio.cpp | 152 +++++++++++++++++++++++++++++++++--- funnyassets/sounds/bonk.wav | Bin 0 -> 198222 bytes game/client/game.cpp | 7 +- game/shared/game.cpp | 1 + game/shared/game.h | 3 + public/iaudio.h | 11 ++- 7 files changed, 160 insertions(+), 15 deletions(-) create mode 100644 funnyassets/sounds/bonk.wav 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 0000000000000000000000000000000000000000..72274e6bb32acf8d97de91f9de895bcd8b8e8be3 GIT binary patch literal 198222 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 - 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