c12936973d
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3438 a1c6a512-1295-4272-9138-f99709370657
164 lines
4.2 KiB
C
164 lines
4.2 KiB
C
/***************************************************************************
|
|
* __________ __ ___.
|
|
* 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 <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <stdbool.h>
|
|
|
|
#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;
|
|
}
|