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:
parent
c30dcb8ad1
commit
569b998c5b
2 changed files with 131 additions and 64 deletions
|
|
@ -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();
|
||||||
|
break;
|
||||||
|
|
||||||
case METRONOME_VOL_UP:
|
case METRONOME_PAUSE:
|
||||||
case METRONOME_VOL_UP | BUTTON_REPEAT:
|
if(!sound_paused)
|
||||||
change_volume(1);
|
sound_paused = true;
|
||||||
calc_period();
|
break;
|
||||||
break;
|
#else
|
||||||
|
case METRONOME_PLAYPAUSE:
|
||||||
|
if(sound_paused)
|
||||||
|
sound_paused = false;
|
||||||
|
else
|
||||||
|
sound_paused = true;
|
||||||
|
calc_period();
|
||||||
|
draw_display();
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
case METRONOME_VOL_DOWN:
|
case METRONOME_VOL_UP:
|
||||||
case METRONOME_VOL_DOWN | BUTTON_REPEAT:
|
case METRONOME_VOL_UP | BUTTON_REPEAT:
|
||||||
change_volume(-1);
|
change_volume(1);
|
||||||
calc_period();
|
calc_period();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BUTTON_LEFT:
|
case METRONOME_VOL_DOWN:
|
||||||
if (bpm > 1)
|
case METRONOME_VOL_DOWN | BUTTON_REPEAT:
|
||||||
bpm--;
|
change_volume(-1);
|
||||||
calc_period();
|
calc_period();
|
||||||
draw_display();
|
break;
|
||||||
break;
|
|
||||||
|
|
||||||
case BUTTON_LEFT | BUTTON_REPEAT:
|
case BUTTON_LEFT:
|
||||||
if (bpm > 10)
|
if (bpm > 1)
|
||||||
bpm=bpm-10;
|
bpm--;
|
||||||
calc_period();
|
calc_period();
|
||||||
draw_display();
|
draw_display();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BUTTON_RIGHT:
|
case BUTTON_LEFT | BUTTON_REPEAT:
|
||||||
if(bpm < 400)
|
if (bpm > 10)
|
||||||
bpm++;
|
bpm=bpm-10;
|
||||||
calc_period();
|
calc_period();
|
||||||
draw_display();
|
draw_display();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BUTTON_RIGHT | BUTTON_REPEAT:
|
case BUTTON_RIGHT:
|
||||||
if (bpm < 400)
|
if(bpm < 400)
|
||||||
bpm=bpm+10;
|
bpm++;
|
||||||
calc_period();
|
calc_period();
|
||||||
draw_display();
|
draw_display();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
case BUTTON_RIGHT | BUTTON_REPEAT:
|
||||||
if (rb->default_event_handler_ex(button, cleanup, NULL)
|
if (bpm < 400)
|
||||||
== SYS_USB_CONNECTED)
|
bpm=bpm+10;
|
||||||
return PLUGIN_USB_CONNECTED;
|
calc_period();
|
||||||
break;
|
draw_display();
|
||||||
|
break;
|
||||||
|
|
||||||
}
|
#if CONFIG_KEYPAD != ONDIO_PAD
|
||||||
|
case METRONOME_TAP:
|
||||||
|
tap();
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (rb->default_event_handler_ex(button, cleanup, NULL)
|
||||||
|
== SYS_USB_CONNECTED)
|
||||||
|
return PLUGIN_USB_CONNECTED;
|
||||||
|
reset_tap = false;
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
if (reset_tap) {
|
||||||
|
tap_count = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* #ifndef SIMULATOR */
|
#endif /* #ifndef SIMULATOR */
|
||||||
|
|
|
||||||
|
|
@ -93,3 +93,4 @@ Jan Gajdos
|
||||||
Antoine Cellerier
|
Antoine Cellerier
|
||||||
Brian King
|
Brian King
|
||||||
Jiri Jurecek
|
Jiri Jurecek
|
||||||
|
Jacob Erlbeck
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue