diff options
author | Brandon Low <lostlogic@rockbox.org> | 2006-04-05 13:00:31 +0000 |
---|---|---|
committer | Brandon Low <lostlogic@rockbox.org> | 2006-04-05 13:00:31 +0000 |
commit | 0fcd4119656d44ac1ea695673180b8a4a8a88ea2 (patch) | |
tree | 62454a9410b463f2d1381357141db79308e3cd69 /apps/pcmbuf.c | |
parent | 231d1d255c0568664a1b657d27b6e770610c3c9c (diff) | |
download | rockbox-0fcd4119656d44ac1ea695673180b8a4a8a88ea2.tar.gz rockbox-0fcd4119656d44ac1ea695673180b8a4a8a88ea2.zip |
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
Diffstat (limited to 'apps/pcmbuf.c')
-rw-r--r-- | apps/pcmbuf.c | 52 |
1 files changed, 30 insertions, 22 deletions
diff --git a/apps/pcmbuf.c b/apps/pcmbuf.c index 7a261fecbe..18ca40eaaa 100644 --- a/apps/pcmbuf.c +++ b/apps/pcmbuf.c @@ -835,44 +835,52 @@ static inline short* get_mix_insert_pos(void) { 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 = get_mix_insert_pos(); + while (i++ < samples) + { + 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); - } else { - *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; - sample = *buf; - *buf++ = MIN(MAX(sample - amplitude, -32768), 32767); } - - if (++count >= interval) + } + else + { + buf = (short *)audiobuffer; + while (i++ < samples) { - count = 0; - state = !state; + *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; } - if (buf > pcmbuf_end) - buf = (short *)audiobuffer; - } - if (!playing) { pcm_play_data(NULL, (unsigned char *)audiobuffer, samples * 4); } } |