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

📄 wps.c

📁 编译后直接运行的MP3播放器全部C语言源代码 一个包含FAT文件系统、系统引导 Boot、FLASH Driver等内容的
💻 C
📖 第 1 页 / 共 2 页
字号:
/*************************************************************************** *             __________               __   ___. *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  / *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  < *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \ *                     \/            \/     \/    \/            \/ * $Id: wps.c,v 1.204 2004/01/15 23:05:13 zagor Exp $ * * Copyright (C) 2002 Jerome Kuptz * * 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 <stdio.h>#include <string.h>#include <stdlib.h>#include "file.h"#include "lcd.h"#include "font.h"#include "backlight.h"#include "button.h"#include "kernel.h"#include "tree.h"#include "debug.h"#include "sprintf.h"#include "settings.h"#include "wps.h"#include "wps-display.h"#include "mpeg.h"#include "mp3_playback.h"#include "usb.h"#include "status.h"#include "main_menu.h"#include "ata.h"#include "screens.h"#include "playlist.h"#ifdef HAVE_LCD_BITMAP#include "icons.h"#include "peakmeter.h"#endif#include "lang.h"#include "bookmark.h"#define FF_REWIND_MAX_PERCENT 3 /* cap ff/rewind step size at max % of file */                                 /* 3% of 30min file == 54s step size */bool keys_locked = false;static bool ff_rewind = false;static bool paused = false;static struct mp3entry* id3 = NULL;static char current_track_path[MAX_PATH+1];#if defined(HAVE_PLAYER_KEYPAD) || defined(HAVE_NEO_KEYPAD)void player_change_volume(int button){    bool exit = false;    char buffer[32];    lcd_stop_scroll();    while (!exit)    {        switch (button)        {            case BUTTON_MENU | BUTTON_RIGHT:            case BUTTON_MENU | BUTTON_RIGHT | BUTTON_REPEAT:                global_settings.volume++;                if(global_settings.volume > mpeg_sound_max(SOUND_VOLUME))                    global_settings.volume = mpeg_sound_max(SOUND_VOLUME);                mpeg_sound_set(SOUND_VOLUME, global_settings.volume);                wps_refresh(id3, 0, WPS_REFRESH_NON_STATIC);                settings_save();                break;            case BUTTON_MENU | BUTTON_LEFT:            case BUTTON_MENU | BUTTON_LEFT | BUTTON_REPEAT:                global_settings.volume--;                if(global_settings.volume < mpeg_sound_min(SOUND_VOLUME))                    global_settings.volume = mpeg_sound_min(SOUND_VOLUME);                mpeg_sound_set(SOUND_VOLUME, global_settings.volume);                wps_refresh(id3, 0, WPS_REFRESH_NON_STATIC);                settings_save();                break;            case BUTTON_MENU | BUTTON_REL:            case BUTTON_MENU | BUTTON_LEFT | BUTTON_REL:            case BUTTON_MENU | BUTTON_RIGHT | BUTTON_REL:                exit = true;                break;        }        snprintf(buffer,sizeof(buffer),"Vol: %d %%       ",                  mpeg_val2phys(SOUND_VOLUME, global_settings.volume));#ifdef HAVE_LCD_CHARCELLS        lcd_puts(0, 0, buffer);#else        lcd_puts(2, 3, buffer);        lcd_update();#endif        status_draw(false);        if (!exit)            button = button_get(true);    }    wps_refresh(id3,0, WPS_REFRESH_ALL);}#endifvoid display_keylock_text(bool locked){    char* s;    lcd_stop_scroll();#ifdef HAVE_LCD_CHARCELLS    if(locked)        s = str(LANG_KEYLOCK_ON_PLAYER);    else        s = str(LANG_KEYLOCK_OFF_PLAYER);#else    if(locked)        s = str(LANG_KEYLOCK_ON_RECORDER);    else        s = str(LANG_KEYLOCK_OFF_RECORDER);#endif    splash(HZ, true, s);}void display_mute_text(bool muted){    lcd_clear_display();#ifdef HAVE_LCD_CHARCELLS    if (muted)        lcd_puts(0, 0, str(LANG_MUTE_ON_PLAYER));    else        lcd_puts(0, 0, str(LANG_MUTE_OFF_PLAYER));#else    if (muted)        lcd_puts(2, 3, str(LANG_MUTE_ON_RECORDER));    else        lcd_puts(2, 3, str(LANG_MUTE_OFF_RECORDER));    lcd_update();#endif        sleep(HZ);}bool browse_id3(void){    int button;    int menu_pos = 0;    int menu_max = 8;    bool exit = false;    char scroll_text[MAX_PATH];    if (!(mpeg_status() & MPEG_STATUS_PLAY))        return false;    while (!exit)    {        lcd_clear_display();        switch (menu_pos)        {            case 0:                lcd_puts(0, 0, str(LANG_ID3_TITLE));                lcd_puts_scroll(0, 1, id3->title ? id3->title :                                 (char*)str(LANG_ID3_NO_TITLE));                break;            case 1:                lcd_puts(0, 0, str(LANG_ID3_ARTIST));                lcd_puts_scroll(0, 1,                                 id3->artist ? id3->artist :                                 (char*)str(LANG_ID3_NO_ARTIST));                break;            case 2:                lcd_puts(0, 0, str(LANG_ID3_ALBUM));                lcd_puts_scroll(0, 1, id3->album ? id3->album :                                 (char*)str(LANG_ID3_NO_ALBUM));                break;            case 3:                lcd_puts(0, 0, str(LANG_ID3_TRACKNUM));                                if (id3->tracknum) {                    snprintf(scroll_text,sizeof(scroll_text), "%d",                             id3->tracknum);                    lcd_puts_scroll(0, 1, scroll_text);                }                else                    lcd_puts_scroll(0, 1, str(LANG_ID3_NO_TRACKNUM));                break;            case 4:                lcd_puts(0, 0, str(LANG_ID3_GENRE));                lcd_puts_scroll(0, 1,                                wps_get_genre(id3->genre) ?                                wps_get_genre(id3->genre) :                                (char*)str(LANG_ID3_NO_INFO));                break;            case 5:                lcd_puts(0, 0, str(LANG_ID3_YEAR));                if (id3->year) {                    snprintf(scroll_text,sizeof(scroll_text), "%d",                             id3->year);                    lcd_puts_scroll(0, 1, scroll_text);                }                else                    lcd_puts_scroll(0, 1, str(LANG_ID3_NO_INFO));                break;            case 6:                lcd_puts(0, 0, str(LANG_ID3_LENGHT));                snprintf(scroll_text,sizeof(scroll_text), "%d:%02d",                         id3->length / 60000,                         id3->length % 60000 / 1000 );                lcd_puts(0, 1, scroll_text);                break;            case 7:                lcd_puts(0, 0, str(LANG_ID3_PLAYLIST));                snprintf(scroll_text,sizeof(scroll_text), "%d/%d",                         playlist_get_display_index(), playlist_amount());                lcd_puts_scroll(0, 1, scroll_text);                break;            case 8:                lcd_puts(0, 0, str(LANG_ID3_BITRATE));                snprintf(scroll_text,sizeof(scroll_text), "%d kbps",                          id3->bitrate);                lcd_puts(0, 1, scroll_text);                break;            case 9:                lcd_puts(0, 0, str(LANG_ID3_FRECUENCY));                snprintf(scroll_text,sizeof(scroll_text), "%d Hz",                         id3->frequency);                lcd_puts(0, 1, scroll_text);                break;            case 10:                lcd_puts(0, 0, str(LANG_ID3_PATH));                lcd_puts_scroll(0, 1, id3->path);                break;        }        lcd_update();        button = button_get(true);        switch(button)        {            case BUTTON_LEFT:#ifdef HAVE_RECORDER_KEYPAD            case BUTTON_UP:#endif                if (menu_pos > 0)                    menu_pos--;                else                    menu_pos = menu_max;                break;            case BUTTON_RIGHT:#ifdef HAVE_RECORDER_KEYPAD            case BUTTON_DOWN:#endif                if (menu_pos < menu_max)                    menu_pos++;                else                    menu_pos = 0;                break;                        case BUTTON_REPEAT:                break;#ifdef BUTTON_STOP            case BUTTON_STOP:#else            case BUTTON_OFF:#endif            case BUTTON_PLAY:                lcd_stop_scroll();                /* eat release event */                button_get(true);                exit = true;                break;            case SYS_USB_CONNECTED:                 status_set_playmode(STATUS_STOP);                usb_screen();                return true;                break;        }    }    return false;}static bool ffwd_rew(int button){    static int ff_rew_steps[] = {      1000, 2000, 3000, 4000,      5000, 6000, 8000, 10000,      15000, 20000, 25000, 30000,      45000, 60000    };    unsigned int step = 0;     /* current ff/rewind step */     unsigned int max_step = 0; /* maximum ff/rewind step */     int ff_rewind_count = 0;   /* current ff/rewind count (in ticks) */    int direction = 1;         /* forward=1 or backward=-1 */    long accel_tick = 0;       /* next time at which to bump the step size */    bool exit = false;    bool usb = false;    while (!exit) {        switch ( button ) {            case BUTTON_LEFT | BUTTON_REPEAT:            case BUTTON_RIGHT | BUTTON_REPEAT:                if (ff_rewind)                {                    ff_rewind_count += step * direction;                    if (global_settings.ff_rewind_accel != 0 &&                         current_tick >= accel_tick)                    {                         step *= 2;                        if (step > max_step)                            step = max_step;                        accel_tick = current_tick +                            global_settings.ff_rewind_accel*HZ;                     }                 }                else                {                    if ( (mpeg_status() & MPEG_STATUS_PLAY) &&                          id3 && id3->length )                    {                        if (!paused)                            mpeg_pause();#ifdef HAVE_PLAYER_KEYPAD                        lcd_stop_scroll();#endif                        direction = (button & BUTTON_RIGHT) ? 1 : -1;                        if (direction > 0)                             status_set_playmode(STATUS_FASTFORWARD);                        else                        status_set_playmode(STATUS_FASTBACKWARD);                        ff_rewind = true;                        step = ff_rew_steps[global_settings.ff_rewind_min_step];                        max_step = id3->length * FF_REWIND_MAX_PERCENT / 100;                        if (step > max_step)                            step = max_step;                        ff_rewind_count = step * direction;                        accel_tick = current_tick +                            global_settings.ff_rewind_accel*HZ;                     }                    else                        break;                }                if (direction > 0) {                if ((id3->elapsed + ff_rewind_count) > id3->length)                    ff_rewind_count = id3->length - id3->elapsed;                }                else {                    if ((int)(id3->elapsed + ff_rewind_count) < 0)                        ff_rewind_count = -id3->elapsed;                }                if(wps_time_countup == false)                    wps_refresh(id3, -ff_rewind_count,                                WPS_REFRESH_PLAYER_PROGRESS |                                WPS_REFRESH_DYNAMIC);                else                    wps_refresh(id3, ff_rewind_count,                                WPS_REFRESH_PLAYER_PROGRESS |                                WPS_REFRESH_DYNAMIC);                break;            case BUTTON_LEFT | BUTTON_REL:            case BUTTON_RIGHT | BUTTON_REL:                 mpeg_ff_rewind(id3->elapsed+ff_rewind_count);                ff_rewind_count = 0;                ff_rewind = false;                if (paused)                    status_set_playmode(STATUS_PAUSE);                else {                    mpeg_resume();                    status_set_playmode(STATUS_PLAY);                }#ifdef HAVE_LCD_CHARCELLS                wps_display(id3);#endif                exit = true;                break;            case SYS_USB_CONNECTED:                status_set_playmode(STATUS_STOP);                usb_screen();                usb = true;                exit = true;                break;        }        if (!exit)            button = button_get(true);    }    /* let mpeg thread update id3->elapsed before calling wps_refresh */    yield();     wps_refresh(id3, 0, WPS_REFRESH_ALL);    return usb;}static bool update(void){    bool track_changed = mpeg_has_changed_track();    bool retcode = false;    if (track_changed)    {        lcd_stop_scroll();        id3 = mpeg_current_track();        if (wps_display(id3))            retcode = true;        else            wps_refresh(id3, 0, WPS_REFRESH_ALL);        if (id3)            memcpy(current_track_path, id3->path, sizeof(current_track_path));    }    if (id3)        wps_refresh(id3, 0, WPS_REFRESH_NON_STATIC);    status_draw(false);    /* save resume data */    if ( id3 &&         global_settings.resume &&         global_settings.resume_offset != id3->offset ) {        DEBUGF("R%X,%X (%X)\n", global_settings.resume_offset,               id3->offset,id3);         if (!playlist_get_resume_info(&global_settings.resume_index))        {            global_settings.resume_offset = id3->offset;            settings_save();        }    }    else if ( !id3 && track_changed ) {        global_settings.resume_index = -1;        global_settings.resume_offset = -1;        settings_save();    }    return retcode;}static bool menu(void){    static bool muted = false;    bool exit = false;    int last_button = 0;#ifdef HAVE_LCD_CHARCELLS    status_set_param(true);    status_draw(false);#endif    while (!exit) {        int button = button_get(true);                switch ( button ) {            /* go into menu */#ifdef HAVE_RECORDER_KEYPAD            case BUTTON_F1 | BUTTON_REL:#else            case BUTTON_MENU | BUTTON_REL:#endif                exit = true;                if ( !last_button && !keys_locked ) {                    lcd_stop_scroll();                    if (main_menu())                        return true;#ifdef HAVE_LCD_BITMAP                    if(global_settings.statusbar)                        lcd_setmargins(0, STATUSBAR_HEIGHT);                    else                        lcd_setmargins(0, 0);#endif                }                break;                /* mute */#ifdef BUTTON_MENU            case BUTTON_MENU | BUTTON_PLAY:#else            case BUTTON_F1 | BUTTON_PLAY:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -