2005-03-02 23:49:38 +00:00
|
|
|
/***************************************************************************
|
|
|
|
* __________ __ ___.
|
|
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
|
|
* \/ \/ \/ \/ \/
|
|
|
|
* $Id$
|
|
|
|
*
|
|
|
|
* Gameboy emulator based on gnuboy
|
|
|
|
*
|
2008-06-28 18:10:04 +00:00
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
2005-03-02 23:49:38 +00:00
|
|
|
*
|
|
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
|
|
* KIND, either express or implied.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
#include "plugin.h"
|
|
|
|
#include "loader.h"
|
|
|
|
#include "rockmacros.h"
|
2007-10-16 18:16:22 +00:00
|
|
|
#include "input.h"
|
|
|
|
#include "emu.h"
|
|
|
|
#include "hw.h"
|
|
|
|
#include "pcm.h"
|
2005-03-02 23:49:38 +00:00
|
|
|
|
2006-01-15 18:20:18 +00:00
|
|
|
PLUGIN_HEADER
|
2006-11-18 02:18:29 +00:00
|
|
|
PLUGIN_IRAM_DECLARE
|
2005-03-03 13:50:09 +00:00
|
|
|
|
2005-03-02 23:49:38 +00:00
|
|
|
int shut,cleanshut;
|
|
|
|
char *errormsg;
|
|
|
|
|
2006-01-20 13:05:52 +00:00
|
|
|
#define optionname "options"
|
|
|
|
|
2005-03-02 23:49:38 +00:00
|
|
|
void die(char *message, ...)
|
|
|
|
{
|
|
|
|
shut=1;
|
|
|
|
errormsg=message;
|
|
|
|
}
|
|
|
|
|
2006-06-19 02:44:50 +00:00
|
|
|
struct options options;
|
2006-06-19 01:47:45 +00:00
|
|
|
|
2005-04-05 11:33:58 +00:00
|
|
|
void *audio_bufferbase;
|
|
|
|
void *audio_bufferpointer;
|
2007-04-21 18:38:25 +00:00
|
|
|
size_t audio_buffer_free;
|
2005-03-02 23:49:38 +00:00
|
|
|
|
|
|
|
void *my_malloc(size_t size)
|
|
|
|
{
|
|
|
|
void *alloc;
|
|
|
|
|
2005-04-05 11:33:58 +00:00
|
|
|
if (size + 4 > audio_buffer_free)
|
2005-03-02 23:49:38 +00:00
|
|
|
return 0;
|
2005-04-05 11:33:58 +00:00
|
|
|
alloc = audio_bufferpointer;
|
|
|
|
audio_bufferpointer += size + 4;
|
|
|
|
audio_buffer_free -= size + 4;
|
2005-03-02 23:49:38 +00:00
|
|
|
return alloc;
|
|
|
|
}
|
|
|
|
|
2007-10-16 18:16:22 +00:00
|
|
|
static void setoptions (void)
|
2006-06-19 01:47:45 +00:00
|
|
|
{
|
2006-01-20 13:05:52 +00:00
|
|
|
int fd;
|
|
|
|
DIR* dir;
|
|
|
|
char optionsave[sizeof(savedir)+sizeof(optionname)];
|
|
|
|
|
2007-07-20 17:06:55 +00:00
|
|
|
dir=rb->opendir(savedir);
|
2006-03-23 23:49:22 +00:00
|
|
|
if(!dir)
|
2007-07-20 17:06:55 +00:00
|
|
|
rb->mkdir(savedir);
|
2006-03-23 23:49:22 +00:00
|
|
|
else
|
2007-07-20 17:06:55 +00:00
|
|
|
rb->closedir(dir);
|
2006-01-20 13:05:52 +00:00
|
|
|
|
|
|
|
snprintf(optionsave, sizeof(optionsave), "%s/%s", savedir, optionname);
|
|
|
|
|
2007-06-24 16:00:55 +00:00
|
|
|
fd = open(optionsave, O_RDONLY);
|
|
|
|
if(fd < 0) /* no options to read, set defaults */
|
|
|
|
{
|
2008-08-23 09:46:38 +00:00
|
|
|
#ifdef HAVE_TOUCHSCREEN
|
2008-04-27 15:30:19 +00:00
|
|
|
options.LEFT=BUTTON_MIDLEFT;
|
|
|
|
options.RIGHT=BUTTON_MIDRIGHT;
|
|
|
|
#else
|
2007-06-24 16:00:55 +00:00
|
|
|
options.LEFT=BUTTON_LEFT;
|
|
|
|
options.RIGHT=BUTTON_RIGHT;
|
2008-04-27 15:30:19 +00:00
|
|
|
#endif
|
2007-06-24 16:00:55 +00:00
|
|
|
|
2007-10-16 18:16:22 +00:00
|
|
|
#if CONFIG_KEYPAD == IRIVER_H100_PAD
|
2007-06-24 16:00:55 +00:00
|
|
|
options.UP=BUTTON_UP;
|
|
|
|
options.DOWN=BUTTON_DOWN;
|
|
|
|
|
|
|
|
options.A=BUTTON_ON;
|
|
|
|
options.B=BUTTON_OFF;
|
|
|
|
options.START=BUTTON_REC;
|
|
|
|
options.SELECT=BUTTON_SELECT;
|
|
|
|
options.MENU=BUTTON_MODE;
|
2006-01-20 13:05:52 +00:00
|
|
|
|
2007-10-16 18:16:22 +00:00
|
|
|
#elif CONFIG_KEYPAD == IRIVER_H300_PAD
|
2007-06-24 16:00:55 +00:00
|
|
|
options.UP=BUTTON_UP;
|
|
|
|
options.DOWN=BUTTON_DOWN;
|
|
|
|
|
|
|
|
options.A=BUTTON_REC;
|
|
|
|
options.B=BUTTON_MODE;
|
|
|
|
options.START=BUTTON_ON;
|
|
|
|
options.SELECT=BUTTON_SELECT;
|
|
|
|
options.MENU=BUTTON_OFF;
|
2006-01-20 13:05:52 +00:00
|
|
|
|
|
|
|
#elif CONFIG_KEYPAD == RECORDER_PAD
|
2007-06-24 16:00:55 +00:00
|
|
|
options.UP=BUTTON_UP;
|
|
|
|
options.DOWN=BUTTON_DOWN;
|
|
|
|
|
|
|
|
options.A=BUTTON_F1;
|
|
|
|
options.B=BUTTON_F2;
|
|
|
|
options.START=BUTTON_F3;
|
|
|
|
options.SELECT=BUTTON_PLAY;
|
|
|
|
options.MENU=BUTTON_OFF;
|
2006-01-20 13:05:52 +00:00
|
|
|
|
2006-01-20 20:59:07 +00:00
|
|
|
#elif CONFIG_KEYPAD == IPOD_4G_PAD
|
2007-06-24 16:00:55 +00:00
|
|
|
options.UP=BUTTON_MENU;
|
|
|
|
options.DOWN=BUTTON_PLAY;
|
|
|
|
|
|
|
|
options.A=BUTTON_NONE;
|
|
|
|
options.B=BUTTON_NONE;
|
|
|
|
options.START=BUTTON_SELECT;
|
|
|
|
options.SELECT=BUTTON_NONE;
|
|
|
|
options.MENU=(BUTTON_SELECT | BUTTON_REPEAT);
|
2006-01-20 20:59:07 +00:00
|
|
|
|
2006-01-20 13:05:52 +00:00
|
|
|
#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
|
2007-06-24 16:00:55 +00:00
|
|
|
options.UP=BUTTON_UP;
|
|
|
|
options.DOWN=BUTTON_DOWN;
|
|
|
|
|
|
|
|
options.A=BUTTON_PLAY;
|
|
|
|
options.B=BUTTON_EQ;
|
|
|
|
options.START=BUTTON_MODE;
|
|
|
|
options.SELECT=(BUTTON_SELECT | BUTTON_REL);
|
|
|
|
options.MENU=(BUTTON_SELECT | BUTTON_REPEAT);
|
2006-03-02 13:28:24 +00:00
|
|
|
|
|
|
|
#elif CONFIG_KEYPAD == GIGABEAT_PAD
|
2007-06-24 16:00:55 +00:00
|
|
|
options.UP=BUTTON_UP;
|
|
|
|
options.DOWN=BUTTON_DOWN;
|
|
|
|
|
|
|
|
options.A=BUTTON_VOL_UP;
|
|
|
|
options.B=BUTTON_VOL_DOWN;
|
|
|
|
options.START=BUTTON_A;
|
|
|
|
options.SELECT=BUTTON_SELECT;
|
|
|
|
options.MENU=BUTTON_MENU;
|
2007-01-15 20:40:48 +00:00
|
|
|
|
|
|
|
#elif CONFIG_KEYPAD == SANSA_E200_PAD
|
2007-06-24 16:00:55 +00:00
|
|
|
options.UP=BUTTON_UP;
|
|
|
|
options.DOWN=BUTTON_DOWN;
|
|
|
|
|
|
|
|
options.A=BUTTON_SELECT;
|
|
|
|
options.B=BUTTON_REC;
|
2008-01-10 08:08:31 +00:00
|
|
|
options.START=BUTTON_SCROLL_BACK;
|
|
|
|
options.SELECT=BUTTON_SCROLL_FWD;
|
2007-06-24 16:00:55 +00:00
|
|
|
options.MENU=BUTTON_POWER;
|
2009-01-04 23:33:15 +00:00
|
|
|
|
|
|
|
#elif CONFIG_KEYPAD == SANSA_FUZE_PAD
|
|
|
|
options.UP=BUTTON_UP;
|
|
|
|
options.DOWN=BUTTON_DOWN;
|
|
|
|
|
|
|
|
options.A=BUTTON_SELECT;
|
2009-04-10 17:28:26 +00:00
|
|
|
options.B=BUTTON_LEFT;
|
2009-01-04 23:33:15 +00:00
|
|
|
options.START=BUTTON_SCROLL_BACK;
|
|
|
|
options.SELECT=BUTTON_SCROLL_FWD;
|
2009-04-10 17:28:26 +00:00
|
|
|
options.MENU=BUTTON_HOME;
|
2009-01-04 23:33:15 +00:00
|
|
|
|
2007-10-10 21:35:49 +00:00
|
|
|
#elif CONFIG_KEYPAD == SANSA_C200_PAD
|
|
|
|
options.UP=BUTTON_UP;
|
|
|
|
options.DOWN=BUTTON_DOWN;
|
|
|
|
|
|
|
|
options.A=BUTTON_SELECT;
|
|
|
|
options.B=BUTTON_REC;
|
|
|
|
options.START=BUTTON_VOL_DOWN;
|
|
|
|
options.SELECT=BUTTON_VOL_UP;
|
|
|
|
options.MENU=BUTTON_POWER;
|
2007-06-24 16:00:55 +00:00
|
|
|
|
2007-03-16 23:02:39 +00:00
|
|
|
#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
|
2007-06-24 16:00:55 +00:00
|
|
|
options.UP=BUTTON_UP;
|
|
|
|
options.DOWN=BUTTON_DOWN;
|
|
|
|
|
|
|
|
options.A=BUTTON_PLAY;
|
|
|
|
options.B=BUTTON_REC;
|
|
|
|
options.START=BUTTON_SELECT;
|
|
|
|
options.SELECT=BUTTON_NONE;
|
|
|
|
options.MENU=BUTTON_POWER;
|
2007-11-02 05:21:34 +00:00
|
|
|
|
2007-02-06 21:41:08 +00:00
|
|
|
#elif CONFIG_KEYPAD == IRIVER_H10_PAD
|
2007-06-24 16:00:55 +00:00
|
|
|
options.UP=BUTTON_SCROLL_UP;
|
|
|
|
options.DOWN=BUTTON_SCROLL_DOWN;
|
|
|
|
|
|
|
|
options.A=BUTTON_PLAY;
|
|
|
|
options.B=BUTTON_FF;
|
|
|
|
options.START=BUTTON_REW;
|
|
|
|
options.SELECT=BUTTON_NONE;
|
|
|
|
options.MENU=BUTTON_POWER;
|
2008-09-16 08:14:31 +00:00
|
|
|
|
2007-11-02 05:21:34 +00:00
|
|
|
#elif CONFIG_KEYPAD == MROBE500_PAD
|
|
|
|
options.UP=BUTTON_RC_PLAY;
|
|
|
|
options.DOWN=BUTTON_RC_DOWN;
|
|
|
|
options.LEFT=BUTTON_RC_REW;
|
|
|
|
options.RIGHT=BUTTON_RC_FF;
|
|
|
|
|
|
|
|
options.A=BUTTON_RC_VOL_DOWN;
|
|
|
|
options.B=BUTTON_RC_VOL_UP;
|
|
|
|
options.START=BUTTON_RC_HEART;
|
|
|
|
options.SELECT=BUTTON_RC_MODE;
|
|
|
|
options.MENU=BUTTON_POWER;
|
2008-09-16 08:14:31 +00:00
|
|
|
|
2008-03-22 22:03:34 +00:00
|
|
|
#elif CONFIG_KEYPAD == COWOND2_PAD
|
2008-09-16 08:14:31 +00:00
|
|
|
options.A=BUTTON_PLUS;
|
|
|
|
options.B=BUTTON_MINUS;
|
|
|
|
options.MENU=BUTTON_MENU;
|
2008-03-22 22:03:34 +00:00
|
|
|
|
2008-05-02 00:38:11 +00:00
|
|
|
#elif CONFIG_KEYPAD == GIGABEAT_S_PAD
|
|
|
|
options.UP=BUTTON_UP;
|
|
|
|
options.DOWN=BUTTON_DOWN;
|
|
|
|
|
|
|
|
options.A=BUTTON_VOL_UP;
|
|
|
|
options.B=BUTTON_VOL_DOWN;
|
|
|
|
options.START=BUTTON_PLAY;
|
|
|
|
options.SELECT=BUTTON_SELECT;
|
|
|
|
options.MENU=BUTTON_MENU;
|
2008-12-04 21:28:56 +00:00
|
|
|
#elif CONFIG_KEYPAD == CREATIVEZVM_PAD
|
|
|
|
options.UP=BUTTON_UP;
|
|
|
|
options.DOWN=BUTTON_DOWN;
|
|
|
|
|
|
|
|
options.A=BUTTON_CUSTOM;
|
2008-12-08 09:51:42 +00:00
|
|
|
options.B=BUTTON_PLAY;
|
2008-12-04 21:28:56 +00:00
|
|
|
options.START=BUTTON_BACK;
|
2008-12-08 09:51:42 +00:00
|
|
|
options.SELECT=BUTTON_SELECT;
|
2008-12-04 21:28:56 +00:00
|
|
|
options.MENU=BUTTON_MENU;
|
2009-01-24 22:41:55 +00:00
|
|
|
|
|
|
|
#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
|
|
|
|
options.UP=BUTTON_UP;
|
|
|
|
options.DOWN=BUTTON_DOWN;
|
|
|
|
|
|
|
|
options.A=BUTTON_VOL_UP;
|
|
|
|
options.B=BUTTON_VOL_DOWN;
|
|
|
|
options.START=BUTTON_VIEW;
|
|
|
|
options.SELECT=BUTTON_SELECT;
|
|
|
|
options.MENU=BUTTON_MENU;
|
2009-04-07 23:41:44 +00:00
|
|
|
|
|
|
|
#elif CONFIG_KEYPAD == ONDAVX747_PAD
|
|
|
|
options.A=BUTTON_VOL_UP;
|
|
|
|
options.B=BUTTON_VOL_DOWN;
|
|
|
|
options.MENU=BUTTON_MENU;
|
2007-11-02 05:21:34 +00:00
|
|
|
#else
|
|
|
|
#error No Keymap Defined!
|
2006-01-20 13:05:52 +00:00
|
|
|
#endif
|
|
|
|
|
2008-08-23 09:46:38 +00:00
|
|
|
#ifdef HAVE_TOUCHSCREEN
|
2008-04-27 15:30:19 +00:00
|
|
|
options.UP=BUTTON_TOPMIDDLE;
|
|
|
|
options.DOWN=BUTTON_BOTTOMMIDDLE;
|
|
|
|
options.START=BUTTON_TOPRIGHT;
|
|
|
|
options.SELECT=BUTTON_CENTER;
|
2008-09-16 08:14:31 +00:00
|
|
|
#if CONFIG_KEYPAD != COWOND2_PAD
|
|
|
|
options.A=BUTTON_BOTTOMLEFT;
|
|
|
|
options.B=BUTTON_BOTTOMRIGHT;
|
2008-04-27 15:30:19 +00:00
|
|
|
options.MENU=BUTTON_TOPLEFT;
|
2008-09-16 08:14:31 +00:00
|
|
|
#endif
|
2008-04-27 15:30:19 +00:00
|
|
|
#endif
|
|
|
|
|
2006-01-20 13:05:52 +00:00
|
|
|
options.maxskip=4;
|
|
|
|
options.fps=0;
|
|
|
|
options.showstats=0;
|
2007-02-06 21:41:08 +00:00
|
|
|
#if (LCD_WIDTH>=160) && (LCD_HEIGHT>=144)
|
2007-10-16 18:16:22 +00:00
|
|
|
options.scaling=0;
|
2007-02-06 21:41:08 +00:00
|
|
|
#else
|
2007-10-16 18:16:22 +00:00
|
|
|
options.scaling=1;
|
2007-02-06 21:41:08 +00:00
|
|
|
#endif
|
2006-01-20 13:05:52 +00:00
|
|
|
options.sound=1;
|
2007-02-06 21:41:08 +00:00
|
|
|
options.pal=0;
|
2006-01-20 13:05:52 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
read(fd,&options, sizeof(options));
|
|
|
|
|
2006-06-19 02:44:50 +00:00
|
|
|
close(fd);
|
2006-01-20 13:05:52 +00:00
|
|
|
}
|
|
|
|
|
2007-10-16 18:16:22 +00:00
|
|
|
static void savesettings(void)
|
2006-01-20 13:05:52 +00:00
|
|
|
{
|
2007-06-24 16:00:55 +00:00
|
|
|
int fd;
|
|
|
|
char optionsave[sizeof(savedir)+sizeof(optionname)];
|
2006-01-20 13:05:52 +00:00
|
|
|
|
2007-06-24 16:00:55 +00:00
|
|
|
if(options.dirty)
|
|
|
|
{
|
|
|
|
options.dirty=0;
|
|
|
|
snprintf(optionsave, sizeof(optionsave), "%s/%s", savedir, optionname);
|
|
|
|
fd = open(optionsave, O_WRONLY|O_CREAT|O_TRUNC);
|
|
|
|
write(fd,&options, sizeof(options));
|
|
|
|
close(fd);
|
|
|
|
}
|
2006-01-20 13:05:52 +00:00
|
|
|
}
|
|
|
|
|
2007-10-16 18:16:22 +00:00
|
|
|
void doevents(void)
|
|
|
|
{
|
|
|
|
event_t ev;
|
|
|
|
int st;
|
|
|
|
|
|
|
|
ev_poll();
|
|
|
|
while (ev_getevent(&ev))
|
|
|
|
{
|
|
|
|
if (ev.type != EV_PRESS && ev.type != EV_RELEASE)
|
|
|
|
continue;
|
|
|
|
st = (ev.type != EV_RELEASE);
|
|
|
|
pad_set(ev.code, st);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-05-13 09:57:56 +00:00
|
|
|
static int gnuboy_main(const char *rom)
|
2007-10-16 18:16:22 +00:00
|
|
|
{
|
|
|
|
rb->lcd_puts(0,0,"Init video");
|
|
|
|
vid_init();
|
|
|
|
rb->lcd_puts(0,1,"Init sound");
|
|
|
|
pcm_init();
|
|
|
|
rb->lcd_puts(0,2,"Loading rom");
|
|
|
|
loader_init(rom);
|
|
|
|
if(shut)
|
|
|
|
return PLUGIN_ERROR;
|
|
|
|
rb->lcd_puts(0,3,"Emu reset");
|
|
|
|
emu_reset();
|
|
|
|
rb->lcd_puts(0,4,"Emu run");
|
|
|
|
rb->lcd_clear_display();
|
|
|
|
rb->lcd_update();
|
|
|
|
emu_run();
|
|
|
|
|
|
|
|
/* never reached */
|
|
|
|
return PLUGIN_OK;
|
|
|
|
}
|
|
|
|
|
2005-03-02 23:49:38 +00:00
|
|
|
/* this is the plugin entry point */
|
2009-01-16 10:34:40 +00:00
|
|
|
enum plugin_status plugin_start(const void* parameter)
|
2005-03-02 23:49:38 +00:00
|
|
|
{
|
2009-01-16 10:34:40 +00:00
|
|
|
PLUGIN_IRAM_INIT(rb)
|
2006-03-23 23:49:22 +00:00
|
|
|
|
|
|
|
rb->lcd_setfont(0);
|
2006-01-15 18:20:18 +00:00
|
|
|
|
2006-06-19 01:47:45 +00:00
|
|
|
rb->lcd_clear_display();
|
|
|
|
|
2006-06-19 01:57:44 +00:00
|
|
|
if (!parameter)
|
|
|
|
{
|
2007-03-16 21:56:08 +00:00
|
|
|
rb->splash(HZ*3, "Play gameboy ROM file! (.gb/.gbc)");
|
2005-03-07 21:41:10 +00:00
|
|
|
return PLUGIN_OK;
|
|
|
|
}
|
2007-04-18 07:41:31 +00:00
|
|
|
if(rb->audio_status())
|
|
|
|
{
|
|
|
|
audio_bufferbase = audio_bufferpointer
|
2007-04-21 18:38:25 +00:00
|
|
|
= rb->plugin_get_buffer(&audio_buffer_free);
|
2007-04-18 07:41:31 +00:00
|
|
|
plugbuf=true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
audio_bufferbase = audio_bufferpointer
|
2007-04-21 18:38:25 +00:00
|
|
|
= rb->plugin_get_audio_buffer(&audio_buffer_free);
|
2007-04-18 07:41:31 +00:00
|
|
|
plugbuf=false;
|
|
|
|
}
|
2005-06-28 21:19:40 +00:00
|
|
|
#if MEM <= 8 && !defined(SIMULATOR)
|
2006-01-16 18:51:12 +00:00
|
|
|
/* loaded as an overlay plugin, protect from overwriting ourselves */
|
|
|
|
if ((unsigned)(plugin_start_addr - (unsigned char *)audio_bufferbase)
|
2005-06-29 18:54:56 +00:00
|
|
|
< audio_buffer_free)
|
2006-01-16 18:51:12 +00:00
|
|
|
audio_buffer_free = plugin_start_addr - (unsigned char *)audio_bufferbase;
|
2005-06-28 21:19:40 +00:00
|
|
|
#endif
|
2006-06-19 02:44:50 +00:00
|
|
|
setoptions();
|
2006-11-18 02:18:29 +00:00
|
|
|
|
2005-03-02 23:49:38 +00:00
|
|
|
shut=0;
|
|
|
|
cleanshut=0;
|
|
|
|
|
2006-10-02 19:28:14 +00:00
|
|
|
#ifdef HAVE_WHEEL_POSITION
|
|
|
|
rb->wheel_send_events(false);
|
|
|
|
#endif
|
|
|
|
|
2005-03-02 23:49:38 +00:00
|
|
|
gnuboy_main(parameter);
|
|
|
|
|
2006-10-02 19:28:14 +00:00
|
|
|
#ifdef HAVE_WHEEL_POSITION
|
|
|
|
rb->wheel_send_events(true);
|
|
|
|
#endif
|
|
|
|
|
2006-06-19 01:57:44 +00:00
|
|
|
if(shut&&!cleanshut)
|
|
|
|
{
|
2007-03-16 21:56:08 +00:00
|
|
|
rb->splash(HZ/2, errormsg);
|
2005-03-02 23:49:38 +00:00
|
|
|
return PLUGIN_ERROR;
|
|
|
|
}
|
2007-04-18 07:41:31 +00:00
|
|
|
if(!rb->audio_status())
|
|
|
|
pcm_close();
|
2007-06-24 16:00:55 +00:00
|
|
|
rb->splash(HZ/2, "Closing Rockboy");
|
2006-01-20 13:05:52 +00:00
|
|
|
|
2006-06-19 01:57:44 +00:00
|
|
|
savesettings();
|
2005-03-02 23:49:38 +00:00
|
|
|
|
|
|
|
cleanup();
|
|
|
|
|
|
|
|
return PLUGIN_OK;
|
|
|
|
}
|