diff options
Diffstat (limited to 'pcsound')
-rw-r--r-- | pcsound/pcsound_sdl.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/pcsound/pcsound_sdl.c b/pcsound/pcsound_sdl.c index 546e6a36..6ba06785 100644 --- a/pcsound/pcsound_sdl.c +++ b/pcsound/pcsound_sdl.c @@ -32,7 +32,7 @@ #include "pcsound.h" #include "pcsound_internal.h" -#define SOUND_SLICE_TIME 100 /* ms */ +#define MAX_SOUND_SLICE_TIME 70 /* ms */ #define SQUARE_WAVE_AMP 0x2000 // If true, we initialised SDL and have the responsibility to shut it @@ -164,6 +164,33 @@ static void PCSound_SDL_Shutdown(void) } } +// Calculate slice size, based on MAX_SOUND_SLICE_TIME. +// The result must be a power of two. + +static int GetSliceSize(void) +{ + int limit; + int n; + + limit = (pcsound_sample_rate * MAX_SOUND_SLICE_TIME) / 1000; + + // Try all powers of two, not exceeding the limit. + + for (n=0;; ++n) + { + // 2^n <= limit < 2^n+1 ? + + if ((1 << (n + 1)) > limit) + { + return (1 << n); + } + } + + // Should never happen? + + return 1024; +} + static int PCSound_SDL_Init(pcsound_callback_func callback_func) { int slicesize; @@ -179,7 +206,7 @@ static int PCSound_SDL_Init(pcsound_callback_func callback_func) return 0; } - slicesize = (SOUND_SLICE_TIME * pcsound_sample_rate) / 1000; + slicesize = GetSliceSize(); if (Mix_OpenAudio(pcsound_sample_rate, AUDIO_S16SYS, 2, slicesize) < 0) { |