diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libjin/audio/audio.cpp | 13 | ||||
-rw-r--r-- | src/libjin/audio/audio.h | 12 | ||||
-rw-r--r-- | src/libjin/audio/sdl/audio.cpp | 7 | ||||
-rw-r--r-- | src/libjin/audio/sdl/audio.h | 14 | ||||
-rw-r--r-- | src/libjin/common/singleton.h | 34 | ||||
-rw-r--r-- | src/libjin/common/subsystem.h | 30 | ||||
-rw-r--r-- | src/libjin/render/window.cpp | 28 | ||||
-rw-r--r-- | src/libjin/render/window.h | 23 | ||||
-rw-r--r-- | src/libjin/utils/macros.h | 2 | ||||
-rw-r--r-- | src/libjin/utils/unittest.cpp | 2 | ||||
-rw-r--r-- | src/libjin/utils/utils.h | 2 | ||||
-rw-r--r-- | src/lua/graphics/luaopen_graphics.cpp | 3 |
12 files changed, 77 insertions, 93 deletions
diff --git a/src/libjin/audio/audio.cpp b/src/libjin/audio/audio.cpp index edba496..350af51 100644 --- a/src/libjin/audio/audio.cpp +++ b/src/libjin/audio/audio.cpp @@ -7,18 +7,5 @@ namespace jin namespace audio { - shared Audio* Audio::audio = NULL; - - bool Audio::init(const SettingBase* setting) - { - static bool result = _init(setting); - return result; - } - - void Audio::quit() - { - CallOnce(_quit()); - } - } }
\ No newline at end of file diff --git a/src/libjin/audio/audio.h b/src/libjin/audio/audio.h index 4c8b35b..ccfc8a1 100644 --- a/src/libjin/audio/audio.h +++ b/src/libjin/audio/audio.h @@ -12,14 +12,12 @@ namespace audio { class Source; - class Audio : public Subsystem + template<class T> + class Audio : public Subsystem<T> { public: - Audio() {}; - virtual ~Audio() {}; - virtual void play() = 0; virtual void stop() = 0; virtual bool pause() = 0; @@ -30,12 +28,10 @@ namespace audio virtual void setVolume(float volume) = 0; virtual float getVolume() = 0; - bool init(const SettingBase* setting) override; - void quit() override; - protected: - static Audio* audio; + Audio() {}; + virtual ~Audio() {}; }; diff --git a/src/libjin/audio/sdl/audio.cpp b/src/libjin/audio/sdl/audio.cpp index 79ca3f2..8a0fc86 100644 --- a/src/libjin/audio/sdl/audio.cpp +++ b/src/libjin/audio/sdl/audio.cpp @@ -18,8 +18,10 @@ namespace audio audio->unlock(); } - onlyonce bool SDLAudio::_init(const SettingBase* s) + onlyonce bool SDLAudio::initSystem(const SettingBase* s) { + std::cout << "Init Audio System" << std::endl; + if (SDL_Init(SDL_INIT_AUDIO) < 0) return false; SDL_AudioSpec spec; @@ -45,10 +47,9 @@ namespace audio return true; } - onlyonce void SDLAudio::_quit() + onlyonce void SDLAudio::quitSystem() { SDL_CloseAudio(); - delete audio; } void SDLAudio::lock() diff --git a/src/libjin/audio/sdl/audio.h b/src/libjin/audio/sdl/audio.h index 6e42690..953a853 100644 --- a/src/libjin/audio/sdl/audio.h +++ b/src/libjin/audio/sdl/audio.h @@ -13,7 +13,7 @@ namespace audio #define SDLAUDIO_BYTEDEPTH (SDLAUDIO_BITDEPTH >> 3) #define SDLAUDIO_CHANNELS 2 - class SDLAudio : public Audio + class SDLAudio : public Audio<SDLAudio> { public: @@ -25,11 +25,6 @@ namespace audio int samples; // sample<=samplerate }; - static inline Audio* get() - { - return audio != NULL ? audio : (audio = new SDLAudio()); - } - /* IAudio interface */ void play() override; void stop() override; @@ -50,11 +45,8 @@ namespace audio private: - SDLAudio() {} - ~SDLAudio() {} - - onlyonce bool _init(const SettingBase* setting) override; - onlyonce void _quit() override; + onlyonce bool initSystem(const SettingBase* setting) override; + onlyonce void quitSystem() override; unsigned int audioDevice; diff --git a/src/libjin/common/singleton.h b/src/libjin/common/singleton.h new file mode 100644 index 0000000..e6326b2 --- /dev/null +++ b/src/libjin/common/singleton.h @@ -0,0 +1,34 @@ +#ifndef __JIN_SINGLETON_H +#define __JIN_SINGLETON_H + +namespace jin +{ + template<class T> + class Singleton + { + public: + static T* get() + { + if (_instance == nullptr) + _instance = new T; + return _instance; + } + static void destroy() + { + delete _instance; + _instance = nullptr; + } + protected: + Singleton() {}; + virtual ~Singleton() {}; + private: + Singleton(const Singleton&); + Singleton& operator = (const Singleton&); + + static T* _instance; + }; + + template<class T> T* Singleton<T>::_instance = nullptr; +} + +#endif
\ No newline at end of file diff --git a/src/libjin/common/subsystem.h b/src/libjin/common/subsystem.h index abe509e..4f3c5ab 100644 --- a/src/libjin/common/subsystem.h +++ b/src/libjin/common/subsystem.h @@ -1,32 +1,36 @@ #ifndef __JIN_COMMON_SUBSYSTEM_H #define __JIN_COMMON_SUBSYSTEM_H +#include "singleton.h" #include "../utils/macros.h" namespace jin { - class Subsystem + template<class System> + class Subsystem : public Singleton<System> { + public: + struct Setting {}; + typedef Setting SettingBase; - public: + void init(const SettingBase* setting) + { + initSystem(setting); + } - struct Setting {}; - - typedef Subsystem::Setting SettingBase; - - virtual bool init(const Setting* setting) = 0; - - virtual void quit() = 0; + void quit() + { + quitSystem(); + destroy(); + } protected: - Subsystem() {}; virtual ~Subsystem() {}; - virtual onlyonce bool _init(const Setting* setting) = 0; - virtual onlyonce void _quit() = 0; - + virtual bool initSystem(const Setting* setting) = 0; + virtual void quitSystem() = 0; }; } diff --git a/src/libjin/render/window.cpp b/src/libjin/render/window.cpp index 1e58dd8..fe81f58 100644 --- a/src/libjin/render/window.cpp +++ b/src/libjin/render/window.cpp @@ -1,3 +1,5 @@ +#include <iostream> + #include "window.h" #include "3rdparty/GLee/GLee.h" #include "canvas.h" @@ -8,29 +10,10 @@ namespace jin namespace render { - shared Window* Window::g_wnd = NULL; - - Window::Window(): wnd(0), ctx(0) - { - } - - Window::~Window() - { - } - - bool Window::init(const SettingBase* setting) - { - static bool result = _init(setting); - return result; - } - - void Window::quit() + onlyonce bool Window::initSystem(const SettingBase* s) { - CallOnce(_quit()); - } + std::cout << "Init window system" << std::endl; - onlyonce bool Window::_init(const SettingBase* s) - { if (SDL_Init(SDL_INIT_VIDEO) < 0) return false; @@ -84,10 +67,9 @@ namespace render return true; } - onlyonce void Window::_quit() + onlyonce void Window::quitSystem() { SDL_DestroyWindow(wnd); - delete g_wnd; } SDL_Window* Window::getWnd() diff --git a/src/libjin/render/window.h b/src/libjin/render/window.h index 54fff47..0c2c79d 100644 --- a/src/libjin/render/window.h +++ b/src/libjin/render/window.h @@ -9,7 +9,7 @@ namespace jin namespace render { - class Window : public Subsystem + class Window : public Subsystem<Window> { public: @@ -25,11 +25,6 @@ namespace render SDL_GLContext getCtx(); - static inline Window* get() - { - return (g_wnd ? g_wnd : (g_wnd = new Window())); - } - inline int getW() { return width; @@ -42,24 +37,16 @@ namespace render inline void swapBuffers(); - bool init(const SettingBase* setting) override; - void quit() override; + private: - private: + SDL_Window* wnd; - Window(); - ~Window(); - - static Window* g_wnd; - - SDL_Window* wnd; - SDL_GLContext ctx; int width, height; - onlyonce bool _init(const SettingBase* setting) override; - onlyonce void _quit() override; + onlyonce bool initSystem(const SettingBase* setting) override; + onlyonce void quitSystem() override; }; typedef Window::Setting WindowSetting; diff --git a/src/libjin/utils/macros.h b/src/libjin/utils/macros.h index 4f86807..adfc64c 100644 --- a/src/libjin/utils/macros.h +++ b/src/libjin/utils/macros.h @@ -8,7 +8,7 @@ #define MASK // enum -#define CallOnce(func) static char __dummy__=(func, 1) // ֻһ +#define CallOnce(call) static char __dummy__=(call, 1) // ֻһ #define onlyonce // ֻһ #define zero(mem) memset(&mem, 0, sizeof(mem)) diff --git a/src/libjin/utils/unittest.cpp b/src/libjin/utils/unittest.cpp index 951b996..2952b0b 100644 --- a/src/libjin/utils/unittest.cpp +++ b/src/libjin/utils/unittest.cpp @@ -12,7 +12,7 @@ using namespace std; int main(int argc, char* argv[]) { - Audio* audio = SDLAudio::get(); + SDLAudio* audio = SDLAudio::get(); audio->init(0); SDLSource* source = SDLSource::createSource("a.ogg"); SDLSource* source2 = SDLSource::createSource("a.wav"); diff --git a/src/libjin/utils/utils.h b/src/libjin/utils/utils.h index 9073d59..cf0920e 100644 --- a/src/libjin/utils/utils.h +++ b/src/libjin/utils/utils.h @@ -4,6 +4,6 @@ #include "macros.h" #include "endian.h" -#define UNITTEST 1 +#define UNITTEST 0 #endif
\ No newline at end of file diff --git a/src/lua/graphics/luaopen_graphics.cpp b/src/lua/graphics/luaopen_graphics.cpp index 362ee93..025781e 100644 --- a/src/lua/graphics/luaopen_graphics.cpp +++ b/src/lua/graphics/luaopen_graphics.cpp @@ -33,7 +33,8 @@ namespace lua setting.height = luax_getfield_integer(L, 1, "height"); setting.title = luax_getfield_string(L, 1, "title"); setting.vsync = luax_getfield_bool(L, 1, "vsync"); - luax_pushboolean(L, wnd->init(&setting)); + wnd->init(&setting); + luax_pushboolean(L, 1); return 1; } |