diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2008-12-07 00:07:47 +0000 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2008-12-07 00:07:47 +0000 |
commit | 89da4328a07c8736c42843607a3f3bf91c17601d (patch) | |
tree | cbd5d6580b2c62dad5830c043d9284ff15cf7bdf /apps/pcmbuf.c | |
parent | 3648e8705402ce5a0af2125987f12c884b540eea (diff) | |
download | rockbox-89da4328a07c8736c42843607a3f3bf91c17601d.tar.gz 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.c | 27 |
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) | |||
954 | } | 954 | } |
955 | #endif | 955 | #endif |
956 | 956 | ||
957 | #ifndef HAVE_HARDWARE_BEEP | ||
957 | /* Generates a constant square wave sound with a given frequency | 958 | /* Generates a constant square wave sound with a given frequency |
958 | in Hertz for a duration in milliseconds. */ | 959 | in Hertz for a duration in milliseconds. */ |
959 | void pcmbuf_beep(unsigned int frequency, size_t duration, int amplitude) | 960 | void pcmbuf_beep(unsigned int frequency, size_t duration, int amplitude) |
960 | { | 961 | { |
961 | unsigned int count = 0; | 962 | int i; |
962 | unsigned int i; | 963 | unsigned int step = 0xffffffffu / NATIVE_FREQUENCY * frequency; |
963 | unsigned int interval = NATIVE_FREQUENCY / frequency; | 964 | int32_t phase = 0; |
964 | unsigned int samples = NATIVE_FREQUENCY / 1000 * duration; | 965 | int samples = NATIVE_FREQUENCY / 1000 * duration; |
965 | int32_t sample; | 966 | int32_t sample; |
966 | int16_t *bufstart; | 967 | int16_t *bufstart; |
967 | int16_t *bufptr; | 968 | int16_t *bufptr; |
@@ -986,21 +987,17 @@ void pcmbuf_beep(unsigned int frequency, size_t duration, int amplitude) | |||
986 | bufptr = bufstart; | 987 | bufptr = bufstart; |
987 | for (i = 0; i < samples; ++i) | 988 | for (i = 0; i < samples; ++i) |
988 | { | 989 | { |
990 | int32_t amp = (phase >> 31) ^ (int32_t)amplitude; | ||
989 | sample = mix ? *bufptr : 0; | 991 | sample = mix ? *bufptr : 0; |
990 | *bufptr++ = clip_sample_16(sample + amplitude); | 992 | *bufptr++ = clip_sample_16(sample + amp); |
991 | if (bufptr > pcmbuf_end) | 993 | if (bufptr >= pcmbuf_end) |
992 | bufptr = (int16_t *)audiobuffer; | 994 | bufptr = (int16_t *)audiobuffer; |
993 | sample = mix ? *bufptr : 0; | 995 | sample = mix ? *bufptr : 0; |
994 | *bufptr++ = clip_sample_16(sample + amplitude); | 996 | *bufptr++ = clip_sample_16(sample + amp); |
995 | if (bufptr > pcmbuf_end) | 997 | if (bufptr >= pcmbuf_end) |
996 | bufptr = (int16_t *)audiobuffer; | 998 | bufptr = (int16_t *)audiobuffer; |
997 | 999 | ||
998 | /* Toggle square wave edge */ | 1000 | phase += step; |
999 | if (++count >= interval) | ||
1000 | { | ||
1001 | count = 0; | ||
1002 | amplitude = -amplitude; | ||
1003 | } | ||
1004 | } | 1001 | } |
1005 | 1002 | ||
1006 | /* Kick off playback if required */ | 1003 | /* Kick off playback if required */ |
@@ -1009,7 +1006,7 @@ void pcmbuf_beep(unsigned int frequency, size_t duration, int amplitude) | |||
1009 | pcm_play_data(NULL, (unsigned char *)bufstart, samples * 4); | 1006 | pcm_play_data(NULL, (unsigned char *)bufstart, samples * 4); |
1010 | } | 1007 | } |
1011 | } | 1008 | } |
1012 | 1009 | #endif /* HAVE_HARDWARE_BEEP */ | |
1013 | 1010 | ||
1014 | /* Returns pcm buffer usage in percents (0 to 100). */ | 1011 | /* Returns pcm buffer usage in percents (0 to 100). */ |
1015 | int pcmbuf_usage(void) | 1012 | int pcmbuf_usage(void) |