diff options
Diffstat (limited to 'src/libjin/Audio/SDL/SDLAudio.cpp')
-rw-r--r-- | src/libjin/Audio/SDL/SDLAudio.cpp | 60 |
1 files changed, 39 insertions, 21 deletions
diff --git a/src/libjin/Audio/SDL/SDLAudio.cpp b/src/libjin/Audio/SDL/SDLAudio.cpp index a41382b..f7ca70d 100644 --- a/src/libjin/Audio/SDL/SDLAudio.cpp +++ b/src/libjin/Audio/SDL/SDLAudio.cpp @@ -18,15 +18,20 @@ namespace audio static void defaultCallback(void *userdata, Uint8 *stream, int size) { static SDLAudio* audio = static_cast<SDLAudio*>(userdata); + if (!audio->goOnProcess()) + return; audio->lock(); audio->processCommands(); audio->processSources(stream, size); + audio->processBuffer(stream, size); audio->unlock(); } onlyonce bool SDLAudio::initSystem(const SettingBase* s) { +#if JIN_DEBUG Loghelper::log(Loglevel::LV_INFO, "Init Audio System"); +#endif if (SDL_Init(SDL_INIT_AUDIO) < 0) return false; @@ -68,6 +73,20 @@ namespace audio SDL_UnlockAudioDevice(audioDevice); } + bool SDLAudio::goOnProcess() + { + if (state == SDLAudio::State::STOP) + { + SDLSourceManager::get()->removeAllSource(); + pause(); + return false; + } + else if (state == SDLAudio::State::PAUSE) + return false; + else + return true; + } + void SDLAudio::processCommands() { SDLSourceManager::get()->processCommands(); @@ -78,45 +97,44 @@ namespace audio SDLSourceManager::get()->processSources(buffer, len); } - void SDLAudio::play() {} - - void SDLAudio::stop() {} - - bool SDLAudio::pause() + void SDLAudio::processBuffer(void* buff, size_t len) { - return false; + short* buffer = (short*)buff; + int samples = (len / SDLAUDIO_BYTEDEPTH) >> 1; // ˫ + const char L = 0, R = 1; + for (int i = 0; i < samples; ++i) + { + short* clip = buffer + (i << 1); + clip[L] *= volume; + clip[R] *= volume; + } } - bool SDLAudio::pause(Source* source) + void SDLAudio::play() { - return false; + state = State::PLAY; } - bool SDLAudio::resume() + void SDLAudio::stop() { - return false; + state = State::STOP; } - bool SDLAudio::resume(Source* source) + void SDLAudio::pause() { - return false; + state = State::PAUSE; } - - void SDLAudio::rewind() + + void SDLAudio::resume() { - + state = State::PLAY; } void SDLAudio::setVolume(float volume) { - + this->volume = clamp(volume, 0.0f, 1.0f); } - float SDLAudio::getVolume() - { - return 0.f; - } - } } |