Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 0 additions & 51 deletions Core/GameEngine/Include/Common/GameAudio.h
Original file line number Diff line number Diff line change
Expand Up @@ -383,55 +383,4 @@ 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) override {}
virtual void pauseAudio(AudioAffect which) override {}
virtual void resumeAudio(AudioAffect which) override {}
virtual void pauseAmbient(Bool shouldPause) override {}
virtual void killAudioEventImmediately(AudioHandle audioEvent) override {}
virtual void nextMusicTrack() override {}
virtual void prevMusicTrack() override {}
virtual Bool isMusicPlaying() const override { return false; }
virtual Bool hasMusicTrackCompleted(const AsciiString& trackName, Int numberOfTimes) const override { return false; }
virtual AsciiString getMusicTrackName() const override { return ""; }
virtual void openDevice() override {}
virtual void closeDevice() override {}
virtual void* getDevice() override { return nullptr; }
virtual void notifyOfAudioCompletion(UnsignedInt audioCompleted, UnsignedInt flags) override {}
virtual UnsignedInt getProviderCount() const override { return 0; };
virtual AsciiString getProviderName(UnsignedInt providerNum) const override { return ""; }
virtual UnsignedInt getProviderIndex(AsciiString providerName) const override { return 0; }
virtual void selectProvider(UnsignedInt providerNdx) override {}
virtual void unselectProvider() override {}
virtual UnsignedInt getSelectedProvider() const override { return 0; }
virtual void setSpeakerType(UnsignedInt speakerType) override {}
virtual UnsignedInt getSpeakerType() override { return 0; }
virtual UnsignedInt getNum2DSamples() const override { return 0; }
virtual UnsignedInt getNum3DSamples() const override { return 0; }
virtual UnsignedInt getNumStreams() const override { return 0; }
virtual Bool doesViolateLimit(AudioEventRTS* event) const override { return false; }
virtual Bool isPlayingLowerPriority(AudioEventRTS* event) const override { return false; }
virtual Bool isPlayingAlready(AudioEventRTS* event) const override { return false; }
virtual Bool isObjectPlayingVoice(UnsignedInt objID) const override { return false; }
virtual void adjustVolumeOfPlayingAudio(AsciiString eventName, Real newVolume) override {}
virtual void removePlayingAudio(AsciiString eventName) override {}
virtual void removeAllDisabledAudio() override {}
virtual Bool has3DSensitiveStreamsPlaying() const override { return false; }
virtual void* getHandleForBink() override { return nullptr; }
virtual void releaseHandleForBink() override {}
virtual void friend_forcePlayAudioEventRTS(const AudioEventRTS* eventToPlay) override {}
virtual void setPreferredProvider(AsciiString providerNdx) override {}
virtual void setPreferredSpeaker(AsciiString speakerType) override {}
virtual Real getFileLengthMS(AsciiString strToLoad) const override { return -1; }
virtual void closeAnySamplesUsingFile(const void* fileToClose) override {}
virtual void setDeviceListenerPosition() override {}
};


extern AudioManager *TheAudio;
50 changes: 50 additions & 0 deletions Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -330,3 +330,53 @@ class MilesAudioManager : public AudioManager

};

