From aaa99e70ba738cd29f9d1b627d8bf47de1160d3b Mon Sep 17 00:00:00 2001 From: Linus Nielsen Feltzing Date: Thu, 20 Nov 2003 00:33:43 +0000 Subject: Recording in FM screen, USB mode possible in FM and recording screen git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4046 a1c6a512-1295-4272-9138-f99709370657 --- apps/lang/english.lang | 10 +++ apps/main_menu.c | 9 ++- apps/recorder/radio.c | 160 +++++++++++++++++++++++++++++++++++++++------- apps/recorder/recording.c | 95 ++++++++++++--------------- apps/settings.c | 26 ++++++++ apps/settings.h | 4 ++ apps/sound_menu.c | 31 +++++---- apps/sound_menu.h | 2 +- firmware/mpeg.c | 17 ++++- 9 files changed, 264 insertions(+), 90 deletions(-) diff --git a/apps/lang/english.lang b/apps/lang/english.lang index 2c84763263..0a1cfaeb51 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -1817,3 +1817,13 @@ id: LANG_FM_NO_FREE_PRESETS desc: in radio screen eng: "The preset list is full" new: + +id: LANG_FM_RADIO +desc: in main menu +eng: "FM Radio" +new: + +id: LANG_FM_BUTTONBAR_RECORD +desc: in main menu +eng: "Record" +new: diff --git a/apps/main_menu.c b/apps/main_menu.c index 01aa3dc30c..9a351928ac 100644 --- a/apps/main_menu.c +++ b/apps/main_menu.c @@ -252,6 +252,11 @@ static bool plugin_browse(void) return rockbox_browse(PLUGIN_DIR, SHOW_PLUGINS); } +static bool recording_settings(void) +{ + return recording_menu(false); +} + bool main_menu(void) { int m; @@ -262,11 +267,11 @@ bool main_menu(void) { str(LANG_SOUND_SETTINGS), sound_menu }, { str(LANG_GENERAL_SETTINGS), settings_menu }, #ifdef HAVE_FMRADIO - { "FM Radio", radio_screen }, + { str(LANG_FM_RADIO), radio_screen }, #endif #ifdef HAVE_MAS3587F { str(LANG_RECORDING), recording_screen }, - { str(LANG_RECORDING_SETTINGS), recording_menu }, + { str(LANG_RECORDING_SETTINGS), recording_settings}, #endif { str(LANG_PLAYLIST_MENU), playlist_menu }, { str(LANG_MENU_SHOW_ID3_INFO), browse_id3 }, diff --git a/apps/recorder/radio.c b/apps/recorder/radio.c index 9688a3a727..44b1661aac 100644 --- a/apps/recorder/radio.c +++ b/apps/recorder/radio.c @@ -43,6 +43,8 @@ #include "peakmeter.h" #include "lang.h" #include "font.h" +#include "sound_menu.h" +#include "recording.h" #ifdef HAVE_FMRADIO @@ -116,6 +118,11 @@ bool radio_screen(void) bool update_screen = true; int timeout = current_tick + HZ/10; bool screen_freeze = false; + bool have_recorded = false; + unsigned int seconds; + unsigned int last_seconds = 0; + int hours, minutes; + bool keep_playing = false; lcd_clear_display(); lcd_setmargins(0, 8); @@ -133,11 +140,27 @@ bool radio_screen(void) mpeg_stop(); - /* Enable the Left and right A/D Converter */ - mas_codec_writereg(0x0, 0x2227); + mpeg_init_recording(); - mas_codec_writereg(6, 0x4000); + mpeg_sound_set(SOUND_VOLUME, global_settings.volume); + + status_set_playmode(STATUS_STOP); + + /* Yes, we use the D/A for monitoring */ + peak_meter_playback(true); + + peak_meter_enabled = true; + mpeg_set_recording_options(global_settings.rec_frequency, + global_settings.rec_quality, + 1 /* Line In */, + global_settings.rec_channels, + global_settings.rec_editable); + + + mpeg_set_recording_gain(mpeg_sound_default(SOUND_LEFT_GAIN), + mpeg_sound_default(SOUND_RIGHT_GAIN), false); + fmradio_set(2, 0x140884); /* 5kHz, 7.2MHz crystal */ radio_set_frequency(curr_freq); curr_preset = find_preset(curr_freq); @@ -147,7 +170,7 @@ bool radio_screen(void) peak_meter_enabled = true; buttonbar_set(str(LANG_BUTTONBAR_MENU), str(LANG_FM_BUTTONBAR_PRESETS), - NULL); + str(LANG_FM_BUTTONBAR_RECORD)); while(!done) { @@ -188,16 +211,39 @@ bool radio_screen(void) switch(button) { case BUTTON_OFF: - radio_stop(); + if(mpeg_status()) + { + mpeg_stop(); + status_set_playmode(STATUS_STOP); + } + else + { + radio_stop(); + done = true; + } + update_screen = true; + break; - /* Turn off the ADC gain */ - mas_codec_writereg(6, 0x0000); - - done = true; + case BUTTON_F3: + /* Only act if the mpeg is stopped */ + if(!mpeg_status()) + { + have_recorded = true; + mpeg_record(rec_create_filename()); + status_set_playmode(STATUS_RECORD); + update_screen = true; + } + else + { + mpeg_new_file(rec_create_filename()); + update_screen = true; + } + last_seconds = 0; break; - + case BUTTON_ON | BUTTON_REL: done = true; + keep_playing = true; break; case BUTTON_LEFT: @@ -257,7 +303,7 @@ bool radio_screen(void) lcd_setmargins(0, 8); buttonbar_set(str(LANG_BUTTONBAR_MENU), str(LANG_FM_BUTTONBAR_PRESETS), - NULL); + str(LANG_FM_BUTTONBAR_RECORD)); update_screen = true; break; @@ -268,11 +314,11 @@ bool radio_screen(void) lcd_setmargins(0, 8); buttonbar_set(str(LANG_BUTTONBAR_MENU), str(LANG_FM_BUTTONBAR_PRESETS), - NULL); + str(LANG_FM_BUTTONBAR_RECORD)); update_screen = true; break; - case BUTTON_F3: + case BUTTON_PLAY: if(!screen_freeze) { splash(0, 0, true, "Screen frozen"); @@ -287,9 +333,15 @@ bool radio_screen(void) break; case SYS_USB_CONNECTED: - usb_screen(); - fmradio_set_status(0); - return true; + /* Only accept USB connection when not recording */ + if(!mpeg_status()) + { + usb_screen(); + fmradio_set_status(0); + have_recorded = true; /* Refreshes the browser later on */ + done = true; + } + break; } peak_meter_peek(); @@ -297,9 +349,12 @@ bool radio_screen(void) if(!screen_freeze) { lcd_setmargins(0, 8); - lcd_clearrect(0, 8 + fh*(top_of_screen + 3), LCD_WIDTH, fh); - peak_meter_draw(0, 8 + fh*(top_of_screen + 3), LCD_WIDTH, fh); - lcd_update_rect(0, 8 + fh*(top_of_screen + 3), LCD_WIDTH, fh); + if(!mpeg_status()) + { + lcd_clearrect(0, 8 + fh*(top_of_screen + 3), LCD_WIDTH, fh); + peak_meter_draw(0, 8 + fh*(top_of_screen + 3), LCD_WIDTH, fh); + lcd_update_rect(0, 8 + fh*(top_of_screen + 3), LCD_WIDTH, fh); + } if(TIME_AFTER(current_tick, timeout)) { @@ -314,8 +369,12 @@ bool radio_screen(void) } } - if(update_screen) + seconds = mpeg_recorded_time() / HZ; + + if(update_screen || seconds > last_seconds) { + last_seconds = seconds; + lcd_setfont(FONT_UI); if(curr_preset >= 0) @@ -336,6 +395,16 @@ bool radio_screen(void) stereo?str(LANG_CHANNEL_STEREO): str(LANG_CHANNEL_MONO)); lcd_puts(0, top_of_screen + 2, buf); + + if(mpeg_status()) + { + hours = seconds / 3600; + minutes = (seconds - (hours * 3600)) / 60; + snprintf(buf, 32, "%s %02d:%02d:%02d", + str(LANG_RECORDING_TIME), + hours, minutes, seconds%60); + lcd_puts(0, top_of_screen + 3, buf); + } /* Only force the redraw if update_screen is true */ status_draw(update_screen); @@ -347,10 +416,51 @@ bool radio_screen(void) update_screen = false; } } + + if(mpeg_status() & MPEG_STATUS_ERROR) + { + done = true; + } } + + if(mpeg_status() & MPEG_STATUS_ERROR) + { + status_set_playmode(STATUS_STOP); + splash(0, 0, true, str(LANG_DISK_FULL)); + status_draw(true); + lcd_update(); + mpeg_error_clear(); + + while(1) + { + button = button_get(true); + if(button == (BUTTON_OFF | BUTTON_REL)) + break; + } + } + + mpeg_init_playback(); + + mpeg_sound_channel_config(global_settings.channel_config); + mpeg_sound_set(SOUND_BASS, global_settings.bass); + mpeg_sound_set(SOUND_TREBLE, global_settings.treble); + mpeg_sound_set(SOUND_BALANCE, global_settings.balance); + mpeg_sound_set(SOUND_VOLUME, global_settings.volume); + mpeg_sound_set(SOUND_LOUDNESS, global_settings.loudness); + mpeg_sound_set(SOUND_SUPERBASS, global_settings.bass_boost); + mpeg_sound_set(SOUND_AVC, global_settings.avc); + fmradio_set_status(0); - return false; + + if(keep_playing) + { + /* Enable the Left and right A/D Converter */ + mpeg_set_recording_gain(mpeg_sound_default(SOUND_LEFT_GAIN), + mpeg_sound_default(SOUND_RIGHT_GAIN), false); + mas_codec_writereg(6, 0x4000); + } + return have_recorded; } static bool parseline(char* line, char** freq, char** name) @@ -556,11 +666,17 @@ bool radio_delete_preset(void) return reload_dir; } +static bool fm_recording_settings(void) +{ + return recording_menu(true); +} + bool radio_menu(void) { struct menu_items radio_menu_items[] = { { str(LANG_FM_SAVE_PRESET), radio_add_preset }, - { str(LANG_FM_DELETE_PRESET), radio_delete_preset } + { str(LANG_FM_DELETE_PRESET), radio_delete_preset }, + { str(LANG_RECORDING_SETTINGS), fm_recording_settings } }; int m; bool result; diff --git a/apps/recorder/recording.c b/apps/recorder/recording.c index b440764c9d..ab36e032df 100644 --- a/apps/recorder/recording.c +++ b/apps/recorder/recording.c @@ -45,16 +45,6 @@ bool f2_rec_screen(void); bool f3_rec_screen(void); -extern int recording_peak_left; -extern int recording_peak_right; - -extern int mp3buf_write; -extern int mp3buf_read; -extern bool recording; - -extern unsigned long record_start_frame; /* Frame number where - recording started */ - #define SOURCE_MIC 0 #define SOURCE_LINE 1 #define SOURCE_SPDIF 2 @@ -89,25 +79,6 @@ static char *fmtstr[] = "%d.%02d %s " /* 2 decimals */ }; -/* This array holds the record timer interval lengths, in seconds */ -static unsigned long rec_timer_seconds[] = -{ - 0, /* off */ - 5*60, /* 00:05 */ - 10*60, /* 00:10 */ - 15*60, /* 00:15 */ - 30*60, /* 00:30 */ - 60*60, /* 01:00 */ - 2*60*60, /* 02:00 */ - 4*60*60, /* 04:00 */ - 6*60*60, /* 06:00 */ - 8*60*60, /* 08:00 */ - 10*60*60, /* 10:00 */ - 12*60*60, /* 12:00 */ - 18*60*60, /* 18:00 */ - 24*60*60 /* 24:00 */ -}; - char *fmt_gain(int snd, int val, char *str, int len) { int tmp, i, d, numdec; @@ -169,8 +140,8 @@ bool recording_screen(void) int w, h; int update_countdown = 1; bool have_recorded = false; - unsigned long seconds; - unsigned long last_seconds = 0; + unsigned int seconds; + unsigned int last_seconds = 0; int hours, minutes; cursor = 0; @@ -225,13 +196,13 @@ bool recording_screen(void) mpeg_record(rec_create_filename()); status_set_playmode(STATUS_RECORD); update_countdown = 1; /* Update immediately */ - last_seconds = 0; } else { mpeg_new_file(rec_create_filename()); update_countdown = 1; /* Update immediately */ } + last_seconds = 0; break; case BUTTON_UP: @@ -331,7 +302,7 @@ bool recording_screen(void) break; case BUTTON_F1: - if (recording_menu()) + if (recording_menu(false)) return SYS_USB_CONNECTED; settings_save(); mpeg_set_recording_options(global_settings.rec_frequency, @@ -348,8 +319,12 @@ bool recording_screen(void) if(!mpeg_status()) { if (f2_rec_screen()) - return SYS_USB_CONNECTED; - update_countdown = 1; /* Update immediately */ + { + have_recorded = true; + done = true; + } + else + update_countdown = 1; /* Update immediately */ } break; @@ -357,11 +332,24 @@ bool recording_screen(void) if(!mpeg_status()) { if (f3_rec_screen()) - return SYS_USB_CONNECTED; - update_countdown = 1; /* Update immediately */ + { + have_recorded = true; + done = true; + } + else + update_countdown = 1; /* Update immediately */ } break; + case SYS_USB_CONNECTED: + /* Only accept USB connection when not recording */ + if(!mpeg_status()) + { + usb_screen(); + have_recorded = true; /* Refreshes the browser later on */ + done = true; + } + break; } peak_meter_peek(); @@ -377,6 +365,7 @@ bool recording_screen(void) update_countdown--; if(update_countdown == 0 || seconds > last_seconds) { + unsigned int dseconds, dhours, dminutes; int pos = 0; update_countdown = 5; @@ -390,21 +379,13 @@ bool recording_screen(void) str(LANG_RECORDING_TIME), hours, minutes, seconds%60); lcd_puts(0, 0, buf); - - /* if the record timesplit is active */ - if (global_settings.rec_timesplit) - { - unsigned long dseconds, dhours, dminutes; - int rti = global_settings.rec_timesplit; - dseconds = rec_timer_seconds[rti]; - if (mpeg_status() && (seconds >= dseconds)) - { - mpeg_new_file(rec_create_filename()); - update_countdown = 1; - last_seconds = 0; - } + dseconds = rec_timesplit_seconds(); + /* Display the split interval if the record timesplit + is active */ + if (global_settings.rec_timesplit) + { /* Display the record timesplit interval rather than the file size if the record timer is active */ dhours = dseconds / 3600; @@ -418,6 +399,16 @@ bool recording_screen(void) num2max5(mpeg_num_recorded_bytes(), buf2)); lcd_puts(0, 1, buf); + /* We will do file splitting regardless, since the OFF + setting really means 24 hours. This is to make sure + that the recorded files don't get too big. */ + if (mpeg_status() && (seconds >= dseconds)) + { + mpeg_new_file(rec_create_filename()); + update_countdown = 1; + last_seconds = 0; + } + peak_meter_draw(0, 8 + h*2, LCD_WIDTH, h); /* Show mic gain if input source is Mic */ @@ -518,12 +509,10 @@ bool recording_screen(void) mpeg_sound_set(SOUND_TREBLE, global_settings.treble); mpeg_sound_set(SOUND_BALANCE, global_settings.balance); mpeg_sound_set(SOUND_VOLUME, global_settings.volume); - -#ifdef HAVE_MAS3587F mpeg_sound_set(SOUND_LOUDNESS, global_settings.loudness); mpeg_sound_set(SOUND_SUPERBASS, global_settings.bass_boost); mpeg_sound_set(SOUND_AVC, global_settings.avc); -#endif + lcd_setfont(FONT_UI); return have_recorded; } diff --git a/apps/settings.c b/apps/settings.c index 1f3382f460..68e382a2dd 100644 --- a/apps/settings.c +++ b/apps/settings.c @@ -1988,3 +1988,29 @@ bool set_time(char* string, int timedate[]) return false; } #endif + +#ifdef HAVE_MAS3587F +/* This array holds the record timer interval lengths, in seconds */ +static unsigned long rec_timer_seconds[] = +{ + 24*60*60, /* OFF really means 24 hours, to avoid >2Gbyte files */ + 5*60, /* 00:05 */ + 10*60, /* 00:10 */ + 15*60, /* 00:15 */ + 30*60, /* 00:30 */ + 60*60, /* 01:00 */ + 2*60*60, /* 02:00 */ + 4*60*60, /* 04:00 */ + 6*60*60, /* 06:00 */ + 8*60*60, /* 08:00 */ + 10*60*60, /* 10:00 */ + 12*60*60, /* 12:00 */ + 18*60*60, /* 18:00 */ + 24*60*60 /* 24:00 */ +}; + +unsigned int rec_timesplit_seconds(void) +{ + return rec_timer_seconds[global_settings.rec_timesplit]; +} +#endif diff --git a/apps/settings.h b/apps/settings.h index 93516d86cf..c0e785489a 100644 --- a/apps/settings.h +++ b/apps/settings.h @@ -199,6 +199,10 @@ bool set_int(char* string, char* unit, int* variable, bool set_time(char* string, int timedate[]); void set_file(char* filename, char* setting, int maxlen); +#ifdef HAVE_MAS3587F +unsigned int rec_timesplit_seconds(void); +#endif + /* global settings */ extern struct user_settings global_settings; /* name of directory where configuration, fonts and other data diff --git a/apps/sound_menu.c b/apps/sound_menu.c index 0c875400d3..c5e254794e 100644 --- a/apps/sound_menu.c +++ b/apps/sound_menu.c @@ -290,20 +290,29 @@ bool sound_menu(void) } #ifdef HAVE_MAS3587F -bool recording_menu(void) +bool recording_menu(bool no_source) { int m; + int i = 0; + struct menu_items menu[6]; bool result; - struct menu_items items[] = { - { str(LANG_RECORDING_QUALITY), recquality }, - { str(LANG_RECORDING_FREQUENCY), recfrequency }, - { str(LANG_RECORDING_SOURCE), recsource }, - { str(LANG_RECORDING_CHANNELS), recchannels }, - { str(LANG_RECORDING_EDITABLE), receditable }, - { str(LANG_RECORD_TIMESPLIT), rectimesplit }, - }; - - m=menu_init( items, sizeof items / sizeof(struct menu_items) ); + + menu[i].desc = str(LANG_RECORDING_QUALITY); + menu[i++].function = recquality; + menu[i].desc = str(LANG_RECORDING_FREQUENCY); + menu[i++].function = recfrequency; + if(!no_source) { + menu[i].desc = str(LANG_RECORDING_SOURCE); + menu[i++].function = recsource; + } + menu[i].desc = str(LANG_RECORDING_CHANNELS); + menu[i++].function = recchannels; + menu[i].desc = str(LANG_RECORDING_EDITABLE); + menu[i++].function = receditable; + menu[i].desc = str(LANG_RECORD_TIMESPLIT); + menu[i++].function = rectimesplit; + + m=menu_init( menu, i ); result = menu_run(m); menu_exit(m); diff --git a/apps/sound_menu.h b/apps/sound_menu.h index 8c1f4db089..206d1e3715 100644 --- a/apps/sound_menu.h +++ b/apps/sound_menu.h @@ -22,6 +22,6 @@ #include "menu.h" bool sound_menu(void); -bool recording_menu(void); +bool recording_menu(bool no_source); #endif diff --git a/firmware/mpeg.c b/firmware/mpeg.c index b51f9b9732..0610e9890f 100644 --- a/firmware/mpeg.c +++ b/firmware/mpeg.c @@ -167,7 +167,7 @@ static int defaultval[] = 0, /* AVC */ 0, /* Channels */ 8, /* Left gain */ - 2, /* Right gain */ + 8, /* Right gain */ 2, /* Mic gain */ }; @@ -2157,6 +2157,21 @@ static void mpeg_thread(void) init_playback(); init_playback_done = true; break; + + case SYS_USB_CONNECTED: + is_playing = false; + paused = false; + stop_playing(); +#ifndef SIMULATOR + + /* Tell the USB thread that we are safe */ + DEBUGF("mpeg_thread got SYS_USB_CONNECTED\n"); + usb_acknowledge(SYS_USB_CONNECTED_ACK); + + /* Wait until the USB cable is extracted again */ + usb_wait_for_disconnect(&mpeg_queue); +#endif + break; } } #endif -- cgit v1.2.3