Add speech feedback in pitchscreen

Patch by Igor Poretsky

Change-Id: I8828cefdb3346a25071fba0afff2c9d3bca440a1
diff --git a/apps/gui/pitchscreen.c b/apps/gui/pitchscreen.c
index 200033b..443a967 100644
--- a/apps/gui/pitchscreen.c
+++ b/apps/gui/pitchscreen.c
@@ -31,6 +31,7 @@
 #include "lang.h"
 #include "icons.h"
 #include "screens.h"
+#include "talk.h"
 #include "viewport.h"
 #include "font.h"
 #include "system.h"
@@ -164,6 +165,18 @@
  * 
  */
 
+static void speak_pitch_mode(bool enqueue)
+{
+    bool timestretch_mode = global_settings.pitch_mode_timestretch && dsp_timestretch_available();
+    if (timestretch_mode)
+        talk_id(VOICE_PITCH_TIMESTRETCH_MODE, enqueue);
+    if (global_settings.pitch_mode_semitone)
+        talk_id(VOICE_PITCH_SEMITONE_MODE, timestretch_mode ? true : enqueue);
+    else
+        talk_id(VOICE_PITCH_ABSOLUTE_MODE, timestretch_mode ? true : enqueue);
+    return;
+}
+
 /*
  * Fixes the viewports so they represent the 3 rows, and adds a little margin
  * on all sides for the icons (which are drawn outside of the grid
@@ -739,6 +752,7 @@
     int32_t new_pitch;
     int32_t pitch_delta;
     bool nudged = false;
+    int i, updated = 4, decimals = 0;
     bool exit = false;
     /* should maybe be passed per parameter later, not needed for now */
     struct viewport parent[NB_SCREENS];
@@ -769,6 +783,10 @@
     }
 #endif
 
+    /* Count decimals for speaking */
+    for (i = PITCH_SPEED_PRECISION; i >= 10; i /= 10)
+        decimals++;
+
     /* set the semitone index based on the current pitch */
     semitone = get_semitone_from_pitch(pitch);
 
@@ -801,6 +819,49 @@
 #if CONFIG_CODEC == SWCODEC
         new_speed = 0;
 #endif
+
+        if (global_settings.talk_menu && updated)
+        {
+            talk_shutup();
+            switch (updated)
+            {
+            case 1:
+                if (global_settings.pitch_mode_semitone)
+                    talk_value_decimal(semitone, UNIT_SIGNED, decimals, false);
+                else
+                    talk_value_decimal(pitch, UNIT_PERCENT, decimals, false);
+                break;
+#if CONFIG_CODEC == SWCODEC
+            case 2:
+                talk_value_decimal(speed, UNIT_PERCENT, decimals, false);
+                break;
+#endif
+            case 3:
+                speak_pitch_mode(false);
+                break;
+            case 4:
+#if CONFIG_CODEC == SWCODEC
+                if (global_settings.pitch_mode_timestretch && dsp_timestretch_available())
+                    talk_id(LANG_PITCH, false);
+                else
+#endif
+                    talk_id(LANG_PLAYBACK_RATE, false);
+                talk_value_decimal(pitch, UNIT_PERCENT, decimals, true);
+#if CONFIG_CODEC == SWCODEC
+                if (global_settings.pitch_mode_timestretch && dsp_timestretch_available())
+                {
+                    talk_id(LANG_SPEED, true);
+                    talk_value_decimal(speed, UNIT_PERCENT, decimals, true);
+                }
+#endif
+                speak_pitch_mode(true);
+                break;
+            default:
+                break;
+            }
+        }
+        updated = 0;
+
         button = get_action(CONTEXT_PITCHSCREEN, HZ);
         
 #ifdef HAVE_TOUCHSCREEN
@@ -817,6 +878,7 @@
                     pitch_delta = SEMITONE_SMALL_DELTA;
                 else 
                     pitch_delta = PITCH_SMALL_DELTA;
+                updated = 1;
                 break;
 
             case ACTION_PS_INC_BIG:
@@ -824,6 +886,7 @@
                     pitch_delta = SEMITONE_BIG_DELTA;
                 else 
                     pitch_delta = PITCH_BIG_DELTA;
+                updated = 1;
                 break;
 
             case ACTION_PS_DEC_SMALL:
