1
0
Fork 0
forked from len0rd/rockbox

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
This commit is contained in:
Michael Sevakis 2008-12-07 00:07:47 +00:00
parent 3648e87054
commit 89da4328a0
8 changed files with 141 additions and 24 deletions

View file

@ -130,7 +130,7 @@ static int get_action_worker(int context, int timeout,
/* Produce keyclick */
if (global_settings.keyclick && !(button & BUTTON_REL))
if (!(button & BUTTON_REPEAT) || global_settings.keyclick_repeats)
pcmbuf_beep(5000, 2, 2500*global_settings.keyclick);
pcmbuf_beep(4000, 2, 2500*global_settings.keyclick);
#endif
if ((context != last_context) && ((last_button & BUTTON_REL) == 0))

View file

@ -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)

View file

@ -694,7 +694,7 @@ static void audio_skip(int direction)
if (playlist_check(ci.new_track + wps_offset + direction))
{
if (global_settings.beep)
pcmbuf_beep(5000, 100, 2500*global_settings.beep);
pcmbuf_beep(2000, 100, 2500*global_settings.beep);
LOGFQUEUE("audio > audio Q_AUDIO_SKIP %d", direction);
queue_post(&audio_queue, Q_AUDIO_SKIP, direction);
@ -706,7 +706,7 @@ static void audio_skip(int direction)
{
/* No more tracks. */
if (global_settings.beep)
pcmbuf_beep(1000, 100, 1000*global_settings.beep);
pcmbuf_beep(1000, 100, 1500*global_settings.beep);
}
}