summaryrefslogtreecommitdiffstats
path: root/apps/pcmbuf.c
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2008-12-07 00:07:47 +0000
committerMichael Sevakis <jethead71@rockbox.org>2008-12-07 00:07:47 +0000
commit89da4328a07c8736c42843607a3f3bf91c17601d (patch)
treecbd5d6580b2c62dad5830c043d9284ff15cf7bdf /apps/pcmbuf.c
parent3648e8705402ce5a0af2125987f12c884b540eea (diff)
downloadrockbox-89da4328a07c8736c42843607a3f3bf91c17601d.tar.gz
rockbox-89da4328a07c8736c42843607a3f3bf91c17601d.tar.bz2
rockbox-89da4328a07c8736c42843607a3f3bf91c17601d.zip
Meg F/X can beep and click using a hardware timer so let us try it out. To match things up better, fix PCM beeping to give correct frequency (and get a pointer wrap bug too). Do some minor adjustments to compensate for corrections.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19355 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/pcmbuf.c')
-rw-r--r--apps/pcmbuf.c27
1 files changed, 12 insertions, 15 deletions
diff --git a/apps/pcmbuf.c b/apps/pcmbuf.c
index 61c6c45de2..c7db4d3101 100644
--- a/apps/pcmbuf.c
+++ b/apps/pcmbuf.c
@@ -954,14 +954,15 @@ bool pcmbuf_insert_buffer(char *buf, int count)
}
#endif
+#ifndef HAVE_HARDWARE_BEEP
/* Generates a constant square wave sound with a given frequency
in Hertz for a duration in milliseconds. */
void pcmbuf_beep(unsigned int frequency, size_t duration, int amplitude)
{
- unsigned int count = 0;
- unsigned int i;
- unsigned int interval = NATIVE_FREQUENCY / frequency;
- unsigned int samples = NATIVE_FREQUENCY / 1000 * duration;
+ int i;
+ unsigned int step = 0xffffffffu / NATIVE_FREQUENCY * frequency;
+ int32_t phase = 0;
+ int samples = NATIVE_FREQUENCY / 1000 * duration;
int32_t sample;
int16_t *bufstart;
int16_t *bufptr;
@@ -986,21 +987,17 @@ void pcmbuf_beep(unsigned int frequency, size_t duration, int amplitude)
bufptr = bufstart;
for (i = 0; i < samples; ++i)
{
+ int32_t amp = (phase >> 31) ^ (int32_t)amplitude;
sample = mix ? *bufptr : 0;
- *bufptr++ = clip_sample_16(sample + amplitude);
- if (bufptr > pcmbuf_end)
+ *bufptr++ = clip_sample_16(sample + amp);
+ if (bufptr >= pcmbuf_end)
bufptr = (int16_t *)audiobuffer;
sample = mix ? *bufptr : 0;
- *bufptr++ = clip_sample_16(sample + amplitude);
- if (bufptr > pcmbuf_end)
+ *bufptr++ = clip_sample_16(sample + amp);
+ if (bufptr >= pcmbuf_end)
bufptr = (int16_t *)audiobuffer;
- /* Toggle square wave edge */
- if (++count >= interval)
- {
- count = 0;
- amplitude = -amplitude;
- }
+ phase += step;
}
/* Kick off playback if required */
@@ -1009,7 +1006,7 @@ void pcmbuf_beep(unsigned int frequency, size_t duration, int amplitude)
pcm_play_data(NULL, (unsigned char *)bufstart, samples * 4);
}
}
-
+#endif /* HAVE_HARDWARE_BEEP */
/* Returns pcm buffer usage in percents (0 to 100). */
int pcmbuf_usage(void)