summaryrefslogtreecommitdiff
path: root/apps/plugins/metronome.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/metronome.c')
-rw-r--r--apps/plugins/metronome.c71
1 files changed, 34 insertions, 37 deletions
diff --git a/apps/plugins/metronome.c b/apps/plugins/metronome.c
index a6ca3d33c4..1647854acd 100644
--- a/apps/plugins/metronome.c
+++ b/apps/plugins/metronome.c
@@ -22,14 +22,14 @@
22 22
23static struct plugin_api* rb; 23static struct plugin_api* rb;
24 24
25static long bpm = 120; 25static int bpm = 120;
26static long time_to_next_tock; 26static int period = 0;
27static int minitick = 0;
27 28
28static bool sound_active = false; 29static bool sound_active = false;
29static bool sound_paused = true; 30static bool sound_paused = true;
30static bool key_pressed = false;
31 31
32static long sound_playback_tick; 32static char buffer[30];
33 33
34/*tick sound from a metronome*/ 34/*tick sound from a metronome*/
35static unsigned char sound[]={ 35static unsigned char sound[]={
@@ -96,14 +96,8 @@ void led(bool on){
96 and_b(~0x40, &PBDRL); 96 and_b(~0x40, &PBDRL);
97} 97}
98 98
99void calc_time_to_next_tock(void){ 99void calc_period(void){
100 time_to_next_tock = ((HZ * 60) / bpm); 100 period = 61440/bpm-1; // (60*1024)/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 }
107} 101}
108 102
109void callback(unsigned char** start, int* size){ 103void callback(unsigned char** start, int* size){
@@ -122,7 +116,6 @@ void play_tock(void){
122 116
123 117
124void draw_display(void){ 118void draw_display(void){
125 char buffer[30];
126 rb->lcd_clear_display(); 119 rb->lcd_clear_display();
127 120
128#ifdef HAVE_LCD_BITMAP 121#ifdef HAVE_LCD_BITMAP
@@ -174,6 +167,19 @@ void change_volume(int delta){
174 } 167 }
175} 168}
176 169
170void timer_callback(void){
171 if(minitick>=period){
172 minitick = 0;
173 if(!sound_active && !sound_paused){
174 play_tock();
175 }
176 }
177 else {
178 minitick++;
179 }
180}
181
182
177enum plugin_status plugin_start(struct plugin_api* api, void* parameter){ 183enum plugin_status plugin_start(struct plugin_api* api, void* parameter){
178 184
179 TEST_PLUGIN_API(api); 185 TEST_PLUGIN_API(api);
@@ -185,20 +191,14 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter){
185 if (rb->mp3_is_playing()) 191 if (rb->mp3_is_playing())
186 rb->mp3_play_stop(); // stop audio ISR 192 rb->mp3_play_stop(); // stop audio ISR
187 193
188 calc_time_to_next_tock(); 194 calc_period();
189 sound_playback_tick = *rb->current_tick; 195 rb->plugin_register_timer((FREQ/1024), 1, timer_callback);
196
190 draw_display(); 197 draw_display();
191 198
192 /* main loop */ 199 /* main loop */
193 while (true){ 200 while (true){
194 /* playback time reached? */ 201
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 }
200 }
201
202 switch (rb->button_get(false)) { 202 switch (rb->button_get(false)) {
203#ifdef HAVE_RECORDER_KEYPAD 203#ifdef HAVE_RECORDER_KEYPAD
204 case BUTTON_OFF: 204 case BUTTON_OFF:
@@ -207,16 +207,16 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter){
207#endif 207#endif
208 /* get out of here */ 208 /* get out of here */
209 rb->mp3_play_stop(); /* stop audio ISR */ 209 rb->mp3_play_stop(); /* stop audio ISR */
210 rb->plugin_unregister_timer();
210 led(0); 211 led(0);
211 return PLUGIN_OK; 212 return PLUGIN_OK;
212 213
213 case BUTTON_PLAY: 214 case BUTTON_PLAY:
214 key_pressed = true;
215 if(sound_paused) 215 if(sound_paused)
216 sound_paused = false; 216 sound_paused = false;
217 else 217 else
218 sound_paused = true; 218 sound_paused = true;
219 calc_time_to_next_tock(); 219 calc_period();
220 draw_display(); 220 draw_display();
221 break; 221 break;
222 222
@@ -228,7 +228,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter){
228 case BUTTON_ON | BUTTON_RIGHT | BUTTON_REPEAT: 228 case BUTTON_ON | BUTTON_RIGHT | BUTTON_REPEAT:
229#endif 229#endif
230 change_volume(1); 230 change_volume(1);
231 calc_time_to_next_tock(); 231 calc_period();
232 break; 232 break;
233 233
234#ifdef HAVE_RECORDER_KEYPAD 234#ifdef HAVE_RECORDER_KEYPAD
@@ -239,42 +239,39 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter){
239 case BUTTON_ON | BUTTON_LEFT | BUTTON_REPEAT: 239 case BUTTON_ON | BUTTON_LEFT | BUTTON_REPEAT:
240#endif 240#endif
241 change_volume(-1); 241 change_volume(-1);
242 calc_time_to_next_tock(); 242 calc_period();
243 break; 243 break;
244 244
245 case BUTTON_LEFT: 245 case BUTTON_LEFT:
246 key_pressed = true;
247 if (bpm > 1) 246 if (bpm > 1)
248 bpm--; 247 bpm--;
249 calc_time_to_next_tock(); 248 calc_period();
250 draw_display(); 249 draw_display();
251 break; 250 break;
252 251
253 case BUTTON_LEFT | BUTTON_REPEAT: 252 case BUTTON_LEFT | BUTTON_REPEAT:
254 key_pressed = true;
255 if (bpm > 10) 253 if (bpm > 10)
256 bpm=bpm-10; 254 bpm=bpm-10;
257 calc_time_to_next_tock(); 255 calc_period();
258 draw_display(); 256 draw_display();
259 break; 257 break;
260 258
261 case BUTTON_RIGHT: 259 case BUTTON_RIGHT:
262 key_pressed = true; 260 if(bpm < 400)
263 if(bpm < 300)
264 bpm++; 261 bpm++;
265 calc_time_to_next_tock(); 262 calc_period();
266 draw_display(); 263 draw_display();
267 break; 264 break;
268 265
269 case BUTTON_RIGHT | BUTTON_REPEAT: 266 case BUTTON_RIGHT | BUTTON_REPEAT:
270 key_pressed = true; 267 if (bpm < 400)
271 if (bpm < 300)
272 bpm=bpm+10; 268 bpm=bpm+10;
273 calc_time_to_next_tock(); 269 calc_period();
274 draw_display(); 270 draw_display();
275 break; 271 break;
276 272
277 case SYS_USB_CONNECTED: 273 case SYS_USB_CONNECTED:
274 rb->plugin_unregister_timer();
278 rb->usb_screen(); 275 rb->usb_screen();
279 return PLUGIN_USB_CONNECTED; 276 return PLUGIN_USB_CONNECTED;
280 } 277 }