Fix bug #4896 and make the beep code a bit cleaner


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9514 a1c6a512-1295-4272-9138-f99709370657
diff --git a/apps/pcmbuf.c b/apps/pcmbuf.c
index 7a261fe..18ca40e 100644
--- a/apps/pcmbuf.c
+++ b/apps/pcmbuf.c
@@ -835,44 +835,52 @@
 void pcmbuf_beep(unsigned int frequency, size_t duration, int amplitude)
 {
     unsigned int count = 0, i = 0;
-    bool state = false;
     unsigned int interval = NATIVE_FREQUENCY / frequency;
+    long sample;
     short *buf;
     short *pcmbuf_end = (short *)guardbuf;
-    bool playing = pcm_is_playing();
     size_t samples = NATIVE_FREQUENCY / 1000 * duration;
 
-    if (playing) {
-        buf = get_mix_insert_pos();
-    } else {
-        buf = (short *)audiobuffer;
-    }
-    while (i++ < samples)
+    if (pcm_is_playing())
     {
-        long sample = *buf;
-        if (state) {
-            *buf++ = MIN(MAX(sample + amplitude, -32768), 32767);
-            if (buf > pcmbuf_end)
-                buf = (short *)audiobuffer;
-            sample = *buf;
-            *buf++ = MIN(MAX(sample + amplitude, -32768), 32767);
-        } else {
-            *buf++ = MIN(MAX(sample - amplitude, -32768), 32767);
-            if (buf > pcmbuf_end)
-                buf = (short *)audiobuffer;
-            sample = *buf;
-            *buf++ = MIN(MAX(sample - amplitude, -32768), 32767);
-        }
-
-        if (++count >= interval)
+        buf = get_mix_insert_pos();
+        while (i++ < samples)
         {
-            count = 0;
-            state = !state;
+            sample = *buf;
+            *buf++ = MIN(MAX(sample + amplitude, -32768), 32767);
+            if (buf > pcmbuf_end)
+                buf = (short *)audiobuffer;
+            sample = *buf;
+            *buf++ = MIN(MAX(sample + amplitude, -32768), 32767);
+
+            /* Toggle square wav side */
+            if (++count >= interval)
+            {
+                count = 0;
+                amplitude = -amplitude;
+            }
+            if (buf > pcmbuf_end)
+                buf = (short *)audiobuffer;
         }
-        if (buf > pcmbuf_end)
-            buf = (short *)audiobuffer;
     }
-    if (!playing) {
+    else
+    {
+        buf = (short *)audiobuffer;
+        while (i++ < samples)
+        {
+            *buf++ = amplitude;
+            if (buf > pcmbuf_end)
+                buf = (short *)audiobuffer;
+            *buf++ = amplitude;
+
+            if (++count >= interval)
+            {
+                count = 0;
+                amplitude = -amplitude;
+            }
+            if (buf > pcmbuf_end)
+                buf = (short *)audiobuffer;
+        }
         pcm_play_data(NULL, (unsigned char *)audiobuffer, samples * 4);
     }
 }