aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libjin/audio/audio.cpp13
-rw-r--r--src/libjin/audio/audio.h12
-rw-r--r--src/libjin/audio/sdl/audio.cpp7
-rw-r--r--src/libjin/audio/sdl/audio.h14
-rw-r--r--src/libjin/common/singleton.h34
-rw-r--r--src/libjin/common/subsystem.h30
-rw-r--r--src/libjin/render/window.cpp28
-rw-r--r--src/libjin/render/window.h23
-rw-r--r--src/libjin/utils/macros.h2
-rw-r--r--src/libjin/utils/unittest.cpp2
-rw-r--r--src/libjin/utils/utils.h2
-rw-r--r--src/lua/graphics/luaopen_graphics.cpp3
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;
}