? Makefile
? autoconf.h
? compiled
? sim
? trigger.patch
? triggermod.patch
? tools/codepages
? tools/mkboot
? tools/rdf2binary
? tools/uclpack
Index: apps/settings.c
===================================================================
RCS file: /cvsroot/rockbox/apps/settings.c,v
retrieving revision 1.428
diff -u -r1.428 settings.c
--- apps/settings.c	11 Oct 2006 09:12:23 -0000	1.428
+++ apps/settings.c	16 Oct 2006 12:40:11 -0000
@@ -667,6 +667,9 @@
 
     /* If values are just added to the end, no need to bump the version. */
     /* new stuff to be added at the end */
+#ifdef HAVE_RECORDING
+    {2, S_O(rec_trigger_type), 0, "trigger type", "stop,pause,nf stp,nf go"},
+#endif
 
     /* Sum of all bit sizes must not grow beyond 0xB8*8 = 1472 */
 };
Index: apps/settings.h
===================================================================
RCS file: /cvsroot/rockbox/apps/settings.h,v
retrieving revision 1.247
diff -u -r1.247 settings.h
--- apps/settings.h	9 Oct 2006 10:54:16 -0000	1.247
+++ apps/settings.h	16 Oct 2006 12:40:12 -0000
@@ -185,6 +185,7 @@
     int rec_stop_postrec;   /* negative: db, positive: % range -87 .. 100 */
     int rec_stop_gap;       /* index of trig_durations */
     int rec_trigger_mode;   /* see TRIG_MODE_XXX constants */
+    int rec_trigger_type;   /* what to do when trigger released */
 
 #ifdef HAVE_AGC
     int rec_agc_preset_mic; /* AGC mic preset modes:
Index: apps/sound_menu.c
===================================================================
RCS file: /cvsroot/rockbox/apps/sound_menu.c,v
retrieving revision 1.117
diff -u -r1.117 sound_menu.c
--- apps/sound_menu.c	27 Sep 2006 21:36:49 -0000	1.117
+++ apps/sound_menu.c	16 Oct 2006 12:40:13 -0000
@@ -45,7 +45,7 @@
 #include "radio.h"
 #endif
 #endif
-#if CONFIG_CODEC == MAS3587F
+#ifdef HAVE_RECORDING
 #include "peakmeter.h"
 #include "mas.h"
 #endif
@@ -671,6 +671,7 @@
 enum trigger_menu_option
 {
     TRIGGER_MODE,
+    TRIGGER_TYPE,
     PRERECORD_TIME,
     START_THRESHOLD,
     START_DURATION,
@@ -680,7 +681,7 @@
     TRIG_OPTION_COUNT,
 };
 
-#if !defined(SIMULATOR) && CONFIG_CODEC == MAS3587F
+#ifdef HAVE_RECORDING
 static char* create_thres_str(int threshold)
 {
     static char retval[6];
@@ -723,17 +724,6 @@
     }
 }
 
-/* Variable button definitions */
-#if CONFIG_KEYPAD == RECORDER_PAD
-#define TRIG_CANCEL BUTTON_OFF
-#define TRIG_ACCEPT BUTTON_PLAY
-#define TRIG_RESET_SIM BUTTON_F2
-
-#elif CONFIG_KEYPAD == ONDIO_PAD
-#define TRIG_CANCEL BUTTON_OFF
-#define TRIG_ACCEPT BUTTON_MENU
-#endif
-
 /**
  * Displays a menu for editing the trigger settings.
  */
@@ -759,8 +749,17 @@
         "30s"
     };
 
