diff --git a/apps/action.c b/apps/action.c index 3d4ea9c..37c3592 100644 --- a/apps/action.c +++ b/apps/action.c @@ -39,6 +39,10 @@ #endif #include "viewport.h" +#ifdef HAVE_HARDWARE_CLICK +#include "piezo.h" +#endif + static int last_button = BUTTON_NONE|BUTTON_REL; /* allow the ipod wheel to work on startup */ static intptr_t last_data = 0; @@ -196,9 +200,47 @@ static int get_action_worker(int context, int timeout, #if CONFIG_CODEC == SWCODEC /* Produce keyclick */ +#ifdef HAVE_HARDWARE_CLICK + if ((global_settings.keyclick || global_settings.keyclick_hardware) + && !(button & BUTTON_REL)) +#else if (global_settings.keyclick && !(button & BUTTON_REL)) +#endif + { +#ifdef HAVE_SCROLLWHEEL + if (!(button & BUTTON_REPEAT) || global_settings.keyclick_repeats + || (button & (BUTTON_SCROLL_FWD | BUTTON_SCROLL_BACK))) + { + switch (context) + { + case CONTEXT_WPS: + /* Reduce volume clicks by clickwheel to every 8dB */ + if (button & BUTTON_SCROLL_FWD) + if ((global_settings.volume+1) % 8 != 0) + break; + if (button & BUTTON_SCROLL_BACK) + if ((global_settings.volume-1) % 8 != 0) + break; + action_do_keyclick(); + break; + case CONTEXT_MAINMENU: + case CONTEXT_LIST: + case CONTEXT_TREE: + /* Don't make clickwheel click here - look in gui list handling */ + if (button & (BUTTON_SCROLL_FWD | BUTTON_SCROLL_BACK)) + break; + default: + action_do_keyclick(); + break; + } + } +#else if (!(button & BUTTON_REPEAT) || global_settings.keyclick_repeats) - pcmbuf_beep(4000, KEYCLICK_DURATION, 2500*global_settings.keyclick); + { + action_do_keyclick(); + } +#endif + } #endif if ((context != last_context) && ((last_button & BUTTON_REL) == 0)) @@ -427,4 +469,15 @@ void action_wait_for_release(void) { wait_for_release = true; } - + +#if CONFIG_CODEC == SWCODEC +void action_do_keyclick(void) +{ + if (global_settings.keyclick) + pcmbuf_beep(4000, KEYCLICK_DURATION, 2500*global_settings.keyclick); +#ifdef HAVE_HARDWARE_CLICK + if (global_settings.keyclick_hardware) + piezo_button_beep(false, false); +#endif +} +#endif diff --git a/apps/action.h b/apps/action.h index ea15b53..ad16674 100644 --- a/apps/action.h +++ b/apps/action.h @@ -376,4 +376,8 @@ int action_get_touchscreen_press_in_vp(short *x1, short *y1, struct viewport *vp */ void action_wait_for_release(void); +#if CONFIG_CODEC == SWCODEC +void action_do_keyclick(void); +#endif + #endif /* __ACTION_H__ */ diff --git a/apps/features.txt b/apps/features.txt index 0bcfb23..a6906b5 100644 --- a/apps/features.txt +++ b/apps/features.txt @@ -224,3 +224,7 @@ touchscreen #if (PLUGIN_BUFFER_SIZE >= 0x80000) large_plugin_buffer #endif + +#if defined(HAVE_HARDWARE_CLICK) +hardware_click +#endif diff --git a/apps/gui/list.c b/apps/gui/list.c index 8e350b5..6e75459 100644 --- a/apps/gui/list.c +++ b/apps/gui/list.c @@ -40,6 +40,13 @@ #include "viewport.h" #include "appevents.h" +#if CONFIG_CODEC == SWCODEC +#include "pcmbuf.h" +#ifdef HAVE_HARDWARE_CLICK +#include "piezo.h" +#endif +#endif + #ifdef HAVE_LCD_CHARCELLS #define SCROLL_LIMIT 1 #else @@ -332,11 +339,27 @@ static void gui_list_select_at_offset(struct gui_synclist * gui_list, new_selection = gui_list->selected_item + offset; if (new_selection >= gui_list->nb_items) { +#if CONFIG_CODEC == SWCODEC +#ifdef HAVE_HARDWARE_CLICK + if (!gui_list->limit_scroll) + { + action_do_keyclick(); + } +#endif +#endif gui_list->selected_item = gui_list->limit_scroll ? gui_list->nb_items - gui_list->selected_size : 0; } else if (new_selection < 0) { +#if CONFIG_CODEC == SWCODEC +#ifdef HAVE_HARDWARE_CLICK + if (!gui_list->limit_scroll) + { + action_do_keyclick(); + } +#endif +#endif gui_list->selected_item = gui_list->limit_scroll ? 0 : gui_list->nb_items - gui_list->selected_size; } @@ -362,7 +385,15 @@ static void gui_list_select_at_offset(struct gui_synclist * gui_list, } return; } - else gui_list->selected_item += offset; + else + { +#if CONFIG_CODEC == SWCODEC +#ifdef HAVE_HARDWARE_CLICK + action_do_keyclick(); +#endif +#endif + gui_list->selected_item += offset; + } gui_synclist_select_item(gui_list, gui_list->selected_item); } diff --git a/apps/lang/english.lang b/apps/lang/english.lang index 4d73592..393bf71 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -13287,3 +13287,37 @@ *: "of" + + id: LANG_KEYCLICK_SOFTWARE + desc: in keyclick settings menu + user: core + + *: none + hardware_click: "Headphone Keyclick" + + + *: none + hardware_click: "Headphone Keyclick" + + + *: none + hardware_click: "Headphone Keyclick" + + + + id: LANG_KEYCLICK_HARDWARE + desc: in keyclick settings menu + user: core + + *: none + hardware_click: "Speaker Keyclick" + + + *: none + hardware_click: "Speaker Keyclick" + + + *: none + hardware_click: "Speaker Keyclick" + + diff --git a/apps/main.c b/apps/main.c index 6d2609b..4f5850d 100644 --- a/apps/main.c +++ b/apps/main.c @@ -113,6 +113,10 @@ #include "m5636.h" #endif +#ifdef HAVE_HARDWARE_CLICK +#include "piezo.h" +#endif + #ifdef SIMULATOR #include "sim_tasks.h" #include "system-sdl.h" @@ -236,6 +240,9 @@ static int init_dircache(bool preinit) (void)preinit; return 0; #endif +#ifdef HAVE_HARDWARE_CLICK + piezo_init(); +#endif } #ifdef HAVE_TAGCACHE diff --git a/apps/menus/settings_menu.c b/apps/menus/settings_menu.c index 5c30e59..a2bc3ec 100644 --- a/apps/menus/settings_menu.c +++ b/apps/menus/settings_menu.c @@ -220,9 +220,15 @@ MAKE_MENU(limits_menu, ID2P(LANG_LIMITS_MENU), 0, Icon_NOICON, #if CONFIG_CODEC == SWCODEC MENUITEM_SETTING(keyclick, &global_settings.keyclick, NULL); MENUITEM_SETTING(keyclick_repeats, &global_settings.keyclick_repeats, NULL); +#ifdef HAVE_HARDWARE_CLICK +MENUITEM_SETTING(keyclick_hardware, &global_settings.keyclick_hardware, NULL); +MAKE_MENU(keyclick_menu, ID2P(LANG_KEYCLICK), 0, Icon_NOICON, + &keyclick, &keyclick_hardware, &keyclick_repeats); +#else MAKE_MENU(keyclick_menu, ID2P(LANG_KEYCLICK), 0, Icon_NOICON, &keyclick, &keyclick_repeats); #endif +#endif #if CONFIG_CODEC == MAS3507D diff --git a/apps/settings.h b/apps/settings.h index ea7138c..78d8d61 100644 --- a/apps/settings.h +++ b/apps/settings.h @@ -807,6 +807,12 @@ struct user_settings bool morse_input; /* text input method setting */ #endif +#ifdef HAVE_HARDWARE_CLICK +#if CONFIG_CODEC == SWCODEC + bool keyclick_hardware; /* hardware piezo keyclick */ +#endif +#endif + }; /** global variables **/ diff --git a/apps/settings_list.c b/apps/settings_list.c index a60ee3f..f4165fd 100644 --- a/apps/settings_list.c +++ b/apps/settings_list.c @@ -1551,12 +1551,23 @@ const struct settings_list settings[] = { #endif /* HAVE_WHEEL_ACCELERATION */ #if CONFIG_CODEC == SWCODEC /* keyclick */ +#ifdef HAVE_HARDWARE_CLICK + CHOICE_SETTING(0, keyclick, LANG_KEYCLICK_SOFTWARE, 0, + "keyclick", "off,weak,moderate,strong", NULL, 4, + ID2P(LANG_OFF), ID2P(LANG_WEAK), ID2P(LANG_MODERATE), + ID2P(LANG_STRONG)), + OFFON_SETTING(0, keyclick_repeats, LANG_KEYCLICK_REPEATS, false, + "keyclick repeats", NULL), + OFFON_SETTING(0, keyclick_hardware, LANG_KEYCLICK_HARDWARE, false, + "hardware keyclick", NULL), +#else CHOICE_SETTING(0, keyclick, LANG_KEYCLICK, 0, "keyclick", "off,weak,moderate,strong", NULL, 4, ID2P(LANG_OFF), ID2P(LANG_WEAK), ID2P(LANG_MODERATE), ID2P(LANG_STRONG)), OFFON_SETTING(0, keyclick_repeats, LANG_KEYCLICK_REPEATS, false, "keyclick repeats", NULL), +#endif #endif /* CONFIG_CODEC == SWCODEC */ TEXT_SETTING(0, playlist_catalog_dir, "playlist catalog directory", PLAYLIST_CATALOG_DEFAULT_DIR, NULL, NULL), diff --git a/firmware/SOURCES b/firmware/SOURCES index 064c8fe..b8b928d 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -995,6 +995,7 @@ target/arm/ata-pp5020.c target/arm/ipod/adc-ipod-pcf.c target/arm/ipod/backlight-4g_color.c target/arm/ipod/button-clickwheel.c +target/arm/ipod/piezo.c target/arm/ipod/lcd-as-gray.S target/arm/ipod/lcd-gray.c target/arm/ipod/power-ipod.c @@ -1013,6 +1014,7 @@ target/arm/i2s-pp.c target/arm/ipod/adc-ipod-pcf.c target/arm/ipod/backlight-4g_color.c target/arm/ipod/button-clickwheel.c +target/arm/ipod/piezo.c target/arm/ipod/lcd-color_nano.c target/arm/ipod/power-ipod.c target/arm/ipod/powermgmt-ipod-pcf.c @@ -1030,6 +1032,7 @@ target/arm/i2s-pp.c target/arm/ipod/adc-ipod-pcf.c target/arm/ipod/backlight-nano_video.c target/arm/ipod/button-clickwheel.c +target/arm/ipod/piezo.c target/arm/ipod/lcd-color_nano.c target/arm/ipod/power-ipod.c target/arm/ipod/powermgmt-ipod-pcf.c @@ -1047,6 +1050,7 @@ target/arm/i2s-pp.c target/arm/ipod/adc-ipod-pcf.c target/arm/ipod/backlight-nano_video.c target/arm/ipod/button-clickwheel.c +target/arm/ipod/piezo.c target/arm/ipod/power-ipod.c target/arm/ipod/powermgmt-ipod-pcf.c target/arm/ipod/video/lcd-as-video.S @@ -1098,6 +1102,7 @@ target/arm/i2s-pp.c target/arm/ipod/adc-ipod-pcf.c target/arm/ipod/backlight-mini1g_mini2g.c target/arm/ipod/button-mini1g.c +target/arm/ipod/piezo.c target/arm/ipod/lcd-as-gray.S target/arm/ipod/lcd-gray.c target/arm/ipod/power-ipod.c @@ -1116,6 +1121,7 @@ target/arm/i2s-pp.c target/arm/ipod/adc-ipod-pcf.c target/arm/ipod/backlight-mini1g_mini2g.c target/arm/ipod/button-clickwheel.c +target/arm/ipod/piezo.c target/arm/ipod/lcd-as-gray.S target/arm/ipod/lcd-gray.c target/arm/ipod/power-ipod.c diff --git a/firmware/export/config/ipod4g.h b/firmware/export/config/ipod4g.h index e6bdc35..a64bd10 100644 --- a/firmware/export/config/ipod4g.h +++ b/firmware/export/config/ipod4g.h @@ -196,6 +196,8 @@ /* Define this if you can read an absolute wheel position */ #define HAVE_WHEEL_POSITION +#define HAVE_HARDWARE_CLICK + #define BOOTFILE_EXT "ipod" #define BOOTFILE "rockbox." BOOTFILE_EXT #define BOOTDIR "/.rockbox" diff --git a/firmware/export/config/ipodcolor.h b/firmware/export/config/ipodcolor.h index 0f1de4f..426e9aa 100644 --- a/firmware/export/config/ipodcolor.h +++ b/firmware/export/config/ipodcolor.h @@ -173,6 +173,8 @@ /* Define this if you can read an absolute wheel position */ #define HAVE_WHEEL_POSITION +#define HAVE_HARDWARE_CLICK + #define BOOTFILE_EXT "ipod" #define BOOTFILE "rockbox." BOOTFILE_EXT #define BOOTDIR "/.rockbox" diff --git a/firmware/export/config/ipodmini1g.h b/firmware/export/config/ipodmini1g.h index 129829f..5a5bca3 100644 --- a/firmware/export/config/ipodmini1g.h +++ b/firmware/export/config/ipodmini1g.h @@ -185,6 +185,8 @@ /* Define this if you have adjustable CPU frequency */ #define HAVE_ADJUSTABLE_CPU_FREQ +#define HAVE_HARDWARE_CLICK + #define BOOTFILE_EXT "ipod" #define BOOTFILE "rockbox." BOOTFILE_EXT #define BOOTDIR "/.rockbox" diff --git a/firmware/export/config/ipodmini2g.h b/firmware/export/config/ipodmini2g.h index 8087269..730d350 100644 --- a/firmware/export/config/ipodmini2g.h +++ b/firmware/export/config/ipodmini2g.h @@ -195,6 +195,8 @@ /* Define this if you can read an absolute wheel position */ #define HAVE_WHEEL_POSITION +#define HAVE_HARDWARE_CLICK + #define BOOTFILE_EXT "ipod" #define BOOTFILE "rockbox." BOOTFILE_EXT #define BOOTDIR "/.rockbox" diff --git a/firmware/export/config/ipodnano1g.h b/firmware/export/config/ipodnano1g.h index 5f63c26..2335043 100644 --- a/firmware/export/config/ipodnano1g.h +++ b/firmware/export/config/ipodnano1g.h @@ -183,6 +183,8 @@ /* Define this if you can read an absolute wheel position */ #define HAVE_WHEEL_POSITION +#define HAVE_HARDWARE_CLICK + #define BOOTFILE_EXT "ipod" #define BOOTFILE "rockbox." BOOTFILE_EXT #define BOOTDIR "/.rockbox" diff --git a/firmware/export/config/ipodvideo.h b/firmware/export/config/ipodvideo.h index 59ac646..2ed4039 100644 --- a/firmware/export/config/ipodvideo.h +++ b/firmware/export/config/ipodvideo.h @@ -207,6 +207,8 @@ /* Define this if you can read an absolute wheel position */ #define HAVE_WHEEL_POSITION +#define HAVE_HARDWARE_CLICK + /* define this if the device has larger sectors when accessed via USB */ /* (only relevant in disk.c, fat.c now always supports large virtual sectors) */ #define MAX_LOG_SECTOR_SIZE 2048 diff --git a/firmware/export/thread.h b/firmware/export/thread.h index cd27324..cd11822 100644 --- a/firmware/export/thread.h +++ b/firmware/export/thread.h @@ -61,10 +61,18 @@ #if CONFIG_CODEC == SWCODEC #ifdef HAVE_RECORDING +#ifdef HAVE_HARDWARE_CLICK +#define BASETHREADS 18 +#else +#define BASETHREADS 17 +#endif +#else +#ifdef HAVE_HARDWARE_CLICK #define BASETHREADS 17 #else #define BASETHREADS 16 #endif +#endif #else #define BASETHREADS 11