diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/plugins/metronome.c | 63 |
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 | ||
23 | static struct plugin_api* rb; | 23 | static struct plugin_api* rb; |
24 | 24 | ||
25 | static unsigned int bpm = 120; | 25 | static long bpm = 120; |
26 | static unsigned int time_to_next_tock; | 26 | static long time_to_next_tock; |
27 | 27 | ||
28 | static bool sound_active = false; | 28 | static bool sound_active = false; |
29 | static bool sound_paused = true; | 29 | static bool sound_paused = true; |
30 | static bool mute = false; | 30 | static bool key_pressed = false; |
31 | static long mute_until_tick; | 31 | |
32 | static long sound_playback_tick; | ||
32 | 33 | ||
33 | /*tick sound from a metronome*/ | 34 | /*tick sound from a metronome*/ |
34 | static unsigned char sound[]={ | 35 | static unsigned char sound[]={ |
@@ -96,7 +97,13 @@ void led(bool on){ | |||
96 | } | 97 | } |
97 | 98 | ||
98 | void calc_time_to_next_tock(void){ | 99 | void 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 | ||
102 | void callback(unsigned char** start, int* size){ | 109 | void 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 */ |
151 | void change_volume(int delta){ | 159 | void 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 | ||
170 | void set_mute_ticks(void){ | ||
171 | mute_until_tick = *rb->current_tick + 50; | ||
172 | mute = true; | ||
173 | } | ||
174 | |||
175 | enum plugin_status plugin_start(struct plugin_api* api, void* parameter){ | 177 | enum 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(); |