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;
 }