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.cpp121
1 files changed, 121 insertions, 0 deletions
diff --git a/src/libjin/Audio/SDL/SDLAudio.cpp b/src/libjin/Audio/SDL/SDLAudio.cpp
new file mode 100644
index 0000000..c154ae4
--- /dev/null
+++ b/src/libjin/Audio/SDL/SDLAudio.cpp
@@ -0,0 +1,121 @@
+#include "../../modules.h"
+#if JIN_MODULES_AUDIO && JIN_AUDIO_SDLAUDIO
+
+#include <iostream>
+#include "SDLAudio.h"
+#include "SDLSource.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