diff options
Diffstat (limited to 'src/libjin')
-rw-r--r-- | src/libjin/audio/audio.cpp | 37 | ||||
-rw-r--r-- | src/libjin/audio/audio.h | 52 | ||||
-rw-r--r-- | src/libjin/audio/sdl/audio.cpp | 83 | ||||
-rw-r--r-- | src/libjin/audio/sdl/audio.h | 59 | ||||
-rw-r--r-- | src/libjin/audio/sdl/source.cpp | 2 | ||||
-rw-r--r-- | src/libjin/audio/sdl/source.h | 19 | ||||
-rw-r--r-- | src/libjin/audio/source.h | 31 | ||||
-rw-r--r-- | src/libjin/common/subsystem.h | 8 | ||||
-rw-r--r-- | src/libjin/core/thread.cpp | 0 | ||||
-rw-r--r-- | src/libjin/core/thread.h | 1 | ||||
-rw-r--r-- | src/libjin/core/timer.cpp | 0 | ||||
-rw-r--r-- | src/libjin/core/timer.h | 1 | ||||
-rw-r--r-- | src/libjin/jin.h | 5 | ||||
-rw-r--r-- | src/libjin/math/constant.h | 4 | ||||
-rw-r--r-- | src/libjin/math/math.h | 7 | ||||
-rw-r--r-- | src/libjin/math/rect.h | 15 | ||||
-rw-r--r-- | src/libjin/physics/physics.h | 12 | ||||
-rw-r--r-- | src/libjin/render/image.cpp | 1 | ||||
-rw-r--r-- | src/libjin/utils/endian.h | 3 | ||||
-rw-r--r-- | src/libjin/utils/unittest.cpp | 33 | ||||
-rw-r--r-- | src/libjin/utils/utils.h | 6 |
21 files changed, 267 insertions, 112 deletions
diff --git a/src/libjin/audio/audio.cpp b/src/libjin/audio/audio.cpp index 7142625..edba496 100644 --- a/src/libjin/audio/audio.cpp +++ b/src/libjin/audio/audio.cpp @@ -6,7 +6,7 @@ namespace jin { namespace audio { - + shared Audio* Audio::audio = NULL; bool Audio::init(const SettingBase* setting) @@ -20,40 +20,5 @@ namespace audio CallOnce(_quit()); } - onlyonce bool Audio::_init(const SettingBase* s) - { - if (SDL_Init(SDL_INIT_AUDIO) < 0) - return false; - - const AudioSetting* setting = (AudioSetting*)s; - SDL_AudioSpec wanted; - zero(wanted); - wanted.freq = setting->freq; - wanted.format = setting->format; - wanted.channels = setting->channels; - wanted.samples = setting->samples; - wanted.userdata = setting->userdata; - wanted.callback = setting->callback; - - if (SDL_OpenAudio(&wanted, NULL) < 0) - { - return false; - } - // start audio - SDL_PauseAudio(0); - return true; - } - - onlyonce void Audio::_quit() - { - SDL_CloseAudio(); - delete audio; - } - - shared void defaultCallback(void *udata, Uint8 *stream, int len) - { - - } - } }
\ No newline at end of file diff --git a/src/libjin/audio/audio.h b/src/libjin/audio/audio.h index 80e463f..6d57cd2 100644 --- a/src/libjin/audio/audio.h +++ b/src/libjin/audio/audio.h @@ -10,44 +10,42 @@ namespace jin { namespace audio { - - class Audio : public common::Subsystem + class Source; + + class IAudio { + public: - - struct Setting : SettingBase - { - int freq; - int format; - char channels; - int samples; - SDL_AudioCallback callback; - void* userdata; - }; - - bool init(const SettingBase* setting) override; - void quit() override; - static inline Audio* get() - { - return (audio == NULL ? (audio = new Audio()) : audio); - } + virtual void play() = 0; + virtual void stop() = 0; + virtual bool pause() = 0; + virtual bool pause(Source* source) = 0; + virtual bool resume() = 0; + virtual bool resume(Source* source) = 0; + virtual void rewind() = 0; + virtual void setVolume(float volume) = 0; + virtual float getVolume() = 0; - static void defaultCallback(void *udata, Uint8 *stream, int len); + }; - private: + class Audio : public common::Subsystem, IAudio + { - Audio() {}; - ~Audio() {}; + public: + + Audio() {}; + virtual ~Audio() {}; + + bool init(const SettingBase* setting) override; + void quit() override; + + protected: static Audio* audio; - onlyonce bool _init(const SettingBase* setting) override; - onlyonce void _quit() override; }; - typedef Audio::Setting AudioSetting; - } } diff --git a/src/libjin/audio/sdl/audio.cpp b/src/libjin/audio/sdl/audio.cpp new file mode 100644 index 0000000..0559c18 --- /dev/null +++ b/src/libjin/audio/sdl/audio.cpp @@ -0,0 +1,83 @@ +#include "audio.h" + +namespace jin +{ +namespace audio +{ + + onlyonce bool SDLAudio::_init(const SettingBase* s) + { + if (SDL_Init(SDL_INIT_AUDIO) < 0) + return false; + + const SDLAudioSetting* setting = (SDLAudioSetting*)s; + SDL_AudioSpec wanted; + zero(wanted); + wanted.freq = setting->rate; + wanted.format = setting->resolution; + wanted.channels = setting->channels; + wanted.samples = setting->samples; + wanted.userdata = setting->userdata; + wanted.callback = setting->callback; + + if (SDL_OpenAudio(&wanted, NULL) < 0) + { + return false; + } + // start audio + SDL_PauseAudio(0); + return true; + } + + onlyonce void SDLAudio::_quit() + { + SDL_CloseAudio(); + delete audio; + } + + void SDLAudio::defaultCallback(void *udata, Uint8 *stream, int len) + { + + } + + void SDLAudio::play() {} + + void SDLAudio::stop() {} + + bool SDLAudio::pause() + { + return false; + } + + bool SDLAudio::pause(Source* source) + { + return false; + } + + bool SDLAudio::resume() + { + return false; + } + + bool SDLAudio::resume(Source* source) + { + return false; + } + + void SDLAudio::rewind() + { + + } + + void SDLAudio::setVolume(float volume) + { + + } + + float SDLAudio::getVolume() + { + return 0.f; + } + +} +} diff --git a/src/libjin/audio/sdl/audio.h b/src/libjin/audio/sdl/audio.h new file mode 100644 index 0000000..920f56a --- /dev/null +++ b/src/libjin/audio/sdl/audio.h @@ -0,0 +1,59 @@ +#ifndef __JIN_AUDIO_SDL_H +#define __JIN_AUDIO_SDL_H + +#include "../audio.h" + +namespace jin +{ +namespace audio +{ + + class SDLAudio : public Audio + { + + public: + + struct Setting : SettingBase + { + int rate; // + int resolution; // ֱ + char channels; // + int samples; // ȡ + SDL_AudioCallback callback; // Ƶص + void* userdata; // Զ + }; + + static void defaultCallback(void *udata, Uint8 *stream, int len); + + static inline Audio* get() + { + return audio != NULL ? audio : (audio = new SDLAudio()); + } + + /* IAudio interface */ + void play() override; + void stop() override; + bool pause() override; + bool pause(Source* source) override; + bool resume() override; + bool resume(Source* source) override; + void rewind() override; + void setVolume(float volume) override; + float getVolume() override; + + private: + + SDLAudio() {} + ~SDLAudio() {} + + onlyonce bool _init(const SettingBase* setting) override; + onlyonce void _quit() override; + + }; + + typedef SDLAudio::Setting SDLAudioSetting; + +} +} + +#endif
\ No newline at end of file diff --git a/src/libjin/audio/sdl/source.cpp b/src/libjin/audio/sdl/source.cpp new file mode 100644 index 0000000..cca4d3e --- /dev/null +++ b/src/libjin/audio/sdl/source.cpp @@ -0,0 +1,2 @@ +#include "source.h" + diff --git a/src/libjin/audio/sdl/source.h b/src/libjin/audio/sdl/source.h new file mode 100644 index 0000000..052a49e --- /dev/null +++ b/src/libjin/audio/sdl/source.h @@ -0,0 +1,19 @@ +#ifndef __JIN_SOURCE_SDL_H +#define __JIN_SOURCE_SDL_H + +#include "../source.h" + +namespace jin +{ +namespace audio +{ + + class SDLSource : public Source + { + + }; + +} +} + +#endif
\ No newline at end of file diff --git a/src/libjin/audio/source.h b/src/libjin/audio/source.h index 96da208..79fa8e0 100644 --- a/src/libjin/audio/source.h +++ b/src/libjin/audio/source.h @@ -10,21 +10,32 @@ namespace audio class Source { + public: - void play(); - void stop(); - void pause(); - void resume(); - void rewind(); - void isStopped() const; - void isPaused() const; - void isFinished() const; - void setPitch(float pitch); - void setVolume(float volume); + + virtual void play() = 0; + virtual void stop() = 0; + virtual void pause() = 0; + virtual void resume() = 0; + virtual void rewind() = 0; + virtual void isStopped() const = 0; + virtual void isPaused() const = 0; + virtual void isFinished() const = 0; + virtual void setPitch(float pitch) = 0; + virtual void setVolume(float volume) = 0; + virtual bool setLoop(bool loop) = 0; + virtual void setRate(float rate) = 0; + + protected: + + Source(); + virtual ~Source(); private: + unsigned char * curPos; unsigned int length; + }; } diff --git a/src/libjin/common/subsystem.h b/src/libjin/common/subsystem.h index ad28061..ca4b33d 100644 --- a/src/libjin/common/subsystem.h +++ b/src/libjin/common/subsystem.h @@ -10,6 +10,7 @@ namespace common class Subsystem { + public: struct Setting {}; @@ -20,11 +21,14 @@ namespace common virtual void quit() = 0; - private: + protected: - virtual onlyonce bool _init(const Setting* setting) = 0; + Subsystem() {}; + virtual ~Subsystem() {}; + virtual onlyonce bool _init(const Setting* setting) = 0; virtual onlyonce void _quit() = 0; + }; } diff --git a/src/libjin/core/thread.cpp b/src/libjin/core/thread.cpp new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/libjin/core/thread.cpp diff --git a/src/libjin/core/thread.h b/src/libjin/core/thread.h new file mode 100644 index 0000000..6f70f09 --- /dev/null +++ b/src/libjin/core/thread.h @@ -0,0 +1 @@ +#pragma once diff --git a/src/libjin/core/timer.cpp b/src/libjin/core/timer.cpp new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/libjin/core/timer.cpp diff --git a/src/libjin/core/timer.h b/src/libjin/core/timer.h new file mode 100644 index 0000000..6f70f09 --- /dev/null +++ b/src/libjin/core/timer.h @@ -0,0 +1 @@ +#pragma once diff --git a/src/libjin/jin.h b/src/libjin/jin.h index 95895f7..32c04c7 100644 --- a/src/libjin/jin.h +++ b/src/libjin/jin.h @@ -9,4 +9,9 @@ #include "net/net.h" #include "render/render.h" +#define JIN_VERSION "Jin 0.1" +#define JIN_RELEASE "Jin 0.1.0" +#define JIN_VERSION_NUM 100 // 00.01.00 +#define JIN_AUTHOR "Chai" + #endif
\ No newline at end of file diff --git a/src/libjin/math/constant.h b/src/libjin/math/constant.h index 74acaea..f2f740f 100644 --- a/src/libjin/math/constant.h +++ b/src/libjin/math/constant.h @@ -3,4 +3,8 @@ #define PI 3.1415926f +// int16 Χ +#define INT16_RANGE_LEFT -32768 +#define INT16_RANGE_RIGHT 32767 + #endif
\ No newline at end of file diff --git a/src/libjin/math/math.h b/src/libjin/math/math.h index fdf1725..f6a299e 100644 --- a/src/libjin/math/math.h +++ b/src/libjin/math/math.h @@ -6,6 +6,11 @@ #include "constant.h" #include "matrix.h" #include "quad.h" -#include "rect.h" + +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#define clamp(a, mi,ma) min(max(a,mi),ma) +#define within(a,min,max) (a >= min && a <= max) +#define without(a,min,max) (a < min || a > max) #endif
\ No newline at end of file diff --git a/src/libjin/math/rect.h b/src/libjin/math/rect.h deleted file mode 100644 index 79c1df2..0000000 --- a/src/libjin/math/rect.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef __JIN_RECT_H -#define __JIN_RECT_H - -namespace jin -{ -namespace math -{ - class Rect - { - public: - int x, y, w, h; - }; -} -} -#endif
\ No newline at end of file diff --git a/src/libjin/physics/physics.h b/src/libjin/physics/physics.h new file mode 100644 index 0000000..9927301 --- /dev/null +++ b/src/libjin/physics/physics.h @@ -0,0 +1,12 @@ +#ifndef __JIN_PHYSICS_H +#define __JIN_PHYSICS_H + +namespace jin +{ +namespace physics +{ + +} +} + +#endif
\ No newline at end of file diff --git a/src/libjin/render/image.cpp b/src/libjin/render/image.cpp index 583bd8d..7955aa2 100644 --- a/src/libjin/render/image.cpp +++ b/src/libjin/render/image.cpp @@ -1,6 +1,7 @@ #include "image.h" #include "3rdparty/stb/stb_image.h" #include "../utils/utils.h" +#include "../math/math.h" namespace jin { diff --git a/src/libjin/utils/endian.h b/src/libjin/utils/endian.h index df28ddb..d4c441a 100644 --- a/src/libjin/utils/endian.h +++ b/src/libjin/utils/endian.h @@ -1,6 +1,3 @@ -/** -* -*/ #ifndef JIN_LIL_ENDIAN && JIN_BIG_ENDIAN #define JIN_LIL_ENDIAN 2 diff --git a/src/libjin/utils/unittest.cpp b/src/libjin/utils/unittest.cpp index 764a2bd..5b73312 100644 --- a/src/libjin/utils/unittest.cpp +++ b/src/libjin/utils/unittest.cpp @@ -2,32 +2,41 @@ #if UNITTEST #include <stdio.h> -#include "../audio/audio.h" +#include "../audio/sdl/audio.h" using namespace jin::audio; -void fill_audio(void *udata, Uint8 *stream, int len) +int sample_nr = 0; + +void fill_audio(void *user_data, Uint8 *raw_buffer, int bytes) { - printf("%d\n", len); - memset(stream, 0x11, len); + Sint16 *buffer = (Sint16*)raw_buffer; + int length = bytes / 2; // 2 bytes per sample for AUDIO_S16SYS + int &sample_nr(*(int*)user_data); + + for (int i = 0; i < length; i++, sample_nr++) + { + double time = (double)sample_nr / (double)44100; + buffer[i] = (Sint16)(28000 * sin(2.0f * M_PI * 441.0f * time)); // render 441 HZ sine wave + } } int main(int argc, char* argv[]) { - Audio* audio = Audio::get(); - - AudioSetting setting; - setting.freq = 22050; - setting.format = AUDIO_S16; - setting.channels = 2; + Audio* audio = SDLAudio::get(); + SDLAudioSetting setting; + setting.rate = 44100; + setting.resolution = AUDIO_S16SYS; + setting.channels = 1; setting.callback = fill_audio; - setting.samples = 1024; - setting.userdata = NULL; + setting.samples = 44100; + setting.userdata = &sample_nr; audio->init(&setting); while (true) { SDL_Delay(100); } + audio->quit(); return 0; } diff --git a/src/libjin/utils/utils.h b/src/libjin/utils/utils.h index 1a4ef35..d597c83 100644 --- a/src/libjin/utils/utils.h +++ b/src/libjin/utils/utils.h @@ -1,12 +1,6 @@ #ifndef __JIN_UTILS_H #define __JIN_UTILS_H -#define min(a,b) (((a) < (b)) ? (a) : (b)) -#define max(a,b) (((a) > (b)) ? (a) : (b)) -#define clamp(a, mi,ma) min(max(a,mi),ma) - -#define within(a,min,max) (a >= min && a <= max) -#define without(a,min,max) (a < min || a > max) #include "macros.h" #include "endian.h" |