aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libjin/audio/sdl/audio.cpp31
-rw-r--r--src/libjin/audio/sdl/audio.h25
-rw-r--r--src/libjin/audio/sdl/source.cpp28
-rw-r--r--src/libjin/audio/sdl/source.h44
-rw-r--r--src/libjin/audio/source.h28
-rw-r--r--src/libjin/utils/unittest.cpp23
6 files changed, 129 insertions, 50 deletions
diff --git a/src/libjin/audio/sdl/audio.cpp b/src/libjin/audio/sdl/audio.cpp
index 0559c18..cdf84aa 100644
--- a/src/libjin/audio/sdl/audio.cpp
+++ b/src/libjin/audio/sdl/audio.cpp
@@ -11,21 +11,22 @@ namespace audio
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;
+ SDL_AudioSpec spec;
+ zero(spec);
+ spec.freq = setting->rate;
+ spec.format = setting->resolution;
+ spec.channels = setting->channels;
+ spec.samples = setting->samples;
+ spec.userdata = this;
+ spec.callback = defaultCallback;
- if (SDL_OpenAudio(&wanted, NULL) < 0)
+ audioDevice = SDL_OpenAudioDevice(NULL, 0, &spec, NULL, 0);
+ if (audioDevice == 0)
{
return false;
}
// start audio
- SDL_PauseAudio(0);
+ SDL_PauseAudioDevice(audioDevice, 0);
return true;
}
@@ -35,7 +36,15 @@ namespace audio
delete audio;
}
- void SDLAudio::defaultCallback(void *udata, Uint8 *stream, int len)
+ shared void SDLAudio::defaultCallback(void *userdata, Uint8 *stream, int size)
+ {
+ SDLAudio* audio = (SDLAudio*)userdata;
+ int16_t* buffer = (int16_t*)stream;
+ int len = size >> 1;
+ audio->processSources(len);
+ }
+
+ void SDLAudio::processSources(int len)
{
}
diff --git a/src/libjin/audio/sdl/audio.h b/src/libjin/audio/sdl/audio.h
index 920f56a..969fbd9 100644
--- a/src/libjin/audio/sdl/audio.h
+++ b/src/libjin/audio/sdl/audio.h
@@ -1,6 +1,7 @@
#ifndef __JIN_AUDIO_SDL_H
#define __JIN_AUDIO_SDL_H
+#include <vector>
#include "../audio.h"
namespace jin
@@ -8,23 +9,21 @@ namespace jin
namespace audio
{
+ class SDLSource;
+
class SDLAudio : public Audio
{
-
- public:
-
+
+ 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());
@@ -41,7 +40,7 @@ namespace audio
void setVolume(float volume) override;
float getVolume() override;
- private:
+ private:
SDLAudio() {}
~SDLAudio() {}
@@ -49,6 +48,16 @@ namespace audio
onlyonce bool _init(const SettingBase* setting) override;
onlyonce void _quit() override;
+ unsigned int audioDevice;
+
+ std::vector<SDLSource*> sources;
+
+ static void defaultCallback(void *udata, Uint8 *stream, int len);
+
+ /* process functions*/
+ void processCommands();
+ void processSources(int len);
+
};
typedef SDLAudio::Setting SDLAudioSetting;
diff --git a/src/libjin/audio/sdl/source.cpp b/src/libjin/audio/sdl/source.cpp
index cca4d3e..c36346c 100644
--- a/src/libjin/audio/sdl/source.cpp
+++ b/src/libjin/audio/sdl/source.cpp
@@ -1,2 +1,30 @@
#include "source.h"
+namespace jin
+{
+namespace audio
+{
+
+ void SDLSource::generateSamples(Uint8* streamIn, int len)
+ {
+
+ }
+
+ void SDLSource::play() {}
+ void SDLSource::stop() {}
+ void SDLSource::pause() {}
+ void SDLSource::resume() {}
+ void SDLSource::rewind() {}
+ void SDLSource::isStopped() const {}
+ void SDLSource::isPaused() const {}
+ void SDLSource::isFinished() const {}
+ void SDLSource::setPitch(float pitch) {}
+ void SDLSource::setVolume(float volume) {}
+ bool SDLSource::setLoop(bool loop)
+ {
+ return false;
+ }
+ void SDLSource::setRate(float rate) {}
+
+}
+}
diff --git a/src/libjin/audio/sdl/source.h b/src/libjin/audio/sdl/source.h
index 052a49e..5ea2cf2 100644
--- a/src/libjin/audio/sdl/source.h
+++ b/src/libjin/audio/sdl/source.h
@@ -11,6 +11,50 @@ namespace audio
class SDLSource : public Source
{
+ public:
+
+ SDLSource() {}
+ ~SDLSource() {}
+
+ void generateSamples(Uint8* streamIn, int len);
+
+ /* ISource interface */
+ void play() override;
+ void stop() override;
+ void pause() override;
+ void resume() override;
+ void rewind() override;
+ void isStopped() const override;
+ void isPaused() const override;
+ void isFinished() const override;
+ void setPitch(float pitch) override;
+ void setVolume(float volume) override;
+ bool setLoop(bool loop) override;
+ void setRate(float rate) override;
+
+ private:
+
+ typedef struct Command
+ {
+ typedef enum Action
+ {
+ Nothing = 0,
+ Play,
+ Stop,
+ Pause,
+ Resume,
+ Rewind,
+ SetVolume,
+ };
+ Action action;
+ union {
+ int _integer;
+ bool _boolean;
+ const char* _string;
+ } parameter;
+ };
+
+ Command command;
};
}
diff --git a/src/libjin/audio/source.h b/src/libjin/audio/source.h
index 79fa8e0..1929f76 100644
--- a/src/libjin/audio/source.h
+++ b/src/libjin/audio/source.h
@@ -8,24 +8,33 @@ namespace jin
namespace audio
{
- class Source
+ class ISource
{
- public:
+ public:
- virtual void play() = 0;
- virtual void stop() = 0;
+ virtual void play() = 0;
+ virtual void stop() = 0;
virtual void pause() = 0;
- virtual void resume() = 0;
- virtual void rewind() = 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 void setPitch(float pitch) = 0;
+ virtual void setVolume(float volume) = 0;
virtual bool setLoop(bool loop) = 0;
virtual void setRate(float rate) = 0;
+ };
+
+ class Source : public ISource
+ {
+
+ public:
+
+ /* ISource interface */
+
protected:
Source();
@@ -33,9 +42,6 @@ namespace audio
private:
- unsigned char * curPos;
- unsigned int length;
-
};
}
diff --git a/src/libjin/utils/unittest.cpp b/src/libjin/utils/unittest.cpp
index 5b73312..b64f394 100644
--- a/src/libjin/utils/unittest.cpp
+++ b/src/libjin/utils/unittest.cpp
@@ -6,31 +6,14 @@
using namespace jin::audio;
-int sample_nr = 0;
-
-void fill_audio(void *user_data, Uint8 *raw_buffer, int bytes)
-{
- Sint16 *buffer = (Sint16*)raw_buffer;
- int length = bytes / 2; // 2 bytes per sample for AUDIO_S16SYS
- int &sample_nr(*(int*)user_data);
-
- for (int i = 0; i < length; i++, sample_nr++)
- {
- double time = (double)sample_nr / (double)44100;
- buffer[i] = (Sint16)(28000 * sin(2.0f * M_PI * 441.0f * time)); // render 441 HZ sine wave
- }
-}
-
int main(int argc, char* argv[])
{
Audio* audio = SDLAudio::get();
SDLAudioSetting setting;
setting.rate = 44100;
- setting.resolution = AUDIO_S16SYS;
- setting.channels = 1;
- setting.callback = fill_audio;
- setting.samples = 44100;
- setting.userdata = &sample_nr;
+ setting.resolution = AUDIO_S16SYS; /*signed 16 - bit samples in native byte order*/
+ setting.channels = 2;
+ setting.samples = 44100;
audio->init(&setting);
while (true)
{