Index: ps/trunk/source/lib/snd.h =================================================================== --- ps/trunk/source/lib/snd.h +++ ps/trunk/source/lib/snd.h @@ -1,47 +0,0 @@ -/* Copyright (C) 2017 Wildfire Games. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * sound card detection. - */ - -#ifndef INCLUDED_SND -#define INCLUDED_SND - -#include - -/** - * description of sound card. - **/ -extern std::string snd_card; - -/** - * sound driver identification and version. - **/ -extern std::string snd_drv_ver; - -/** - * detect sound card and set the above information. - **/ -extern void snd_detect(); - -#endif // #ifndef INCLUDED_SND Index: ps/trunk/source/lib/snd.cpp =================================================================== --- ps/trunk/source/lib/snd.cpp +++ ps/trunk/source/lib/snd.cpp @@ -1,69 +0,0 @@ -/* Copyright (C) 2020 Wildfire Games. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * sound card detection. - */ - -#include "precompiled.h" -#include "lib/snd.h" - -#include -#include -#include - -#include "lib/external_libraries/openal.h" - -std::string snd_card; -std::string snd_drv_ver; - -void snd_detect() -{ - // OpenAL alGetString might not return anything interesting on certain platforms - // (see https://stackoverflow.com/questions/28960638 for an example). - // However our previous code supported only Windows, and alGetString does work on - // Windows, so this is an improvement. - - // Sound cards - - const ALCchar* devices = nullptr; - if (alcIsExtensionPresent(nullptr, "ALC_enumeration_EXT") == AL_TRUE) - { - if (alcIsExtensionPresent(nullptr, "ALC_enumerate_all_EXT") == AL_TRUE) - devices = alcGetString(nullptr, ALC_ALL_DEVICES_SPECIFIER); - else - devices = alcGetString(nullptr, ALC_DEVICE_SPECIFIER); - } - WARN_IF_FALSE(devices); - - snd_card.clear(); - do { - snd_card += devices; - devices += strlen(devices) + 1; - snd_card += "; "; - } while (*devices); - - // Driver version - const ALCchar* al_version = alGetString(AL_VERSION); - if (al_version) - snd_drv_ver = al_version; -} Index: ps/trunk/source/ps/GameSetup/HWDetect.cpp =================================================================== --- ps/trunk/source/ps/GameSetup/HWDetect.cpp +++ ps/trunk/source/ps/GameSetup/HWDetect.cpp @@ -20,9 +20,6 @@ #include "scriptinterface/ScriptInterface.h" #include "lib/ogl.h" -#if CONFIG2_AUDIO -#include "lib/snd.h" -#endif #include "lib/svn_revision.h" #include "lib/timer.h" #include "lib/utf8.h" @@ -37,6 +34,9 @@ # include "lib/sysdep/arch/x86_x64/cache.h" # include "lib/sysdep/arch/x86_x64/topology.h" #endif +#if CONFIG2_AUDIO +#include "soundmanager/SoundManager.h" +#endif #include "ps/CLogger.h" #include "ps/ConfigDB.h" #include "ps/Filesystem.h" @@ -200,8 +200,8 @@ scriptInterface.SetProperty(settings, "gfx_card", gfx::CardName()); scriptInterface.SetProperty(settings, "gfx_drv_ver", gfx::DriverInfo()); #if CONFIG2_AUDIO - scriptInterface.SetProperty(settings, "snd_card", snd_card); - scriptInterface.SetProperty(settings, "snd_drv_ver", snd_drv_ver); + scriptInterface.SetProperty(settings, "snd_card", g_SoundManager->GetSoundCardNames()); + scriptInterface.SetProperty(settings, "snd_drv_ver", g_SoundManager->GetOpenALVersion()); #endif ReportSDL(scriptInterface, settings); @@ -271,7 +271,7 @@ #endif scriptInterface.SetProperty(settings, "timer_resolution", timer_Resolution()); - + // The version should be increased for every meaningful change. const int reportVersion = 13; Index: ps/trunk/source/ps/Util.cpp =================================================================== --- ps/trunk/source/ps/Util.cpp +++ ps/trunk/source/ps/Util.cpp @@ -21,9 +21,6 @@ #include "lib/posix/posix_utsname.h" #include "lib/ogl.h" -#if CONFIG2_AUDIO -#include "lib/snd.h" -#endif #include "lib/timer.h" #include "lib/bits.h" // round_up #include "lib/allocators/shared_ptr.h" @@ -51,6 +48,10 @@ #include "maths/MathUtil.h" #include "graphics/GameView.h" +#if CONFIG2_AUDIO +#include "soundmanager/SoundManager.h" +#endif + #include #include @@ -136,9 +137,8 @@ fprintf(f, "Video Mode : %dx%d:%d\n", g_VideoMode.GetXRes(), g_VideoMode.GetYRes(), g_VideoMode.GetBPP()); #if CONFIG2_AUDIO - snd_detect(); - fprintf(f, "Sound Card : %s\n", snd_card.c_str()); - fprintf(f, "Sound Drivers : %s\n", snd_drv_ver.c_str()); + fprintf(f, "Sound Card : %s\n", g_SoundManager->GetSoundCardNames().c_str()); + fprintf(f, "Sound Drivers : %s\n", g_SoundManager->GetOpenALVersion().c_str()); #else fprintf(f, "Sound : Game was compiled without audio\n"); #endif Index: ps/trunk/source/soundmanager/ISoundManager.h =================================================================== --- ps/trunk/source/soundmanager/ISoundManager.h +++ ps/trunk/source/soundmanager/ISoundManager.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2017 Wildfire Games. +/* Copyright (C) 2020 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -23,6 +23,7 @@ #include "simulation2/system/Entity.h" class CVector3D; +class CStr8; class ISoundManager { @@ -44,6 +45,10 @@ virtual void SetActionGain(float gain) = 0; virtual void SetUIGain(float gain) = 0; + virtual void RunHardwareDetection() = 0; + virtual CStr8 GetSoundCardNames() const = 0; + virtual CStr8 GetOpenALVersion() const = 0; + virtual void PlayAsUI(const VfsPath& itemPath, bool looping) = 0; virtual void PlayAsMusic(const VfsPath& itemPath, bool looping) = 0; virtual void PlayAsAmbient(const VfsPath& itemPath, bool looping) = 0; Index: ps/trunk/source/soundmanager/SoundManager.h =================================================================== --- ps/trunk/source/soundmanager/SoundManager.h +++ ps/trunk/source/soundmanager/SoundManager.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2019 Wildfire Games. +/* Copyright (C) 2020 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -36,6 +36,8 @@ #include #include +class CStr8; + #define AL_CHECK CSoundManager::al_check(__func__, __LINE__) struct ALSourceHolder @@ -91,7 +93,8 @@ long m_DistressErrCount; long m_DistressTime; - + CStr8 m_SoundCardNames; + CStr8 m_OpenALVersion; public: CSoundManager(); virtual ~CSoundManager(); @@ -134,6 +137,8 @@ void SetMemoryUsage(long bufferSize, int bufferCount); long GetBufferCount(); long GetBufferSize(); + CStr8 GetSoundCardNames() const; + CStr8 GetOpenALVersion() const; void PlayAsMusic(const VfsPath& itemPath, bool looping); void PlayAsAmbient(const VfsPath& itemPath, bool looping); @@ -150,6 +155,9 @@ void PauseMusic(bool pauseIt); void PauseAmbient(bool pauseIt); void PauseAction(bool pauseIt); + + void RunHardwareDetection(); + void SetAmbientItem(ISoundItem* anItem); void SetMasterGain(float gain); Index: ps/trunk/source/soundmanager/SoundManager.cpp =================================================================== --- ps/trunk/source/soundmanager/SoundManager.cpp +++ ps/trunk/source/soundmanager/SoundManager.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2019 Wildfire Games. +/* Copyright (C) 2020 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -257,6 +257,8 @@ LOGERROR("CSoundManager: failed to load grammar file 'audio/sound_group.rng'"); RegisterFileReloadFunc(ReloadChangedFileCB, this); + + RunHardwareDetection(); } CSoundManager::~CSoundManager() @@ -808,11 +810,56 @@ AL_CHECK; } } + +void CSoundManager::RunHardwareDetection() +{ + // OpenAL alGetString might not return anything interesting on certain platforms + // (see https://stackoverflow.com/questions/28960638 for an example). + // However our previous code supported only Windows, and alGetString does work on + // Windows, so this is an improvement. + + // Sound cards + + const ALCchar* devices = nullptr; + if (alcIsExtensionPresent(nullptr, "ALC_enumeration_EXT") == AL_TRUE) + { + if (alcIsExtensionPresent(nullptr, "ALC_enumerate_all_EXT") == AL_TRUE) + devices = alcGetString(nullptr, ALC_ALL_DEVICES_SPECIFIER); + else + devices = alcGetString(nullptr, ALC_DEVICE_SPECIFIER); + } + WARN_IF_FALSE(devices); + + m_SoundCardNames.clear(); + do { + m_SoundCardNames += devices; + devices += strlen(devices) + 1; + m_SoundCardNames += "; "; + } while (*devices); + + // Driver version + const ALCchar* al_version = alGetString(AL_VERSION); + if (al_version) + m_OpenALVersion = al_version; +} + +CStr8 CSoundManager::GetOpenALVersion() const +{ + return m_OpenALVersion; +} + +CStr8 CSoundManager::GetSoundCardNames() const +{ + return m_SoundCardNames; +} + #else // CONFIG2_AUDIO void ISoundManager::CreateSoundManager(){} void ISoundManager::SetEnabled(bool UNUSED(doEnable)){} void ISoundManager::CloseGame(){} - +void ISoundManager::RunHardwareDetection() {} +CStr8 ISoundManager::GetSoundCardNames() const { return CStr8(); }; +CStr8 ISoundManager::GetOpenALVersion() const { return CStr8(); }; #endif // CONFIG2_AUDIO