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

📄 playlist_viewer.c

📁 编译后直接运行的MP3播放器全部C语言源代码 一个包含FAT文件系统、系统引导 Boot、FLASH Driver等内容的
💻 C
📖 第 1 页 / 共 3 页
字号:
                onplay(tracks[index].name, TREE_ATTR_MPA);                if (!viewer.playlist)                    ret = 1;                else                    ret = 0;                break;            }        }    }    menu_exit(m);    return ret;}#endif/* Menu of viewer options.  Invoked via F1(r) or Menu(p). */static bool viewer_menu(void){    int m;    bool result;    struct menu_items items[] = {        { str(LANG_SHOW_ICONS),             show_icons },        { str(LANG_SHOW_INDICES),           show_indices },        { str(LANG_TRACK_DISPLAY),          track_display },        { str(LANG_SAVE_DYNAMIC_PLAYLIST),  save_playlist },    };        m=menu_init( items, sizeof(items) / sizeof(*items) );    result = menu_run(m);    menu_exit(m);    settings_save();    return result;}/* Show icons in viewer? */static bool show_icons(void){    return set_bool(str(LANG_SHOW_ICONS),        &global_settings.playlist_viewer_icons);}/* Show indices of tracks? */static bool show_indices(void){    return set_bool(str(LANG_SHOW_INDICES),        &global_settings.playlist_viewer_indices);}/* How to display a track */static bool track_display(void){    char* names[] = {        str(LANG_DISPLAY_TRACK_NAME_ONLY),        str(LANG_DISPLAY_FULL_PATH)    };        return set_option(str(LANG_TRACK_DISPLAY),         &global_settings.playlist_viewer_track_display, INT, names, 2, NULL);}/* Save playlist to disk */static bool save_playlist(void){    char filename[MAX_PATH+1];    strncpy(filename, DEFAULT_PLAYLIST_NAME, sizeof(filename));    if (!kbd_input(filename, sizeof(filename)))    {        playlist_save(viewer.playlist, filename);                /* reload in case playlist was saved to cwd */        reload_directory();    }    return false;}/* View current playlist */bool playlist_viewer(void){    return playlist_viewer_ex(NULL);}/* Main viewer function.  Filename identifies playlist to be viewed.  If NULL,   view current playlist. */bool playlist_viewer_ex(char* filename){    bool ret = false;       /* return value */    bool exit=false;        /* exit viewer */    bool update=true;       /* update display */    bool cursor_on=true;    /* used for flashing cursor */    int old_cursor_pos;     /* last cursor position */    int button;     if (!initialize(filename, false))        goto exit;    old_cursor_pos = viewer.cursor_pos;    while (!exit)    {        int track;        /* Timeout so we can determine if play status has changed */        button = button_get_w_tmo(HZ/2);        if (!viewer.playlist && !(mpeg_status() & MPEG_STATUS_PLAY))        {            /* Play has stopped */#ifdef HAVE_LCD_CHARCELLS            splash(HZ, true, str(LANG_END_PLAYLIST_PLAYER));#else            splash(HZ, true, str(LANG_END_PLAYLIST_RECORDER));#endif            status_set_playmode(STATUS_STOP);            goto exit;        }        if (viewer.move_track != -1 || !cursor_on)        {            /* Flash cursor to identify that we are moving a track */            cursor_on = !cursor_on;#ifdef HAVE_LCD_BITMAP            if (global_settings.invert_cursor)            {                lcd_invertrect(                    MARGIN_X, MARGIN_Y+(viewer.cursor_pos*viewer.line_height),                    LCD_WIDTH, viewer.line_height);                lcd_invertscroll(LINE_X, viewer.cursor_pos);            }            else                put_cursorxy(CURSOR_X, CURSOR_Y + viewer.cursor_pos,                    cursor_on);            lcd_update_rect(                0, MARGIN_Y + (viewer.cursor_pos * viewer.line_height),                LCD_WIDTH, viewer.line_height);#else            put_cursorxy(CURSOR_X, CURSOR_Y + viewer.cursor_pos, cursor_on);            lcd_update();#endif        }        if (!viewer.playlist)            playlist_get_resume_info(&track);        else            track = -1;        if (track != viewer.current_playing_track ||            playlist_amount_ex(viewer.playlist) != viewer.num_tracks)        {            /* Playlist has changed (new track started?) */            update_first_index();            if (!update_playlist(false))                exit = true;            else                update = true;            /* Abort move on playlist change */            viewer.move_track = -1;        }        switch (button)        {#ifdef HAVE_RECORDER_KEYPAD            case BUTTON_OFF:            case BUTTON_LEFT:#else            case BUTTON_STOP:#endif                exit = true;                break;#ifdef HAVE_RECORDER_KEYPAD            case BUTTON_UP:            case BUTTON_UP | BUTTON_REPEAT:#else            case BUTTON_LEFT:            case BUTTON_LEFT | BUTTON_REPEAT:#endif                scroll_display(-1);                update = true;                break;#ifdef HAVE_RECORDER_KEYPAD            case BUTTON_DOWN:            case BUTTON_DOWN | BUTTON_REPEAT:#else            case BUTTON_RIGHT:            case BUTTON_RIGHT | BUTTON_REPEAT:#endif                scroll_display(1);                update = true;                break;#ifdef BUTTON_ON#ifdef HAVE_RECORDER_KEYPAD            case BUTTON_ON | BUTTON_UP:            case BUTTON_ON | BUTTON_UP | BUTTON_REPEAT:#else            case BUTTON_ON | BUTTON_LEFT:            case BUTTON_ON | BUTTON_LEFT | BUTTON_REPEAT:#endif                /* Pageup */                scroll_display(-viewer.num_display_lines);                update = true;                break;#ifdef HAVE_RECORDER_KEYPAD            case BUTTON_ON | BUTTON_DOWN:            case BUTTON_ON | BUTTON_DOWN | BUTTON_REPEAT:#else            case BUTTON_ON | BUTTON_RIGHT:            case BUTTON_ON | BUTTON_RIGHT | BUTTON_REPEAT:#endif                /* Pagedown */                scroll_display(viewer.num_display_lines);                update = true;                break;#endif /* BUTTON_ON */#ifdef HAVE_RECORDER_KEYPAD            case BUTTON_RIGHT:#endif            case BUTTON_PLAY:                if (viewer.move_track >= 0)                {                    /* Move track */                    int ret;                    ret = playlist_move(viewer.playlist, viewer.move_track,                        tracks[INDEX(viewer.cursor_pos)].index);                    if (ret < 0)                        splash(HZ, true, str(LANG_MOVE_FAILED));                    update_playlist(true);                    viewer.move_track = -1;                }                else if (!viewer.playlist)                {                    /* Stop current track and play new track */                    mpeg_stop();                    playlist_start(tracks[INDEX(viewer.cursor_pos)].index, 0);                    status_set_playmode(STATUS_PLAY);                    update_playlist(false);                }                else                {                    /* Play track from playlist on disk */                    mpeg_stop();                    /* New playlist */                    if (playlist_set_current(viewer.playlist) < 0)                        goto exit;                    playlist_start(tracks[INDEX(viewer.cursor_pos)].index, 0);                    status_set_playmode(STATUS_PLAY);                    /* Our playlist is now the current list */                    if (!initialize(NULL, true))                        goto exit;                }                display_playlist();                update = true;                break;#ifdef BUTTON_ON            case BUTTON_ON | BUTTON_PLAY:            {                /* ON+PLAY menu */                int ret;                ret = onplay_menu(INDEX(viewer.cursor_pos));                if (ret < 0)                {                    ret = true;                    goto exit;                }                else if (ret > 0)                {                    /* Playlist changed */                    update_first_index();                    update_playlist(false);                    if (viewer.num_tracks <= 0)                        exit = true;                }                else                    display_playlist();                update = true;                break;            }#endif /* BUTTON_ON */#ifdef HAVE_RECORDER_KEYPAD            case BUTTON_F1:#else            case BUTTON_MENU:#endif                if (viewer_menu())                {                    ret = true;                    goto exit;                }                               display_playlist();                update = true;                break;            case SYS_USB_CONNECTED:                usb_screen();                ret = true;                goto exit;                break;            case BUTTON_NONE:                status_draw(false);                break;        }        if (update && !exit)        {            lcd_stop_scroll();            if (viewer.cursor_pos >                (viewer.last_display_index - viewer.first_display_index))            {                /* Cursor position is invalid */                put_cursorxy(CURSOR_X, CURSOR_Y + viewer.cursor_pos, false);                viewer.cursor_pos =                    viewer.last_display_index - viewer.first_display_index;                put_cursorxy(CURSOR_X, CURSOR_Y + viewer.cursor_pos, true);            }            if (viewer.cursor_pos != old_cursor_pos &&                old_cursor_pos <=                    (viewer.last_display_index - viewer.first_display_index))                /* Stop scrolling previous line */                update_display_line(old_cursor_pos, false);            /* Scroll line at new cursor position */            update_display_line(viewer.cursor_pos, true);            lcd_update();            old_cursor_pos = viewer.cursor_pos;            cursor_on = true;            update = false;        }    }exit:    if (viewer.playlist)        playlist_close(viewer.playlist);    return ret;}

⌨️ 快捷键说明

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