From 1325c9d9febf3f1544b7530feda11baf0af37bb6 Mon Sep 17 00:00:00 2001 From: Linus Nielsen Feltzing Date: Sun, 10 Nov 2002 16:42:31 +0000 Subject: Added recording functionality git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2816 a1c6a512-1295-4272-9138-f99709370657 --- apps/lang/english.lang | 40 ++++ apps/main_menu.c | 7 + apps/recorder/recording.c | 528 ++++++++++++++++++++++++++++++++++++++++++++++ apps/recorder/recording.h | 24 +++ 4 files changed, 599 insertions(+) create mode 100644 apps/recorder/recording.c create mode 100644 apps/recorder/recording.h (limited to 'apps') diff --git a/apps/lang/english.lang b/apps/lang/english.lang index 3b036725b5..d190614a78 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -1082,3 +1082,43 @@ id: LANG_PM_MAX desc: in the peak meter menu eng: "Maximum of range" new: + +id: LANG_RECORDING +desc: in the main menu +eng: "Recording" +new: + +id: LANG_RECORDING_GAIN +desc: in the recording screen +eng: "Gain" +new: + +id: LANG_RECORDING_LEFT +desc: in the recording screen +eng: "Left" +new: + +id: LANG_RECORDING_RIGHT +desc: in the recording screen +eng: "Right" +new: + +id: LANG_RECORDING_QUALITY +desc: in the recording settings +eng: "Quality" +new: + +id: LANG_RECORDING_FREQUENCY +desc: in the recording settings +eng: "Frequency" +new: + +id: LANG_RECORDING_SOURCE +desc: in the recording settings +eng: "Source" +new: + +id: LANG_RECORDING_CHANNEL +desc: in the recording settings +eng: "Channel" +new: diff --git a/apps/main_menu.c b/apps/main_menu.c index 9a31687500..5399c996c9 100644 --- a/apps/main_menu.c +++ b/apps/main_menu.c @@ -41,6 +41,10 @@ #include "lang.h" +#ifdef HAVE_MAS3587F +#include "recording.h" +#endif + #ifdef HAVE_LCD_BITMAP #include "bmp.h" #include "icons.h" @@ -223,6 +227,9 @@ bool main_menu(void) struct menu_items items[] = { { str(LANG_SOUND_SETTINGS), sound_menu }, { str(LANG_GENERAL_SETTINGS), settings_menu }, +#ifdef HAVE_MAS3587F + { str(LANG_RECORDING), recording_screen }, +#endif #ifdef HAVE_LCD_BITMAP #ifdef USE_GAMES { str(LANG_GAMES), games_menu }, diff --git a/apps/recorder/recording.c b/apps/recorder/recording.c new file mode 100644 index 0000000000..3ec4249f3c --- /dev/null +++ b/apps/recorder/recording.c @@ -0,0 +1,528 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2002 by Linus Nielsen Feltzing + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include "config.h" + +#include +#include + +#include "system.h" +#include "lcd.h" +#include "mpeg.h" +#include "button.h" +#include "kernel.h" +#include "settings.h" +#include "lang.h" +#include "font.h" +#include "icons.h" +#include "screens.h" +#include "peakmeter.h" +#include "status.h" +#include "menu.h" + +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; + +int mic_gain = 8; +int left_gain = 2; +int right_gain = 2; +unsigned int recording_quality = 5; +unsigned int recording_frequency = 0; +unsigned int recording_channel_mode = 0; +unsigned int recording_source = 0; + +#define SOURCE_MIC 0 +#define SOURCE_LINE 1 +#define SOURCE_SPDIF 2 + +char *freq_str[6] = +{ + "44.1kHz", + "48kHz", + "32kHz", + "22.05kHz", + "24kHz", + "16kHz" +}; + +static void set_gain(void) +{ + if(recording_source == SOURCE_MIC) + { + mpeg_set_recording_gain(left_gain, 0, mic_gain); + } + else + { + mpeg_set_recording_gain(left_gain, right_gain, 0); + } +} + +static char *fmtstr[] = +{ + "", /* no decimals */ + "%d.%d %s ", /* 1 decimal */ + "%d.%02d %s " /* 2 decimals */ +}; + +char *fmt_gain(int snd, int val, char *str, int len) +{ + int tmp, i, d, numdec; + char *unit; + + tmp = mpeg_val2phys(snd, val); + numdec = mpeg_sound_numdecimals(snd); + unit = mpeg_sound_unit(snd); + + i = tmp / (10*numdec); + d = tmp % (10*numdec); + + snprintf(str, len, fmtstr[numdec], i, d, unit); + return str; +} + +int cursor; + +void adjust_cursor(void) +{ + if(recording_source == SOURCE_LINE) + { + if(cursor < 0) + cursor = 0; + + if(cursor > 2) + cursor = 2; + } + else + { + cursor = 0; + } +} + +bool recording_screen(void) +{ + int button; + bool done = false; + char buf[32]; + char buf2[32]; + long timeout = current_tick + HZ/10; + int gain; + int w, h; + int update_countdown = 1; + + cursor = 0; + mpeg_init_recording(); + status_set_playmode(STATUS_STOP); + + peak_meter_playback(false); + + peak_meter_enabled = true; + + mpeg_set_recording_options(recording_frequency, recording_quality, + recording_source, recording_channel_mode); + + lcd_setfont(FONT_UI); + lcd_getstringsize("M", &w, &h); + lcd_setmargins(w, 8); + + while(!done) + { + button = button_get(false); + switch(button) + { + case BUTTON_OFF: + if(mpeg_status()) + { + mpeg_stop(); + status_set_playmode(STATUS_STOP); + } + else + { + peak_meter_playback(true); + peak_meter_enabled = false; + done = true; + } + update_countdown = 1; /* Update immediately */ + break; + + case BUTTON_PLAY: + mpeg_record(""); + status_set_playmode(STATUS_RECORD); + update_countdown = 1; /* Update immediately */ + break; + + case BUTTON_UP: + cursor--; + adjust_cursor(); + update_countdown = 1; /* Update immediately */ + break; + + case BUTTON_DOWN: + cursor++; + adjust_cursor(); + update_countdown = 1; /* Update immediately */ + break; + + case BUTTON_RIGHT: + switch(cursor) + { + case 0: + if(recording_source == SOURCE_MIC) + { + mic_gain++; + if(mic_gain > mpeg_sound_max(SOUND_MIC_GAIN)) + mic_gain = mpeg_sound_max(SOUND_MIC_GAIN); + } + else + { + gain = MAX(left_gain, right_gain) + 1; + if(gain > mpeg_sound_max(SOUND_MIC_GAIN)) + gain = mpeg_sound_max(SOUND_MIC_GAIN); + left_gain = gain; + right_gain = gain; + } + break; + case 1: + left_gain++; + if(left_gain > mpeg_sound_max(SOUND_LEFT_GAIN)) + left_gain = mpeg_sound_max(SOUND_LEFT_GAIN); + break; + case 2: + right_gain++; + if(right_gain > mpeg_sound_max(SOUND_RIGHT_GAIN)) + right_gain = mpeg_sound_max(SOUND_RIGHT_GAIN); + break; + } + set_gain(); + update_countdown = 1; /* Update immediately */ + break; + + case BUTTON_LEFT: + switch(cursor) + { + case 0: + if(recording_source == SOURCE_MIC) + { + mic_gain--; + if(mic_gain < mpeg_sound_min(SOUND_MIC_GAIN)) + mic_gain = mpeg_sound_min(SOUND_MIC_GAIN); + } + else + { + gain = MAX(left_gain, right_gain) - 1; + if(gain < mpeg_sound_min(SOUND_LEFT_GAIN)) + gain = mpeg_sound_min(SOUND_LEFT_GAIN); + left_gain = gain; + right_gain = gain; + } + break; + case 1: + left_gain--; + if(left_gain < mpeg_sound_min(SOUND_LEFT_GAIN)) + left_gain = mpeg_sound_min(SOUND_LEFT_GAIN); + break; + case 2: + right_gain--; + if(right_gain < mpeg_sound_min(SOUND_MIC_GAIN)) + right_gain = mpeg_sound_min(SOUND_MIC_GAIN); + break; + } + set_gain(); + update_countdown = 1; /* Update immediately */ + break; + + case BUTTON_F2: + if (f2_rec_screen()) + return SYS_USB_CONNECTED; + update_countdown = 1; /* Update immediately */ + break; + + case BUTTON_F3: + if (f3_rec_screen()) + return SYS_USB_CONNECTED; + update_countdown = 1; /* Update immediately */ + break; + + } + + peak_meter_peek(); + + if(TIME_AFTER(current_tick, timeout)) + { + timeout = current_tick + HZ/10; + + update_countdown--; + if(update_countdown == 0) + { + update_countdown = 10; + + lcd_clear_display(); + peak_meter_draw(0, 8 + h, LCD_WIDTH, h); + + /* Show mic gain if input source is Mic */ + if(recording_source == 0) + { + snprintf(buf, 32, "%s: %s", str(LANG_RECORDING_GAIN), + fmt_gain(SOUND_MIC_GAIN, mic_gain, + buf2, sizeof(buf2))); + lcd_puts(0, 3, buf); + } + else + { + if(recording_source == SOURCE_LINE) + { + gain = MAX(left_gain, right_gain); + + snprintf(buf, 32, "%s: %s", str(LANG_RECORDING_GAIN), + fmt_gain(SOUND_LEFT_GAIN, gain, + buf2, sizeof(buf2))); + lcd_puts(0, 3, buf); + + snprintf(buf, 32, "%s: %s", str(LANG_RECORDING_LEFT), + fmt_gain(SOUND_LEFT_GAIN, left_gain, + buf2, sizeof(buf2))); + lcd_puts(0, 4, buf); + + snprintf(buf, 32, "%s: %s", str(LANG_RECORDING_RIGHT), + fmt_gain(SOUND_RIGHT_GAIN, right_gain, + buf2, sizeof(buf2))); + lcd_puts(0, 5, buf); + } + } + + status_draw(); + + if(recording_source != SOURCE_SPDIF) + put_cursorxy(0, 3 + cursor, true); + + snprintf(buf, 32, "%s %s [%d]", + freq_str[recording_frequency], + recording_channel_mode? + str(LANG_CHANNEL_MONO):str(LANG_CHANNEL_STEREO), + recording_quality); + lcd_puts(0, 6, buf); + } + else + { + lcd_clearrect(0, 8 + h, LCD_WIDTH, h); + peak_meter_draw(0, 8 + h, LCD_WIDTH, h); + lcd_update_rect(0, 8 + h, LCD_WIDTH, h); + } + lcd_update(); + } + } + + mpeg_init_playback(); + + return false; +} + +bool f2_rec_screen(void) +{ + bool exit = false; + bool used = false; + int w, h; + char buf[32]; + + lcd_setfont(FONT_SYSFIXED); + lcd_getstringsize("A",&w,&h); + lcd_stop_scroll(); + + while (!exit) { + char* ptr=NULL; + + lcd_clear_display(); + + /* Recording quality */ + lcd_putsxy(0, LCD_HEIGHT/2 - h*2, str(LANG_RECORDING_QUALITY)); + snprintf(buf, 32, "%d", recording_quality); + lcd_putsxy(0, LCD_HEIGHT/2-h, buf); + lcd_bitmap(bitmap_icons_7x8[Icon_FastBackward], + LCD_WIDTH/2 - 16, LCD_HEIGHT/2 - 4, 7, 8, true); + + /* Frequency */ + snprintf(buf, sizeof buf, "%s:", str(LANG_RECORDING_FREQUENCY)); + lcd_getstringsize(buf,&w,&h); + lcd_putsxy((LCD_WIDTH-w)/2, LCD_HEIGHT - h*2, buf); + ptr = freq_str[recording_frequency]; + lcd_getstringsize(ptr, &w, &h); + lcd_putsxy((LCD_WIDTH-w)/2, LCD_HEIGHT - h, ptr); + lcd_bitmap(bitmap_icons_7x8[Icon_DownArrow], + LCD_WIDTH/2 - 3, LCD_HEIGHT - h*3, 7, 8, true); + + /* Channel mode */ + switch ( recording_channel_mode ) { + case 0: + ptr = str(LANG_CHANNEL_STEREO); + break; + + case 1: + ptr = str(LANG_CHANNEL_MONO); + break; + } + + lcd_getstringsize(str(LANG_RECORDING_CHANNEL), &w, &h); + lcd_putsxy(LCD_WIDTH - w, LCD_HEIGHT/2 - h*2, + str(LANG_RECORDING_CHANNEL)); + lcd_getstringsize(str(LANG_F2_MODE), &w, &h); + lcd_putsxy(LCD_WIDTH - w, LCD_HEIGHT/2 - h, str(LANG_F2_MODE)); + lcd_getstringsize(ptr, &w, &h); + lcd_putsxy(LCD_WIDTH - w, LCD_HEIGHT/2, ptr); + lcd_bitmap(bitmap_icons_7x8[Icon_FastForward], + LCD_WIDTH/2 + 8, LCD_HEIGHT/2 - 4, 7, 8, true); + + lcd_update(); + + switch (button_get(true)) { + case BUTTON_LEFT: + case BUTTON_F2 | BUTTON_LEFT: + recording_quality++; + if(recording_quality > 7) + recording_quality = 0; + used = true; + break; + + case BUTTON_DOWN: + case BUTTON_F2 | BUTTON_DOWN: + recording_frequency++; + if(recording_frequency > 5) + recording_frequency = 0; + used = true; + break; + + case BUTTON_RIGHT: + case BUTTON_F2 | BUTTON_RIGHT: + recording_channel_mode++; + if(recording_channel_mode > 1) + recording_channel_mode = 0; + used = true; + break; + + case BUTTON_F2 | BUTTON_REL: + if ( used ) + exit = true; + used = true; + break; + + case BUTTON_F2 | BUTTON_REPEAT: + used = true; + break; + + case SYS_USB_CONNECTED: + usb_screen(); + return true; + } + } + + mpeg_set_recording_options(recording_frequency, recording_quality, + recording_source, recording_channel_mode); + +// settings_save(); + lcd_setfont(FONT_UI); + + return false; +} + +char *src_str[] = +{ + "Mic", + "Line In", + "Digital" +}; + +bool f3_rec_screen(void) +{ + bool exit = false; + bool used = false; + int w, h; + + lcd_setfont(FONT_SYSFIXED); + lcd_getstringsize("A",&w,&h); + lcd_stop_scroll(); + + while (!exit) { + char* ptr=NULL; + + lcd_clear_display(); + + /* Recording source */ + lcd_putsxy(0, LCD_HEIGHT/2 - h*2, str(LANG_RECORDING_SOURCE)); + ptr = src_str[recording_source]; + lcd_getstringsize(ptr, &w, &h); + lcd_putsxy(0, LCD_HEIGHT/2-h, ptr); + lcd_bitmap(bitmap_icons_7x8[Icon_FastBackward], + LCD_WIDTH/2 - 16, LCD_HEIGHT/2 - 4, 7, 8, true); + + lcd_update(); + + switch (button_get(true)) { + case BUTTON_LEFT: + case BUTTON_F3 | BUTTON_LEFT: + recording_source++; + if(recording_source > 2) + recording_source = 0; + used = true; + break; + + case BUTTON_DOWN: + case BUTTON_F3 | BUTTON_DOWN: + recording_frequency++; + if(recording_frequency > 5) + recording_frequency = 0; + used = true; + break; + + case BUTTON_RIGHT: + case BUTTON_F3 | BUTTON_RIGHT: + recording_channel_mode++; + if(recording_channel_mode > 1) + recording_channel_mode = 0; + used = true; + break; + + case BUTTON_F3 | BUTTON_REL: + if ( used ) + exit = true; + used = true; + break; + + case BUTTON_F3 | BUTTON_REPEAT: + used = true; + break; + + case SYS_USB_CONNECTED: + usb_screen(); + return true; + } + } + + mpeg_set_recording_options(recording_frequency, recording_quality, + recording_source, recording_channel_mode); + +// settings_save(); + lcd_setfont(FONT_UI); + + return false; +} diff --git a/apps/recorder/recording.h b/apps/recorder/recording.h new file mode 100644 index 0000000000..4818b42b1f --- /dev/null +++ b/apps/recorder/recording.h @@ -0,0 +1,24 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2002 Linus Nielsen Feltzing + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#ifndef RECORDING_H +#define RECORDING_H + +bool recording_screen(void); + +#endif -- cgit v1.2.3