Mercurial > hg > forks > pwpunix
changeset 10:a379d6a2a717
Take into account that SDL does not guarantee audio buffer size to be what
we request it to be, so implement fragment / tick handling.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 18 May 2010 17:58:37 +0300 |
parents | 7fb3727d16b8 |
children | 2105d2dfefa3 |
files | pwplib/snd-sdl.c |
diffstat | 1 files changed, 28 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/pwplib/snd-sdl.c Tue May 18 05:39:26 2010 +0300 +++ b/pwplib/snd-sdl.c Tue May 18 17:58:37 2010 +0300 @@ -17,23 +17,38 @@ #include "pwplib.h" -#define TIMERHZ 72 +#define TIMERHZ 30 -static int pwp_sdlaudio_start = 1; +static int pwp_sdlaudio_run = 1; +static int pwp_sdlaudio_frag = -1, pwp_sdlaudio_curr; extern void gb_sound(int, int, int, int); static void pwp_sdlaudio_fill(void *udata, Uint8 * buf, int len) { - pwplib.player(); - gb_genwave(buf, len); + while (len > 0) { + if (pwp_sdlaudio_curr > len) { + pwp_sdlaudio_curr -= len; + gb_genwave(buf, len); + len = 0; + pwplib.player(); + } else { + gb_genwave(buf, pwp_sdlaudio_curr); + buf += pwp_sdlaudio_curr; + len -= pwp_sdlaudio_curr; + pwp_sdlaudio_curr = pwp_sdlaudio_frag; + pwplib.player(); + } + } } -static void pwp_sdlaudio_loopflush(void) +static void pwp_sdlaudio_start(void) { - if (pwp_sdlaudio_start) { - pwp_sdlaudio_start = 0; + if (pwp_sdlaudio_run) { + fprintf(stderr, "\nsound starting\n"); + pwp_sdlaudio_curr = pwp_sdlaudio_frag; + pwp_sdlaudio_run = 0; SDL_PauseAudio(0); } } @@ -47,11 +62,14 @@ { SDL_AudioSpec fmt; + pwp_sdlaudio_run = 1; + fmt.freq = 44100; fmt.format = AUDIO_U8; fmt.channels = 1; - fmt.samples = fmt.freq / TIMERHZ; + fmt.samples = 2048; fmt.callback = pwp_sdlaudio_fill; + pwp_sdlaudio_frag = fmt.freq / TIMERHZ; if (SDL_OpenAudio(&fmt, NULL) < 0) { @@ -62,10 +80,10 @@ pwpwrite("* SDL sound\n"); pwplib.sound = gb_sound; - pwplib.loopflush = pwp_sdlaudio_loopflush; + pwplib.loopflush = pwp_sdlaudio_start; gb_init(fmt.freq); - pwp_regdestr(pwp_sdlaudio_close); +// pwp_regdestr(pwp_sdlaudio_close); return 1; }