summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/pcmbuf.c52
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) {
835void pcmbuf_beep(unsigned int frequency, size_t duration, int amplitude) 835void pcmbuf_beep(unsigned int frequency, size_t duration, int amplitude)
836{ 836{
837 unsigned int count = 0, i = 0; 837 unsigned int count = 0, i = 0;
838 bool state = false;
839 unsigned int interval = NATIVE_FREQUENCY / frequency; 838 unsigned int interval = NATIVE_FREQUENCY / frequency;
839 long sample;
840 short *buf; 840 short *buf;
841 short *pcmbuf_end = (short *)guardbuf; 841 short *pcmbuf_end = (short *)guardbuf;
842 bool playing = pcm_is_playing();
843 size_t samples = NATIVE_FREQUENCY / 1000 * duration; 842 size_t samples = NATIVE_FREQUENCY / 1000 * duration;
844 843
845 if (playing) { 844 if (pcm_is_playing())
846 buf = get_mix_insert_pos();
847 } else {
848 buf = (short *)audiobuffer;
849 }
850 while (i++ < samples)
851 { 845 {
852 long sample = *buf; 846 buf = get_mix_insert_pos();
853 if (state) { 847 while (i++ < samples)
848 {
849 sample = *buf;
854 *buf++ = MIN(MAX(sample + amplitude, -32768), 32767); 850 *buf++ = MIN(MAX(sample + amplitude, -32768), 32767);
855 if (buf > pcmbuf_end) 851 if (buf > pcmbuf_end)
856 buf = (short *)audiobuffer; 852 buf = (short *)audiobuffer;
857 sample = *buf; 853 sample = *buf;
858 *buf++ = MIN(MAX(sample + amplitude, -32768), 32767); 854 *buf++ = MIN(MAX(sample + amplitude, -32768), 32767);
859 } else { 855
860 *buf++ = MIN(MAX(sample - amplitude, -32768), 32767); 856 /* Toggle square wav side */
857 if (++count >= interval)
858 {
859 count = 0;
860 amplitude = -amplitude;
861 }
861 if (buf > pcmbuf_end) 862 if (buf > pcmbuf_end)
862 buf = (short *)audiobuffer; 863 buf = (short *)audiobuffer;
863 sample = *buf;
864 *buf++ = MIN(MAX(sample - amplitude, -32768), 32767);
865 } 864 }
866 865 }
867 if (++count >= interval) 866 else
867 {
868 buf = (short *)audiobuffer;
869 while (i++ < samples)
868 { 870 {
869 count = 0; 871 *buf++ = amplitude;
870 state = !state; 872 if (buf > pcmbuf_end)
873 buf = (short *)audiobuffer;
874 *buf++ = amplitude;
875
876 if (++count >= interval)
877 {
878 count = 0;
879 amplitude = -amplitude;
880 }
881 if (buf > pcmbuf_end)
882 buf = (short *)audiobuffer;
871 } 883 }
872 if (buf > pcmbuf_end)
873 buf = (short *)audiobuffer;
874 }
875 if (!playing) {
876 pcm_play_data(NULL, (unsigned char *)audiobuffer, samples * 4); 884 pcm_play_data(NULL, (unsigned char *)audiobuffer, samples * 4);
877 } 885 }
878} 886}