aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/audio
diff options
context:
space:
mode:
Diffstat (limited to 'src/libjin/audio')
-rw-r--r--src/libjin/audio/audio.cpp37
-rw-r--r--src/libjin/audio/audio.h52
-rw-r--r--src/libjin/audio/sdl/audio.cpp83
-rw-r--r--src/libjin/audio/sdl/audio.h59
-rw-r--r--src/libjin/audio/sdl/source.cpp2
-rw-r--r--src/libjin/audio/sdl/source.h19
-rw-r--r--src/libjin/audio/source.h31
7 files changed, 210 insertions, 73 deletions
diff --git a/src/libjin/audio/audio.cpp b/src/libjin/audio/audio.cpp
index 7142625..edba496 100644
--- a/src/libjin/audio/audio.cpp
+++ b/src/libjin/audio/audio.cpp
@@ -6,7 +6,7 @@ namespace jin
{
namespace audio
{
-
+
shared Audio* Audio::audio = NULL;
bool Audio::init(const SettingBase* setting)
@@ -20,40 +20,5 @@ namespace audio
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;
- }
-
- shared void defaultCallback(void *udata, Uint8 *stream, int len)
- {
-
- }
-
}
} \ No newline at end of file
diff --git a/src/libjin/audio/audio.h b/src/libjin/audio/audio.h
index 80e463f..6d57cd2 100644
--- a/src/libjin/audio/audio.h
+++ b/src/libjin/audio/audio.h
@@ -10,44 +10,42 @@ namespace jin
{
namespace audio
{
-
- class Audio : public common::Subsystem
+ class Source;
+
+ class IAudio
{
+
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;
- static inline Audio* get()
- {
- return (audio == NULL ? (audio = new Audio()) : audio);
- }
+ virtual void play() = 0;
+ virtual void stop() = 0;
+ virtual bool pause() = 0;
+ virtual bool pause(Source* source) = 0;
+ virtual bool resume() = 0;
+ virtual bool resume(Source* source) = 0;
+ virtual void rewind() = 0;
+ virtual void setVolume(float volume) = 0;
+ virtual float getVolume() = 0;
- static void defaultCallback(void *udata, Uint8 *stream, int len);
+ };
- private:
+ class Audio : public common::Subsystem, IAudio
+ {
- Audio() {};
- ~Audio() {};
+ public:
+
+ Audio() {};
+ virtual ~Audio() {};
+
+ bool init(const SettingBase* setting) override;
+ void quit() override;
+
+ protected:
static Audio* audio;
- onlyonce bool _init(const SettingBase* setting) override;
- onlyonce void _quit() override;
};
- typedef Audio::Setting AudioSetting;
-
}
}
diff --git a/src/libjin/audio/sdl/audio.cpp b/src/libjin/audio/sdl/audio.cpp
new file mode 100644
index 0000000..0559c18
--- /dev/null
+++ b/src/libjin/audio/sdl/audio.cpp
@@ -0,0 +1,83 @@
+#include "audio.h"
+
+namespace jin
+{
+namespace audio
+{
+
+ onlyonce bool SDLAudio::_init(const SettingBase* s)
+ {
+ if (SDL_Init(SDL_INIT_AUDIO) < 0)
+ return false;
+
+ const SDLAudioSetting* setting = (SDLAudioSetting*)s;
+ SDL_AudioSpec wanted;
+ zero(wanted);
+ wanted.freq = setting->rate;
+ wanted.format = setting->resolution;
+ 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 SDLAudio::_quit()
+ {
+ SDL_CloseAudio();
+ delete audio;
+ }
+
+ void SDLAudio::defaultCallback(void *udata, Uint8 *stream, int 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;
+ }
+
+}
+}
diff --git a/src/libjin/audio/sdl/audio.h b/src/libjin/audio/sdl/audio.h
new file mode 100644
index 0000000..920f56a
--- /dev/null
+++ b/src/libjin/audio/sdl/audio.h
@@ -0,0 +1,59 @@
+#ifndef __JIN_AUDIO_SDL_H
+#define __JIN_AUDIO_SDL_H
+
+#include "../audio.h"
+
+namespace jin
+{
+namespace audio
+{
+
+ class SDLAudio : public Audio
+ {
+
+ public:
+
+ struct Setting : SettingBase
+ {
+ int rate; //
+ int resolution; // ֱ
+ char channels; //
+ int samples; // ȡ
+ SDL_AudioCallback callback; // Ƶص
+ void* userdata; // Զ
+ };
+
+ static void defaultCallback(void *udata, Uint8 *stream, int len);
+
+ static inline Audio* get()
+ {
+ return audio != NULL ? audio : (audio = new SDLAudio());
+ }
+
+ /* IAudio interface */
+ void play() override;
+ void stop() override;
+ bool pause() override;
+ bool pause(Source* source) override;
+ bool resume() override;
+ bool resume(Source* source) override;
+ void rewind() override;
+ void setVolume(float volume) override;
+ float getVolume() override;
+
+ private:
+
+ SDLAudio() {}
+ ~SDLAudio() {}
+
+ onlyonce bool _init(const SettingBase* setting) override;
+ onlyonce void _quit() override;
+
+ };
+
+ typedef SDLAudio::Setting SDLAudioSetting;
+
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/libjin/audio/sdl/source.cpp b/src/libjin/audio/sdl/source.cpp
new file mode 100644
index 0000000..cca4d3e
--- /dev/null
+++ b/src/libjin/audio/sdl/source.cpp
@@ -0,0 +1,2 @@
+#include "source.h"
+
diff --git a/src/libjin/audio/sdl/source.h b/src/libjin/audio/sdl/source.h
new file mode 100644
index 0000000..052a49e
--- /dev/null
+++ b/src/libjin/audio/sdl/source.h
@@ -0,0 +1,19 @@
+#ifndef __JIN_SOURCE_SDL_H
+#define __JIN_SOURCE_SDL_H
+
+#include "../source.h"
+
+namespace jin
+{
+namespace audio
+{
+
+ class SDLSource : public Source
+ {
+
+ };
+
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/libjin/audio/source.h b/src/libjin/audio/source.h
index 96da208..79fa8e0 100644
--- a/src/libjin/audio/source.h
+++ b/src/libjin/audio/source.h
@@ -10,21 +10,32 @@ namespace audio
class Source
{
+
public:
- void play();
- void stop();
- void pause();
- void resume();
- void rewind();
- void isStopped() const;
- void isPaused() const;
- void isFinished() const;
- void setPitch(float pitch);
- void setVolume(float volume);
+
+ virtual void play() = 0;
+ virtual void stop() = 0;
+ virtual void pause() = 0;
+ virtual void resume() = 0;
+ virtual void rewind() = 0;
+ virtual void isStopped() const = 0;
+ virtual void isPaused() const = 0;
+ virtual void isFinished() const = 0;
+ virtual void setPitch(float pitch) = 0;
+ virtual void setVolume(float volume) = 0;
+ virtual bool setLoop(bool loop) = 0;
+ virtual void setRate(float rate) = 0;
+
+ protected:
+
+ Source();
+ virtual ~Source();
private:
+
unsigned char * curPos;
unsigned int length;
+
};
}