📄 wps-display.c
字号:
if (refresh_mode == WPS_REFRESH_ALL) { for (i=0; i<MAX_LINES; i++) { curr_subline[i] = SUBLINE_RESET; } }#ifdef HAVE_LCD_CHARCELLS for (i=0; i<8; i++) { if (wps_progress_pat[i]==0) wps_progress_pat[i]=lcd_get_locked_pattern(); }#endif if (!id3) { lcd_stop_scroll(); return false; } ff_rewind_count = ffwd_offset; for (i = 0; i < MAX_LINES; i++) { new_subline_refresh = false; only_one_subline = false; /* if time to advance to next sub-line */ if (TIME_AFTER(current_tick, subline_expire_time[i] - 1) || (curr_subline[i] == SUBLINE_RESET)) { /* search all sublines until the next subline with time > 0 is found or we get back to the subline we started with */ if (curr_subline[i] == SUBLINE_RESET) search_start = 0; else search_start = curr_subline[i]; for (search=0; search<MAX_SUBLINES; search++) { curr_subline[i]++; /* wrap around if beyond last defined subline or MAX_SUBLINES */ if ((!format_lines[i][curr_subline[i]]) || (curr_subline[i] == MAX_SUBLINES)) { if (curr_subline[i] == 1) only_one_subline = true; curr_subline[i] = 0; } /* if back where we started after search or only one subline is defined on the line */ if (((search > 0) && (curr_subline[i] == search_start)) || only_one_subline) { /* no other subline with a time > 0 exists */ subline_expire_time[i] = current_tick + 100 * HZ; break; } else { /* get initial time multiplier and line type flags for this subline */ format_display(buf, sizeof(buf), id3, format_lines[i][curr_subline[i]], &time_mult[i][curr_subline[i]], &line_type[i][curr_subline[i]]); /* only use this subline if subline time > 0 */ if (time_mult[i][curr_subline[i]] > 0) { new_subline_refresh = true; subline_expire_time[i] = current_tick + BASE_SUBLINE_TIME * time_mult[i][curr_subline[i]]; break; } } } } update_line = false; if ( !format_lines[i][curr_subline[i]] ) break; if ((line_type[i][curr_subline[i]] & refresh_mode) || (refresh_mode == WPS_REFRESH_ALL) || new_subline_refresh) { flags = 0; format_display(buf, sizeof(buf), id3, format_lines[i][curr_subline[i]], &time_mult[i][curr_subline[i]], &flags); line_type[i][curr_subline[i]] = flags;#ifdef HAVE_LCD_BITMAP /* progress */ if (flags & refresh_mode & WPS_REFRESH_PLAYER_PROGRESS) { int percent= id3->length? (id3->elapsed + ff_rewind_count) * 100 / id3->length:0; slidebar(0, i*h + offset + 1, LCD_WIDTH, 6, percent, Grow_Right); update_line = true; } if (flags & refresh_mode & WPS_REFRESH_PEAK_METER) { /* peak meter */ int peak_meter_y; update_line = true; peak_meter_y = i * h + offset; /* The user might decide to have the peak meter in the last line so that it is only displayed if no status bar is visible. If so we neither want do draw nor enable the peak meter. */ if (peak_meter_y + h <= LCD_HEIGHT) { /* found a line with a peak meter -> remember that we must enable it later */ enable_pm = true; peak_meter_draw(0, peak_meter_y, LCD_WIDTH, MIN(h, LCD_HEIGHT - peak_meter_y)); } }#else /* progress */ if (flags & refresh_mode & WPS_REFRESH_PLAYER_PROGRESS) { if (full_line_progressbar) draw_player_fullbar(buf, sizeof(buf), id3, ff_rewind_count); else draw_player_progress(id3, ff_rewind_count); }#endif if (flags & WPS_REFRESH_SCROLL) { /* scroll line */ if ((refresh_mode & WPS_REFRESH_SCROLL) || new_subline_refresh) { lcd_puts_scroll(0, i, buf); update_line = true; } } else if (flags & (WPS_REFRESH_DYNAMIC | WPS_REFRESH_STATIC)) { /* dynamic / static line */ if ((refresh_mode & (WPS_REFRESH_DYNAMIC|WPS_REFRESH_STATIC)) || new_subline_refresh) { update_line = true; lcd_puts(0, i, buf); } } }#ifdef HAVE_LCD_BITMAP if (update_line) { lcd_update_rect(0, i*h + offset, LCD_WIDTH, h); }#endif }#ifdef HAVE_LCD_BITMAP /* Now we know wether the peak meter is used. So we can enable / disable the peak meter thread */ peak_meter_enabled = enable_pm;#endif#ifndef SIMULATOR if (global_settings.caption_backlight && id3) { /* turn on backlight n seconds before track ends, and turn it off n seconds into the new track. n == backlight_timeout, or 5s */ int n = backlight_timeout_value[global_settings.backlight_timeout] * 1000; if ( n < 1000 ) n = 5000; /* use 5s if backlight is always on or off */ if ((id3->elapsed < 1000) || ((id3->length - id3->elapsed) < (unsigned)n)) backlight_on(); }#endif return true;}bool wps_display(struct mp3entry* id3){ lcd_clear_display(); if (!id3 && !(mpeg_status() & MPEG_STATUS_PLAY)) {#ifdef HAVE_LCD_CHARCELLS lcd_puts(0, 0, str(LANG_END_PLAYLIST_PLAYER));#else lcd_puts(0, 2, str(LANG_END_PLAYLIST_RECORDER)); lcd_update();#endif global_settings.resume_index = -1; status_set_playmode(STATUS_STOP); status_draw(true); sleep(HZ); return true; } else { if (!wps_loaded) { if ( !format_buffer[0] ) {#ifdef HAVE_LCD_BITMAP wps_format("%s%?it<%?in<%in. |>%it|%fn>\n" "%s%?ia<%ia|%?d2<%d2|(root)>>\n" "%s%?id<%id|%?d1<%d1|(root)>> %?iy<(%iy)|>\n" "\n" "%pc/%pt [%pp:%pe]\n" "%fbkBit %?fv<avg|> %?iv<(id3v%iv)|(no id3)>\n" "%pb\n" "%pm\n");#else wps_format("%s%pp/%pe: %?it<%it|%fn> - %?ia<%ia|%d2> - %?id<%id|%d1>\n" "%pc%?ps<*|/>%pt\n");#endif } } } yield(); wps_refresh(id3, 0, WPS_REFRESH_ALL); status_draw(true); lcd_update(); return false;}#ifdef HAVE_LCD_CHARCELLSstatic bool draw_player_progress(struct mp3entry* id3, int ff_rewwind_count){ char player_progressbar[7]; char binline[36]; int songpos = 0; int i,j; if (!id3) return false; memset(binline, 1, sizeof binline); memset(player_progressbar, 1, sizeof player_progressbar); if(id3->elapsed >= id3->length) songpos = 0; else { if(wps_time_countup == false) songpos = ((id3->elapsed - ff_rewwind_count) * 36) / id3->length; else songpos = ((id3->elapsed + ff_rewwind_count) * 36) / id3->length; } for (i=0; i < songpos; i++) binline[i] = 0; for (i=0; i<=6; i++) { for (j=0;j<5;j++) { player_progressbar[i] <<= 1; player_progressbar[i] += binline[i*5+j]; } } lcd_define_pattern(wps_progress_pat[0], player_progressbar); return true;}static void draw_player_fullbar(char* buf, int buf_size, struct mp3entry* id3, int ff_rewwind_count){ int i,j,lcd_char_pos; char player_progressbar[7]; char binline[36]; char numbers[12][4][3]={{{1,1,1},{1,0,1},{1,0,1},{1,1,1}},/*0*/ {{0,1,0},{1,1,0},{0,1,0},{0,1,0}},/*1*/ {{1,1,1},{0,0,1},{0,1,0},{1,1,1}},/*2*/ {{1,1,1},{0,0,1},{0,1,1},{1,1,1}},/*3*/ {{1,0,0},{1,1,0},{1,1,1},{0,1,0}},/*4*/ {{1,1,1},{1,1,0},{0,0,1},{1,1,0}},/*5*/ {{1,1,1},{1,0,0},{1,1,1},{1,1,1}},/*6*/ {{1,1,1},{0,0,1},{0,1,0},{1,0,0}},/*7*/ {{1,1,1},{1,1,1},{1,0,1},{1,1,1}},/*8*/ {{1,1,1},{1,1,1},{0,0,1},{1,1,1}},/*9*/ {{0,0,0},{0,1,0},{0,0,0},{0,1,0}},/*:*/ {{0,0,0},{0,0,0},{0,0,0},{0,0,0}}};/*<blank>*/ int songpos = 0; int digits[6]; int time; char timestr[7]; for (i=0; i < buf_size; i++) buf[i] = ' '; if(id3->elapsed >= id3->length) songpos = 55; else { if(wps_time_countup == false) songpos = ((id3->elapsed - ff_rewwind_count) * 55) / id3->length; else songpos = ((id3->elapsed + ff_rewwind_count) * 55) / id3->length; } time=(id3->elapsed + ff_rewind_count); memset(timestr, 0, sizeof(timestr)); format_time(timestr, sizeof(timestr), time); for(lcd_char_pos=0; lcd_char_pos<6; lcd_char_pos++) { digits[lcd_char_pos] = map_fullbar_char(timestr[lcd_char_pos]); } /* build the progressbar-icons */ for (lcd_char_pos=0; lcd_char_pos<6; lcd_char_pos++) { memset(binline, 0, sizeof binline); memset(player_progressbar, 0, sizeof player_progressbar); /* make the character (progressbar & digit)*/ for (i=0; i<7; i++) { for (j=0;j<5;j++) { /* make the progressbar */ if (lcd_char_pos==(songpos/5)) { /* partial */ if ((j<(songpos%5))&&(i>4)) binline[i*5+j] = 1; else binline[i*5+j] = 0; } else { if (lcd_char_pos<(songpos/5)) { /* full character */ if (i>4) binline[i*5+j] = 1; } } /* insert the digit */ if ((j<3)&&(i<4)) { if (numbers[digits[lcd_char_pos]][i][j]==1) binline[i*5+j] = 1; } } } for (i=0; i<=6; i++) { for (j=0;j<5;j++) { player_progressbar[i] <<= 1; player_progressbar[i] += binline[i*5+j]; } } lcd_define_pattern(wps_progress_pat[lcd_char_pos+1],player_progressbar); buf[lcd_char_pos]=wps_progress_pat[lcd_char_pos+1]; } /* make rest of the progressbar if necessary */ if (songpos/5>5) { /* set the characters positions that use the full 5 pixel wide bar */ for (lcd_char_pos=6; lcd_char_pos < (songpos/5); lcd_char_pos++) buf[lcd_char_pos] = 0x86; /* '_' */ /* build the partial bar character for the tail character position */ memset(binline, 0, sizeof binline); memset(player_progressbar, 0, sizeof player_progressbar); for (i=5; i<7; i++) { for (j=0;j<5;j++) { if (j<(songpos%5)) { binline[i*5+j] = 1; } } } for (i=0; i<7; i++) { for (j=0;j<5;j++) { player_progressbar[i] <<= 1; player_progressbar[i] += binline[i*5+j]; } } lcd_define_pattern(wps_progress_pat[7],player_progressbar); buf[songpos/5]=wps_progress_pat[7]; }}static char map_fullbar_char(char ascii_val){ if (ascii_val >= '0' && ascii_val <= '9') { return(ascii_val - '0'); } else if (ascii_val == ':') { return(10); } else return(11); /* anything besides a number or ':' is mapped to <blank> */}#endif/* ----------------------------------------------------------------- * vim: et sw=4 ts=8 sts=4 tw=78 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -