summaryrefslogtreecommitdiff
path: root/apps/recorder
diff options
context:
space:
mode:
Diffstat (limited to 'apps/recorder')
-rw-r--r--apps/recorder/peakmeter.c104
-rw-r--r--apps/recorder/peakmeter.h8
-rw-r--r--apps/recorder/recording.c64
3 files changed, 133 insertions, 43 deletions
diff --git a/apps/recorder/peakmeter.c b/apps/recorder/peakmeter.c
index 44be43124a..1033ffee67 100644
--- a/apps/recorder/peakmeter.c
+++ b/apps/recorder/peakmeter.c
@@ -23,7 +23,7 @@
23#include "settings.h" 23#include "settings.h"
24#include "ata.h" 24#include "ata.h"
25#include "lcd.h" 25#include "lcd.h"
26#include "widgets.h" 26#include "scrollbar.h"
27#include "gwps.h" 27#include "gwps.h"
28#include "sprintf.h" 28#include "sprintf.h"
29#include "button.h" 29#include "button.h"
@@ -593,25 +593,33 @@ void peak_meter_peek(void)
593 pm_max_right = MAX(pm_max_right, right); 593 pm_max_right = MAX(pm_max_right, right);
594 594
595#ifdef HAVE_RECORDING 595#ifdef HAVE_RECORDING
596#if CONFIG_CODEC == SWCODEC
597 /* Ignore any unread peakmeter data */
598#define MAX_DROP_TIME HZ/7 /* this value may need tweaking. Increase if you are
599 getting trig events when you shouldn't with
600 trig_stp_hold = 0 */
601 if (!trig_stp_hold)
602 trig_stp_hold = MAX_DROP_TIME;
603#endif
604
596 switch (trig_status) { 605 switch (trig_status) {
597 case TRIG_READY: 606 case TRIG_READY:
598 /* no more changes, if trigger was activated as release trigger */ 607 /* no more changes, if trigger was activated as release trigger */
599 /* threshold exceeded? */ 608 /* threshold exceeded? */
600 if ((left > trig_strt_threshold) 609 if ((left > trig_strt_threshold)
601 || (right > trig_strt_threshold)) { 610 || (right > trig_strt_threshold)) {
602 if (trig_strt_duration) {
603 /* reset trigger duration */ 611 /* reset trigger duration */
604 trig_hightime = current_tick; 612 trig_hightime = current_tick;
605 613
606 /* reset dropout duration */ 614 /* reset dropout duration */
607 trig_lowtime = current_tick; 615 trig_lowtime = current_tick;
608 616
617 if (trig_strt_duration)
618 set_trig_status(TRIG_STEADY);
619 else
609 /* if trig_duration is set to 0 the user wants to start 620 /* if trig_duration is set to 0 the user wants to start
610 recording immediately */ 621 recording immediately */
611 set_trig_status(TRIG_STEADY);
612 } else {
613 set_trig_status(TRIG_GO); 622 set_trig_status(TRIG_GO);
614 }
615 } 623 }
616 break; 624 break;
617 625
@@ -652,7 +660,11 @@ void peak_meter_peek(void)
652 || (right > trig_stp_threshold)) { 660 || (right > trig_stp_threshold)) {
653 /* restart hold time countdown */ 661 /* restart hold time countdown */
654 trig_lowtime = current_tick; 662 trig_lowtime = current_tick;
663#if CONFIG_CODEC == SWCODEC
664 } else if (current_tick - trig_lowtime > MAX_DROP_TIME){
665#else
655 } else { 666 } else {
667#endif
656 set_trig_status(TRIG_POSTREC); 668 set_trig_status(TRIG_POSTREC);
657 trig_hightime = current_tick; 669 trig_hightime = current_tick;
658 } 670 }
@@ -667,6 +679,7 @@ void peak_meter_peek(void)
667 679
668 set_trig_status(TRIG_RETRIG); 680 set_trig_status(TRIG_RETRIG);
669 trig_hightime = current_tick; 681 trig_hightime = current_tick;
682 trig_lowtime = current_tick;
670 } 683 }
671 else 684 else
672 685
@@ -709,6 +722,11 @@ void peak_meter_peek(void)
709 } 722 }
710 break; 723 break;
711 } 724 }
725#if CONFIG_CODEC == SWCODEC
726 /* restore stop hold value */
727 if (trig_stp_hold == MAX_DROP_TIME)
728 trig_stp_hold = 0;
729#endif
712#endif 730#endif
713 /* check levels next time peakmeter drawn */ 731 /* check levels next time peakmeter drawn */
714 level_check = true; 732 level_check = true;
@@ -1153,55 +1171,81 @@ int peak_meter_trigger_status(void)
1153 return trig_status; /* & TRIG_PIT_MASK;*/ 1171 return trig_status; /* & TRIG_PIT_MASK;*/
1154} 1172}
1155 1173
1156void peak_meter_draw_trig(int xpos, int ypos) 1174void peak_meter_draw_trig(int xpos[], int ypos[], int trig_width[], int nb_screens)
1157{ 1175{
1158 int barstart, barend; 1176 int barstart[NB_SCREENS];
1159 int icon, ixpos; 1177 int barend[NB_SCREENS];
1178 int icon;
1179 int ixpos[NB_SCREENS];
1160 int i; 1180 int i;
1181 int trigbar_width[NB_SCREENS];
1182
1183 FOR_NB_SCREENS(i)
1184 trigbar_width[i] = (trig_width[i] - (2 * (ICON_PLAY_STATE_WIDTH + 1)));
1185
1161 switch (trig_status) { 1186 switch (trig_status) {
1162 1187
1163 case TRIG_READY: 1188 case TRIG_READY:
1164 barstart = 0; 1189 FOR_NB_SCREENS(i){
1165 barend = 0; 1190 barstart[i] = 0;
1191 barend[i] = 0;
1192 }
1166 icon = Icon_Stop; 1193 icon = Icon_Stop;
1167 ixpos = xpos; 1194 FOR_NB_SCREENS(i)
1195 ixpos[i] = xpos[i];
1168 break; 1196 break;
1169 1197
1170 case TRIG_STEADY: 1198 case TRIG_STEADY:
1171 case TRIG_RETRIG: 1199 case TRIG_RETRIG:
1172 barstart = 0; 1200 FOR_NB_SCREENS(i)
1173 barend = TRIGBAR_WIDTH * (current_tick - trig_hightime) 1201 {
1174 / trig_strt_duration; 1202 barstart[i] = 0;
1203 barend[i] = (trig_strt_duration == 0) ? trigbar_width[i] :
1204 trigbar_width[i] *
1205 (current_tick - trig_hightime) / trig_strt_duration;
1206 }
1175 icon = Icon_Stop; 1207 icon = Icon_Stop;
1176 ixpos = xpos; 1208 FOR_NB_SCREENS(i)
1209 ixpos[i] = xpos[i];
1177 break; 1210 break;
1178 1211
1179 case TRIG_GO: 1212 case TRIG_GO:
1180 case TRIG_CONTINUE: 1213 case TRIG_CONTINUE:
1181 barstart = TRIGBAR_WIDTH; 1214 FOR_NB_SCREENS(i)
1182 barend = TRIGBAR_WIDTH; 1215 {
1216 barstart[i] = trigbar_width[i];
1217 barend[i] = trigbar_width[i];
1218 }
1183 icon = Icon_Record; 1219 icon = Icon_Record;
1184 ixpos = TRIG_WIDTH - ICON_PLAY_STATE_WIDTH; 1220 FOR_NB_SCREENS(i)
1221 ixpos[i] = xpos[i]+ trig_width[i] - ICON_PLAY_STATE_WIDTH;
1185 break; 1222 break;
1186 1223
1187 case TRIG_POSTREC: 1224 case TRIG_POSTREC:
1188 barstart = TRIGBAR_WIDTH 1225 FOR_NB_SCREENS(i)
1189 - TRIGBAR_WIDTH * (current_tick - trig_lowtime) 1226 {
1190 / trig_stp_hold; 1227 barstart[i] = (trig_stp_hold == 0) ? 0 :
1191 barend = TRIGBAR_WIDTH; 1228 trigbar_width[i] - trigbar_width[i] *
1229 (current_tick - trig_lowtime) / trig_stp_hold;
1230 barend[i] = trigbar_width[i];
1231 }
1192 icon = Icon_Record; 1232 icon = Icon_Record;
1193 ixpos = TRIG_WIDTH - ICON_PLAY_STATE_WIDTH; 1233 FOR_NB_SCREENS(i)
1234 ixpos[i] = xpos[i] + trig_width[i] - ICON_PLAY_STATE_WIDTH;
1194 break; 1235 break;
1195 1236
1196 default: 1237 default:
1197 return; 1238 return;
1198 } 1239 }
1199 scrollbar(xpos + ICON_PLAY_STATE_WIDTH + 1, ypos + 1, 1240
1200 TRIGBAR_WIDTH, TRIG_HEIGHT - 2, 1241 for(i = 0; i < nb_screens; i++)
1201 TRIGBAR_WIDTH, barstart, barend, HORIZONTAL);
1202 FOR_NB_SCREENS(i)
1203 { 1242 {
1204 screens[i].mono_bitmap(bitmap_icons_7x8[icon], ixpos, ypos, 1243 gui_scrollbar_draw(&screens[i], xpos[i] + ICON_PLAY_STATE_WIDTH + 1,
1244 ypos[i] + 1, trigbar_width[i], TRIG_HEIGHT - 2,
1245 trigbar_width[i], barstart[i], barend[i],
1246 HORIZONTAL);
1247
1248 screens[i].mono_bitmap(bitmap_icons_7x8[icon], ixpos[i], ypos[i],
1205 ICON_PLAY_STATE_WIDTH, STATUSBAR_HEIGHT); 1249 ICON_PLAY_STATE_WIDTH, STATUSBAR_HEIGHT);
1206 } 1250 }
1207} 1251}
diff --git a/apps/recorder/peakmeter.h b/apps/recorder/peakmeter.h
index 548b95b7da..a521f975fa 100644
--- a/apps/recorder/peakmeter.h
+++ b/apps/recorder/peakmeter.h
@@ -69,14 +69,10 @@ extern void peak_meter_trigger(bool on);
69extern int peak_meter_trigger_status(void); 69extern int peak_meter_trigger_status(void);
70extern void peak_meter_set_trigger_listener(void (*listener)(int status)); 70extern void peak_meter_set_trigger_listener(void (*listener)(int status));
71 71
72//#define TRIG_WIDTH 12
73//#define TRIG_HEIGHT 14
74
75#define TRIG_WIDTH 112
76#define TRIG_HEIGHT 8 72#define TRIG_HEIGHT 8
77#define TRIGBAR_WIDTH (TRIG_WIDTH - (2 * (ICON_PLAY_STATE_WIDTH + 1)))
78 73
79extern void peak_meter_draw_trig(int x, int y); 74extern void peak_meter_draw_trig(int x[], int y[], int trig_width[],
75 int nb_screens);
80 76
81extern unsigned short peak_meter_range_min; 77extern unsigned short peak_meter_range_min;
82extern unsigned short peak_meter_range_max; 78extern unsigned short peak_meter_range_max;
diff --git a/apps/recorder/recording.c b/apps/recorder/recording.c
index 6a053cd12e..d38856db23 100644
--- a/apps/recorder/recording.c
+++ b/apps/recorder/recording.c
@@ -801,9 +801,16 @@ static void trigger_listener(int trigger_status)
801 /* if we're already recording this is a retrigger */ 801 /* if we're already recording this is a retrigger */
802 else 802 else
803 { 803 {
804 rec_new_file(); 804 if((audio_status() & AUDIO_STATUS_PAUSE) &&
805 /* tell recording_screen to reset the time */ 805 (global_settings.rec_trigger_type == 1))
806 last_seconds = 0; 806 audio_resume_recording();
807 /* New file on trig start*/
808 else if (global_settings.rec_trigger_type != 2)
809 {
810 rec_new_file();
811 /* tell recording_screen to reset the time */
812 last_seconds = 0;
813 }
807 } 814 }
808 break; 815 break;
809 816
@@ -811,7 +818,27 @@ static void trigger_listener(int trigger_status)
811 case TRIG_READY: 818 case TRIG_READY:
812 if(audio_status() & AUDIO_STATUS_RECORD) 819 if(audio_status() & AUDIO_STATUS_RECORD)
813 { 820 {
814 audio_stop(); 821 switch(global_settings.rec_trigger_type)
822 {
823 case 0: /* Stop */
824#if CONFIG_CODEC == SWCODEC
825 audio_stop_recording();
826#else
827 audio_stop();
828#endif
829 break;
830
831 case 1: /* Pause */
832 audio_pause_recording();
833 break;
834
835 case 2: /* New file on trig stop*/
836 rec_new_file();
837 /* tell recording_screen to reset the time */
838 last_seconds = 0;
839 break;
840 }
841
815 if (global_settings.rec_trigger_mode != TRIG_MODE_REARM) 842 if (global_settings.rec_trigger_mode != TRIG_MODE_REARM)
816 { 843 {
817 peak_meter_set_trigger_listener(NULL); 844 peak_meter_set_trigger_listener(NULL);
@@ -861,6 +888,9 @@ bool recording_screen(bool no_source)
861 int i; 888 int i;
862 int filename_offset[NB_SCREENS]; 889 int filename_offset[NB_SCREENS];
863 int pm_y[NB_SCREENS]; 890 int pm_y[NB_SCREENS];
891 int trig_xpos[NB_SCREENS];
892 int trig_ypos[NB_SCREENS];
893 int trig_width[NB_SCREENS];
864 894
865 static const unsigned char *byte_units[] = { 895 static const unsigned char *byte_units[] = {
866 ID2P(LANG_BYTE), 896 ID2P(LANG_BYTE),
@@ -1602,6 +1632,10 @@ bool recording_screen(bool no_source)
1602 line[i] = 3; 1632 line[i] = 3;
1603 break; 1633 break;
1604#endif 1634#endif
1635 default:
1636 line[i] = 5; /* to prevent uninitialisation
1637 warnings for line[0] */
1638 break;
1605 } /* end switch */ 1639 } /* end switch */
1606#ifdef HAVE_AGC 1640#ifdef HAVE_AGC
1607 if (screens[i].height < h * (2 + filename_offset[i] + PM_HEIGHT + line[i])) 1641 if (screens[i].height < h * (2 + filename_offset[i] + PM_HEIGHT + line[i]))
@@ -1747,12 +1781,28 @@ bool recording_screen(bool no_source)
1747 } 1781 }
1748 1782
1749 /* draw the trigger status */ 1783 /* draw the trigger status */
1784 FOR_NB_SCREENS(i)
1785 {
1786 trig_width[i] = ((screens[i].height < 64) ||
1787 ((screens[i].height < 72) && (PM_HEIGHT > 1))) ?
1788 screens[i].width - 14 * w : screens[i].width;
1789 trig_xpos[i] = screens[i].width - trig_width[i];
1790 trig_ypos[i] = ((screens[i].height < 72) && (PM_HEIGHT > 1)) ?
1791 h*2 :
1792 h*(1 + filename_offset[i] + PM_HEIGHT + line[i]
1793#ifdef HAVE_AGC
1794 + 1
1795#endif
1796 );
1797 }
1798
1750 if (peak_meter_trigger_status() != TRIG_OFF) 1799 if (peak_meter_trigger_status() != TRIG_OFF)
1751 { 1800 {
1752 peak_meter_draw_trig(LCD_WIDTH - TRIG_WIDTH, 4 * h); 1801 peak_meter_draw_trig(trig_xpos, trig_ypos, trig_width,
1802 screen_update);
1753 for(i = 0; i < screen_update; i++){ 1803 for(i = 0; i < screen_update; i++){
1754 screens[i].update_rect(LCD_WIDTH - (TRIG_WIDTH + 2), 4 * h, 1804 screens[i].update_rect(trig_xpos[i], trig_ypos[i],
1755 TRIG_WIDTH + 2, TRIG_HEIGHT); 1805 trig_width[i] + 2, TRIG_HEIGHT);
1756 } 1806 }
1757 } 1807 }
1758 } 1808 }