From 5298bdefd7f7875ae8b7cb6c9201e3321af62011 Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 30 May 2018 08:22:30 +0800 Subject: =?UTF-8?q?=E6=9B=B4=E6=94=B9=E5=9B=9E=E8=B0=83=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/libjin/audio/sdl/audio.cpp | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) (limited to 'src/libjin/audio/sdl/audio.cpp') diff --git a/src/libjin/audio/sdl/audio.cpp b/src/libjin/audio/sdl/audio.cpp index 5277a3d..a26ea1a 100644 --- a/src/libjin/audio/sdl/audio.cpp +++ b/src/libjin/audio/sdl/audio.cpp @@ -1,3 +1,4 @@ +#include #include "audio.h" #include "source.h" @@ -6,35 +7,32 @@ namespace jin namespace audio { - void SDLAudio::defaultCallback(void *userdata, Uint8 *stream, int size) + /* 注意callback是在音频线程调用 */ + void defaultCallback(void *userdata, Uint8 *stream, int size) { SDLAudio* audio = (SDLAudio*)userdata; - SDL_LockAudioDevice(audio->audioDevice); + audio->lock(); audio->processCommands(); audio->processSources(stream, size); - SDL_UnlockAudioDevice(audio->audioDevice); + audio->unlock(); } onlyonce bool SDLAudio::_init(const SettingBase* s) { if (SDL_Init(SDL_INIT_AUDIO) < 0) return false; - SDLAudioSetting* setting = (SDLAudioSetting*)s; SDL_AudioSpec spec; - zero(spec); - spec.freq = 44100; - spec.format = AUDIO_S16SYS; - spec.channels = 1; - spec.samples = 2048; + spec.freq = 44100; // 44100 Hz + spec.format = AUDIO_S16SYS; // signed 16bits + spec.channels = 2; // 立体声 + spec.samples = 1 << 15; // Uin16范围内最大的2的幂 spec.userdata = this; spec.callback = defaultCallback; audioDevice = SDL_OpenAudioDevice(NULL, 0, &spec, NULL, 0); if (audioDevice == 0) - { return false; - } - // start audio + /* start audio */ SDL_PauseAudioDevice(audioDevice, 0); return true; } @@ -45,12 +43,22 @@ namespace audio delete audio; } + void SDLAudio::lock() + { + SDL_LockAudioDevice(audioDevice); + } + + void SDLAudio::unlock() + { + SDL_UnlockAudioDevice(audioDevice); + } + void SDLAudio::processCommands() { SDLSourceManager::get()->processCommands(); } - void SDLAudio::processSources(Uint8* buffer, int len) + void SDLAudio::processSources(void* buffer, size_t len) { SDLSourceManager::get()->processSources(buffer, len); } -- cgit v1.1-26-g67d0