diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/plugins/metronome.c | 71 |
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 | ||
23 | static struct plugin_api* rb; | 23 | static struct plugin_api* rb; |
24 | 24 | ||
25 | static long bpm = 120; | 25 | static int bpm = 120; |
26 | static long time_to_next_tock; | 26 | static int period = 0; |
27 | static int minitick = 0; | ||
27 | 28 | ||
28 | static bool sound_active = false; | 29 | static bool sound_active = false; |
29 | static bool sound_paused = true; | 30 | static bool sound_paused = true; |
30 | static bool key_pressed = false; | ||
31 | 31 | ||
32 | static long sound_playback_tick; | 32 | static char buffer[30]; |
33 | 33 | ||
34 | /*tick sound from a metronome*/ | 34 | /*tick sound from a metronome*/ |
35 | static unsigned char sound[]={ | 35 | static 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 | ||
99 | void calc_time_to_next_tock(void){ | 99 | void 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 | ||
109 | void callback(unsigned char** start, int* size){ | 103 | void callback(unsigned char** start, int* size){ |
@@ -122,7 +116,6 @@ void play_tock(void){ | |||
122 | 116 | ||
123 | 117 | ||
124 | void draw_display(void){ | 118 | void 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 | ||
170 | void 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 | |||
177 | enum plugin_status plugin_start(struct plugin_api* api, void* parameter){ | 183 | enum 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 | } |