summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/plugins/metronome.c63
1 files changed, 33 insertions, 30 deletions
diff --git a/apps/plugins/metronome.c b/apps/plugins/metronome.c
index ece5275e87..00cbe18e25 100644
--- a/apps/plugins/metronome.c
+++ b/apps/plugins/metronome.c
@@ -22,13 +22,14 @@
22 22
23static struct plugin_api* rb; 23static struct plugin_api* rb;
24 24
25static unsigned int bpm = 120; 25static long bpm = 120;
26static unsigned int time_to_next_tock; 26static long time_to_next_tock;
27 27
28static bool sound_active = false; 28static bool sound_active = false;
29static bool sound_paused = true; 29static bool sound_paused = true;
30static bool mute = false; 30static bool key_pressed = false;
31static long mute_until_tick; 31
32static long sound_playback_tick;
32 33
33/*tick sound from a metronome*/ 34/*tick sound from a metronome*/
34static unsigned char sound[]={ 35static unsigned char sound[]={
@@ -96,7 +97,13 @@ void led(bool on){
96} 97}
97 98
98void calc_time_to_next_tock(void){ 99void calc_time_to_next_tock(void){
99 time_to_next_tock = (HZ * 60) / bpm ; 100 time_to_next_tock = ((HZ * 60) / bpm);
101 if (key_pressed){
102 /* we changed timing, so re-initialize timing loop
103 to be on the safe side */
104 sound_playback_tick = *rb->current_tick;
105 key_pressed = false;
106 }
100} 107}
101 108
102void callback(unsigned char** start, int* size){ 109void callback(unsigned char** start, int* size){
@@ -122,6 +129,7 @@ void draw_display(void){
122 rb->lcd_setfont(FONT_SYSFIXED); 129 rb->lcd_setfont(FONT_SYSFIXED);
123 rb->lcd_putsxy(1, 1, "Metronome"); 130 rb->lcd_putsxy(1, 1, "Metronome");
124#endif 131#endif
132
125 rb->snprintf(buffer, sizeof(buffer), "BPM: %d ",bpm); 133 rb->snprintf(buffer, sizeof(buffer), "BPM: %d ",bpm);
126#ifdef HAVE_LCD_BITMAP 134#ifdef HAVE_LCD_BITMAP
127 rb->lcd_puts(0,7, buffer); 135 rb->lcd_puts(0,7, buffer);
@@ -146,8 +154,8 @@ void draw_display(void){
146#endif 154#endif
147} 155}
148 156
149// helper function to change the volume by a certain amount, +/- 157/* helper function to change the volume by a certain amount, +/-
150// ripped from video.c 158 ripped from video.c */
151void change_volume(int delta){ 159void change_volume(int delta){
152 int vol = rb->global_settings->volume + delta; 160 int vol = rb->global_settings->volume + delta;
153 char buffer[30]; 161 char buffer[30];
@@ -158,7 +166,7 @@ void change_volume(int delta){
158 rb->global_settings->volume = vol; 166 rb->global_settings->volume = vol;
159 rb->snprintf(buffer, sizeof(buffer), "Vol: %d ", vol); 167 rb->snprintf(buffer, sizeof(buffer), "Vol: %d ", vol);
160#ifdef HAVE_LCD_BITMAP 168#ifdef HAVE_LCD_BITMAP
161 rb->lcd_puts(0,7, buffer); 169 rb->lcd_puts(10,7, buffer);
162 rb->lcd_update(); 170 rb->lcd_update();
163#else 171#else
164 rb->lcd_puts(0,1, buffer); 172 rb->lcd_puts(0,1, buffer);
@@ -166,12 +174,6 @@ void change_volume(int delta){
166 } 174 }
167} 175}
168 176
169// if a key was pressed we shut up for a little while
170void set_mute_ticks(void){
171 mute_until_tick = *rb->current_tick + 50;
172 mute = true;
173}
174
175enum plugin_status plugin_start(struct plugin_api* api, void* parameter){ 177enum plugin_status plugin_start(struct plugin_api* api, void* parameter){
176 178
177 TEST_PLUGIN_API(api); 179 TEST_PLUGIN_API(api);
@@ -183,19 +185,21 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter){
183 if (rb->mp3_is_playing) 185 if (rb->mp3_is_playing)
184 rb->mp3_play_stop(); // stop audio ISR 186 rb->mp3_play_stop(); // stop audio ISR
185 187
186 calc_time_to_next_tock(); 188 calc_time_to_next_tock();
187 draw_display(); 189 sound_playback_tick = *rb->current_tick;
190 draw_display();
188 191
189 /* main loop */ 192 /* main loop */
190 while (true){ 193 while (true){
191 if (!mute && !sound_active && !sound_paused){ 194 /* playback time reached? */
192 play_tock(); 195 if (*rb->current_tick == (sound_playback_tick + time_to_next_tock)){
196 sound_playback_tick = *rb->current_tick;
197 if(!sound_active && !sound_paused){
198 play_tock();
199 }
193 } 200 }
194 201
195 if (*rb->current_tick >= mute_until_tick) 202 switch (rb->button_get(false)) {
196 mute = false;
197
198 switch (rb->button_get_w_tmo(time_to_next_tock)) {
199#ifdef HAVE_RECORDER_KEYPAD 203#ifdef HAVE_RECORDER_KEYPAD
200 case BUTTON_OFF: 204 case BUTTON_OFF:
201#else 205#else
@@ -204,17 +208,16 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter){
204 /* get out of here */ 208 /* get out of here */
205 rb->mp3_play_stop(); /* stop audio ISR */ 209 rb->mp3_play_stop(); /* stop audio ISR */
206 led(0); 210 led(0);
207 set_mute_ticks();
208 return PLUGIN_OK; 211 return PLUGIN_OK;
209 212
210 case BUTTON_PLAY: 213 case BUTTON_PLAY:
214 key_pressed = true;
211 if(sound_paused) 215 if(sound_paused)
212 sound_paused = false; 216 sound_paused = false;
213 else 217 else
214 sound_paused = true; 218 sound_paused = true;
215 calc_time_to_next_tock(); 219 calc_time_to_next_tock();
216 draw_display(); 220 draw_display();
217 set_mute_ticks();
218 break; 221 break;
219 222
220#ifdef HAVE_RECORDER_KEYPAD 223#ifdef HAVE_RECORDER_KEYPAD
@@ -224,8 +227,8 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter){
224 case BUTTON_ON | BUTTON_RIGHT: 227 case BUTTON_ON | BUTTON_RIGHT:
225 case BUTTON_ON | BUTTON_RIGHT | BUTTON_REPEAT: 228 case BUTTON_ON | BUTTON_RIGHT | BUTTON_REPEAT:
226#endif 229#endif
227 set_mute_ticks();
228 change_volume(1); 230 change_volume(1);
231 calc_time_to_next_tock();
229 break; 232 break;
230 233
231#ifdef HAVE_RECORDER_KEYPAD 234#ifdef HAVE_RECORDER_KEYPAD
@@ -235,12 +238,12 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter){
235 case BUTTON_ON | BUTTON_LEFT: 238 case BUTTON_ON | BUTTON_LEFT:
236 case BUTTON_ON | BUTTON_LEFT | BUTTON_REPEAT: 239 case BUTTON_ON | BUTTON_LEFT | BUTTON_REPEAT:
237#endif 240#endif
238 set_mute_ticks();
239 change_volume(-1); 241 change_volume(-1);
242 calc_time_to_next_tock();
240 break; 243 break;
241 244
242 case BUTTON_LEFT: 245 case BUTTON_LEFT:
243 set_mute_ticks(); 246 key_pressed = true;
244 if (bpm > 1) 247 if (bpm > 1)
245 bpm--; 248 bpm--;
246 calc_time_to_next_tock(); 249 calc_time_to_next_tock();
@@ -248,7 +251,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter){
248 break; 251 break;
249 252
250 case BUTTON_LEFT | BUTTON_REPEAT: 253 case BUTTON_LEFT | BUTTON_REPEAT:
251 set_mute_ticks(); 254 key_pressed = true;
252 if (bpm > 10) 255 if (bpm > 10)
253 bpm=bpm-10; 256 bpm=bpm-10;
254 calc_time_to_next_tock(); 257 calc_time_to_next_tock();
@@ -256,7 +259,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter){
256 break; 259 break;
257 260
258 case BUTTON_RIGHT: 261 case BUTTON_RIGHT:
259 set_mute_ticks(); 262 key_pressed = true;
260 if(bpm < 300) 263 if(bpm < 300)
261 bpm++; 264 bpm++;
262 calc_time_to_next_tock(); 265 calc_time_to_next_tock();
@@ -264,7 +267,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter){
264 break; 267 break;
265 268
266 case BUTTON_RIGHT | BUTTON_REPEAT: 269 case BUTTON_RIGHT | BUTTON_REPEAT:
267 set_mute_ticks(); 270 key_pressed = true;
268 if (bpm < 300) 271 if (bpm < 300)
269 bpm=bpm+10; 272 bpm=bpm+10;
270 calc_time_to_next_tock(); 273 calc_time_to_next_tock();