From 7c70efa00bdc699e2463140f17d4347acada3db6 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Mon, 16 Feb 2026 03:15:26 +0100 Subject: [PATCH 1/7] Moved AudioManagerDummy class. --- Core/GameEngine/Include/Common/GameAudio.h | 50 ------------------- .../MilesAudioDevice/MilesAudioManager.h | 49 ++++++++++++++++++ 2 files changed, 49 insertions(+), 50 deletions(-) diff --git a/Core/GameEngine/Include/Common/GameAudio.h b/Core/GameEngine/Include/Common/GameAudio.h index 74f6c7120c0..ba81d473bfc 100644 --- a/Core/GameEngine/Include/Common/GameAudio.h +++ b/Core/GameEngine/Include/Common/GameAudio.h @@ -387,55 +387,5 @@ class AudioManager : public SubsystemInterface Bool m_disallowSpeech : 1; }; -// TheSuperHackers @feature helmutbuhler 17/05/2025 -// AudioManager that does nothing. Used for Headless Mode. -class AudioManagerDummy : public AudioManager -{ -#if defined(RTS_DEBUG) - virtual void audioDebugDisplay(DebugDisplayInterface* dd, void* userData, FILE* fp) {} -#endif - virtual void stopAudio(AudioAffect which) {} - virtual void pauseAudio(AudioAffect which) {} - virtual void resumeAudio(AudioAffect which) {} - virtual void pauseAmbient(Bool shouldPause) {} - virtual void killAudioEventImmediately(AudioHandle audioEvent) {} - virtual void nextMusicTrack() {} - virtual void prevMusicTrack() {} - virtual Bool isMusicPlaying() const { return false; } - virtual Bool hasMusicTrackCompleted(const AsciiString& trackName, Int numberOfTimes) const { return false; } - virtual AsciiString getMusicTrackName() const { return ""; } - virtual void openDevice() {} - virtual void closeDevice() {} - virtual void* getDevice() { return nullptr; } - virtual void notifyOfAudioCompletion(UnsignedInt audioCompleted, UnsignedInt flags) {} - virtual UnsignedInt getProviderCount(void) const { return 0; }; - virtual AsciiString getProviderName(UnsignedInt providerNum) const { return ""; } - virtual UnsignedInt getProviderIndex(AsciiString providerName) const { return 0; } - virtual void selectProvider(UnsignedInt providerNdx) {} - virtual void unselectProvider(void) {} - virtual UnsignedInt getSelectedProvider(void) const { return 0; } - virtual void setSpeakerType(UnsignedInt speakerType) {} - virtual UnsignedInt getSpeakerType(void) { return 0; } - virtual UnsignedInt getNum2DSamples(void) const { return 0; } - virtual UnsignedInt getNum3DSamples(void) const { return 0; } - virtual UnsignedInt getNumStreams(void) const { return 0; } - virtual Bool doesViolateLimit(AudioEventRTS* event) const { return false; } - virtual Bool isPlayingLowerPriority(AudioEventRTS* event) const { return false; } - virtual Bool isPlayingAlready(AudioEventRTS* event) const { return false; } - virtual Bool isObjectPlayingVoice(UnsignedInt objID) const { return false; } - virtual void adjustVolumeOfPlayingAudio(AsciiString eventName, Real newVolume) {} - virtual void removePlayingAudio(AsciiString eventName) {} - virtual void removeAllDisabledAudio() {} - virtual Bool has3DSensitiveStreamsPlaying(void) const { return false; } - virtual void* getHandleForBink(void) { return nullptr; } - virtual void releaseHandleForBink(void) {} - virtual void friend_forcePlayAudioEventRTS(const AudioEventRTS* eventToPlay) {} - virtual void setPreferredProvider(AsciiString providerNdx) {} - virtual void setPreferredSpeaker(AsciiString speakerType) {} - virtual Real getFileLengthMS(AsciiString strToLoad) const { return -1; } - virtual void closeAnySamplesUsingFile(const void* fileToClose) {} - virtual void setDeviceListenerPosition(void) {} -}; - extern AudioManager *TheAudio; diff --git a/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h b/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h index 6d6f52f2d55..7d0ef09bf4d 100644 --- a/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h +++ b/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h @@ -330,3 +330,52 @@ class MilesAudioManager : public AudioManager }; +// TheSuperHackers @feature helmutbuhler 17/05/2025 +// AudioManager that does nothing. Used for Headless Mode. +class AudioManagerDummy : public AudioManager +{ +#if defined(RTS_DEBUG) + virtual void audioDebugDisplay(DebugDisplayInterface* dd, void* userData, FILE* fp) {} +#endif + virtual void stopAudio(AudioAffect which) {} + virtual void pauseAudio(AudioAffect which) {} + virtual void resumeAudio(AudioAffect which) {} + virtual void pauseAmbient(Bool shouldPause) {} + virtual void killAudioEventImmediately(AudioHandle audioEvent) {} + virtual void nextMusicTrack() {} + virtual void prevMusicTrack() {} + virtual Bool isMusicPlaying() const { return false; } + virtual Bool hasMusicTrackCompleted(const AsciiString& trackName, Int numberOfTimes) const { return false; } + virtual AsciiString getMusicTrackName() const { return ""; } + virtual void openDevice() {} + virtual void closeDevice() {} + virtual void* getDevice() { return nullptr; } + virtual void notifyOfAudioCompletion(UnsignedInt audioCompleted, UnsignedInt flags) {} + virtual UnsignedInt getProviderCount(void) const { return 0; }; + virtual AsciiString getProviderName(UnsignedInt providerNum) const { return ""; } + virtual UnsignedInt getProviderIndex(AsciiString providerName) const { return 0; } + virtual void selectProvider(UnsignedInt providerNdx) {} + virtual void unselectProvider(void) {} + virtual UnsignedInt getSelectedProvider(void) const { return 0; } + virtual void setSpeakerType(UnsignedInt speakerType) {} + virtual UnsignedInt getSpeakerType(void) { return 0; } + virtual UnsignedInt getNum2DSamples(void) const { return 0; } + virtual UnsignedInt getNum3DSamples(void) const { return 0; } + virtual UnsignedInt getNumStreams(void) const { return 0; } + virtual Bool doesViolateLimit(AudioEventRTS* event) const { return false; } + virtual Bool isPlayingLowerPriority(AudioEventRTS* event) const { return false; } + virtual Bool isPlayingAlready(AudioEventRTS* event) const { return false; } + virtual Bool isObjectPlayingVoice(UnsignedInt objID) const { return false; } + virtual void adjustVolumeOfPlayingAudio(AsciiString eventName, Real newVolume) {} + virtual void removePlayingAudio(AsciiString eventName) {} + virtual void removeAllDisabledAudio() {} + virtual Bool has3DSensitiveStreamsPlaying(void) const { return false; } + virtual void* getHandleForBink(void) { return nullptr; } + virtual void releaseHandleForBink(void) {} + virtual void friend_forcePlayAudioEventRTS(const AudioEventRTS* eventToPlay) {} + virtual void setPreferredProvider(AsciiString providerNdx) {} + virtual void setPreferredSpeaker(AsciiString speakerType) {} + virtual Real getFileLengthMS(AsciiString strToLoad) const { return -1; } + virtual void closeAnySamplesUsingFile(const void* fileToClose) {} + virtual void setDeviceListenerPosition(void) {} +}; From 13a5ed69b5dfc87fbcdcaf5178984a38c33e7268 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Mon, 16 Feb 2026 03:16:11 +0100 Subject: [PATCH 2/7] Update audio manager creation code. --- GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h | 2 +- GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp | 2 +- .../Include/Win32Device/Common/Win32GameEngine.h | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h b/GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h index 62d3502eed1..6473eef7f98 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h @@ -95,7 +95,7 @@ class GameEngine : public SubsystemInterface virtual Radar *createRadar( void ) = 0; ///< Factory for radar virtual WebBrowser *createWebBrowser( void ) = 0; ///< Factory for embedded browser virtual ParticleSystemManager* createParticleSystemManager( void ) = 0; - virtual AudioManager *createAudioManager( void ) = 0; ///< Factory for Audio Manager + virtual AudioManager *createAudioManager( bool headless ) = 0; ///< Factory for Audio Manager Real m_logicTimeAccumulator; ///< Frame time accumulated towards submitting a new logic frame diff --git a/GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp b/GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp index 5aa3a1e7b4d..ceebf85f1ee 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp @@ -522,7 +522,7 @@ void GameEngine::init() startTime64 = endTime64;//Reset the clock //////////////////////////////////////////////////////// DEBUG_LOG(("%s", Buf));//////////////////////////////////////////////////////////////////////////// #endif///////////////////////////////////////////////////////////////////////////////////////////// - initSubsystem(TheAudio,"TheAudio", TheGlobalData->m_headless ? NEW AudioManagerDummy : createAudioManager(), nullptr); + initSubsystem(TheAudio,"TheAudio", createAudioManager(TheGlobalData->m_headless), nullptr); if (!TheAudio->isMusicAlreadyLoaded()) setQuitting(TRUE); diff --git a/GeneralsMD/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h b/GeneralsMD/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h index 8eac1dccc1c..ee6b0b9228c 100644 --- a/GeneralsMD/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h +++ b/GeneralsMD/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h @@ -77,7 +77,7 @@ class Win32GameEngine : public GameEngine virtual NetworkInterface *createNetwork( void ); ///< Factory for the network virtual Radar *createRadar( void ); ///< Factory for radar virtual WebBrowser *createWebBrowser( void ); ///< Factory for embedded browser - virtual AudioManager *createAudioManager( void ); ///< Factory for audio device + virtual AudioManager *createAudioManager( bool headless ); ///< Factory for audio device virtual ParticleSystemManager* createParticleSystemManager( void ); @@ -98,4 +98,4 @@ inline ParticleSystemManager* Win32GameEngine::createParticleSystemManager( void inline NetworkInterface *Win32GameEngine::createNetwork( void ) { return NetworkInterface::createNetwork(); } inline Radar *Win32GameEngine::createRadar( void ) { return NEW W3DRadar; } inline WebBrowser *Win32GameEngine::createWebBrowser( void ) { return NEW CComObject; } -inline AudioManager *Win32GameEngine::createAudioManager( void ) { return NEW MilesAudioManager; } +inline AudioManager *Win32GameEngine::createAudioManager( bool headless ) { return headless ? NEW AudioManagerDummy : NEW MilesAudioManager; } From d30cdbf72ec64aa5909b572de8e89cb35245bb25 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Mon, 16 Feb 2026 03:26:20 +0100 Subject: [PATCH 3/7] Made AudioManagerDummy derive from MilesAudioManager instead. --- .../Include/MilesAudioDevice/MilesAudioManager.h | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h b/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h index 7d0ef09bf4d..b8a273728a1 100644 --- a/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h +++ b/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h @@ -330,9 +330,10 @@ class MilesAudioManager : public AudioManager }; -// TheSuperHackers @feature helmutbuhler 17/05/2025 -// AudioManager that does nothing. Used for Headless Mode. -class AudioManagerDummy : public AudioManager +// TheSuperHackers @feature helmutbuhler 17/05/2025 AudioManager that does almost nothing. Used for Headless Mode. +// @tweak Caball009 16/02/2026 Scripts may require the actual audio file length to function properly. +// The Miles audio manager handles the device opening / closure, so that getFileLengthMS can function as intended. +class AudioManagerDummy : public MilesAudioManager { #if defined(RTS_DEBUG) virtual void audioDebugDisplay(DebugDisplayInterface* dd, void* userData, FILE* fp) {} @@ -347,8 +348,8 @@ class AudioManagerDummy : public AudioManager virtual Bool isMusicPlaying() const { return false; } virtual Bool hasMusicTrackCompleted(const AsciiString& trackName, Int numberOfTimes) const { return false; } virtual AsciiString getMusicTrackName() const { return ""; } - virtual void openDevice() {} - virtual void closeDevice() {} + //virtual void openDevice() {} + //virtual void closeDevice() {} virtual void* getDevice() { return nullptr; } virtual void notifyOfAudioCompletion(UnsignedInt audioCompleted, UnsignedInt flags) {} virtual UnsignedInt getProviderCount(void) const { return 0; }; @@ -375,7 +376,7 @@ class AudioManagerDummy : public AudioManager virtual void friend_forcePlayAudioEventRTS(const AudioEventRTS* eventToPlay) {} virtual void setPreferredProvider(AsciiString providerNdx) {} virtual void setPreferredSpeaker(AsciiString speakerType) {} - virtual Real getFileLengthMS(AsciiString strToLoad) const { return -1; } + //virtual Real getFileLengthMS(AsciiString strToLoad) const { return -1; } virtual void closeAnySamplesUsingFile(const void* fileToClose) {} virtual void setDeviceListenerPosition(void) {} }; From 97f51d73f7cf973db0b7333ba328bcf3b4e86a76 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Mon, 16 Feb 2026 03:26:51 +0100 Subject: [PATCH 4/7] Changed unused code for file length. --- .../Include/MilesAudioDevice/MilesAudioManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h b/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h index b8a273728a1..fea28b0da6d 100644 --- a/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h +++ b/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h @@ -376,7 +376,7 @@ class AudioManagerDummy : public MilesAudioManager virtual void friend_forcePlayAudioEventRTS(const AudioEventRTS* eventToPlay) {} virtual void setPreferredProvider(AsciiString providerNdx) {} virtual void setPreferredSpeaker(AsciiString speakerType) {} - //virtual Real getFileLengthMS(AsciiString strToLoad) const { return -1; } + //virtual Real getFileLengthMS(AsciiString strToLoad) const { return 0.0f; } virtual void closeAnySamplesUsingFile(const void* fileToClose) {} virtual void setDeviceListenerPosition(void) {} }; From eae21d032cc2a92a8b14c4cfdb803bf5b3628169 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Mon, 16 Feb 2026 03:28:55 +0100 Subject: [PATCH 5/7] Renamed AudioManagerDummy to MilesAudioManagerDummy. --- .../Include/MilesAudioDevice/MilesAudioManager.h | 2 +- .../Include/Win32Device/Common/Win32GameEngine.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h b/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h index fea28b0da6d..c306e504d05 100644 --- a/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h +++ b/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h @@ -333,7 +333,7 @@ class MilesAudioManager : public AudioManager // TheSuperHackers @feature helmutbuhler 17/05/2025 AudioManager that does almost nothing. Used for Headless Mode. // @tweak Caball009 16/02/2026 Scripts may require the actual audio file length to function properly. // The Miles audio manager handles the device opening / closure, so that getFileLengthMS can function as intended. -class AudioManagerDummy : public MilesAudioManager +class MilesAudioManagerDummy : public MilesAudioManager { #if defined(RTS_DEBUG) virtual void audioDebugDisplay(DebugDisplayInterface* dd, void* userData, FILE* fp) {} diff --git a/GeneralsMD/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h b/GeneralsMD/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h index ee6b0b9228c..87cab864e76 100644 --- a/GeneralsMD/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h +++ b/GeneralsMD/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h @@ -98,4 +98,4 @@ inline ParticleSystemManager* Win32GameEngine::createParticleSystemManager( void inline NetworkInterface *Win32GameEngine::createNetwork( void ) { return NetworkInterface::createNetwork(); } inline Radar *Win32GameEngine::createRadar( void ) { return NEW W3DRadar; } inline WebBrowser *Win32GameEngine::createWebBrowser( void ) { return NEW CComObject; } -inline AudioManager *Win32GameEngine::createAudioManager( bool headless ) { return headless ? NEW AudioManagerDummy : NEW MilesAudioManager; } +inline AudioManager *Win32GameEngine::createAudioManager( bool headless ) { return headless ? NEW MilesAudioManagerDummy : NEW MilesAudioManager; } From 7aea679f581e69ea690a8a21f07b93d34023dcbc Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Mon, 16 Feb 2026 03:31:05 +0100 Subject: [PATCH 6/7] Changed TSH comment. --- .../Include/MilesAudioDevice/MilesAudioManager.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h b/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h index c306e504d05..f96a23cc606 100644 --- a/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h +++ b/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h @@ -331,8 +331,8 @@ class MilesAudioManager : public AudioManager }; // TheSuperHackers @feature helmutbuhler 17/05/2025 AudioManager that does almost nothing. Used for Headless Mode. -// @tweak Caball009 16/02/2026 Scripts may require the actual audio file length to function properly. -// The Miles audio manager handles the device opening / closure, so that getFileLengthMS can function as intended. +// @bugfix Caball009 16/02/2026 Scripts may require the actual audio file length to function properly. +// The Miles AudioManager handles the device opening / closure, so that getFileLengthMS can function as intended. class MilesAudioManagerDummy : public MilesAudioManager { #if defined(RTS_DEBUG) From 7751f9efe8d82858d7a4e1863ec7e0c302b8da4b Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Mon, 16 Feb 2026 04:12:26 +0100 Subject: [PATCH 7/7] Removed unnecessary and inconsistent 'void' function parameters. --- .../MilesAudioDevice/MilesAudioManager.h | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h b/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h index f96a23cc606..bca2c8539e9 100644 --- a/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h +++ b/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h @@ -352,17 +352,17 @@ class MilesAudioManagerDummy : public MilesAudioManager //virtual void closeDevice() {} virtual void* getDevice() { return nullptr; } virtual void notifyOfAudioCompletion(UnsignedInt audioCompleted, UnsignedInt flags) {} - virtual UnsignedInt getProviderCount(void) const { return 0; }; + virtual UnsignedInt getProviderCount() const { return 0; }; virtual AsciiString getProviderName(UnsignedInt providerNum) const { return ""; } virtual UnsignedInt getProviderIndex(AsciiString providerName) const { return 0; } virtual void selectProvider(UnsignedInt providerNdx) {} - virtual void unselectProvider(void) {} - virtual UnsignedInt getSelectedProvider(void) const { return 0; } + virtual void unselectProvider() {} + virtual UnsignedInt getSelectedProvider() const { return 0; } virtual void setSpeakerType(UnsignedInt speakerType) {} - virtual UnsignedInt getSpeakerType(void) { return 0; } - virtual UnsignedInt getNum2DSamples(void) const { return 0; } - virtual UnsignedInt getNum3DSamples(void) const { return 0; } - virtual UnsignedInt getNumStreams(void) const { return 0; } + virtual UnsignedInt getSpeakerType() { return 0; } + virtual UnsignedInt getNum2DSamples() const { return 0; } + virtual UnsignedInt getNum3DSamples() const { return 0; } + virtual UnsignedInt getNumStreams() const { return 0; } virtual Bool doesViolateLimit(AudioEventRTS* event) const { return false; } virtual Bool isPlayingLowerPriority(AudioEventRTS* event) const { return false; } virtual Bool isPlayingAlready(AudioEventRTS* event) const { return false; } @@ -370,13 +370,13 @@ class MilesAudioManagerDummy : public MilesAudioManager virtual void adjustVolumeOfPlayingAudio(AsciiString eventName, Real newVolume) {} virtual void removePlayingAudio(AsciiString eventName) {} virtual void removeAllDisabledAudio() {} - virtual Bool has3DSensitiveStreamsPlaying(void) const { return false; } - virtual void* getHandleForBink(void) { return nullptr; } - virtual void releaseHandleForBink(void) {} + virtual Bool has3DSensitiveStreamsPlaying() const { return false; } + virtual void* getHandleForBink() { return nullptr; } + virtual void releaseHandleForBink() {} virtual void friend_forcePlayAudioEventRTS(const AudioEventRTS* eventToPlay) {} virtual void setPreferredProvider(AsciiString providerNdx) {} virtual void setPreferredSpeaker(AsciiString speakerType) {} //virtual Real getFileLengthMS(AsciiString strToLoad) const { return 0.0f; } virtual void closeAnySamplesUsingFile(const void* fileToClose) {} - virtual void setDeviceListenerPosition(void) {} + virtual void setDeviceListenerPosition() {} };