⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 recording.c

📁 编译后直接运行的MP3播放器全部C语言源代码 一个包含FAT文件系统、系统引导 Boot、FLASH Driver等内容的
💻 C
📖 第 1 页 / 共 2 页
字号:
/*************************************************************************** *             __________               __   ___. *   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 + -