+#define TRIGGER_TYPE_COUNT 4
+    static const unsigned char *trigger_types[] = {
+        ID2P(LANG_RECORD_TRIGGER_STOP),
+        ID2P(LANG_RECORD_TRIGGER_PAUSE),
+        ID2P(LANG_RECORD_TRIGGER_NEWFILESTP),
+        ID2P(LANG_RECORD_TRIGGER_NEWFILEGO),
+    };
+
     static const unsigned char *option_name[] = {
         [TRIGGER_MODE] =    ID2P(LANG_RECORD_TRIGGER_MODE),
+        [TRIGGER_TYPE] =    ID2P(LANG_RECORD_TRIGGER_TYPE),
         [PRERECORD_TIME] =  ID2P(LANG_RECORD_PRERECORD_TIME),
         [START_THRESHOLD] = ID2P(LANG_RECORD_START_THRESHOLD),
         [START_DURATION] =  ID2P(LANG_RECORD_MIN_DURATION),
@@ -776,6 +775,8 @@
     int old_stop_postrec = global_settings.rec_stop_postrec;
     int old_stop_gap = global_settings.rec_stop_gap;
     int old_trigger_mode = global_settings.rec_trigger_mode;
+    int old_trigger_type = global_settings.rec_trigger_type;
+
 
     int offset = 0;
     int option_lines;
@@ -800,7 +801,9 @@
     lcd_getstringsize("M", &w, &h);
 
     // two lines are reserved for peak meter and trigger status
-    option_lines = (LCD_HEIGHT/h) - (global_settings.statusbar ? 1:0) - 2;
+    option_lines = MIN(((LCD_HEIGHT/h) -
+                          (global_settings.statusbar ? 1:0) - 2),
+                           TRIG_OPTION_COUNT);
 
     while (!exit_request) {
         int stat_height = global_settings.statusbar ? STATUSBAR_HEIGHT : 0;
@@ -814,6 +817,12 @@
             "%s",
             P2STR(trigger_modes[global_settings.rec_trigger_mode]));
 
+        snprintf(
+            option_value[TRIGGER_TYPE],
+            sizeof option_value[TRIGGER_TYPE],
+            "%s",
+            P2STR(trigger_types[global_settings.rec_trigger_type]));
+
         snprintf (
             option_value[PRERECORD_TIME],
             sizeof option_value[PRERECORD_TIME],
@@ -874,7 +883,8 @@
             int x, y;
 
             str = P2STR(option_name[i + offset]);
-            lcd_putsxy(5, stat_height + i * h, str);
+            lcd_putsxy((option_lines < TRIG_OPTION_COUNT) ? 5 : 0,
+                            stat_height + i * h, str);
 
             str = option_value[i + offset];
             lcd_getstringsize(str, &w, &h);
@@ -888,10 +898,11 @@
             }
         }
 
-        scrollbar(0, stat_height,
-            4, LCD_HEIGHT - 16 - stat_height,
-            TRIG_OPTION_COUNT, offset, offset + option_lines,
-            VERTICAL);
+        if (option_lines < TRIG_OPTION_COUNT)
+            scrollbar(0, stat_height,
+                4, LCD_HEIGHT - 16 - stat_height,
+                TRIG_OPTION_COUNT, offset, offset + option_lines,
+                VERTICAL);
 
         peak_meter_draw_trig(0, LCD_HEIGHT - 8 - TRIG_HEIGHT);
 
@@ -911,6 +922,7 @@
                 global_settings.rec_stop_postrec = old_stop_postrec;
                 global_settings.rec_stop_gap = old_stop_gap;
                 global_settings.rec_trigger_mode = old_trigger_mode;
+                global_settings.rec_trigger_type = old_trigger_type;
                 exit_request = true;
                 break;
 
@@ -939,6 +951,11 @@
                         global_settings.rec_trigger_mode %= TRIGGER_MODE_COUNT;
                         break;
 
+                    case TRIGGER_TYPE:
+                        global_settings.rec_trigger_type ++;
+                        global_settings.rec_trigger_type %= TRIGGER_TYPE_COUNT;
+                        break;
+
                     case PRERECORD_TIME:
                         global_settings.rec_prerecord_time ++;
                         global_settings.rec_prerecord_time %= PRERECORD_TIMES_COUNT;
@@ -982,6 +999,11 @@
                         global_settings.rec_trigger_mode %= TRIGGER_MODE_COUNT;
                         break;
 
+                    case TRIGGER_TYPE:
+                        global_settings.rec_trigger_type+=TRIGGER_TYPE_COUNT-1;
+                        global_settings.rec_trigger_type %= TRIGGER_TYPE_COUNT;
+                        break;
+
                     case PRERECORD_TIME:
                         global_settings.rec_prerecord_time += PRERECORD_TIMES_COUNT - 1;
                         global_settings.rec_prerecord_time %= PRERECORD_TIMES_COUNT;
@@ -1021,11 +1043,9 @@
                 settings_apply_trigger();
                 break;
 
-#ifdef TRIG_RESET_SIM
             case ACTION_REC_F2:
                 peak_meter_trigger(true);
                 break;