@@ -831,6 +894,7 @@
                     pitch_delta = -SEMITONE_SMALL_DELTA;
                 else 
                     pitch_delta = -PITCH_SMALL_DELTA;
+                updated = 1;
                 break;
 
             case ACTION_PS_DEC_BIG:
@@ -838,6 +902,7 @@
                     pitch_delta = -SEMITONE_BIG_DELTA;
                 else 
                     pitch_delta = -PITCH_BIG_DELTA;
+                updated = 1;
                 break;
 
             case ACTION_PS_NUDGE_RIGHT:
@@ -856,6 +921,7 @@
 #if CONFIG_CODEC == SWCODEC
                     speed = pitch;
 #endif
+                    updated = nudged ? 1 : 0;
                     break;
 #if CONFIG_CODEC == SWCODEC
                 }
@@ -863,6 +929,7 @@
                 {
                     new_speed = speed + SPEED_SMALL_DELTA;
                     at_limit = false;
+                    updated = 2;
                 }
                 break;
 
@@ -874,6 +941,7 @@
                     if(new_speed % PITCH_SPEED_PRECISION != 0)
                         new_speed -= new_speed % PITCH_SPEED_PRECISION;
                     at_limit = false;
+                    updated = 2;
                 }
                 break;
 #endif
@@ -891,6 +959,7 @@
 #endif
                     semitone = get_semitone_from_pitch(pitch);
                     nudged = false;
+                    updated = 1;
                 }
                 break;
 
@@ -910,6 +979,7 @@
 #if CONFIG_CODEC == SWCODEC
                     speed = pitch;
 #endif
+                    updated = nudged ? 1 : 0;
                     break;
 #if CONFIG_CODEC == SWCODEC
                 }
@@ -917,6 +987,7 @@
                 {
                     new_speed = speed - SPEED_SMALL_DELTA;
                     at_limit = false;
+                    updated = 2;
                 }
                 break;
 
@@ -928,6 +999,7 @@
                     if(new_speed % PITCH_SPEED_PRECISION != 0)
                         new_speed += PITCH_SPEED_PRECISION - speed % PITCH_SPEED_PRECISION;
                     at_limit = false;
+                    updated = 2;
                 }
                 break;
 #endif
@@ -945,6 +1017,7 @@
 #endif
                     semitone = get_semitone_from_pitch(pitch);
                     nudged = false;
+                    updated = 1;
                 }
                 break;
 
@@ -960,6 +1033,7 @@
                 }
 #endif
                 semitone = get_semitone_from_pitch(pitch);
+                updated = 4;
                 break;
 
             case ACTION_PS_TOGGLE_MODE:
@@ -978,6 +1052,7 @@
                 }
                 settings_save();
 #endif
+                updated = 3;
                 break;
 
             case ACTION_PS_EXIT:
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 207bad6..265fcd6 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -11361,7 +11361,7 @@
   </dest>
   <voice>
     *: none
-    swcodec: "Timestretch"
+    swcodec: "Time stretch"
   </voice>
 </phrase>
 <phrase>
@@ -14000,3 +14000,54 @@
     charging: "Delay Before Resume"
   </voice>
 </phrase>
+<phrase>
+  id: VOICE_PITCH_ABSOLUTE_MODE
+  desc: spoken only
+  user: core
+  <source>
+    *: none
+    pitchscreen: ""
+  </source>
+  <dest>
+    *: none
+    pitchscreen: ""
+  </dest>
+  <voice>
+    *: none
+    pitchscreen: "Absolute mode"
+  </voice>
+</phrase>
+<phrase>
+  id: VOICE_PITCH_SEMITONE_MODE
+  desc: spoken only
+  user: core
+  <source>
+    *: none
+    pitchscreen: ""
+  </source>
+  <dest>
+    *: none
+    pitchscreen: ""
+  </dest>
+  <voice>
+    *: none
+    pitchscreen: "Semitone mode"
+  </voice>
+</phrase>
+<phrase>
+  id: VOICE_PITCH_TIMESTRETCH_MODE
+  desc: spoken only
+  user: core
+  <source>
+    *: none
+    pitchscreen: ""
+  </source>
+  <dest>
+    *: none
+    pitchscreen: ""
+  </dest>
+  <voice>
+    *: none
+    pitchscreen: "Time stretch"
+  </voice>
+</phrase>