summaryrefslogtreecommitdiff
path: root/apps/recorder/recording.c
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2007-06-22 09:34:57 +0000
committerMichael Sevakis <jethead71@rockbox.org>2007-06-22 09:34:57 +0000
commitea255fbc3a5842d200e943522cea9bd2cb701dd6 (patch)
treecb730c3b060dc3c253d64695d49a4f14a0da65d0 /apps/recorder/recording.c
parent6e21c146f80b17e158f3f13f84afab2978367917 (diff)
downloadrockbox-ea255fbc3a5842d200e943522cea9bd2cb701dd6.tar.gz
rockbox-ea255fbc3a5842d200e943522cea9bd2cb701dd6.zip
Prevent initial spinup when starting first file when in a stopped state on non-RTC targets. Fix some states that are dangerous on SWCODEC and could result in data loss. Had to make plugin API incopatible since specified numbered filename creation is enabled now on all non-RTC targets with recording; increase version and sort the items that looked like they had a place to go.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13683 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/recorder/recording.c')
-rw-r--r--apps/recorder/recording.c127
1 files changed, 79 insertions, 48 deletions
diff --git a/apps/recorder/recording.c b/apps/recorder/recording.c
index f7ceb508d5..17ed1052cb 100644
--- a/apps/recorder/recording.c
+++ b/apps/recorder/recording.c
@@ -70,11 +70,20 @@
70#include "radio.h" 70#include "radio.h"
71#ifdef HAVE_RECORDING 71#ifdef HAVE_RECORDING
72 72
73static bool in_screen = false; 73/* recording screen status flags */
74 74enum rec_status_flags
75{
76 RCSTAT_IN_RECSCREEN = 0x00000001,
77 RCSTAT_BEEN_IN_USB_MODE = 0x00000002,
78 RCSTAT_CREATED_DIRECTORY = 0x00000004,
79 RCSTAT_HAVE_RECORDED = 0x00000008,
80};
81
82static int rec_status = 0;
83
75bool in_recording_screen(void) 84bool in_recording_screen(void)
76{ 85{
77 return in_screen; 86 return (rec_status & RCSTAT_IN_RECSCREEN) != 0;
78} 87}
79 88
80#define PM_HEIGHT ((LCD_HEIGHT >= 72) ? 2 : 1) 89#define PM_HEIGHT ((LCD_HEIGHT >= 72) ? 2 : 1)
@@ -92,13 +101,13 @@ static bool remote_display_on = true;
92#endif 101#endif
93 102
94/** File name creation **/ 103/** File name creation **/
95#if CONFIG_CODEC == SWCODEC 104#if CONFIG_RTC == 0
96
97#ifdef IF_CNFN_NUM
98/* current file number to assist in creating unique numbered filenames 105/* current file number to assist in creating unique numbered filenames
99 without actually having to create the file on disk */ 106 without actually having to create the file on disk */
100static int file_number = -1; 107static int file_number = -1;
101#endif /* IF_CNFN_NUM */ 108#endif /* CONFIG_RTC */
109
110#if CONFIG_CODEC == SWCODEC
102 111
103#define REC_FILE_ENDING(rec_format) \ 112#define REC_FILE_ENDING(rec_format) \
104 (audio_formats[rec_format_afmt[rec_format]].ext_list) 113 (audio_formats[rec_format_afmt[rec_format]].ext_list)
@@ -511,16 +520,26 @@ char *rec_create_filename(char *buffer)
511 snprintf(ext, sizeof(ext), ".%s", 520 snprintf(ext, sizeof(ext), ".%s",
512 REC_FILE_ENDING(global_settings.rec_format)); 521 REC_FILE_ENDING(global_settings.rec_format));
513 522
514#if CONFIG_RTC 523#if CONFIG_RTC == 0
524 return create_numbered_filename(buffer, buffer, "rec_", ext, 4,
525 &file_number);
526#else
515 /* We'll wait at least up to the start of the next second so no duplicate 527 /* We'll wait at least up to the start of the next second so no duplicate
516 names are created */ 528 names are created */
517 return create_datetime_filename(buffer, buffer, "R", ext, true); 529 return create_datetime_filename(buffer, buffer, "R", ext, true);
518#else
519 return create_numbered_filename(buffer, buffer, "rec_", ext, 4
520 IF_CNFN_NUM_(, &file_number));
521#endif 530#endif
522} 531}
523 532
533#if CONFIG_RTC == 0
534/* Hit disk to get a starting filename for the type */
535void rec_init_filename(void)
536{
537 file_number = -1;
538 rec_create_filename(path_buffer);
539 file_number--;
540}
541#endif
542
524int rec_create_directory(void) 543int rec_create_directory(void)
525{ 544{
526 int rc; 545 int rc;
@@ -594,7 +613,6 @@ void rec_record(void)
594#if CONFIG_CODEC != SWCODEC 613#if CONFIG_CODEC != SWCODEC
595 talk_buffer_steal(); /* we use the mp3 buffer */ 614 talk_buffer_steal(); /* we use the mp3 buffer */
596#endif 615#endif
597 IF_CNFN_NUM_(file_number = -1;) /* Hit disk for number */
598 audio_record(rec_create_filename(path_buffer)); 616 audio_record(rec_create_filename(path_buffer));
599} 617}
600 618
@@ -617,12 +635,15 @@ static void trigger_listener(int trigger_status)
617 switch (trigger_status) 635 switch (trigger_status)
618 { 636 {
619 case TRIG_GO: 637 case TRIG_GO:
620 if((audio_status() & AUDIO_STATUS_RECORD) != AUDIO_STATUS_RECORD) 638 if(!(audio_status() & AUDIO_STATUS_RECORD))
621 { 639 {
640 rec_status |= RCSTAT_HAVE_RECORDED;
622 rec_record(); 641 rec_record();
642#if CONFIG_CODEC != SWCODEC
623 /* give control to mpeg thread so that it can start 643 /* give control to mpeg thread so that it can start
624 recording */ 644 recording */
625 yield(); yield(); yield(); 645 yield(); yield(); yield();
646#endif
626 } 647 }
627 648
628 /* if we're already recording this is a retrigger */ 649 /* if we're already recording this is a retrigger */
@@ -648,11 +669,7 @@ static void trigger_listener(int trigger_status)
648 switch(global_settings.rec_trigger_type) 669 switch(global_settings.rec_trigger_type)
649 { 670 {
650 case 0: /* Stop */ 671 case 0: /* Stop */
651#if CONFIG_CODEC == SWCODEC
652 audio_stop_recording(); 672 audio_stop_recording();
653#else
654 audio_stop();
655#endif
656 break; 673 break;
657 674
658 case 1: /* Pause */ 675 case 1: /* Pause */
@@ -686,11 +703,9 @@ bool recording_screen(bool no_source)
686 char buf2[32]; 703 char buf2[32];
687 int w, h; 704 int w, h;
688 int update_countdown = 1; 705 int update_countdown = 1;
689 bool have_recorded = false;
690 unsigned int seconds; 706 unsigned int seconds;
691 int hours, minutes; 707 int hours, minutes;
692 char filename[13]; 708 char filename[13];
693 bool been_in_usb_mode = false;
694 int last_audio_stat = -1; 709 int last_audio_stat = -1;
695 int audio_stat; 710 int audio_stat;
696#if CONFIG_CODEC == SWCODEC 711#if CONFIG_CODEC == SWCODEC
@@ -733,7 +748,7 @@ bool recording_screen(bool no_source)
733 748
734 struct audio_recording_options rec_options; 749 struct audio_recording_options rec_options;
735 750
736 in_screen = true; 751 rec_status = RCSTAT_IN_RECSCREEN;
737 cursor = 0; 752 cursor = 0;
738#if (CONFIG_LED == LED_REAL) && !defined(SIMULATOR) 753#if (CONFIG_LED == LED_REAL) && !defined(SIMULATOR)
739 ata_set_led_enabled(false); 754 ata_set_led_enabled(false);
@@ -761,6 +776,15 @@ bool recording_screen(bool no_source)
761 rec_set_recording_options(&rec_options); 776 rec_set_recording_options(&rec_options);
762 777
763 set_gain(); 778 set_gain();
779
780 if(rec_create_directory() > 0)
781 rec_status |= RCSTAT_CREATED_DIRECTORY;
782
783#if CONFIG_RTC == 0
784 /* Create new filename for recording start */
785 rec_init_filename();
786#endif
787
764 settings_apply_trigger(); 788 settings_apply_trigger();
765 789
766#ifdef HAVE_AGC 790#ifdef HAVE_AGC
@@ -788,9 +812,7 @@ bool recording_screen(bool no_source)
788 filename_offset[i] = ((screens[i].height >= 80) ? 1 : 0); 812 filename_offset[i] = ((screens[i].height >= 80) ? 1 : 0);
789 pm_y[i] = 8 + h * (2 + filename_offset[i]); 813 pm_y[i] = 8 + h * (2 + filename_offset[i]);
790 } 814 }
791 815
792 if(rec_create_directory() > 0)
793 have_recorded = true;
794#ifdef HAVE_REMOTE_LCD 816#ifdef HAVE_REMOTE_LCD
795 if (!remote_display_on) 817 if (!remote_display_on)
796 { 818 {
@@ -859,9 +881,9 @@ bool recording_screen(bool no_source)
859 881
860 if (last_audio_stat != audio_stat) 882 if (last_audio_stat != audio_stat)
861 { 883 {
862 if (audio_stat == AUDIO_STATUS_RECORD) 884 if (audio_stat & AUDIO_STATUS_RECORD)
863 { 885 {
864 have_recorded = true; 886 rec_status |= RCSTAT_HAVE_RECORDED;
865 } 887 }
866 last_audio_stat = audio_stat; 888 last_audio_stat = audio_stat;
867 } 889 }
@@ -926,7 +948,7 @@ bool recording_screen(bool no_source)
926 (peak_meter_trigger_status() != TRIG_OFF)) 948 (peak_meter_trigger_status() != TRIG_OFF))
927 { 949 {
928 /* manual recording */ 950 /* manual recording */
929 have_recorded = true; 951 rec_status |= RCSTAT_HAVE_RECORDED;
930 rec_record(); 952 rec_record();
931 last_seconds = 0; 953 last_seconds = 0;
932 if (global_settings.talk_menu) 954 if (global_settings.talk_menu)
@@ -1119,7 +1141,11 @@ bool recording_screen(bool no_source)
1119 break; 1141 break;
1120 1142
1121 case ACTION_STD_MENU: 1143 case ACTION_STD_MENU:
1144#if CONFIG_CODEC == SWCODEC
1145 if(!(audio_stat & AUDIO_STATUS_RECORD))
1146#else
1122 if(audio_stat != AUDIO_STATUS_RECORD) 1147 if(audio_stat != AUDIO_STATUS_RECORD)
1148#endif
1123 { 1149 {
1124#ifdef HAVE_FMRADIO_REC 1150#ifdef HAVE_FMRADIO_REC
1125 const int prev_rec_source = global_settings.rec_source; 1151 const int prev_rec_source = global_settings.rec_source;
@@ -1132,7 +1158,7 @@ bool recording_screen(bool no_source)
1132 if (recording_menu(no_source)) 1158 if (recording_menu(no_source))
1133 { 1159 {
1134 done = true; 1160 done = true;
1135 been_in_usb_mode = true; 1161 rec_status |= RCSTAT_BEEN_IN_USB_MODE;
1136#ifdef HAVE_FMRADIO_REC 1162#ifdef HAVE_FMRADIO_REC
1137 radio_status = FMRADIO_OFF; 1163 radio_status = FMRADIO_OFF;
1138#endif 1164#endif
@@ -1152,11 +1178,18 @@ bool recording_screen(bool no_source)
1152 audio_close_recording(); 1178 audio_close_recording();
1153 audio_init_recording(0); 1179 audio_init_recording(0);
1154#endif 1180#endif
1181
1155 rec_init_recording_options(&rec_options); 1182 rec_init_recording_options(&rec_options);
1156 rec_set_recording_options(&rec_options); 1183 rec_set_recording_options(&rec_options);
1157 1184
1158 if(rec_create_directory() > 0) 1185 if(rec_create_directory() > 0)
1159 have_recorded = true; 1186 rec_status |= RCSTAT_CREATED_DIRECTORY;
1187
1188#if CONFIG_CODEC == SWCODEC && CONFIG_RTC == 0
1189 /* If format changed, a new number is required */
1190 rec_init_filename();
1191#endif
1192
1160#ifdef HAVE_AGC 1193#ifdef HAVE_AGC
1161 if (global_settings.rec_source == AUDIO_SRC_MIC) { 1194 if (global_settings.rec_source == AUDIO_SRC_MIC) {
1162 agc_preset = global_settings.rec_agc_preset_mic; 1195 agc_preset = global_settings.rec_agc_preset_mic;
@@ -1192,7 +1225,7 @@ bool recording_screen(bool no_source)
1192#endif 1225#endif
1193 if (f2_rec_screen()) 1226 if (f2_rec_screen())
1194 { 1227 {
1195 have_recorded = true; 1228 rec_status |= RCSTAT_HAVE_RECORDED;
1196 done = true; 1229 done = true;
1197 } 1230 }
1198 else 1231 else
@@ -1208,31 +1241,28 @@ bool recording_screen(bool no_source)
1208 } 1241 }
1209 else 1242 else
1210 { 1243 {
1211 if(audio_stat != AUDIO_STATUS_RECORD)
1212 {
1213#if (CONFIG_LED == LED_REAL) 1244#if (CONFIG_LED == LED_REAL)
1214 /* led is restored at begin of loop / end of function */ 1245 /* led is restored at begin of loop / end of function */
1215 led(false); 1246 led(false);
1216#endif 1247#endif
1217 if (f3_rec_screen()) 1248 if (f3_rec_screen())
1218 { 1249 {
1219 have_recorded = true; 1250 rec_status |= RCSTAT_HAVE_RECORDED;
1220 done = true; 1251 done = true;
1221 }
1222 else
1223 update_countdown = 1; /* Update immediately */
1224 } 1252 }
1253 else
1254 update_countdown = 1; /* Update immediately */
1225 } 1255 }
1226 break; 1256 break;
1227#endif /* CONFIG_KEYPAD == RECORDER_PAD */ 1257#endif /* CONFIG_KEYPAD == RECORDER_PAD */
1228 1258
1229 case SYS_USB_CONNECTED: 1259 case SYS_USB_CONNECTED:
1230 /* Only accept USB connection when not recording */ 1260 /* Only accept USB connection when not recording */
1231 if(audio_stat != AUDIO_STATUS_RECORD) 1261 if(!(audio_stat & AUDIO_STATUS_RECORD))
1232 { 1262 {
1233 default_event_handler(SYS_USB_CONNECTED); 1263 default_event_handler(SYS_USB_CONNECTED);
1234 done = true; 1264 done = true;
1235 been_in_usb_mode = true; 1265 rec_status |= RCSTAT_BEEN_IN_USB_MODE;
1236#ifdef HAVE_FMRADIO_REC 1266#ifdef HAVE_FMRADIO_REC
1237 radio_status = FMRADIO_OFF; 1267 radio_status = FMRADIO_OFF;
1238#endif 1268#endif
@@ -1467,12 +1497,11 @@ bool recording_screen(bool no_source)
1467 { 1497 {
1468 switch (global_settings.rec_source) 1498 switch (global_settings.rec_source)
1469 { 1499 {
1470#if defined(HAVE_LINE_REC) || defined(HAVE_FMRADIO_REC)
1471 HAVE_LINE_REC_(case AUDIO_SRC_LINEIN:) 1500 HAVE_LINE_REC_(case AUDIO_SRC_LINEIN:)
1472 HAVE_FMRADIO_REC_(case AUDIO_SRC_FMRADIO:) 1501 HAVE_FMRADIO_REC_(case AUDIO_SRC_FMRADIO:)
1473 line[i] = 5; 1502 line[i] = 5;
1474 break; 1503 break;
1475#endif 1504
1476 case AUDIO_SRC_MIC: 1505 case AUDIO_SRC_MIC:
1477 line[i] = 4; 1506 line[i] = 4;
1478 break; 1507 break;
@@ -1678,7 +1707,7 @@ bool recording_screen(bool no_source)
1678 break; 1707 break;
1679 } 1708 }
1680 } 1709 }
1681 1710
1682#if CONFIG_CODEC == SWCODEC 1711#if CONFIG_CODEC == SWCODEC
1683 audio_stop_recording(); 1712 audio_stop_recording();
1684 audio_close_recording(); 1713 audio_close_recording();
@@ -1704,13 +1733,15 @@ bool recording_screen(bool no_source)
1704 peak_meter_trigger(false); 1733 peak_meter_trigger(false);
1705 peak_meter_set_trigger_listener(NULL); 1734 peak_meter_set_trigger_listener(NULL);
1706 1735
1707 in_screen = false; 1736 rec_status &= ~RCSTAT_IN_RECSCREEN;
1708 sound_settings_apply(); 1737 sound_settings_apply();
1709 1738
1710 FOR_NB_SCREENS(i) 1739 FOR_NB_SCREENS(i)
1711 screens[i].setfont(FONT_UI); 1740 screens[i].setfont(FONT_UI);
1712 1741
1713 if (have_recorded) 1742 /* if the directory was created or recording happened, make sure the
1743 browser is updated */
1744 if (rec_status & (RCSTAT_CREATED_DIRECTORY | RCSTAT_HAVE_RECORDED))
1714 reload_directory(); 1745 reload_directory();
1715 1746
1716#if (CONFIG_LED == LED_REAL) && !defined(SIMULATOR) 1747#if (CONFIG_LED == LED_REAL) && !defined(SIMULATOR)
@@ -1719,7 +1750,7 @@ bool recording_screen(bool no_source)
1719 1750
1720 settings_save(); 1751 settings_save();
1721 1752
1722 return been_in_usb_mode; 1753 return (rec_status & RCSTAT_BEEN_IN_USB_MODE) != 0;
1723} /* recording_screen */ 1754} /* recording_screen */
1724 1755
1725#if CONFIG_KEYPAD == RECORDER_PAD 1756#if CONFIG_KEYPAD == RECORDER_PAD