1
0
Fork 0
forked from len0rd/rockbox

Patch #1048937 by Jacob Erlbeck, Metronome tap speed entry

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5468 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Linus Nielsen Feltzing 2004-11-26 13:31:40 +00:00
parent c30dcb8ad1
commit 569b998c5b
2 changed files with 131 additions and 64 deletions

View file

@ -26,22 +26,25 @@
#define METRONOME_PLAYPAUSE BUTTON_PLAY #define METRONOME_PLAYPAUSE BUTTON_PLAY
#define METRONOME_VOL_UP BUTTON_UP #define METRONOME_VOL_UP BUTTON_UP
#define METRONOME_VOL_DOWN BUTTON_DOWN #define METRONOME_VOL_DOWN BUTTON_DOWN
#define METRONOME_TAP BUTTON_ON
#define METRONOME_MSG_START "press play" #define METRONOME_MSG_START "press play"
#define METRONOME_MSG_STOP "press pause" #define METRONOME_MSG_STOP "press pause"
#elif CONFIG_KEYPAD == ONDIO_PAD #elif CONFIG_KEYPAD == ONDIO_PAD
#define METRONOME_QUIT BUTTON_OFF #define METRONOME_QUIT BUTTON_OFF
#define METRONOME_PLAYPAUSE BUTTON_MENU #define METRONOME_PLAY_TAP BUTTON_MENU
#define METRONOME_PAUSE (BUTTON_MENU | BUTTON_REPEAT)
#define METRONOME_VOL_UP BUTTON_UP #define METRONOME_VOL_UP BUTTON_UP
#define METRONOME_VOL_DOWN BUTTON_DOWN #define METRONOME_VOL_DOWN BUTTON_DOWN
#define METRONOME_MSG_START "start: menu" #define METRONOME_MSG_START "start: menu"
#define METRONOME_MSG_STOP "pause: menu" #define METRONOME_MSG_STOP "pause: hold menu"
#elif CONFIG_KEYPAD == PLAYER_PAD #elif CONFIG_KEYPAD == PLAYER_PAD
#define METRONOME_QUIT BUTTON_STOP #define METRONOME_QUIT BUTTON_STOP
#define METRONOME_PLAYPAUSE BUTTON_PLAY #define METRONOME_PLAYPAUSE BUTTON_PLAY
#define METRONOME_VOL_UP (BUTTON_ON | BUTTON_RIGHT) #define METRONOME_VOL_UP (BUTTON_ON | BUTTON_RIGHT)
#define METRONOME_VOL_DOWN (BUTTON_ON | BUTTON_LEFT) #define METRONOME_VOL_DOWN (BUTTON_ON | BUTTON_LEFT)
#define METRONOME_TAP BUTTON_ON
#endif #endif
static struct plugin_api* rb; static struct plugin_api* rb;
@ -55,6 +58,11 @@ static bool sound_paused = true;
static char buffer[30]; static char buffer[30];
static bool reset_tap = false;
static int tap_count = 0;
static int tap_time = 0;
static int tap_timeout = 0;
/*tick sound from a metronome*/ /*tick sound from a metronome*/
static unsigned char sound[]={ static unsigned char sound[]={
255,251, 80,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255,251, 80,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@ -194,13 +202,19 @@ void change_volume(int delta){
void timer_callback(void){ void timer_callback(void){
if(minitick>=period){ if(minitick>=period){
minitick = 0; minitick = 0;
if(!sound_active && !sound_paused){ if(!sound_active && !sound_paused && !tap_count){
play_tock(); play_tock();
} }
} }
else { else {
minitick++; minitick++;
} }
if (tap_count) {
tap_time++;
if (tap_count > 1 && tap_time > tap_timeout)
tap_count = 0;
}
} }
void cleanup(void *parameter) void cleanup(void *parameter)
@ -212,8 +226,32 @@ void cleanup(void *parameter)
led(0); led(0);
} }
enum plugin_status plugin_start(struct plugin_api* api, void* parameter){ void tap(void)
{
if (tap_count == 0) {
tap_time = 0;
}
else {
if (tap_time > 0) {
bpm = 61440/(tap_time/tap_count);
if (bpm > 400)
bpm = 400;
}
calc_period();
draw_display();
tap_timeout = (tap_count+2)*tap_time/tap_count;
}
tap_count++;
minitick = 0; /* sync tock to tapping */
reset_tap = false;
}
enum plugin_status plugin_start(struct plugin_api* api, void* parameter){
int button; int button;
TEST_PLUGIN_API(api); TEST_PLUGIN_API(api);
@ -223,81 +261,109 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter){
rb->bitswap(sound, sizeof(sound)); rb->bitswap(sound, sizeof(sound));
if (rb->mp3_is_playing()) if (rb->mp3_is_playing())
rb->mp3_play_stop(); // stop audio ISR rb->mp3_play_stop(); // stop audio ISR
calc_period(); calc_period();
rb->plugin_register_timer((FREQ/1024), 1, timer_callback); rb->plugin_register_timer((FREQ/1024), 1, timer_callback);
draw_display(); draw_display();
/* main loop */ /* main loop */
while (true){ while (true){
reset_tap = true;
button = rb->button_get(true); button = rb->button_get(true);
switch (button) { switch (button) {
case METRONOME_QUIT: case METRONOME_QUIT:
/* get out of here */ /* get out of here */
cleanup(NULL); cleanup(NULL);
return PLUGIN_OK; return PLUGIN_OK;
case METRONOME_PLAYPAUSE: #if CONFIG_KEYPAD == ONDIO_PAD
if(sound_paused) case METRONOME_PLAY_TAP:
sound_paused = false; if(sound_paused) {
else sound_paused = false;
sound_paused = true; calc_period();
calc_period(); draw_display();
draw_display(); }
break; else
tap();
case METRONOME_VOL_UP: break;
case METRONOME_VOL_UP | BUTTON_REPEAT:
change_volume(1); case METRONOME_PAUSE:
calc_period(); if(!sound_paused)
break; sound_paused = true;
break;
#else
case METRONOME_PLAYPAUSE:
if(sound_paused)
sound_paused = false;
else
sound_paused = true;
calc_period();
draw_display();
break;
#endif
case METRONOME_VOL_UP:
case METRONOME_VOL_UP | BUTTON_REPEAT:
change_volume(1);
calc_period();
break;
case METRONOME_VOL_DOWN:
case METRONOME_VOL_DOWN | BUTTON_REPEAT:
change_volume(-1);
calc_period();
break;
case METRONOME_VOL_DOWN: case BUTTON_LEFT:
case METRONOME_VOL_DOWN | BUTTON_REPEAT: if (bpm > 1)
change_volume(-1); bpm--;
calc_period(); calc_period();
break; draw_display();
break;
case BUTTON_LEFT: case BUTTON_LEFT | BUTTON_REPEAT:
if (bpm > 1) if (bpm > 10)
bpm--; bpm=bpm-10;
calc_period(); calc_period();
draw_display(); draw_display();
break; break;
case BUTTON_LEFT | BUTTON_REPEAT: case BUTTON_RIGHT:
if (bpm > 10) if(bpm < 400)
bpm=bpm-10; bpm++;
calc_period(); calc_period();
draw_display(); draw_display();
break; break;
case BUTTON_RIGHT: case BUTTON_RIGHT | BUTTON_REPEAT:
if(bpm < 400) if (bpm < 400)
bpm++; bpm=bpm+10;
calc_period(); calc_period();
draw_display(); draw_display();
break; break;
case BUTTON_RIGHT | BUTTON_REPEAT: #if CONFIG_KEYPAD != ONDIO_PAD
if (bpm < 400) case METRONOME_TAP:
bpm=bpm+10; tap();
calc_period(); break;
draw_display(); #endif
break;
default:
default: if (rb->default_event_handler_ex(button, cleanup, NULL)
if (rb->default_event_handler_ex(button, cleanup, NULL) == SYS_USB_CONNECTED)
== SYS_USB_CONNECTED) return PLUGIN_USB_CONNECTED;
return PLUGIN_USB_CONNECTED; reset_tap = false;
break; break;
} }
if (reset_tap) {
tap_count = 0;
}
} }
} }
#endif /* #ifndef SIMULATOR */ #endif /* #ifndef SIMULATOR */

View file

@ -93,3 +93,4 @@ Jan Gajdos
Antoine Cellerier Antoine Cellerier
Brian King Brian King
Jiri Jurecek Jiri Jurecek
Jacob Erlbeck