📄 recording.c
字号:
/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * $Id: recording.c,v 1.44 2004/01/21 14:58:40 linusnielsen Exp $ * * 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 <stdio.h>#include <stdbool.h>#include <stdlib.h>#include "system.h"#include "lcd.h"#include "mpeg.h"#include "mp3_playback.h"#include "mas.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"#include "sound_menu.h"#include "timefuncs.h"#include "debug.h"#include "misc.h"#include "tree.h"#include "string.h"#include "dir.h"#include "errno.h"bool f2_rec_screen(void);bool f3_rec_screen(void);#define SOURCE_MIC 0#define SOURCE_LINE 1#define SOURCE_SPDIF 2char *freq_str[6] ={ "44.1kHz", "48kHz", "32kHz", "22.05kHz", "24kHz", "16kHz"};static void set_gain(void){ if(global_settings.rec_source == SOURCE_MIC) { mpeg_set_recording_gain(global_settings.rec_mic_gain, 0, true); } else { mpeg_set_recording_gain(global_settings.rec_left_gain, global_settings.rec_right_gain, false); }}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 = abs(tmp % (10*numdec)); snprintf(str, len, fmtstr[numdec], i, d, unit); return str;}static int cursor;void adjust_cursor(void){ if(global_settings.rec_source == SOURCE_LINE) { if(cursor < 0) cursor = 0; if(cursor > 2) cursor = 2; } else { cursor = 0; }}char *rec_create_filename(char *buffer){ int fpos; struct tm *tm = get_time(); if(global_settings.rec_directory) getcwd(buffer, MAX_PATH); else strncpy(buffer, rec_base_directory, MAX_PATH); /* Append filename to path: RYYMMDD-HH.MM.SS.mp3 */ fpos = strlen(buffer); snprintf(&buffer[fpos], MAX_PATH-fpos, "/R%02d%02d%02d-%02d%02d%02d.mp3", tm->tm_year%100, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); return buffer;}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; bool have_recorded = false; unsigned int seconds; unsigned int last_seconds = 0; int hours, minutes; char path_buffer[MAX_PATH]; int rc; bool been_in_usb_mode = false; cursor = 0; mpeg_init_recording(); 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, global_settings.rec_source, global_settings.rec_channels, global_settings.rec_editable, global_settings.rec_prerecord_time); set_gain(); lcd_setfont(FONT_SYSFIXED); lcd_getstringsize("M", &w, &h); lcd_setmargins(global_settings.invert_cursor ? 0 : w, 8); /* Try to create the base directory if needed */ if(global_settings.rec_directory == 0) { rc = mkdir(rec_base_directory, 0); if(rc < 0 && errno != EEXIST) { splash(HZ * 2, true, "Can't create the %s directory. Error code %d.", rec_base_directory, rc); } else { /* If we have created the directory, we want the dir browser to be refreshed even if we haven't recorded anything */ if(errno != EEXIST) have_recorded = true; } } while(!done) { button = button_get_w_tmo(HZ / peak_meter_fps); switch(button) { case BUTTON_OFF: if(mpeg_status() & MPEG_STATUS_RECORD) { 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: /* Only act if the mpeg is stopped */ if(!(mpeg_status() & MPEG_STATUS_RECORD)) { have_recorded = true; mpeg_record(rec_create_filename(path_buffer)); status_set_playmode(STATUS_RECORD); update_countdown = 1; /* Update immediately */ } else { mpeg_new_file(rec_create_filename(path_buffer)); update_countdown = 1; /* Update immediately */ } last_seconds = 0; 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: case BUTTON_RIGHT | BUTTON_REPEAT: switch(cursor) { case 0: if(global_settings.rec_source == SOURCE_MIC) { global_settings.rec_mic_gain++; if(global_settings.rec_mic_gain > mpeg_sound_max(SOUND_MIC_GAIN)) global_settings.rec_mic_gain = mpeg_sound_max(SOUND_MIC_GAIN); } else { gain = MAX(global_settings.rec_left_gain, global_settings.rec_right_gain) + 1; if(gain > mpeg_sound_max(SOUND_MIC_GAIN)) gain = mpeg_sound_max(SOUND_MIC_GAIN); global_settings.rec_left_gain = gain; global_settings.rec_right_gain = gain; } break; case 1: global_settings.rec_left_gain++; if(global_settings.rec_left_gain > mpeg_sound_max(SOUND_LEFT_GAIN)) global_settings.rec_left_gain = mpeg_sound_max(SOUND_LEFT_GAIN); break; case 2: global_settings.rec_right_gain++; if(global_settings.rec_right_gain > mpeg_sound_max(SOUND_RIGHT_GAIN)) global_settings.rec_right_gain = mpeg_sound_max(SOUND_RIGHT_GAIN); break; } set_gain(); update_countdown = 1; /* Update immediately */ break; case BUTTON_LEFT: case BUTTON_LEFT | BUTTON_REPEAT: switch(cursor) { case 0: if(global_settings.rec_source == SOURCE_MIC) { global_settings.rec_mic_gain--; if(global_settings.rec_mic_gain < mpeg_sound_min(SOUND_MIC_GAIN)) global_settings.rec_mic_gain = mpeg_sound_min(SOUND_MIC_GAIN); } else { gain = MAX(global_settings.rec_left_gain, global_settings.rec_right_gain) - 1; if(gain < mpeg_sound_min(SOUND_LEFT_GAIN)) gain = mpeg_sound_min(SOUND_LEFT_GAIN); global_settings.rec_left_gain = gain; global_settings.rec_right_gain = gain; } break; case 1: global_settings.rec_left_gain--; if(global_settings.rec_left_gain < mpeg_sound_min(SOUND_LEFT_GAIN)) global_settings.rec_left_gain = mpeg_sound_min(SOUND_LEFT_GAIN); break; case 2: global_settings.rec_right_gain--; if(global_settings.rec_right_gain < mpeg_sound_min(SOUND_MIC_GAIN)) global_settings.rec_right_gain = mpeg_sound_min(SOUND_MIC_GAIN); break; } set_gain(); update_countdown = 1; /* Update immediately */ break; case BUTTON_F1: if (recording_menu(false)) return SYS_USB_CONNECTED; settings_save(); mpeg_set_recording_options(global_settings.rec_frequency, global_settings.rec_quality, global_settings.rec_source, global_settings.rec_channels, global_settings.rec_editable, global_settings.rec_prerecord_time); set_gain(); update_countdown = 1; /* Update immediately */ lcd_setfont(FONT_SYSFIXED); lcd_setmargins(global_settings.invert_cursor ? 0 : w, 8); break; case BUTTON_F2: if(mpeg_status() != MPEG_STATUS_RECORD) { if (f2_rec_screen()) { have_recorded = true; done = true; } else update_countdown = 1; /* Update immediately */ } break; case BUTTON_F3: if(mpeg_status() != MPEG_STATUS_RECORD) { if (f3_rec_screen()) { have_recorded = true; done = true; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -