diff --git a/engine/include/fishbone/mixer.h b/engine/include/fishbone/mixer.h index 0c8f1ea..c01a589 100644 --- a/engine/include/fishbone/mixer.h +++ b/engine/include/fishbone/mixer.h @@ -11,7 +11,7 @@ namespace fishbone { namespace fishbone { class Mixer { - fishbone::Mutex mutex; + fishbone::Mutex* mutex; public: Mixer(); diff --git a/engine/include/fishbone/sound.h b/engine/include/fishbone/sound.h index d1967e5..d9462cf 100644 --- a/engine/include/fishbone/sound.h +++ b/engine/include/fishbone/sound.h @@ -10,17 +10,10 @@ namespace fishbone { #include #include -#ifdef _FISHBONE -#if defined(FISHBONE_SOUND_USE_SDL2) -typedef size_t FISHBONE_SOUNDDRV_HANDLE; -#endif -#else -typedef void* FISHBONE_SOUNDDRV_HANDLE; -#endif - namespace fishbone { class SoundDriver { - FISHBONE_SOUNDDRV_HANDLE sound; + struct Impl; + Impl* impl; public: SoundDriver(); diff --git a/engine/include/fishbone/thread.h b/engine/include/fishbone/thread.h index 9f94360..b210e17 100644 --- a/engine/include/fishbone/thread.h +++ b/engine/include/fishbone/thread.h @@ -8,19 +8,10 @@ namespace fishbone { #include -#ifdef _FISHBONE -#if defined(FISHBONE_THREAD_USE_SDL2) -typedef SDL_mutex* FISHBONE_MUTEX_HANDLE; -typedef SDL_Thread* FISHBONE_THREAD_HANDLE; -#endif -#else -typedef void* FISHBONE_MUTEX_HANDLE; -typedef void* FISHBONE_THREAD_HANDLE; -#endif - namespace fishbone { class Thread { - FISHBONE_THREAD_HANDLE thread; + struct Impl; + Impl* impl; public: Thread(void (*call)(fishbone::Thread* thread, void* arg), void* arg); @@ -30,7 +21,8 @@ namespace fishbone { }; class Mutex { - FISHBONE_MUTEX_HANDLE mutex; + struct Impl; + Impl* impl; public: Mutex(); diff --git a/engine/src/mixer.cc b/engine/src/mixer.cc index 79a8e7b..916da2b 100644 --- a/engine/src/mixer.cc +++ b/engine/src/mixer.cc @@ -1,6 +1,7 @@ #include fishbone::Mixer::Mixer() { + this->mutex = new fishbone::Mutex(); } fishbone::Mixer::~Mixer() { @@ -10,14 +11,26 @@ fishbone::Mixer::~Mixer() { for(int i = 0; i < this->loaders.size(); i++) { delete this->loaders[i]; } + + delete this->mutex; } void fishbone::Mixer::read(short* buffer, size_t frames) { + float* tmp = new float[frames * 2]; + + for(int i = 0; i < frames * 2; i++) tmp[i] = 0; + + this->mutex->lock(); + this->mutex->unlock(); + + for(int i = 0; i < frames * 2; i++) buffer[i] = tmp[i] * 32767; + + delete tmp; } fishbone::Sound* fishbone::Mixer::open(const char* path) { for(int i = 0; i < this->loaders.size(); i++) { - // this->loaders[i]->open(); + //this->loaders[i]->open(); } return nullptr; diff --git a/engine/src/sounddrv/sdl2.cc b/engine/src/sounddrv/sdl2.cc index 5a7869e..ba8a2a8 100644 --- a/engine/src/sounddrv/sdl2.cc +++ b/engine/src/sounddrv/sdl2.cc @@ -5,13 +5,17 @@ static int sdl_audio_init = 0; static void SDLCALL sound_callback(void* userdata, Uint8* stream, int len) { - fishbone::Mixer* mixer = (fishbone::Mixer*)userdata; + fishbone::SoundDriver* sd = (fishbone::SoundDriver*)userdata; SDL_memset(stream, 0, len); - mixer->read((short*)stream, len / 4); + sd->mixer.read((short*)stream, len / 4); } +struct fishbone::SoundDriver::Impl { + SDL_AudioDeviceID id; +}; + fishbone::SoundDriver::SoundDriver() { SDL_AudioSpec spec; @@ -29,13 +33,15 @@ fishbone::SoundDriver::SoundDriver() { spec.callback = sound_callback; spec.userdata = this; - if((this->sound = SDL_OpenAudioDevice(NULL, 0, &spec, NULL, 0)) > 0) { - SDL_PauseAudioDevice(this->sound, 0); + this->impl = new fishbone::SoundDriver::Impl(); + + if((this->impl->id = SDL_OpenAudioDevice(NULL, 0, &spec, NULL, 0)) > 0) { + SDL_PauseAudioDevice(this->impl->id, 0); } } fishbone::SoundDriver::~SoundDriver() { - SDL_PauseAudioDevice(this->sound, 1); - SDL_CloseAudioDevice(this->sound); + SDL_PauseAudioDevice(this->impl->id, 1); + SDL_CloseAudioDevice(this->impl->id); } #endif diff --git a/engine/src/soundldr/flac.cc b/engine/src/soundldr/flac.cc new file mode 100644 index 0000000..e69de29 diff --git a/engine/src/soundldr/mod.cc b/engine/src/soundldr/mod.cc new file mode 100644 index 0000000..e69de29 diff --git a/engine/src/soundldr/mp3.cc b/engine/src/soundldr/mp3.cc new file mode 100644 index 0000000..e69de29 diff --git a/engine/src/soundldr/wav.cc b/engine/src/soundldr/wav.cc new file mode 100644 index 0000000..e69de29 diff --git a/engine/src/soundldr/xm.cc b/engine/src/soundldr/xm.cc new file mode 100644 index 0000000..e69de29 diff --git a/engine/src/thread/sdl2.cc b/engine/src/thread/sdl2.cc index 5c83833..b55098f 100644 --- a/engine/src/thread/sdl2.cc +++ b/engine/src/thread/sdl2.cc @@ -18,6 +18,10 @@ static int SDLCALL thread_call(void* data) { return 0; } +struct fishbone::Thread::Impl { + SDL_Thread* thread; +}; + fishbone::Thread::Thread(void (*call)(fishbone::Thread* thread, void* arg), void* arg) { struct call_arg* data = new struct call_arg(); @@ -25,7 +29,8 @@ fishbone::Thread::Thread(void (*call)(fishbone::Thread* thread, void* arg), void data->thread = this; data->arg = arg; - this->thread = SDL_CreateThread(thread_call, "FBThread", data); + this->impl = new fishbone::Thread::Impl(); + this->impl->thread = SDL_CreateThread(thread_call, "FBThread", data); } fishbone::Thread::~Thread() { @@ -33,22 +38,29 @@ fishbone::Thread::~Thread() { } void fishbone::Thread::join() { - SDL_WaitThread(this->thread, nullptr); + SDL_WaitThread(this->impl->thread, nullptr); } +struct fishbone::Mutex::Impl { + SDL_mutex* mutex; +}; + fishbone::Mutex::Mutex() { - this->mutex = SDL_CreateMutex(); + this->impl = new fishbone::Mutex::Impl(); + this->impl->mutex = SDL_CreateMutex(); } fishbone::Mutex::~Mutex() { - SDL_DestroyMutex(this->mutex); + SDL_DestroyMutex(this->impl->mutex); + + delete this->impl; } void fishbone::Mutex::lock() { - SDL_LockMutex(this->mutex); + SDL_LockMutex(this->impl->mutex); } void fishbone::Mutex::unlock() { - SDL_UnlockMutex(this->mutex); + SDL_UnlockMutex(this->impl->mutex); } #endif