// TheSuperHackers @feature helmutbuhler 17/05/2025 AudioManager that does almost nothing. Useful for headless mode.
// @bugfix Caball009 26/03/2026 Scripts may require the actual audio file length to function properly, which is important for the CRC computation.
// The Miles AudioManager handles the device opening / closure, so that getFileLengthMS can function as intended.
class MilesAudioManagerDummy : public MilesAudioManager
{
#if defined(RTS_DEBUG)
virtual void audioDebugDisplay(DebugDisplayInterface* dd, void* userData, FILE* fp) {}
#endif
virtual void stopAudio(AudioAffect which) override {}
virtual void pauseAudio(AudioAffect which) override {}
virtual void resumeAudio(AudioAffect which) override {}
virtual void pauseAmbient(Bool shouldPause) override {}
virtual void killAudioEventImmediately(AudioHandle audioEvent) override {}
virtual void nextMusicTrack() override {}
virtual void prevMusicTrack() override {}
virtual Bool isMusicPlaying() const override { return false; }
virtual Bool hasMusicTrackCompleted(const AsciiString& trackName, Int numberOfTimes) const override { return false; }
virtual AsciiString getMusicTrackName() const override { return ""; }
//virtual void openDevice() override {}
//virtual void closeDevice() override {}
//virtual void* getDevice() override { return nullptr; }
virtual void notifyOfAudioCompletion(UnsignedInt audioCompleted, UnsignedInt flags) override {}
virtual UnsignedInt getProviderCount() const override { return 0; };
virtual AsciiString getProviderName(UnsignedInt providerNum) const override { return ""; }
virtual UnsignedInt getProviderIndex(AsciiString providerName) const override { return 0; }
virtual void selectProvider(UnsignedInt providerNdx) override {}
virtual void unselectProvider() override {}
virtual UnsignedInt getSelectedProvider() const override { return 0; }
virtual void setSpeakerType(UnsignedInt speakerType) override {}
virtual UnsignedInt getSpeakerType() override { return 0; }
virtual UnsignedInt getNum2DSamples() const override { return 0; }
virtual UnsignedInt getNum3DSamples() const override { return 0; }
virtual UnsignedInt getNumStreams() const override { return 0; }
virtual Bool doesViolateLimit(AudioEventRTS* event) const override { return false; }
virtual Bool isPlayingLowerPriority(AudioEventRTS* event) const override { return false; }
virtual Bool isPlayingAlready(AudioEventRTS* event) const override { return false; }
virtual Bool isObjectPlayingVoice(UnsignedInt objID) const override { return false; }
virtual void adjustVolumeOfPlayingAudio(AsciiString eventName, Real newVolume) override {}
virtual void removePlayingAudio(AsciiString eventName) override {}
virtual void removeAllDisabledAudio() override {}
virtual Bool has3DSensitiveStreamsPlaying() const override { return false; }
virtual void* getHandleForBink() override { return nullptr; }
virtual void releaseHandleForBink() override {}
virtual void friend_forcePlayAudioEventRTS(const AudioEventRTS* eventToPlay) override {}
virtual void setPreferredProvider(AsciiString providerNdx) override {}
virtual void setPreferredSpeaker(AsciiString speakerType) override {}
//virtual Real getFileLengthMS(AsciiString strToLoad) const override { return 0.0f; }
virtual void closeAnySamplesUsingFile(const void* fileToClose) override {}
virtual void setDeviceListenerPosition() override {}
};
4 changes: 2 additions & 2 deletions Generals/Code/GameEngine/Include/Common/GameEngine.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,10 +93,10 @@ class GameEngine : public SubsystemInterface
virtual ModuleFactory *createModuleFactory() = 0; ///< Factory for modules
virtual ThingFactory *createThingFactory() = 0; ///< Factory for the thing factory
virtual FunctionLexicon *createFunctionLexicon() = 0; ///< Factory for Function Lexicon
virtual Radar *createRadar() = 0; ///< Factory for radar
virtual Radar *createRadar(Bool dummy) = 0; ///< Factory for radar
virtual WebBrowser *createWebBrowser() = 0; ///< Factory for embedded browser
virtual ParticleSystemManager* createParticleSystemManager(Bool dummy) = 0;
virtual AudioManager *createAudioManager() = 0; ///< Factory for Audio Manager
virtual AudioManager *createAudioManager(Bool dummy) = 0; ///< Factory for Audio Manager

Real m_logicTimeAccumulator; ///< Frame time accumulated towards submitting a new logic frame

Expand Down
4 changes: 2 additions & 2 deletions Generals/Code/GameEngine/Source/Common/GameEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -440,7 +440,7 @@ void GameEngine::init()
initSubsystem(TheTerrainRoads,"TheTerrainRoads", MSGNEW("GameEngineSubsystem") TerrainRoadCollection(), &xferCRC, "Data\\INI\\Default\\Roads", "Data\\INI\\Roads");
initSubsystem(TheGlobalLanguageData,"TheGlobalLanguageData",MSGNEW("GameEngineSubsystem") GlobalLanguage, nullptr); // must be before the game text
TheGlobalLanguageData->parseCustomDefinition();
initSubsystem(TheAudio,"TheAudio", TheGlobalData->m_headless ? NEW AudioManagerDummy : createAudioManager(), nullptr);
initSubsystem(TheAudio,"TheAudio", createAudioManager(TheGlobalData->m_headless), nullptr);
if (!TheAudio->isMusicAlreadyLoaded())
setQuitting(TRUE);

Expand Down Expand Up @@ -479,7 +479,7 @@ void GameEngine::init()
initSubsystem(TheCrateSystem,"TheCrateSystem", MSGNEW("GameEngineSubsystem") CrateSystem(), &xferCRC, "Data\\INI\\Default\\Crate", "Data\\INI\\Crate");
initSubsystem(ThePlayerList,"ThePlayerList", MSGNEW("GameEngineSubsystem") PlayerList(), nullptr);
initSubsystem(TheRecorder,"TheRecorder", createRecorder(), nullptr);
initSubsystem(TheRadar,"TheRadar", TheGlobalData->m_headless ? NEW RadarDummy : createRadar(), nullptr);
initSubsystem(TheRadar,"TheRadar", createRadar(TheGlobalData->m_headless), nullptr);
initSubsystem(TheVictoryConditions,"TheVictoryConditions", createVictoryConditions(), nullptr);

AsciiString fname;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,9 @@ class Win32GameEngine : public GameEngine
virtual LocalFileSystem *createLocalFileSystem(); ///< factory for local file system
virtual ArchiveFileSystem *createArchiveFileSystem(); ///< factory for archive file system
virtual NetworkInterface *createNetwork(); ///< Factory for the network
virtual Radar *createRadar(); ///< Factory for radar
virtual Radar *createRadar(Bool dummy); ///< Factory for radar
virtual WebBrowser *createWebBrowser(); ///< Factory for embedded browser
virtual AudioManager *createAudioManager(); ///< Factory for audio device
virtual AudioManager *createAudioManager(Bool dummy); ///< Factory for audio device
virtual ParticleSystemManager* createParticleSystemManager(Bool dummy);


