From b2c7bb0b283dd2a80f345e26c042d6ffaf05209c Mon Sep 17 00:00:00 2001 From: chai Date: Sun, 22 Jul 2018 12:28:03 +0800 Subject: update --- src/libjin/audio/sdl/audio.cpp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 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 be4caa2..79ca3f2 100644 --- a/src/libjin/audio/sdl/audio.cpp +++ b/src/libjin/audio/sdl/audio.cpp @@ -1,6 +1,7 @@ #include #include "audio.h" #include "source.h" +#include "../../math/math.h" namespace jin { @@ -8,9 +9,9 @@ namespace audio { /* 注意callback是在音频线程调用 */ - void defaultCallback(void *userdata, Uint8 *stream, int size) + static void defaultCallback(void *userdata, Uint8 *stream, int size) { - SDLAudio* audio = static_cast(userdata); + static SDLAudio* audio = static_cast(userdata); audio->lock(); audio->processCommands(); audio->processSources(stream, size); @@ -22,14 +23,21 @@ namespace audio if (SDL_Init(SDL_INIT_AUDIO) < 0) return false; SDL_AudioSpec spec; - spec.freq = 44100; // 44100 Hz - spec.format = AUDIO_S16SYS; // signed 16bits - spec.channels = 2; // 立体声 - spec.samples = 1 << 15; // Uin16范围内最大的2的幂 + Setting* setting = (Setting*)s; + if (setting == nullptr) + return false; + + unsigned int samplerate = setting->samplerate; + unsigned int samples = clamp(setting->samples, 1, setting->samplerate); + + spec.freq = samplerate; // 每秒采样的sample数,常用的有 11025, 22050, 44100 and 48000 Hz. + spec.format = AUDIO_S16SYS; // signed 16-bit samples in native byte order + spec.channels = SDLAUDIO_CHANNELS; // 立体声 + spec.samples = samples; // 每次采样时都一次性填充好,如果=setting->samplerate则每秒只调用1次 spec.userdata = this; spec.callback = defaultCallback; - audioDevice = SDL_OpenAudioDevice(NULL, 0, &spec, NULL, 0); + audioDevice = SDL_OpenAudioDevice(NULL, 0, &spec, NULL, 0); if (audioDevice == 0) return false; /* start audio */ -- cgit v1.1-26-g67d0