rockbox/apps/onplay.c

165 lines
4.2 KiB
C
Raw Normal View History

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2002 Bj<EFBFBD>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;
}