Expand All @@ -97,6 +97,6 @@ inline ArchiveFileSystem *Win32GameEngine::createArchiveFileSystem() { return NE
inline ParticleSystemManager* Win32GameEngine::createParticleSystemManager(Bool dummy) { return dummy ? static_cast<ParticleSystemManager*>(NEW ParticleSystemManagerDummy) : NEW W3DParticleSystemManager; }

inline NetworkInterface *Win32GameEngine::createNetwork() { return NetworkInterface::createNetwork(); }
inline Radar *Win32GameEngine::createRadar() { return NEW W3DRadar; }
inline Radar *Win32GameEngine::createRadar(Bool dummy) { return dummy ? static_cast<Radar*>(NEW RadarDummy) : NEW W3DRadar; }
inline WebBrowser *Win32GameEngine::createWebBrowser() { return NEW CComObject<W3DWebBrowser>; }
inline AudioManager *Win32GameEngine::createAudioManager() { return NEW MilesAudioManager; }
inline AudioManager *Win32GameEngine::createAudioManager(Bool dummy) { return dummy ? NEW MilesAudioManagerDummy : NEW MilesAudioManager; }
4 changes: 2 additions & 2 deletions GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,10 +92,10 @@ class GameEngine : public SubsystemInterface
virtual ModuleFactory *createModuleFactory() = 0; ///< Factory for modules
virtual ThingFactory *createThingFactory() = 0; ///< Factory for the thing factory
virtual FunctionLexicon *createFunctionLexicon() = 0; ///< Factory for Function Lexicon
virtual Radar *createRadar() = 0; ///< Factory for radar
virtual Radar *createRadar(Bool dummy) = 0; ///< Factory for radar
virtual WebBrowser *createWebBrowser() = 0; ///< Factory for embedded browser
virtual ParticleSystemManager* createParticleSystemManager(Bool dummy) = 0;
virtual AudioManager *createAudioManager() = 0; ///< Factory for Audio Manager
virtual AudioManager *createAudioManager(Bool dummy) = 0; ///< Factory for Audio Manager

Real m_logicTimeAccumulator; ///< Frame time accumulated towards submitting a new logic frame

Expand Down
4 changes: 2 additions & 2 deletions GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -525,7 +525,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);

Expand Down Expand Up @@ -610,7 +610,7 @@ void GameEngine::init()
initSubsystem(TheCrateSystem,"TheCrateSystem", MSGNEW("GameEngineSubsystem") CrateSystem(), &xferCRC, "Data\\INI\\Default\\Crate", "Data\\INI\\Crate");
initSubsystem(ThePlayerList,"ThePlayerList", MSGNEW("GameEngineSubsystem") PlayerList(), nullptr);
initSubsystem(TheRecorder,"TheRecorder", createRecorder(), nullptr);
initSubsystem(TheRadar,"TheRadar", TheGlobalData->m_headless ? NEW RadarDummy : createRadar(), nullptr);
initSubsystem(TheRadar,"TheRadar", createRadar(TheGlobalData->m_headless), nullptr);
initSubsystem(TheVictoryConditions,"TheVictoryConditions", createVictoryConditions(), nullptr);


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,9 @@ class Win32GameEngine : public GameEngine
virtual LocalFileSystem *createLocalFileSystem(); ///< factory for local file system
virtual ArchiveFileSystem *createArchiveFileSystem(); ///< factory for archive file system
virtual NetworkInterface *createNetwork(); ///< Factory for the network
virtual Radar *createRadar(); ///< Factory for radar
virtual Radar *createRadar(Bool dummy); ///< Factory for radar
virtual WebBrowser *createWebBrowser(); ///< Factory for embedded browser
virtual AudioManager *createAudioManager(); ///< Factory for audio device
virtual AudioManager *createAudioManager(Bool dummy); ///< Factory for audio device
virtual ParticleSystemManager* createParticleSystemManager(Bool dummy);


Expand All @@ -97,6 +97,6 @@ inline ArchiveFileSystem *Win32GameEngine::createArchiveFileSystem() { return NE
inline ParticleSystemManager* Win32GameEngine::createParticleSystemManager(Bool dummy) { return dummy ? static_cast<ParticleSystemManager*>(NEW ParticleSystemManagerDummy) : NEW W3DParticleSystemManager; }

inline NetworkInterface *Win32GameEngine::createNetwork() { return NetworkInterface::createNetwork(); }
inline Radar *Win32GameEngine::createRadar() { return NEW W3DRadar; }
inline Radar *Win32GameEngine::createRadar(Bool dummy) { return dummy ? static_cast<Radar*>(NEW RadarDummy) : NEW W3DRadar; }
inline WebBrowser *Win32GameEngine::createWebBrowser() { return NEW CComObject<W3DWebBrowser>; }
inline AudioManager *Win32GameEngine::createAudioManager() { return NEW MilesAudioManager; }
inline AudioManager *Win32GameEngine::createAudioManager(Bool dummy) { return dummy ? NEW MilesAudioManagerDummy : NEW MilesAudioManager; }
Loading