aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/audio
diff options
context:
space:
mode:
Diffstat (limited to 'src/libjin/audio')
-rw-r--r--src/libjin/audio/audio.cpp49
-rw-r--r--src/libjin/audio/audio.h30
-rw-r--r--src/libjin/audio/source.h3
3 files changed, 77 insertions, 5 deletions
diff --git a/src/libjin/audio/audio.cpp b/src/libjin/audio/audio.cpp
index f4b64e6..7142625 100644
--- a/src/libjin/audio/audio.cpp
+++ b/src/libjin/audio/audio.cpp
@@ -1,13 +1,58 @@
+#include <SDL2/SDL.h>
+
#include "audio.h"
namespace jin
{
namespace audio
{
+
+ shared Audio* Audio::audio = NULL;
+
+ bool Audio::init(const SettingBase* setting)
+ {
+ static bool result = _init(setting);
+ return result;
+ }
+
+ void Audio::quit()
+ {
+ CallOnce(_quit());
+ }
+
+ onlyonce bool Audio::_init(const SettingBase* s)
+ {
+ if (SDL_Init(SDL_INIT_AUDIO) < 0)
+ return false;
+
+ const AudioSetting* setting = (AudioSetting*)s;
+ SDL_AudioSpec wanted;
+ zero(wanted);
+ wanted.freq = setting->freq;
+ wanted.format = setting->format;
+ wanted.channels = setting->channels;
+ wanted.samples = setting->samples;
+ wanted.userdata = setting->userdata;
+ wanted.callback = setting->callback;
+
+ if (SDL_OpenAudio(&wanted, NULL) < 0)
+ {
+ return false;
+ }
+ // start audio
+ SDL_PauseAudio(0);
+ return true;
+ }
+
+ onlyonce void Audio::_quit()
+ {
+ SDL_CloseAudio();
+ delete audio;
+ }
- onlyonce bool Audio::_init(const SettingBase* setting)
+ shared void defaultCallback(void *udata, Uint8 *stream, int len)
{
- return false;
+
}
}
diff --git a/src/libjin/audio/audio.h b/src/libjin/audio/audio.h
index fd4ab69..80e463f 100644
--- a/src/libjin/audio/audio.h
+++ b/src/libjin/audio/audio.h
@@ -1,5 +1,8 @@
#ifndef __JIN_AUDIO_H
#define __JIN_AUDIO_H
+
+#include <SDL2/SDL.h>
+
#include "../utils/macros.h"
#include "../common/subsystem.h"
@@ -11,15 +14,36 @@ namespace audio
class Audio : public common::Subsystem
{
public:
+
struct Setting : SettingBase
{
-
+ int freq;
+ int format;
+ char channels;
+ int samples;
+ SDL_AudioCallback callback;
+ void* userdata;
};
+
+ bool init(const SettingBase* setting) override;
+ void quit() override;
- private:
+ static inline Audio* get()
+ {
+ return (audio == NULL ? (audio = new Audio()) : audio);
+ }
- onlyonce bool _init(const SettingBase* setting) override;
+ static void defaultCallback(void *udata, Uint8 *stream, int len);
+ private:
+
+ Audio() {};
+ ~Audio() {};
+
+ static Audio* audio;
+
+ onlyonce bool _init(const SettingBase* setting) override;
+ onlyonce void _quit() override;
};
typedef Audio::Setting AudioSetting;
diff --git a/src/libjin/audio/source.h b/src/libjin/audio/source.h
index a8e40fe..96da208 100644
--- a/src/libjin/audio/source.h
+++ b/src/libjin/audio/source.h
@@ -22,6 +22,9 @@ namespace audio
void setPitch(float pitch);
void setVolume(float volume);
+ private:
+ unsigned char * curPos;
+ unsigned int length;
};
}