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