aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/Audio/SDL/SDLAudio.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libjin/Audio/SDL/SDLAudio.cpp')
-rw-r--r--src/libjin/Audio/SDL/SDLAudio.cpp60
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;
- }
-
}
}