diff options
author | chai <chaifix@163.com> | 2018-05-21 23:33:33 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2018-05-21 23:33:33 +0800 |
commit | 1deb2a5f8a1c9b44ad38eea73449250d46ec0ce7 (patch) | |
tree | 34ec91e569965762c65bf6e01f854f96720fa3c1 /src | |
parent | 628a35692a165cdd6e26fac1beb274f2c7055483 (diff) |
更新音频模块
Diffstat (limited to 'src')
-rw-r--r-- | src/libjin/audio/sdl/audio.cpp | 31 | ||||
-rw-r--r-- | src/libjin/audio/sdl/audio.h | 25 | ||||
-rw-r--r-- | src/libjin/audio/sdl/source.cpp | 28 | ||||
-rw-r--r-- | src/libjin/audio/sdl/source.h | 44 | ||||
-rw-r--r-- | src/libjin/audio/source.h | 28 | ||||
-rw-r--r-- | src/libjin/utils/unittest.cpp | 23 |
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) { |