-#endif
 
             case SYS_USB_CONNECTED:
                 if(default_event_handler(button) == SYS_USB_CONNECTED) {
@@ -1079,10 +1099,8 @@
     items[i].desc = ID2P(LANG_CLIP_LIGHT);
     items[i++].function = cliplight;
 #endif
-#if !defined(SIMULATOR) && CONFIG_CODEC == MAS3587F
     items[i].desc = ID2P(LANG_RECORD_TRIGGER);
     items[i++].function = rectrigger;
-#endif
 #ifdef HAVE_AGC
     items[i].desc = ID2P(LANG_RECORD_AGC_PRESET);
     items[i++].function = agc_preset;
Index: apps/lang/english.lang
===================================================================
RCS file: /cvsroot/rockbox/apps/lang/english.lang,v
retrieving revision 1.285
diff -u -r1.285 english.lang
--- apps/lang/english.lang	9 Oct 2006 11:22:42 -0000	1.285
+++ apps/lang/english.lang	16 Oct 2006 12:40:21 -0000
@@ -9940,3 +9940,68 @@
     *: "Random"
   </voice>
 </phrase>
+<phrase>
+  id: LANG_RECORD_TRIGGER_TYPE
+  desc: in recording trigger menu
+  <source>
+    *: "Trigger type"
+  </source>
+  <dest>
+    *: "Trigger type"
+  </dest>
+  <voice>
+    *: "Trigger type"
+  </voice>
+</phrase>
+<phrase>
+  id: LANG_RECORD_TRIGGER_STOP
+  desc: trigger types
+  <source>
+    *: "Stop"
+  </source>
+  <dest>
+    *: "Stop"
+  </dest>
+  <voice>
+    *: "Stop"
+  </voice>
+</phrase>
+<phrase>
+  id: LANG_RECORD_TRIGGER_PAUSE
+  desc: trigger types
+  <source>
+    *: "Pause"
+  </source>
+  <dest>
+    *: "Pause"
+  </dest>
+  <voice>
+    *: "Pause"
+  </voice>
+</phrase>
+<phrase>
+  id: LANG_RECORD_TRIGGER_NEWFILESTP
+  desc: trigger types
+  <source>
+    *: "Nf stp"
+  </source>
+  <dest>
+    *: "Nf stp"
+  </dest>
+  <voice>
+    *: "Nf stp"
+  </voice>
+</phrase>
+<phrase>
+  id: LANG_RECORD_TRIGGER_NEWFILEGO
+  desc: trigger types
+  <source>
+    *: "Nf go"
+  </source>
+  <dest>
+    *: "Nf go"
+  </dest>
+  <voice>
+    *: "Nf go"
+  </voice>
+</phrase>
Index: apps/recorder/peakmeter.c
===================================================================
RCS file: /cvsroot/rockbox/apps/recorder/peakmeter.c,v
retrieving revision 1.41
diff -u -r1.41 peakmeter.c
--- apps/recorder/peakmeter.c	20 Aug 2006 21:33:40 -0000	1.41
+++ apps/recorder/peakmeter.c	16 Oct 2006 12:40:24 -0000
@@ -595,25 +595,33 @@
     pm_max_right = MAX(pm_max_right, right);
 
 #ifdef HAVE_RECORDING
+#if CONFIG_CODEC == SWCODEC
+    /* Ignore any unread peakmeter data */
+#define MAX_DROP_TIME HZ/7 /* this value may need tweaking. Increase if you are
+                              getting trig events when you shouldn't with
+                              trig_stp_hold = 0 */
+    if (!trig_stp_hold)
+        trig_stp_hold = MAX_DROP_TIME;
+#endif
+
     switch (trig_status) {
         case TRIG_READY:
             /* no more changes, if trigger was activated as release trigger */
             /* threshold exceeded? */
             if ((left > trig_strt_threshold) 
                 || (right > trig_strt_threshold)) {
-                if (trig_strt_duration) {
                     /* reset trigger duration */
                     trig_hightime = current_tick;
 
                     /* reset dropout duration */
                     trig_lowtime = current_tick;
 
+                if (trig_strt_duration)
+                    set_trig_status(TRIG_STEADY);
+                else
                     /* if trig_duration is set to 0 the user wants to start
                      recording immediately */
-                    set_trig_status(TRIG_STEADY);
-                } else {
                     set_trig_status(TRIG_GO);
-                }
             }
             break;
 
@@ -621,7 +629,10 @@
         case TRIG_RETRIG:
             /* trigger duration exceeded */
             if (current_tick - trig_hightime > trig_strt_duration) {
-                set_trig_status(TRIG_GO);
+                if (trig_status == TRIG_STEADY)
+                    set_trig_status(TRIG_GO);
+                else
+                    set_trig_status(TRIG_CONTINUE);
             } else {
                 /* threshold exceeded? */
                 if ((left > trig_strt_threshold)
@@ -711,6 +722,11 @@
             }
             break;
     }
+#if CONFIG_CODEC == SWCODEC
+    /* restore stop hold value */
+    if (trig_stp_hold == MAX_DROP_TIME)
+        trig_stp_hold = 0;
+#endif
 #endif
     /* check levels next time peakmeter drawn */
     level_check = true;
@@ -1172,8 +1188,8 @@
         case TRIG_STEADY:
         case TRIG_RETRIG: 
             barstart = 0;
-            barend = TRIGBAR_WIDTH * (current_tick - trig_hightime) 
-                   / trig_strt_duration;
+            barend = (trig_strt_duration == 0) ? TRIGBAR_WIDTH : TRIGBAR_WIDTH *
+                         (current_tick - trig_hightime) / trig_strt_duration;
             icon = Icon_Stop;
             ixpos = xpos;
             break;
@@ -1183,16 +1199,16 @@
             barstart = TRIGBAR_WIDTH;
             barend = TRIGBAR_WIDTH;
             icon = Icon_Record;
-            ixpos = TRIG_WIDTH - ICON_PLAY_STATE_WIDTH;
+            ixpos = xpos + TRIG_WIDTH - ICON_PLAY_STATE_WIDTH;
             break;
 
         case TRIG_POSTREC: 
-            barstart = TRIGBAR_WIDTH
-                     - TRIGBAR_WIDTH * (current_tick - trig_lowtime)
-                       / trig_stp_hold;
+            barstart = (trig_stp_hold == 0) ? TRIGBAR_WIDTH : TRIGBAR_WIDTH
+                            - TRIGBAR_WIDTH * (current_tick - trig_lowtime)
+                            / trig_stp_hold;
             barend = TRIGBAR_WIDTH;
             icon = Icon_Record;
-            ixpos = TRIG_WIDTH - ICON_PLAY_STATE_WIDTH;
+            ixpos = xpos + TRIG_WIDTH - ICON_PLAY_STATE_WIDTH;
             break;
 
         default:
Index: apps/recorder/recording.c
===================================================================
RCS file: /cvsroot/rockbox/apps/recorder/recording.c,v
retrieving revision 1.143
diff -u -r1.143 recording.c
--- apps/recorder/recording.c	1 Oct 2006 10:04:40 -0000	1.143
+++ apps/recorder/recording.c	16 Oct 2006 12:40:27 -0000
@@ -763,9 +763,19 @@
             /* if we're already recording this is a retrigger */
             else
             {
-                rec_new_file();
-                /* tell recording_screen to reset the time */
-                last_seconds = 0;
+                if((audio_status() & AUDIO_STATUS_PAUSE) &&
+                       (global_settings.rec_trigger_type == 1))
+                {
+                    talk_buffer_steal(); /* we use the mp3 buffer */
+                    audio_resume_recording();
+                }
+                /* New file on trig start*/
+                else if (global_settings.rec_trigger_type == 3)
+                {
+                    rec_new_file();
+                    /* tell recording_screen to reset the time */
+                    last_seconds = 0;
+                }
             }
             break;
 
@@ -773,7 +783,27 @@
         case TRIG_READY:
             if(audio_status() & AUDIO_STATUS_RECORD)
             {
-                audio_stop();
+                switch(global_settings.rec_trigger_type)
+                {
+                    case 0: /* Stop */
+#if CONFIG_CODEC == SWCODEC
+                        audio_stop_recording();
+#else
+                        audio_stop();
+#endif
+                        break;
+
+                    case 1: /* Pause */
+                        audio_pause_recording();
+                        break;
+
+                    case 2: /* New file on trig stop*/
+                        rec_new_file();
+                        /* tell recording_screen to reset the time */
+                        last_seconds = 0;
+                        break;
+                 }
+
                 if (global_settings.rec_trigger_mode != TRIG_MODE_REARM)
                 {
                     peak_meter_set_trigger_listener(NULL);
@@ -1725,10 +1755,19 @@
             /* draw the trigger status */
             if (peak_meter_trigger_status() != TRIG_OFF)
             {
-                peak_meter_draw_trig(LCD_WIDTH - TRIG_WIDTH, 4 * h);
+                peak_meter_draw_trig(LCD_WIDTH - TRIG_WIDTH, h*(1 +
+                                     filename_offset[0] + PM_HEIGHT + line[0]
+#ifdef HAVE_AGC
+                                     + 1
+#endif
+                                     ));
                 for(i = 0; i < screen_update; i++){
-                    screens[i].update_rect(LCD_WIDTH - (TRIG_WIDTH + 2), 4 * h,
-                                    TRIG_WIDTH + 2, TRIG_HEIGHT);
+                    screens[i].update_rect(LCD_WIDTH - (TRIG_WIDTH + 2), h*(1 +
+                                    filename_offset[0] + PM_HEIGHT + line[0]
+#ifdef HAVE_AGC
+                                    + 1
+#endif
+                                    ), TRIG_WIDTH + 2, TRIG_HEIGHT);
                 }
             }
         }
