Index: apps/action.c =================================================================== --- apps/action.c (revisione 23221) +++ apps/action.c (copia locale) @@ -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; @@ -185,10 +189,48 @@ #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)) { @@ -415,4 +457,15 @@ { 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 Index: apps/action.h =================================================================== --- apps/action.h (revisione 23221) +++ apps/action.h (copia locale) @@ -377,4 +377,8 @@ */ void action_wait_for_release(void); +#if CONFIG_CODEC == SWCODEC +void action_do_keyclick(void); +#endif + #endif /* __ACTION_H__ */ Index: apps/lang/english.lang =================================================================== --- apps/lang/english.lang (revisione 23221) +++ apps/lang/english.lang (copia locale) @@ -13075,3 +13075,37 @@ swcodec: "Release Time" + + 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" + + Index: apps/gui/list.c =================================================================== --- apps/gui/list.c (revisione 23221) +++ apps/gui/list.c (copia locale) @@ -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 @@ -333,11 +340,27 @@ 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; } @@ -370,7 +393,15 @@ } 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); } Index: apps/settings.h =================================================================== --- apps/settings.h (revisione 23221) +++ apps/settings.h (copia locale) @@ -791,6 +791,12 @@ int compressor_release_time; #endif +#ifdef HAVE_HARDWARE_CLICK +#if CONFIG_CODEC == SWCODEC + bool keyclick_hardware; /* hardware piezo keyclick */ +#endif +#endif + }; /** global variables **/ Index: apps/menus/settings_menu.c =================================================================== --- apps/menus/settings_menu.c (revisione 23221) +++ apps/menus/settings_menu.c (copia locale) @@ -220,9 +220,15 @@ #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 Index: apps/settings_list.c =================================================================== --- apps/settings_list.c (revisione 23221) +++ apps/settings_list.c (copia locale) @@ -1557,12 +1557,23 @@ #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), Index: apps/features.txt =================================================================== --- apps/features.txt (revisione 23221) +++ apps/features.txt (copia locale) @@ -215,3 +215,7 @@ #if (PLUGIN_BUFFER_SIZE >= 0x80000) large_plugin_buffer #endif + +#if defined(HAVE_HARDWARE_CLICK) +hardware_click +#endif Index: apps/main.c =================================================================== --- apps/main.c (revisione 23221) +++ apps/main.c (copia locale) @@ -111,6 +111,10 @@ #include "m5636.h" #endif +#ifdef HAVE_HARDWARE_CLICK +#include "piezo.h" +#endif + #ifdef SIMULATOR #include "sim_tasks.h" #include "system-sdl.h" @@ -612,6 +616,9 @@ #ifdef HAVE_ACCESSORY_SUPPLY accessory_supply_set(global_settings.accessory_supply); #endif +#ifdef HAVE_HARDWARE_CLICK + piezo_init(); +#endif } #ifdef CPU_PP Index: firmware/export/config-ipodvideo.h =================================================================== --- firmware/export/config-ipodvideo.h (revisione 23221) +++ firmware/export/config-ipodvideo.h (copia locale) @@ -205,6 +205,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 Index: firmware/export/config-ipodcolor.h =================================================================== --- firmware/export/config-ipodcolor.h (revisione 23221) +++ firmware/export/config-ipodcolor.h (copia locale) @@ -168,6 +168,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" Index: firmware/export/thread.h =================================================================== --- firmware/export/thread.h (revisione 23221) +++ firmware/export/thread.h (copia locale) @@ -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 Index: firmware/export/config-ipodmini.h =================================================================== --- firmware/export/config-ipodmini.h (revisione 23221) +++ firmware/export/config-ipodmini.h (copia locale) @@ -184,6 +184,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" Index: firmware/export/config-ipodmini2g.h =================================================================== --- firmware/export/config-ipodmini2g.h (revisione 23221) +++ firmware/export/config-ipodmini2g.h (copia locale) @@ -194,6 +194,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" Index: firmware/export/config-ipodnano.h =================================================================== --- firmware/export/config-ipodnano.h (revisione 23221) +++ firmware/export/config-ipodnano.h (copia locale) @@ -178,6 +178,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" Index: firmware/export/config-ipod4g.h =================================================================== --- firmware/export/config-ipod4g.h (revisione 23221) +++ firmware/export/config-ipod4g.h (copia locale) @@ -194,6 +194,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" Index: firmware/SOURCES =================================================================== --- firmware/SOURCES (revisione 23221) +++ firmware/SOURCES (copia locale) @@ -962,6 +962,7 @@ 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 @@ -980,6 +981,7 @@ 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 @@ -997,6 +999,7 @@ 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 @@ -1014,6 +1017,7 @@ 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 @@ -1065,6 +1069,7 @@ 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 @@ -1083,6 +1088,7 @@ 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