diff options
Diffstat (limited to 'apps/recorder')
-rw-r--r-- | apps/recorder/peakmeter.c | 104 | ||||
-rw-r--r-- | apps/recorder/peakmeter.h | 8 | ||||
-rw-r--r-- | apps/recorder/recording.c | 64 |
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 | ||
1156 | void peak_meter_draw_trig(int xpos, int ypos) | 1174 | void 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); | |||
69 | extern int peak_meter_trigger_status(void); | 69 | extern int peak_meter_trigger_status(void); |
70 | extern void peak_meter_set_trigger_listener(void (*listener)(int status)); | 70 | extern 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 | ||
79 | extern void peak_meter_draw_trig(int x, int y); | 74 | extern void peak_meter_draw_trig(int x[], int y[], int trig_width[], |
75 | int nb_screens); | ||
80 | 76 | ||
81 | extern unsigned short peak_meter_range_min; | 77 | extern unsigned short peak_meter_range_min; |
82 | extern unsigned short peak_meter_range_max; | 78 | extern 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 | } |