diff options
Diffstat (limited to 'src/libjin/Audio/SDL/Audio.cpp')
-rw-r--r-- | src/libjin/Audio/SDL/Audio.cpp | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/src/libjin/Audio/SDL/Audio.cpp b/src/libjin/Audio/SDL/Audio.cpp new file mode 100644 index 0000000..47d8cf8 --- /dev/null +++ b/src/libjin/Audio/SDL/Audio.cpp @@ -0,0 +1,121 @@ +#include "../../modules.h" +#if JIN_MODULES_AUDIO && JIN_AUDIO_SDLAUDIO + +#include <iostream> +#include "audio.h" +#include "source.h" +#include "../../math/math.h" +#include "../../utils/log.h" + +namespace jin +{ +namespace audio +{ + + /* עcallbackƵ̵߳ */ + static void defaultCallback(void *userdata, Uint8 *stream, int size) + { + static SDLAudio* audio = static_cast<SDLAudio*>(userdata); + audio->lock(); + audio->processCommands(); + audio->processSources(stream, size); + audio->unlock(); + } + + onlyonce bool SDLAudio::initSystem(const SettingBase* s) + { + Loghelper::log(Loglevel::LV_INFO, "Init Audio System"); + + if (SDL_Init(SDL_INIT_AUDIO) < 0) + return false; + SDL_AudioSpec spec; + Setting* setting = (Setting*)s; + if (setting == nullptr) + return false; + + unsigned int samplerate = setting->samplerate; + unsigned int samples = clamp(setting->samples, 1, setting->samplerate); + + spec.freq = samplerate; // ÿsample,õ 11025, 22050, 44100 and 48000 Hz. + spec.format = AUDIO_S16SYS; // signed 16-bit samples in native byte order + spec.channels = SDLAUDIO_CHANNELS; // + spec.samples = samples; // ÿβʱһã=setting->samplerateÿֻ1 + spec.userdata = this; + spec.callback = defaultCallback; + + audioDevice = SDL_OpenAudioDevice(NULL, 0, &spec, NULL, 0); + if (audioDevice == 0) + return false; + /* start audio */ + SDL_PauseAudioDevice(audioDevice, 0); + return true; + } + + onlyonce void SDLAudio::quitSystem() + { + SDL_CloseAudio(); + } + + void SDLAudio::lock() + { + SDL_LockAudioDevice(audioDevice); + } + + void SDLAudio::unlock() + { + SDL_UnlockAudioDevice(audioDevice); + } + + void SDLAudio::processCommands() + { + SDLSourceManager::get()->processCommands(); + } + + void SDLAudio::processSources(void* buffer, size_t len) + { + SDLSourceManager::get()->processSources(buffer, 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; + } + +} +} + +#endif // JIN_MODULES_AUDIO && JIN_AUDIO_SDLAUDIO
\ No newline at end of file |