diff options
Diffstat (limited to 'apps/plugins/rockboy.c')
| -rw-r--r-- | apps/plugins/rockboy.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/apps/plugins/rockboy.c b/apps/plugins/rockboy.c new file mode 100644 index 0000000..4778fa8 --- /dev/null +++ b/apps/plugins/rockboy.c @@ -0,0 +1,81 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2005 Jens Arnold + * + * Overlay loader for rockboy on Archos + * + * 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 "plugin.h" + +#if MEM <= 8 && !defined(SIMULATOR) + +#define OVL_NAME "/.rockbox/viewers/rockboy.ovl" +#define OVL_DISPLAYNAME "RockBoy" + +struct plugin_api* rb; +unsigned char *mp3buf; +int mp3buf_size; + +/* this is the plugin entry point */ +enum plugin_status plugin_start(struct plugin_api* api, void* parameter) +{ + int fh, readsize; + struct { + unsigned long magic; + unsigned char *start_addr; + unsigned char *end_addr; + enum plugin_status(*entry_point)(struct plugin_api*, void*); + } header; + + /* this macro should be called as the first thing you do in the plugin. + it test that the api version and model the plugin was compiled for + matches the machine it is running on */ + TEST_PLUGIN_API(api); + rb = api; + + fh = rb->open(OVL_NAME, O_RDONLY); + if (fh < 0) + { + rb->splash(2*HZ, true, "Couldn't open " OVL_DISPLAYNAME " overlay."); + return PLUGIN_ERROR; + } + readsize = rb->read(fh, &header, sizeof(header)); + if (readsize != sizeof(header) || header.magic != 0x524f564c) + { + rb->close(fh); + rb->splash(2*HZ, true, OVL_NAME " is not a valid Rockbox overlay."); + return PLUGIN_ERROR; + } + + mp3buf = rb->plugin_get_mp3_buffer(&mp3buf_size); + if (header.start_addr < mp3buf || header.end_addr > mp3buf + mp3buf_size) + { + rb->close(fh); + rb->splash(2*HZ, true, OVL_DISPLAYNAME + " overlay doesn't fit into memory."); + return PLUGIN_ERROR; + } + rb->lseek(fh, 0, SEEK_SET); + readsize = rb->read(fh, header.start_addr, header.end_addr - header.start_addr); + rb->close(fh); + if (readsize != header.end_addr - header.start_addr) + { + rb->splash(2*HZ, true, "Error loading " OVL_DISPLAYNAME " overlay."); + return PLUGIN_ERROR; + } + return header.entry_point(api, parameter); +} +#endif |