Index: trunk/apps/pcmbuf.c =================================================================== --- trunk.orig/apps/pcmbuf.c +++ trunk/apps/pcmbuf.c @@ -1025,6 +1025,84 @@ void pcmbuf_beep(unsigned int frequency, } +void pcmbuf_tune(struct tune_data *tune) +{ + unsigned int count = 0, i; + long sample; + short *buf; + short *pcmbuf_end = (short *)fadebuf; + + if (pcm_is_playing() && pcmbuf_read != NULL) + { + if (pcmbuf_read->link) + { + /* Get the next chunk */ + char *pcmbuf_mix_buf = pcmbuf_read->link->addr; + /* Give at least 1/8s clearance. */ + buf = (short *)&pcmbuf_mix_buf[NATIVE_FREQUENCY * 4 / 8]; + } + else + { + logf("No place to beep"); + return; + } + + while(tune->frequency) { + size_t samples = NATIVE_FREQUENCY / 1000 * tune->duration; + unsigned int interval = NATIVE_FREQUENCY / tune->frequency; + int amplitude = tune->amplitude; + for (i=0; i < samples; i++) + { + 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; + } + ++tune; + } + } + else + { + size_t total_samples = 0; + buf = (short *)audiobuffer; + while(tune->frequency) { + size_t samples = NATIVE_FREQUENCY / 1000 * tune->duration; + unsigned int interval = NATIVE_FREQUENCY / tune->frequency; + int amplitude = tune->amplitude; + total_samples += samples; + for (i=0; i < samples; i++) + { + *buf++ = amplitude; + if (buf > pcmbuf_end) + buf = (short *)audiobuffer; + *buf++ = amplitude; + + /* Toggle square wav side */ + if (++count >= interval) + { + count = 0; + amplitude = -amplitude; + } + if (buf > pcmbuf_end) + buf = (short *)audiobuffer; + } + ++tune; + } + pcm_play_data(NULL, (unsigned char *)audiobuffer, total_samples * 4); + } +} + /* Returns pcm buffer usage in percents (0 to 100). */ int pcmbuf_usage(void) { Index: trunk/apps/pcmbuf.h =================================================================== --- trunk.orig/apps/pcmbuf.h +++ trunk/apps/pcmbuf.h @@ -78,6 +78,12 @@ void pcmbuf_crossfade_enable_finished(vo int pcmbuf_usage(void); int pcmbuf_mix_free(void); void pcmbuf_beep(unsigned int frequency, size_t duration, int amplitude); +struct tune_data { + unsigned int frequency; + size_t duration; + int amplitude; +}; +void pcmbuf_tune(struct tune_data *tune); int pcmbuf_used_descs(void); int pcmbuf_descs(void);