diff --git a/main.cpp b/main.cpp index 5b44922..ab179c8 100644 --- a/main.cpp +++ b/main.cpp @@ -1,158 +1,27 @@ #include #include -#include -#include #include #include #include -#include -#include - #include "WallpaperEngine/Render/Shaders/Compiler.h" -#include "WallpaperEngine/Irrlicht/CImageLoaderTEX.h" #include "WallpaperEngine/Core/CProject.h" #include "WallpaperEngine/Irrlicht/CContext.h" #include "WallpaperEngine/Render/CScene.h" -bool IsRootWindow = false; -std::vector Screens; -std::vector> Viewports; +enum BACKGROUND_RUN_MODE +{ + RUN_MODE_UNKNOWN = 0, + RUN_MODE_HELP = 1, + RUN_MODE_DIRECTORY = 2, + RUN_MODE_PACKAGE = 3 +}; +// TODO: MOVE GLOBAL SHADER VARIABLES TO THEIR OWN CLASS irr::f32 g_Time = 0; -WallpaperEngine::Irrlicht::CContext* IrrlichtContext; -void initialize_viewports (irr::SIrrlichtCreationParameters& irrlichtCreationParameters) -{ - if (IsRootWindow == false || Screens.empty () == true) - return; - - Display* display = XOpenDisplay (NULL); - int xrandr_result, xrandr_error; - - if (!XRRQueryExtension (display, &xrandr_result, &xrandr_error)) - { - std::cerr << "XRandr is not present, cannot detect specified screens, running in window mode" << std::endl; - return; - } - - XRRScreenResources* screenResources = XRRGetScreenResources (display, DefaultRootWindow (display)); - - // there are some situations where xrandr returns null (like screen not using the extension) - if (screenResources == nullptr) - return; - - for (int i = 0; i < screenResources->noutput; i ++) - { - XRROutputInfo* info = XRRGetOutputInfo (display, screenResources, screenResources->outputs [i]); - - // there are some situations where xrandr returns null (like screen not using the extension) - if (info == nullptr) - continue; - - auto cur = Screens.begin (); - auto end = Screens.end (); - - for (; cur != end; cur ++) - { - if (info->connection == RR_Connected && strcmp (info->name, (*cur).c_str ()) == 0) - { - XRRCrtcInfo* crtc = XRRGetCrtcInfo (display, screenResources, info->crtc); - - std::cout << "Found requested screen: " << info->name << " -> " << crtc->x << "x" << crtc->y << ":" << crtc->width << "x" << crtc->height << std::endl; - - irr::core::rect viewport; - - viewport.UpperLeftCorner.X = crtc->x; - viewport.UpperLeftCorner.Y = crtc->y; - viewport.LowerRightCorner.X = crtc->x + crtc->width; - viewport.LowerRightCorner.Y = crtc->y + crtc->height; - - Viewports.push_back (viewport); - - XRRFreeCrtcInfo (crtc); - } - } - - XRRFreeOutputInfo (info); - } - - XRRFreeScreenResources (screenResources); - - irrlichtCreationParameters.WindowId = reinterpret_cast (DefaultRootWindow (display)); -} - -int init_irrlicht() -{ - IrrlichtContext = new WallpaperEngine::Irrlicht::CContext (); - - irr::SIrrlichtCreationParameters irrlichtCreationParameters; - // prepare basic configuration for irrlicht - irrlichtCreationParameters.AntiAlias = 8; - irrlichtCreationParameters.Bits = 16; - // _irr_params.DeviceType = Irrlicht::EIDT_X11; - irrlichtCreationParameters.DriverType = irr::video::EDT_OPENGL; - irrlichtCreationParameters.Doublebuffer = false; - irrlichtCreationParameters.EventReceiver = nullptr; - irrlichtCreationParameters.Fullscreen = false; - irrlichtCreationParameters.HandleSRGB = false; - irrlichtCreationParameters.IgnoreInput = true; - irrlichtCreationParameters.Stencilbuffer = true; - irrlichtCreationParameters.UsePerformanceTimer = false; - irrlichtCreationParameters.Vsync = false; - irrlichtCreationParameters.WithAlphaChannel = false; - irrlichtCreationParameters.ZBufferBits = 24; - irrlichtCreationParameters.LoggingLevel = irr::ELL_DEBUG; - - initialize_viewports (irrlichtCreationParameters); - - IrrlichtContext->setDevice (irr::createDeviceEx (irrlichtCreationParameters)); - - if (IrrlichtContext->getDevice () == nullptr) - { - return 1; - } - - IrrlichtContext->getDevice ()->setWindowCaption (L"Test game"); - - // check for ps and vs support - if ( - IrrlichtContext->getDevice ()->getVideoDriver()->queryFeature (irr::video::EVDF_PIXEL_SHADER_1_1) == false && - IrrlichtContext->getDevice ()->getVideoDriver()->queryFeature (irr::video::EVDF_ARB_FRAGMENT_PROGRAM_1) == false) - { - IrrlichtContext->getDevice ()->getLogger ()->log ("WARNING: Pixel shaders disabled because of missing driver/hardware support"); - } - - if ( - IrrlichtContext->getDevice ()->getVideoDriver()->queryFeature (irr::video::EVDF_VERTEX_SHADER_1_1) == false && - IrrlichtContext->getDevice ()->getVideoDriver()->queryFeature (irr::video::EVDF_ARB_VERTEX_PROGRAM_1) == false) - { - IrrlichtContext->getDevice ()->getLogger ()->log ("WARNING: Vertex shaders disabled because of missing driver/hardware support"); - } - - if (IrrlichtContext->getDevice ()->getVideoDriver ()->queryFeature (irr::video::EVDF_RENDER_TO_TARGET) == false) - { - IrrlichtContext->getDevice ()->getLogger ()->log ("ERROR: Your hardware or this renderer do not support rendering to texture"); - return 1; - } - - return 0; -} - -void preconfigure_wallpaper_engine () -{ - // load the assets from wallpaper engine - IrrlichtContext->getDevice ()->getFileSystem ()->addFileArchive ("assets.zip", true, false); - - // register custom loaders - IrrlichtContext->getDevice ()->getVideoDriver()->addExternalImageLoader ( - new WallpaperEngine::Irrlicht::CImageLoaderTex (IrrlichtContext) - ); - IrrlichtContext->getDevice ()->getFileSystem ()->addArchiveLoader ( - new WallpaperEngine::Irrlicht::CArchiveLoaderPkg (IrrlichtContext) - ); -} +WallpaperEngine::Irrlicht::CContext* IrrlichtContext = nullptr; void print_help (const char* route) { @@ -181,21 +50,24 @@ std::string stringPathFixes(const std::string& s){ int main (int argc, char* argv[]) { - int mode = 0; - int max_fps = 30; - bool audio_support = true; + std::vector screens; + bool isRootWindow = false; + + int mode = RUN_MODE_UNKNOWN; + int maximumFPS = 30; + bool shouldEnableAudio = true; std::string path; int option_index = 0; static struct option long_options [] = { - {"screen-root", required_argument, 0, 'r'}, - {"pkg", required_argument, 0, 'p'}, - {"dir", required_argument, 0, 'd'}, - {"silent", no_argument, 0, 's'}, - {"help", no_argument, 0, 'h'}, - {"fps", required_argument, 0, 'f'}, - {nullptr, 0, 0, 0} + {"screen-root", required_argument, 0, 'r'}, + {"pkg", required_argument, 0, 'p'}, + {"dir", required_argument, 0, 'd'}, + {"silent", no_argument, 0, 's'}, + {"help", no_argument, 0, 'h'}, + {"fps", required_argument, 0, 'f'}, + {nullptr, 0, 0, 0} }; while (true) @@ -208,30 +80,32 @@ int main (int argc, char* argv[]) switch (c) { case 'r': - IsRootWindow = true; - Screens.emplace_back (optarg); + isRootWindow = true; + screens.emplace_back (optarg); break; case 'p': - mode = 1; + if (mode == RUN_MODE_UNKNOWN) + mode = RUN_MODE_PACKAGE; path = optarg; break; case 'd': - mode = 2; + if (mode == RUN_MODE_UNKNOWN) + mode = RUN_MODE_DIRECTORY; path = optarg; break; case 's': - audio_support = false; + shouldEnableAudio = false; break; case 'h': - print_help (argv [0]); - return 0; + mode = RUN_MODE_HELP; + break; case 'f': - max_fps = atoi (optarg); + maximumFPS = atoi (optarg); break; default: @@ -239,55 +113,51 @@ int main (int argc, char* argv[]) } } - if (init_irrlicht ()) + if (mode == RUN_MODE_UNKNOWN || mode == RUN_MODE_HELP) { + print_help (argv [0]); + return 0; + } + + try + { + IrrlichtContext = new WallpaperEngine::Irrlicht::CContext (screens, isRootWindow); + IrrlichtContext->initializeContext (); + } + catch (std::runtime_error& ex) + { + std::cerr << ex.what () << std::endl; + return 1; } - preconfigure_wallpaper_engine (); + path = stringPathFixes (path); - irr::io::path wallpaper_path; - irr::io::path project_path; + irr::io::path wallpaper_path = IrrlichtContext->getDevice ()->getFileSystem ()->getAbsolutePath (path.c_str ()); + irr::io::path project_path = wallpaper_path + "project.json"; irr::io::path scene_path; - switch (mode) + if (mode == RUN_MODE_PACKAGE) { - case 0: - print_help (argv [0]); - return 0; - - // pkg mode - case 1: - path = stringPathFixes(path); - wallpaper_path = IrrlichtContext->getDevice ()->getFileSystem ()->getAbsolutePath (path.c_str ()); - project_path = wallpaper_path + "project.json"; - scene_path = wallpaper_path + "scene.pkg"; - - IrrlichtContext->getDevice ()->getFileSystem ()->addFileArchive (scene_path, true, false); // add the pkg file to the lookup list - break; - - // folder mode - case 2: - path = stringPathFixes(path); - wallpaper_path = IrrlichtContext->getDevice ()->getFileSystem ()->getAbsolutePath (path.c_str ()); - project_path = wallpaper_path + "project.json"; - - // set our working directory - IrrlichtContext->getDevice ()->getFileSystem ()->changeWorkingDirectoryTo (wallpaper_path); - break; - - default: - break; + irr::io::path scene_path = wallpaper_path + "scene.pkg"; + // add the package file to the lookup list + IrrlichtContext->getDevice ()->getFileSystem ()->addFileArchive (scene_path, true, false); + } + else if (mode == RUN_MODE_DIRECTORY) + { + project_path = wallpaper_path + "project.json"; + // set the working directory to the project folder + IrrlichtContext->getDevice ()->getFileSystem ()->changeWorkingDirectoryTo (wallpaper_path); } - if (audio_support == true) + if (shouldEnableAudio == true) { int mixer_flags = MIX_INIT_MP3 | MIX_INIT_FLAC | MIX_INIT_OGG; if (SDL_Init (SDL_INIT_AUDIO) < 0 || mixer_flags != Mix_Init (mixer_flags)) { IrrlichtContext->getDevice ()->getLogger ()->log ("Cannot initialize SDL audio system", irr::ELL_ERROR); - return -1; + return 2; } // initialize audio engine @@ -295,52 +165,29 @@ int main (int argc, char* argv[]) } WallpaperEngine::Core::CProject* project = WallpaperEngine::Core::CProject::fromFile (project_path); - WallpaperEngine::Render::CScene* sceneRender = new WallpaperEngine::Render::CScene (project, IrrlichtContext); + WallpaperEngine::Render::CScene* scene = new WallpaperEngine::Render::CScene (project, IrrlichtContext); - irr::u32 lastTime = 0; - irr::u32 minimumTime = 1000 / max_fps; + irr::u32 minimumTime = 1000 / maximumFPS; irr::u32 currentTime = 0; irr::u32 startTime = 0; irr::u32 endTime = 0; - IrrlichtContext->getDevice ()->getSceneManager ()->setAmbientLight (sceneRender->getScene ()->getAmbientColor ().toSColor ()); + IrrlichtContext->getDevice ()->getSceneManager ()->setAmbientLight (scene->getScene ()->getAmbientColor ().toSColor ()); + while (IrrlichtContext && IrrlichtContext->getDevice () && IrrlichtContext->getDevice ()->run ()) { if (IrrlichtContext->getDevice ()->getVideoDriver () == nullptr) continue; - // if (device->isWindowActive ()) - { - currentTime = startTime = IrrlichtContext->getDevice ()->getTimer ()->getTime (); - g_Time = currentTime / 1000.0f; + currentTime = startTime = IrrlichtContext->getDevice ()->getTimer ()->getTime (); + g_Time = currentTime / 1000.0f; - if (Viewports.size () > 0) - { - auto cur = Viewports.begin (); - auto end = Viewports.end (); + IrrlichtContext->renderFrame (scene); - for (; cur != end; cur ++) - { - // change viewport to render to the correct portion of the display - IrrlichtContext->getDevice ()->getVideoDriver ()->setViewPort (*cur); + endTime = IrrlichtContext->getDevice ()->getTimer ()->getTime (); - IrrlichtContext->getDevice ()->getVideoDriver ()->beginScene (false, true, sceneRender->getScene ()->getClearColor ().toSColor()); - IrrlichtContext->getDevice ()->getSceneManager ()->drawAll (); - IrrlichtContext->getDevice ()->getVideoDriver ()->endScene (); - } - } - else - { - IrrlichtContext->getDevice ()->getVideoDriver ()->beginScene (true, true, sceneRender->getScene ()->getClearColor ().toSColor()); - IrrlichtContext->getDevice ()->getSceneManager ()->drawAll (); - IrrlichtContext->getDevice ()->getVideoDriver ()->endScene (); - } - - endTime = IrrlichtContext->getDevice ()->getTimer ()->getTime (); - - IrrlichtContext->getDevice ()->sleep (minimumTime - (endTime - startTime), false); - } + IrrlichtContext->getDevice ()->sleep (minimumTime - (endTime - startTime), false); } SDL_Quit (); diff --git a/src/WallpaperEngine/Irrlicht/CContext.cpp b/src/WallpaperEngine/Irrlicht/CContext.cpp index e3038cf..b797ad0 100644 --- a/src/WallpaperEngine/Irrlicht/CContext.cpp +++ b/src/WallpaperEngine/Irrlicht/CContext.cpp @@ -1,13 +1,177 @@ +#include #include +#include + +#include +#include + +#include "WallpaperEngine/Irrlicht/CImageLoaderTEX.h" +#include "WallpaperEngine/Irrlicht/CPkgReader.h" + #include "CContext.h" using namespace WallpaperEngine::Irrlicht; +CContext::CContext (std::vector screens, bool isRootWindow) : + m_screens (std::move(screens)), + m_isRootWindow (isRootWindow) +{ +} + void CContext::setDevice (irr::IrrlichtDevice* device) { this->m_device = device; } +void CContext::initializeContext () +{ + irr::SIrrlichtCreationParameters irrlichtCreationParameters; + + // prepare basic configuration for irrlicht + irrlichtCreationParameters.AntiAlias = 8; + irrlichtCreationParameters.Bits = 16; + // _irr_params.DeviceType = Irrlicht::EIDT_X11; + irrlichtCreationParameters.DriverType = irr::video::EDT_OPENGL; + irrlichtCreationParameters.Doublebuffer = false; + irrlichtCreationParameters.EventReceiver = nullptr; + irrlichtCreationParameters.Fullscreen = false; + irrlichtCreationParameters.HandleSRGB = false; + irrlichtCreationParameters.IgnoreInput = true; + irrlichtCreationParameters.Stencilbuffer = true; + irrlichtCreationParameters.UsePerformanceTimer = false; + irrlichtCreationParameters.Vsync = false; + irrlichtCreationParameters.WithAlphaChannel = false; + irrlichtCreationParameters.ZBufferBits = 24; + irrlichtCreationParameters.LoggingLevel = irr::ELL_DEBUG; + + this->initializeViewports (irrlichtCreationParameters); + + this->setDevice (irr::createDeviceEx (irrlichtCreationParameters)); + + if (this->getDevice () == nullptr) + { + throw std::runtime_error ("Cannot create irrlicht device"); + } + + this->getDevice ()->setWindowCaption (L"Test game"); + + // check for ps and vs support + if ( + this->getDevice ()->getVideoDriver()->queryFeature (irr::video::EVDF_PIXEL_SHADER_2_0) == false && + this->getDevice ()->getVideoDriver()->queryFeature (irr::video::EVDF_ARB_FRAGMENT_PROGRAM_1) == false) + { + throw std::runtime_error ("Pixel Shader 2.0 not supported by your video driver/hardware"); + } + + if ( + this->getDevice ()->getVideoDriver()->queryFeature (irr::video::EVDF_VERTEX_SHADER_2_0) == false && + this->getDevice ()->getVideoDriver()->queryFeature (irr::video::EVDF_ARB_VERTEX_PROGRAM_1) == false) + { + throw std::runtime_error ("Vertex Shader 2.0 not supported by your video driver/hardware"); + } + + if (this->getDevice ()->getVideoDriver ()->queryFeature (irr::video::EVDF_RENDER_TO_TARGET) == false) + { + throw std::runtime_error ("Render to texture not supported by your video driver/hardware"); + } + + // load the assets from wallpaper engine + this->getDevice ()->getFileSystem ()->addFileArchive ("assets.zip", true, false); + + // register custom loaders + this->getDevice ()->getVideoDriver()->addExternalImageLoader ( + new WallpaperEngine::Irrlicht::CImageLoaderTex (this) + ); + this->getDevice ()->getFileSystem ()->addArchiveLoader ( + new WallpaperEngine::Irrlicht::CArchiveLoaderPkg (this) + ); +} + +void CContext::initializeViewports (irr::SIrrlichtCreationParameters &irrlichtCreationParameters) +{ + if (this->m_isRootWindow == false || this->m_screens.empty () == true) + return; + + Display* display = XOpenDisplay (nullptr); + int xrandr_result, xrandr_error; + + if (!XRRQueryExtension (display, &xrandr_result, &xrandr_error)) + { + std::cerr << "XRandr is not present, cannot detect specified screens, running in window mode" << std::endl; + return; + } + + XRRScreenResources* screenResources = XRRGetScreenResources (display, DefaultRootWindow (display)); + + // there are some situations where xrandr returns null (like screen not using the extension) + if (screenResources == nullptr) + return; + + for (int i = 0; i < screenResources->noutput; i ++) + { + XRROutputInfo* info = XRRGetOutputInfo (display, screenResources, screenResources->outputs [i]); + + // there are some situations where xrandr returns null (like screen not using the extension) + if (info == nullptr) + continue; + + auto cur = this->m_screens.begin (); + auto end = this->m_screens.end (); + + for (; cur != end; cur ++) + { + if (info->connection == RR_Connected && strcmp (info->name, (*cur).c_str ()) == 0) + { + XRRCrtcInfo* crtc = XRRGetCrtcInfo (display, screenResources, info->crtc); + + std::cout << "Found requested screen: " << info->name << " -> " << crtc->x << "x" << crtc->y << ":" << crtc->width << "x" << crtc->height << std::endl; + + irr::core::rect viewport; + + viewport.UpperLeftCorner.X = crtc->x; + viewport.UpperLeftCorner.Y = crtc->y; + viewport.LowerRightCorner.X = crtc->x + crtc->width; + viewport.LowerRightCorner.Y = crtc->y + crtc->height; + + this->m_viewports.push_back (viewport); + + XRRFreeCrtcInfo (crtc); + } + } + + XRRFreeOutputInfo (info); + } + + XRRFreeScreenResources (screenResources); + + irrlichtCreationParameters.WindowId = reinterpret_cast (DefaultRootWindow (display)); +} + +void CContext::renderFrame (Render::CScene* scene) +{ + if (this->m_viewports.empty () == true) + { + this->getDevice ()->getVideoDriver ()->beginScene (true, true, scene->getScene ()->getClearColor ().toSColor()); + this->getDevice ()->getSceneManager ()->drawAll (); + this->getDevice ()->getVideoDriver ()->endScene (); + } + else + { + auto cur = this->m_viewports.begin (); + auto end = this->m_viewports.end (); + + for (; cur != end; cur ++) + { + // change viewport to render to the correct portion of the display + this->getDevice ()->getVideoDriver ()->setViewPort (*cur); + + this->getDevice ()->getVideoDriver ()->beginScene (false, true, scene->getScene ()->getClearColor ().toSColor()); + this->getDevice ()->getSceneManager ()->drawAll (); + this->getDevice ()->getVideoDriver ()->endScene (); + } + } +} + irr::IrrlichtDevice* CContext::getDevice () { return this->m_device; diff --git a/src/WallpaperEngine/Irrlicht/CContext.h b/src/WallpaperEngine/Irrlicht/CContext.h index 1cb31fe..b6acc4f 100644 --- a/src/WallpaperEngine/Irrlicht/CContext.h +++ b/src/WallpaperEngine/Irrlicht/CContext.h @@ -1,15 +1,28 @@ #pragma once +#include #include #include +#include "WallpaperEngine/Render/CScene.h" + +namespace WallpaperEngine::Render +{ + class CScene; +}; + namespace WallpaperEngine::Irrlicht { class CContext { public: + CContext (std::vector screens, bool isRootWindow = false); + void setDevice (irr::IrrlichtDevice* device); + void initializeContext (); + + void renderFrame (Render::CScene* scene); irr::IrrlichtDevice* getDevice (); irr::io::path resolveMaterials (const std::string& materialName); @@ -17,8 +30,14 @@ namespace WallpaperEngine::Irrlicht irr::io::path resolveFragmentShader (const std::string& fragmentShader); irr::io::path resolveIncludeShader (const std::string& includeShader); private: + void initializeViewports (irr::SIrrlichtCreationParameters& irrlichtCreationParameters); + irr::io::path resolveFile (const irr::io::path& file); irr::IrrlichtDevice* m_device; + + std::vector m_screens; + std::vector m_viewports; + bool m_isRootWindow; }; }; diff --git a/src/WallpaperEngine/Render/CScene.cpp b/src/WallpaperEngine/Render/CScene.cpp index cce0147..2f72881 100644 --- a/src/WallpaperEngine/Render/CScene.cpp +++ b/src/WallpaperEngine/Render/CScene.cpp @@ -1,3 +1,5 @@ +#include "WallpaperEngine/Irrlicht/CContext.h" + #include "WallpaperEngine/Core/Objects/CImage.h" #include "WallpaperEngine/Core/Objects/CSound.h" diff --git a/src/WallpaperEngine/Render/CScene.h b/src/WallpaperEngine/Render/CScene.h index 77d34fd..5307a8d 100644 --- a/src/WallpaperEngine/Render/CScene.h +++ b/src/WallpaperEngine/Render/CScene.h @@ -7,6 +7,11 @@ #include "WallpaperEngine/Irrlicht/CContext.h" +namespace WallpaperEngine::Irrlicht +{ + class CContext; +}; + namespace WallpaperEngine::Render { class CCamera; diff --git a/src/WallpaperEngine/Render/Objects/CImage.cpp b/src/WallpaperEngine/Render/Objects/CImage.cpp index 4a25828..2206500 100644 --- a/src/WallpaperEngine/Render/Objects/CImage.cpp +++ b/src/WallpaperEngine/Render/Objects/CImage.cpp @@ -126,7 +126,6 @@ void CImage::generatePass (Core::Objects::Images::Materials::CPassess* pass) for (int textureNumber = 0; texturesCur != texturesEnd; texturesCur ++, textureNumber ++) { - // TODO: LOOK THIS UP PROPERLY irr::io::path texturepath = this->getScene ()->getContext ()->resolveMaterials (*texturesCur); irr::video::ITexture* texture = nullptr; diff --git a/src/WallpaperEngine/Render/Objects/CImage.h b/src/WallpaperEngine/Render/Objects/CImage.h index db8ec93..0be5003 100644 --- a/src/WallpaperEngine/Render/Objects/CImage.h +++ b/src/WallpaperEngine/Render/Objects/CImage.h @@ -11,7 +11,6 @@ using namespace WallpaperEngine; namespace WallpaperEngine::Render::Objects { - // TODO: MOVE IShaderConstantSetCallBack TO IT'S OWN CLASS OR ORGANIZE THIS BETTER class CImage : public CObject, public irr::video::IShaderConstantSetCallBack { public: diff --git a/src/WallpaperEngine/Render/Objects/CSound.cpp b/src/WallpaperEngine/Render/Objects/CSound.cpp index d38db69..5a9fac4 100644 --- a/src/WallpaperEngine/Render/Objects/CSound.cpp +++ b/src/WallpaperEngine/Render/Objects/CSound.cpp @@ -1,3 +1,4 @@ +#include #include #include @@ -18,8 +19,13 @@ CSound::CSound (CScene* scene, Core::Objects::CSound* sound) : void CSound::load () { - std::vector::const_iterator cur = this->m_sound->getSounds ().begin (); - std::vector::const_iterator end = this->m_sound->getSounds ().end (); + if (SDL_WasInit (SDL_INIT_AUDIO) != SDL_INIT_AUDIO) + { + return; + } + + auto cur = this->m_sound->getSounds ().begin (); + auto end = this->m_sound->getSounds ().end (); for (; cur != end; cur ++) { @@ -51,8 +57,13 @@ void CSound::load () } void CSound::play () { - std::vector::const_iterator mixcur = this->m_sdl.begin (); - std::vector::const_iterator mixend = this->m_sdl.end (); + if (SDL_WasInit (SDL_INIT_AUDIO) != SDL_INIT_AUDIO) + { + return; + } + + auto mixcur = this->m_sdl.begin (); + auto mixend = this->m_sdl.end (); for (; mixcur != mixend; mixcur ++) {