diff options
Diffstat (limited to 'src/libjin/audio')
-rw-r--r-- | src/libjin/audio/audio.cpp | 49 | ||||
-rw-r--r-- | src/libjin/audio/audio.h | 30 | ||||
-rw-r--r-- | src/libjin/audio/source.h | 3 |
3 files changed, 77 insertions, 5 deletions
diff --git a/src/libjin/audio/audio.cpp b/src/libjin/audio/audio.cpp index f4b64e6..7142625 100644 --- a/src/libjin/audio/audio.cpp +++ b/src/libjin/audio/audio.cpp @@ -1,13 +1,58 @@ +#include <SDL2/SDL.h> + #include "audio.h" 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()); + } + + 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; + } - onlyonce bool Audio::_init(const SettingBase* setting) + shared void defaultCallback(void *udata, Uint8 *stream, int len) { - return false; + } } diff --git a/src/libjin/audio/audio.h b/src/libjin/audio/audio.h index fd4ab69..80e463f 100644 --- a/src/libjin/audio/audio.h +++ b/src/libjin/audio/audio.h @@ -1,5 +1,8 @@ #ifndef __JIN_AUDIO_H #define __JIN_AUDIO_H + +#include <SDL2/SDL.h> + #include "../utils/macros.h" #include "../common/subsystem.h" @@ -11,15 +14,36 @@ namespace audio class Audio : public common::Subsystem { 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; - private: + static inline Audio* get() + { + return (audio == NULL ? (audio = new Audio()) : audio); + } - onlyonce bool _init(const SettingBase* setting) override; + static void defaultCallback(void *udata, Uint8 *stream, int len); + private: + + Audio() {}; + ~Audio() {}; + + static Audio* audio; + + onlyonce bool _init(const SettingBase* setting) override; + onlyonce void _quit() override; }; typedef Audio::Setting AudioSetting; diff --git a/src/libjin/audio/source.h b/src/libjin/audio/source.h index a8e40fe..96da208 100644 --- a/src/libjin/audio/source.h +++ b/src/libjin/audio/source.h @@ -22,6 +22,9 @@ namespace audio void setPitch(float pitch); void setVolume(float volume); + private: + unsigned char * curPos; + unsigned int length; }; } |