/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * $Id$ * * Copyright (C) 2002 Björn Stenberg * * 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 #include #include #include #include "sprintf.h" #include "lcd.h" #include "dir.h" #include "file.h" #include "mpeg.h" #include "menu.h" #include "lang.h" #include "playlist.h" #include "button.h" #include "kernel.h" #include "keyboard.h" static char* selected_file = NULL; static bool reload_dir = false; static bool queue_file(void) { queue_add(selected_file); return false; } static bool delete_file(void) { bool exit = false; lcd_clear_display(); lcd_puts(0,0,str(LANG_REALLY_DELETE)); lcd_puts_scroll(0,1,selected_file); while (!exit) { int btn = button_get(true); switch (btn) { case BUTTON_PLAY: case BUTTON_PLAY | BUTTON_REL: if (!remove(selected_file)) { reload_dir = true; lcd_clear_display(); lcd_puts_scroll(0,0,selected_file); lcd_puts(0,1,str(LANG_DELETED)); lcd_update(); sleep(HZ); exit = true; } break; default: /* ignore button releases */ if (!(btn & BUTTON_REL)) exit = true; break; } } return false; } static bool rename_file(void) { char newname[MAX_PATH]; char* ptr = strrchr(selected_file, '/') + 1; int pathlen = (ptr - selected_file); strncpy(newname, selected_file, sizeof newname); if (!kbd_input(newname + pathlen, (sizeof newname)-pathlen)) { if (!strlen(selected_file+pathlen) || (rename(selected_file, newname) < 0)) { lcd_clear_display(); lcd_puts(0,0,str(LANG_RENAME)); lcd_puts(0,1,str(LANG_FAILED)); lcd_update(); sleep(HZ*2); } else reload_dir = true; } return false; } extern int d_1; extern int d_2; static void xingupdate(int percent) { char buf[32]; snprintf(buf, 32, "%d%%", percent); lcd_puts(0, 3, buf); snprintf(buf, 32, "%x", d_1); lcd_puts(0, 4, buf); snprintf(buf, 32, "%x", d_2); lcd_puts(0, 5, buf); lcd_update(); } static bool vbr_fix(void) { char buf[32]; unsigned long start_tick; unsigned long end_tick; lcd_clear_display(); lcd_puts(0, 0, selected_file); lcd_update(); start_tick = current_tick; mpeg_create_xing_header(selected_file, xingupdate); end_tick = current_tick; snprintf(buf, 32, "%d ticks", (int)(end_tick - start_tick)); lcd_puts(0, 1, buf); snprintf(buf, 32, "%d seconds", (int)(end_tick - start_tick)/HZ); lcd_puts(0, 2, buf); lcd_update(); return false; } int onplay(char* file, int attr) { struct menu_items menu[5]; /* increase this if you add entries! */ int m, i=0, result; selected_file = file; if (mpeg_status() & MPEG_STATUS_PLAY) menu[i++] = (struct menu_items) { str(LANG_QUEUE), queue_file }; if (!(attr & ATTR_DIRECTORY)) menu[i++] = (struct menu_items) { str(LANG_DELETE), delete_file }; menu[i++] = (struct menu_items) { str(LANG_RENAME), rename_file }; menu[i++] = (struct menu_items) { "VBRfix", vbr_fix }; /* DIY menu handling, since we want to exit after selection */ m = menu_init( menu, i ); result = menu_show(m); if (result >= 0) menu[result].function(); menu_exit(m); return reload_dir; }