Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 1 | /*************************************************************************** |
| 2 | * __________ __ ___. |
| 3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ |
| 4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / |
| 5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < |
| 6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ |
| 7 | * \/ \/ \/ \/ \/ |
| 8 | * $Id$ |
| 9 | * |
Kevin Ferrare | 0028b05 | 2006-07-01 10:14:27 +0000 | [diff] [blame] | 10 | * Copyright (C) 2002 Bj�n Stenberg |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 11 | * |
| 12 | * All files in this archive are subject to the GNU General Public License. |
| 13 | * See the file COPYING in the source tree root for full license agreement. |
| 14 | * |
| 15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY |
| 16 | * KIND, either express or implied. |
| 17 | * |
| 18 | ****************************************************************************/ |
| 19 | #include <stdbool.h> |
| 20 | #include <string.h> |
| 21 | #include <stdio.h> |
Daniel Stenberg | 7b24709 | 2003-07-24 10:02:45 +0000 | [diff] [blame] | 22 | #include <atoi.h> |
| 23 | #include <timefuncs.h> |
Linus Nielsen Feltzing | 0c458c0 | 2004-07-13 14:01:41 +0000 | [diff] [blame] | 24 | #include <ctype.h> |
Linus Nielsen Feltzing | a6142ab | 2004-06-10 13:29:52 +0000 | [diff] [blame] | 25 | #include "debug.h" |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 26 | #include "button.h" |
| 27 | #include "lcd.h" |
| 28 | #include "dir.h" |
| 29 | #include "file.h" |
| 30 | #include "kernel.h" |
Hristo Kovachev | 495c63f | 2006-01-25 18:29:56 +0000 | [diff] [blame] | 31 | #include "usb.h" |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 32 | #include "sprintf.h" |
Miika Pekkarinen | ef72f99 | 2005-06-14 14:36:46 +0000 | [diff] [blame] | 33 | #include "logf.h" |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 34 | #include "screens.h" |
| 35 | #include "misc.h" |
Jens Arnold | 0c09f3e | 2006-03-26 23:00:24 +0000 | [diff] [blame] | 36 | #include "i2c.h" |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 37 | #include "mas.h" |
| 38 | #include "plugin.h" |
| 39 | #include "lang.h" |
Björn Stenberg | 0ef911d | 2003-07-09 22:36:23 +0000 | [diff] [blame] | 40 | #include "keyboard.h" |
Jerome Kuptz | c7d42bb | 2003-07-20 21:29:16 +0000 | [diff] [blame] | 41 | #include "mpeg.h" |
Jörg Hohensohn | 95298a9 | 2004-01-30 22:30:40 +0000 | [diff] [blame] | 42 | #include "buffer.h" |
| 43 | #include "mp3_playback.h" |
| 44 | #include "backlight.h" |
Jörg Hohensohn | facfec0 | 2004-02-03 23:56:25 +0000 | [diff] [blame] | 45 | #include "ata.h" |
Jörg Hohensohn | 4f36ea8 | 2004-03-14 21:33:53 +0000 | [diff] [blame] | 46 | #include "talk.h" |
Linus Nielsen Feltzing | 6f4d721 | 2006-03-26 22:33:25 +0000 | [diff] [blame] | 47 | #include "sound_menu.h" |
Linus Nielsen Feltzing | a6142ab | 2004-06-10 13:29:52 +0000 | [diff] [blame] | 48 | #include "mp3data.h" |
Björn Stenberg | dd26583 | 2004-06-15 22:54:37 +0000 | [diff] [blame] | 49 | #include "powermgmt.h" |
Linus Nielsen Feltzing | 2b25e54 | 2005-02-09 14:23:35 +0000 | [diff] [blame] | 50 | #include "system.h" |
Jens Arnold | e44372e | 2005-07-26 20:01:11 +0000 | [diff] [blame] | 51 | #include "timer.h" |
Linus Nielsen Feltzing | 674eaca | 2005-04-01 13:41:03 +0000 | [diff] [blame] | 52 | #include "sound.h" |
Michiel Van Der Kolk | 9369d48 | 2005-04-28 12:33:38 +0000 | [diff] [blame] | 53 | #include "database.h" |
Kevin Ferrare | e991bee | 2005-11-16 15:12:15 +0000 | [diff] [blame] | 54 | #include "splash.h" |
Hristo Kovachev | 38deb8f | 2006-04-03 08:51:08 +0000 | [diff] [blame] | 55 | #include "list.h" |
Jens Arnold | d6c0545 | 2005-08-29 21:15:27 +0000 | [diff] [blame] | 56 | #if (CONFIG_CODEC == SWCODEC) |
Michiel Van Der Kolk | 457e138 | 2005-03-20 23:05:44 +0000 | [diff] [blame] | 57 | #include "pcm_playback.h" |
Dan Everton | d108849 | 2006-03-05 19:34:54 +0000 | [diff] [blame] | 58 | #include "dsp.h" |
Michiel Van Der Kolk | 9bc6226 | 2005-03-21 00:24:31 +0000 | [diff] [blame] | 59 | #endif |
Björn Stenberg | 0ef911d | 2003-07-09 22:36:23 +0000 | [diff] [blame] | 60 | |
Jens Arnold | 0dd1f8e | 2006-06-06 22:23:52 +0000 | [diff] [blame] | 61 | #ifdef CONFIG_CHARGING |
Hristo Kovachev | 14cfc65 | 2006-02-07 14:46:03 +0000 | [diff] [blame] | 62 | #include "power.h" |
| 63 | #endif |
| 64 | |
Björn Stenberg | 0ef911d | 2003-07-09 22:36:23 +0000 | [diff] [blame] | 65 | #ifdef HAVE_LCD_BITMAP |
Linus Nielsen Feltzing | be6c8ab | 2004-07-29 13:59:04 +0000 | [diff] [blame] | 66 | #include "peakmeter.h" |
Björn Stenberg | 0ef911d | 2003-07-09 22:36:23 +0000 | [diff] [blame] | 67 | #include "widgets.h" |
Linus Nielsen Feltzing | 250678b | 2005-04-25 07:42:10 +0000 | [diff] [blame] | 68 | #include "bmp.h" |
Antoine Cellerier | 06e6acd | 2006-07-19 19:47:34 +0000 | [diff] [blame] | 69 | #include "bidi.h" |
Björn Stenberg | 0ef911d | 2003-07-09 22:36:23 +0000 | [diff] [blame] | 70 | #endif |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 71 | |
Christian Gmeiner | c63430e | 2005-04-15 12:55:31 +0000 | [diff] [blame] | 72 | #ifdef HAVE_REMOTE_LCD |
| 73 | #include "lcd-remote.h" |
| 74 | #endif |
| 75 | |
Hardeep Sidhu | 48c2d0f | 2003-07-25 23:04:59 +0000 | [diff] [blame] | 76 | #ifdef SIMULATOR |
| 77 | static unsigned char pluginbuf[PLUGIN_BUFFER_SIZE]; |
Jens Arnold | 38b7547 | 2006-03-02 01:08:38 +0000 | [diff] [blame] | 78 | void *sim_plugin_load(char *plugin, void **pd); |
| 79 | void sim_plugin_close(void *pd); |
Jens Arnold | 6a972e0 | 2006-02-26 13:37:42 +0000 | [diff] [blame] | 80 | void sim_lcd_ex_init(int shades, unsigned long (*getpixel)(int, int)); |
| 81 | void sim_lcd_ex_update_rect(int x, int y, int width, int height); |
Hardeep Sidhu | 48c2d0f | 2003-07-25 23:04:59 +0000 | [diff] [blame] | 82 | #else |
Daniel Stenberg | 22b7701 | 2005-02-22 12:19:12 +0000 | [diff] [blame] | 83 | #define sim_plugin_close(x) |
Hardeep Sidhu | 48c2d0f | 2003-07-25 23:04:59 +0000 | [diff] [blame] | 84 | extern unsigned char pluginbuf[]; |
Jens Arnold | 4341211 | 2004-09-26 09:25:59 +0000 | [diff] [blame] | 85 | #include "bitswap.h" |
Hardeep Sidhu | 48c2d0f | 2003-07-25 23:04:59 +0000 | [diff] [blame] | 86 | #endif |
| 87 | |
Linus Nielsen Feltzing | ecf2f747 | 2005-06-22 02:47:54 +0000 | [diff] [blame] | 88 | /* for actual plugins only, not for codecs */ |
Hardeep Sidhu | 48c2d0f | 2003-07-25 23:04:59 +0000 | [diff] [blame] | 89 | static bool plugin_loaded = false; |
| 90 | static int plugin_size = 0; |
Jörg Hohensohn | 6800276 | 2004-04-30 20:37:11 +0000 | [diff] [blame] | 91 | static void (*pfn_tsr_exit)(void) = NULL; /* TSR exit callback */ |
Hardeep Sidhu | 48c2d0f | 2003-07-25 23:04:59 +0000 | [diff] [blame] | 92 | |
Jens Arnold | 398e401 | 2004-07-20 21:37:36 +0000 | [diff] [blame] | 93 | static const struct plugin_api rockbox_api = { |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 94 | |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 95 | /* lcd */ |
Jens Arnold | 04daef1 | 2005-06-24 22:33:21 +0000 | [diff] [blame] | 96 | lcd_set_contrast, |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 97 | lcd_clear_display, |
| 98 | lcd_puts, |
| 99 | lcd_puts_scroll, |
| 100 | lcd_stop_scroll, |
| 101 | #ifdef HAVE_LCD_CHARCELLS |
| 102 | lcd_define_pattern, |
Daniel Stenberg | afd7042 | 2003-07-24 09:35:32 +0000 | [diff] [blame] | 103 | lcd_get_locked_pattern, |
| 104 | lcd_unlock_pattern, |
| 105 | lcd_putc, |
Linus Nielsen Feltzing | f4f4111 | 2004-07-27 14:10:48 +0000 | [diff] [blame] | 106 | lcd_put_cursor, |
| 107 | lcd_remove_cursor, |
Daniel Stenberg | d65908f | 2005-02-22 13:02:33 +0000 | [diff] [blame] | 108 | PREFIX(lcd_icon), |
Linus Nielsen Feltzing | 60895bc | 2005-09-02 05:39:09 +0000 | [diff] [blame] | 109 | lcd_double_height, |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 110 | #else |
Jens Arnold | 04daef1 | 2005-06-24 22:33:21 +0000 | [diff] [blame] | 111 | lcd_set_drawmode, |
| 112 | lcd_get_drawmode, |
| 113 | lcd_setfont, |
| 114 | lcd_getstringsize, |
| 115 | lcd_drawpixel, |
| 116 | lcd_drawline, |
Jens Arnold | 7e11acb | 2005-06-28 23:15:47 +0000 | [diff] [blame] | 117 | lcd_hline, |
| 118 | lcd_vline, |
Jens Arnold | 04daef1 | 2005-06-24 22:33:21 +0000 | [diff] [blame] | 119 | lcd_drawrect, |
| 120 | lcd_fillrect, |
Jens Arnold | f894a4c | 2005-07-06 22:58:02 +0000 | [diff] [blame] | 121 | lcd_mono_bitmap_part, |
| 122 | lcd_mono_bitmap, |
Jens Arnold | e44372e | 2005-07-26 20:01:11 +0000 | [diff] [blame] | 123 | #if LCD_DEPTH > 1 |
| 124 | lcd_set_foreground, |
| 125 | lcd_get_foreground, |
| 126 | lcd_set_background, |
| 127 | lcd_get_background, |
| 128 | lcd_bitmap_part, |
| 129 | lcd_bitmap, |
| 130 | #endif |
Brandon Low | 413da2a | 2006-02-07 20:38:55 +0000 | [diff] [blame] | 131 | #if LCD_DEPTH == 16 |
| 132 | lcd_bitmap_transparent_part, |
| 133 | lcd_bitmap_transparent, |
| 134 | #endif |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 135 | lcd_putsxy, |
Linus Nielsen Feltzing | f4f4111 | 2004-07-27 14:10:48 +0000 | [diff] [blame] | 136 | lcd_puts_style, |
Jens Arnold | 1c841b8 | 2004-10-23 09:59:53 +0000 | [diff] [blame] | 137 | lcd_puts_scroll_style, |
Jens Arnold | 04daef1 | 2005-06-24 22:33:21 +0000 | [diff] [blame] | 138 | &lcd_framebuffer[0][0], |
| 139 | lcd_blit, |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 140 | lcd_update, |
| 141 | lcd_update_rect, |
Björn Stenberg | 0ef911d | 2003-07-09 22:36:23 +0000 | [diff] [blame] | 142 | scrollbar, |
Linus Nielsen Feltzing | f4f4111 | 2004-07-27 14:10:48 +0000 | [diff] [blame] | 143 | checkbox, |
Jens Arnold | 04daef1 | 2005-06-24 22:33:21 +0000 | [diff] [blame] | 144 | font_get, |
Jens Arnold | e44372e | 2005-07-26 20:01:11 +0000 | [diff] [blame] | 145 | font_getstringsize, |
Jens Arnold | a36b1d4 | 2006-01-15 18:20:18 +0000 | [diff] [blame] | 146 | font_get_width, |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 147 | #endif |
Linus Nielsen Feltzing | f4f4111 | 2004-07-27 14:10:48 +0000 | [diff] [blame] | 148 | backlight_on, |
| 149 | backlight_off, |
Jens Arnold | 1c841b8 | 2004-10-23 09:59:53 +0000 | [diff] [blame] | 150 | backlight_set_timeout, |
Kevin Ferrare | e991bee | 2005-11-16 15:12:15 +0000 | [diff] [blame] | 151 | gui_syncsplash, |
Christian Gmeiner | c63430e | 2005-04-15 12:55:31 +0000 | [diff] [blame] | 152 | #ifdef HAVE_REMOTE_LCD |
Jens Arnold | 4c7da88 | 2005-06-18 01:25:47 +0000 | [diff] [blame] | 153 | /* remote lcd */ |
Jens Arnold | 576908d | 2005-06-29 01:39:50 +0000 | [diff] [blame] | 154 | lcd_remote_set_contrast, |
Linus Nielsen Feltzing | 250678b | 2005-04-25 07:42:10 +0000 | [diff] [blame] | 155 | lcd_remote_clear_display, |
Christian Gmeiner | 7d98481 | 2005-04-25 23:47:51 +0000 | [diff] [blame] | 156 | lcd_remote_puts, |
| 157 | lcd_remote_puts_scroll, |
| 158 | lcd_remote_stop_scroll, |
Jens Arnold | 576908d | 2005-06-29 01:39:50 +0000 | [diff] [blame] | 159 | lcd_remote_set_drawmode, |
| 160 | lcd_remote_get_drawmode, |
| 161 | lcd_remote_setfont, |
| 162 | lcd_remote_getstringsize, |
| 163 | lcd_remote_drawpixel, |
| 164 | lcd_remote_drawline, |
| 165 | lcd_remote_hline, |
| 166 | lcd_remote_vline, |
| 167 | lcd_remote_drawrect, |
| 168 | lcd_remote_fillrect, |
Jens Arnold | d7f9439 | 2005-07-07 00:05:29 +0000 | [diff] [blame] | 169 | lcd_remote_mono_bitmap_part, |
| 170 | lcd_remote_mono_bitmap, |
Christian Gmeiner | 7d98481 | 2005-04-25 23:47:51 +0000 | [diff] [blame] | 171 | lcd_remote_putsxy, |
| 172 | lcd_remote_puts_style, |
| 173 | lcd_remote_puts_scroll_style, |
Jens Arnold | 576908d | 2005-06-29 01:39:50 +0000 | [diff] [blame] | 174 | &lcd_remote_framebuffer[0][0], |
Christian Gmeiner | 7d98481 | 2005-04-25 23:47:51 +0000 | [diff] [blame] | 175 | lcd_remote_update, |
| 176 | lcd_remote_update_rect, |
Jens Arnold | 4c7da88 | 2005-06-18 01:25:47 +0000 | [diff] [blame] | 177 | |
Jens Arnold | b51f7df | 2005-11-21 23:55:39 +0000 | [diff] [blame] | 178 | remote_backlight_on, |
| 179 | remote_backlight_off, |
Christian Gmeiner | c63430e | 2005-04-15 12:55:31 +0000 | [diff] [blame] | 180 | #endif |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 181 | /* button */ |
| 182 | button_get, |
| 183 | button_get_w_tmo, |
Linus Nielsen Feltzing | f4f4111 | 2004-07-27 14:10:48 +0000 | [diff] [blame] | 184 | button_status, |
| 185 | button_clear_queue, |
Zakk Roberts | 07fcf77 | 2006-05-01 05:45:18 +0000 | [diff] [blame] | 186 | #ifdef HAS_BUTTON_HOLD |
Jens Arnold | 4c7da88 | 2005-06-18 01:25:47 +0000 | [diff] [blame] | 187 | button_hold, |
| 188 | #endif |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 189 | |
| 190 | /* file */ |
Daniel Stenberg | b062547 | 2003-12-09 06:48:55 +0000 | [diff] [blame] | 191 | (open_func)PREFIX(open), |
Daniel Stenberg | 22b7701 | 2005-02-22 12:19:12 +0000 | [diff] [blame] | 192 | close, |
Daniel Stenberg | b062547 | 2003-12-09 06:48:55 +0000 | [diff] [blame] | 193 | (read_func)read, |
Jens Arnold | 399c081 | 2005-02-28 18:32:57 +0000 | [diff] [blame] | 194 | PREFIX(lseek), |
Daniel Stenberg | b062547 | 2003-12-09 06:48:55 +0000 | [diff] [blame] | 195 | (creat_func)PREFIX(creat), |
| 196 | (write_func)write, |
Linus Nielsen Feltzing | 80c31c9 | 2004-07-23 14:51:49 +0000 | [diff] [blame] | 197 | PREFIX(remove), |
| 198 | PREFIX(rename), |
Daniel Stenberg | 22b7701 | 2005-02-22 12:19:12 +0000 | [diff] [blame] | 199 | PREFIX(ftruncate), |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 200 | PREFIX(filesize), |
Daniel Stenberg | 22b7701 | 2005-02-22 12:19:12 +0000 | [diff] [blame] | 201 | fdprintf, |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 202 | read_line, |
Linus Nielsen Feltzing | f4f4111 | 2004-07-27 14:10:48 +0000 | [diff] [blame] | 203 | settings_parseline, |
Linus Nielsen Feltzing | 70de4ec | 2004-07-27 19:16:58 +0000 | [diff] [blame] | 204 | #ifndef SIMULATOR |
| 205 | ata_sleep, |
Zakk Roberts | 07fcf77 | 2006-05-01 05:45:18 +0000 | [diff] [blame] | 206 | ata_disk_is_active, |
Linus Nielsen Feltzing | 70de4ec | 2004-07-27 19:16:58 +0000 | [diff] [blame] | 207 | #endif |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 208 | |
| 209 | /* dir */ |
| 210 | PREFIX(opendir), |
| 211 | PREFIX(closedir), |
| 212 | PREFIX(readdir), |
Jens Arnold | 4c7da88 | 2005-06-18 01:25:47 +0000 | [diff] [blame] | 213 | PREFIX(mkdir), |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 214 | |
Jens Arnold | 1c841b8 | 2004-10-23 09:59:53 +0000 | [diff] [blame] | 215 | /* kernel/ system */ |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 216 | PREFIX(sleep), |
Linus Nielsen Feltzing | f4f4111 | 2004-07-27 14:10:48 +0000 | [diff] [blame] | 217 | yield, |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 218 | ¤t_tick, |
Linus Nielsen Feltzing | f4f4111 | 2004-07-27 14:10:48 +0000 | [diff] [blame] | 219 | default_event_handler, |
Jens Arnold | 1c841b8 | 2004-10-23 09:59:53 +0000 | [diff] [blame] | 220 | default_event_handler_ex, |
Linus Nielsen Feltzing | f4f4111 | 2004-07-27 14:10:48 +0000 | [diff] [blame] | 221 | create_thread, |
| 222 | remove_thread, |
Linus Nielsen Feltzing | 70de4ec | 2004-07-27 19:16:58 +0000 | [diff] [blame] | 223 | reset_poweroff_timer, |
Jens Arnold | 1c841b8 | 2004-10-23 09:59:53 +0000 | [diff] [blame] | 224 | #ifndef SIMULATOR |
| 225 | system_memory_guard, |
Jens Arnold | 4c7da88 | 2005-06-18 01:25:47 +0000 | [diff] [blame] | 226 | &cpu_frequency, |
| 227 | #ifdef HAVE_ADJUSTABLE_CPU_FREQ |
| 228 | cpu_boost, |
| 229 | #endif |
Jens Arnold | e44372e | 2005-07-26 20:01:11 +0000 | [diff] [blame] | 230 | timer_register, |
| 231 | timer_unregister, |
| 232 | timer_set_period, |
Jens Arnold | 1c841b8 | 2004-10-23 09:59:53 +0000 | [diff] [blame] | 233 | #endif |
Brandon Low | 413da2a | 2006-02-07 20:38:55 +0000 | [diff] [blame] | 234 | queue_init, |
| 235 | queue_delete, |
| 236 | queue_post, |
| 237 | queue_wait_w_tmo, |
| 238 | usb_acknowledge, |
| 239 | #ifdef RB_PROFILE |
| 240 | profile_thread, |
| 241 | profstop, |
| 242 | profile_func_enter, |
| 243 | profile_func_exit, |
| 244 | #endif |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 245 | |
Jens Arnold | 06bc627 | 2006-03-11 09:28:49 +0000 | [diff] [blame] | 246 | #ifdef SIMULATOR |
| 247 | /* special simulator hooks */ |
| 248 | #if defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8 |
| 249 | sim_lcd_ex_init, |
| 250 | sim_lcd_ex_update_rect, |
| 251 | #endif |
| 252 | #endif |
| 253 | |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 254 | /* strings and memory */ |
| 255 | snprintf, |
| 256 | strcpy, |
Linus Nielsen Feltzing | f4f4111 | 2004-07-27 14:10:48 +0000 | [diff] [blame] | 257 | strncpy, |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 258 | strlen, |
Linus Nielsen Feltzing | a96a130 | 2004-07-13 14:14:30 +0000 | [diff] [blame] | 259 | strrchr, |
Linus Nielsen Feltzing | f4f4111 | 2004-07-27 14:10:48 +0000 | [diff] [blame] | 260 | strcmp, |
Jens Arnold | e44372e | 2005-07-26 20:01:11 +0000 | [diff] [blame] | 261 | strncmp, |
Linus Nielsen Feltzing | f4f4111 | 2004-07-27 14:10:48 +0000 | [diff] [blame] | 262 | strcasecmp, |
Jens Arnold | 1c841b8 | 2004-10-23 09:59:53 +0000 | [diff] [blame] | 263 | strncasecmp, |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 264 | memset, |
| 265 | memcpy, |
Brandon Low | 413da2a | 2006-02-07 20:38:55 +0000 | [diff] [blame] | 266 | memmove, |
Linus Nielsen Feltzing | 0c458c0 | 2004-07-13 14:01:41 +0000 | [diff] [blame] | 267 | _ctype_, |
Linus Nielsen Feltzing | 70de4ec | 2004-07-27 19:16:58 +0000 | [diff] [blame] | 268 | atoi, |
Daniel Stenberg | 22b7701 | 2005-02-22 12:19:12 +0000 | [diff] [blame] | 269 | strchr, |
| 270 | strcat, |
| 271 | memcmp, |
Jens Arnold | 4c7da88 | 2005-06-18 01:25:47 +0000 | [diff] [blame] | 272 | strcasestr, |
Jens Arnold | a36b1d4 | 2006-01-15 18:20:18 +0000 | [diff] [blame] | 273 | /* unicode stuff */ |
| 274 | utf8decode, |
| 275 | iso_decode, |
| 276 | utf16LEdecode, |
| 277 | utf16BEdecode, |
| 278 | utf8encode, |
| 279 | utf8length, |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 280 | |
| 281 | /* sound */ |
Linus Nielsen Feltzing | 674eaca | 2005-04-01 13:41:03 +0000 | [diff] [blame] | 282 | sound_set, |
Jens Arnold | a36b1d4 | 2006-01-15 18:20:18 +0000 | [diff] [blame] | 283 | sound_min, |
| 284 | sound_max, |
Jörg Hohensohn | 95298a9 | 2004-01-30 22:30:40 +0000 | [diff] [blame] | 285 | #ifndef SIMULATOR |
Jörg Hohensohn | 95298a9 | 2004-01-30 22:30:40 +0000 | [diff] [blame] | 286 | mp3_play_data, |
| 287 | mp3_play_pause, |
| 288 | mp3_play_stop, |
| 289 | mp3_is_playing, |
Jens Arnold | d6c0545 | 2005-08-29 21:15:27 +0000 | [diff] [blame] | 290 | #if CONFIG_CODEC != SWCODEC |
Jörg Hohensohn | 95298a9 | 2004-01-30 22:30:40 +0000 | [diff] [blame] | 291 | bitswap, |
Jörg Hohensohn | facfec0 | 2004-02-03 23:56:25 +0000 | [diff] [blame] | 292 | #endif |
Jens Arnold | d6c0545 | 2005-08-29 21:15:27 +0000 | [diff] [blame] | 293 | #if CONFIG_CODEC == SWCODEC |
Zakk Roberts | 07fcf77 | 2006-05-01 05:45:18 +0000 | [diff] [blame] | 294 | pcm_play_data, |
Jens Arnold | 4c7da88 | 2005-06-18 01:25:47 +0000 | [diff] [blame] | 295 | pcm_play_stop, |
| 296 | pcm_set_frequency, |
| 297 | pcm_is_playing, |
| 298 | pcm_play_pause, |
Linus Nielsen Feltzing | a12ccab | 2005-06-06 00:34:07 +0000 | [diff] [blame] | 299 | #endif |
Jens Arnold | 4c7da88 | 2005-06-18 01:25:47 +0000 | [diff] [blame] | 300 | #endif |
Jens Arnold | dae698c | 2006-03-11 09:38:12 +0000 | [diff] [blame] | 301 | #if CONFIG_CODEC == SWCODEC |
| 302 | pcm_calculate_peaks, |
| 303 | #endif |
Jens Arnold | 4c7da88 | 2005-06-18 01:25:47 +0000 | [diff] [blame] | 304 | |
Linus Nielsen Feltzing | f4f4111 | 2004-07-27 14:10:48 +0000 | [diff] [blame] | 305 | /* playback control */ |
Linus Nielsen Feltzing | 8a237a8 | 2005-04-04 12:06:29 +0000 | [diff] [blame] | 306 | PREFIX(audio_play), |
| 307 | audio_stop, |
| 308 | audio_pause, |
| 309 | audio_resume, |
| 310 | audio_next, |
| 311 | audio_prev, |
| 312 | audio_ff_rewind, |
| 313 | audio_next_track, |
Jörg Hohensohn | 92e19db | 2004-06-19 09:36:03 +0000 | [diff] [blame] | 314 | playlist_amount, |
Linus Nielsen Feltzing | 8a237a8 | 2005-04-04 12:06:29 +0000 | [diff] [blame] | 315 | audio_status, |
| 316 | audio_has_changed_track, |
| 317 | audio_current_track, |
| 318 | audio_flush_and_reload_tracks, |
| 319 | audio_get_file_pos, |
Jens Arnold | d6c0545 | 2005-08-29 21:15:27 +0000 | [diff] [blame] | 320 | #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC) |
Linus Nielsen Feltzing | 78c829f | 2005-04-25 08:21:10 +0000 | [diff] [blame] | 321 | mpeg_get_last_header, |
Linus Nielsen Feltzing | ef73c2e | 2005-04-25 08:59:19 +0000 | [diff] [blame] | 322 | #endif |
Dan Everton | 7699255 | 2006-03-05 19:46:33 +0000 | [diff] [blame] | 323 | #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) || \ |
| 324 | (CONFIG_CODEC == SWCODEC) |
Linus Nielsen Feltzing | 674eaca | 2005-04-01 13:41:03 +0000 | [diff] [blame] | 325 | sound_set_pitch, |
Dan Everton | 7699255 | 2006-03-05 19:46:33 +0000 | [diff] [blame] | 326 | #endif |
Linus Nielsen Feltzing | f4f4111 | 2004-07-27 14:10:48 +0000 | [diff] [blame] | 327 | |
Jens Arnold | d6c0545 | 2005-08-29 21:15:27 +0000 | [diff] [blame] | 328 | #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC) |
Linus Nielsen Feltzing | 70de4ec | 2004-07-27 19:16:58 +0000 | [diff] [blame] | 329 | /* MAS communication */ |
Linus Nielsen Feltzing | 8fc5b78 | 2004-06-10 13:48:53 +0000 | [diff] [blame] | 330 | mas_readmem, |
| 331 | mas_writemem, |
| 332 | mas_readreg, |
| 333 | mas_writereg, |
Jens Arnold | d6c0545 | 2005-08-29 21:15:27 +0000 | [diff] [blame] | 334 | #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) |
Linus Nielsen Feltzing | 8fc5b78 | 2004-06-10 13:48:53 +0000 | [diff] [blame] | 335 | mas_codec_writereg, |
Linus Nielsen Feltzing | 70de4ec | 2004-07-27 19:16:58 +0000 | [diff] [blame] | 336 | mas_codec_readreg, |
Linus Nielsen Feltzing | 8fc5b78 | 2004-06-10 13:48:53 +0000 | [diff] [blame] | 337 | #endif |
Jens Arnold | d6c0545 | 2005-08-29 21:15:27 +0000 | [diff] [blame] | 338 | #endif /* !SIMULATOR && CONFIG_CODEC != SWCODEC */ |
Linus Nielsen Feltzing | 70de4ec | 2004-07-27 19:16:58 +0000 | [diff] [blame] | 339 | |
Jens Arnold | a36b1d4 | 2006-01-15 18:20:18 +0000 | [diff] [blame] | 340 | /* menu */ |
| 341 | menu_init, |
| 342 | menu_exit, |
| 343 | menu_show, |
| 344 | menu_run, |
| 345 | menu_cursor, |
| 346 | menu_description, |
| 347 | menu_delete, |
| 348 | menu_count, |
| 349 | menu_moveup, |
| 350 | menu_movedown, |
| 351 | menu_draw, |
| 352 | menu_insert, |
| 353 | menu_set_cursor, |
Hristo Kovachev | f53f64a | 2006-03-21 09:36:13 +0000 | [diff] [blame] | 354 | set_option, |
Jens Arnold | a36b1d4 | 2006-01-15 18:20:18 +0000 | [diff] [blame] | 355 | |
Brandon Low | 413da2a | 2006-02-07 20:38:55 +0000 | [diff] [blame] | 356 | /* power */ |
| 357 | battery_level, |
| 358 | battery_level_safe, |
| 359 | battery_time, |
| 360 | #ifndef SIMULATOR |
Zakk Roberts | 07fcf77 | 2006-05-01 05:45:18 +0000 | [diff] [blame] | 361 | battery_voltage, |
Brandon Low | 413da2a | 2006-02-07 20:38:55 +0000 | [diff] [blame] | 362 | #endif |
Jens Arnold | 0dd1f8e | 2006-06-06 22:23:52 +0000 | [diff] [blame] | 363 | #ifdef CONFIG_CHARGING |
Brandon Low | 413da2a | 2006-02-07 20:38:55 +0000 | [diff] [blame] | 364 | charger_inserted, |
Jens Arnold | 0dd1f8e | 2006-06-06 22:23:52 +0000 | [diff] [blame] | 365 | # if CONFIG_CHARGING == CHARGING_MONITOR |
Brandon Low | 413da2a | 2006-02-07 20:38:55 +0000 | [diff] [blame] | 366 | charging_state, |
| 367 | # endif |
| 368 | #endif |
| 369 | #ifdef HAVE_USB_POWER |
| 370 | usb_powered, |
| 371 | #endif |
| 372 | |
Linus Nielsen Feltzing | 70de4ec | 2004-07-27 19:16:58 +0000 | [diff] [blame] | 373 | /* misc */ |
| 374 | srand, |
| 375 | rand, |
| 376 | (qsort_func)qsort, |
| 377 | kbd_input, |
| 378 | get_time, |
Björn Stenberg | c05b7d7 | 2004-06-16 19:35:20 +0000 | [diff] [blame] | 379 | set_time, |
Linus Nielsen Feltzing | 70de4ec | 2004-07-27 19:16:58 +0000 | [diff] [blame] | 380 | plugin_get_buffer, |
Linus Nielsen Feltzing | d34865a | 2005-04-05 11:33:58 +0000 | [diff] [blame] | 381 | plugin_get_audio_buffer, |
Linus Nielsen Feltzing | 70de4ec | 2004-07-27 19:16:58 +0000 | [diff] [blame] | 382 | plugin_tsr, |
| 383 | #if defined(DEBUG) || defined(SIMULATOR) |
| 384 | debugf, |
| 385 | #endif |
Jens Arnold | e44372e | 2005-07-26 20:01:11 +0000 | [diff] [blame] | 386 | #ifdef ROCKBOX_HAS_LOGF |
| 387 | logf, |
| 388 | #endif |
Linus Nielsen Feltzing | 70de4ec | 2004-07-27 19:16:58 +0000 | [diff] [blame] | 389 | &global_settings, |
Linus Nielsen Feltzing | 70de4ec | 2004-07-27 19:16:58 +0000 | [diff] [blame] | 390 | mp3info, |
| 391 | count_mp3_frames, |
| 392 | create_xing_header, |
Jens Arnold | 1c841b8 | 2004-10-23 09:59:53 +0000 | [diff] [blame] | 393 | find_next_frame, |
Jens Arnold | d6c0545 | 2005-08-29 21:15:27 +0000 | [diff] [blame] | 394 | #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) |
Jens Arnold | 1c841b8 | 2004-10-23 09:59:53 +0000 | [diff] [blame] | 395 | peak_meter_scale_value, |
| 396 | peak_meter_set_use_dbfs, |
| 397 | peak_meter_get_use_dbfs, |
| 398 | #endif |
Linus Nielsen Feltzing | 250678b | 2005-04-25 07:42:10 +0000 | [diff] [blame] | 399 | #ifdef HAVE_LCD_BITMAP |
| 400 | read_bmp_file, |
Jens Arnold | a36b1d4 | 2006-01-15 18:20:18 +0000 | [diff] [blame] | 401 | screen_dump_set_hook, |
Linus Nielsen Feltzing | 250678b | 2005-04-25 07:42:10 +0000 | [diff] [blame] | 402 | #endif |
Linus Nielsen Feltzing | 60895bc | 2005-09-02 05:39:09 +0000 | [diff] [blame] | 403 | show_logo, |
Jens Arnold | 06bc627 | 2006-03-11 09:28:49 +0000 | [diff] [blame] | 404 | tree_get_context, |
Jens Arnold | 4c7da88 | 2005-06-18 01:25:47 +0000 | [diff] [blame] | 405 | |
| 406 | /* new stuff at the end, sort into place next time |
| 407 | the API gets incompatible */ |
Linus Nielsen Feltzing | 6f4d721 | 2006-03-26 22:33:25 +0000 | [diff] [blame] | 408 | set_sound, |
Jens Arnold | 0c09f3e | 2006-03-26 23:00:24 +0000 | [diff] [blame] | 409 | #if ((CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)) && !defined(SIMULATOR) |
| 410 | i2c_begin, |
| 411 | i2c_end, |
| 412 | i2c_write, |
| 413 | #endif |
Dave Chapman | 47f4a45 | 2006-03-28 15:44:01 +0000 | [diff] [blame] | 414 | |
| 415 | vsnprintf, |
| 416 | memchr, |
Hristo Kovachev | 38deb8f | 2006-04-03 08:51:08 +0000 | [diff] [blame] | 417 | /* list */ |
| 418 | gui_synclist_init, |
| 419 | gui_synclist_set_nb_items, |
| 420 | gui_synclist_set_icon_callback, |
| 421 | gui_synclist_get_nb_items, |
| 422 | gui_synclist_get_sel_pos, |
| 423 | gui_synclist_draw, |
| 424 | gui_synclist_select_item, |
| 425 | gui_synclist_select_next, |
| 426 | gui_synclist_select_previous, |
| 427 | gui_synclist_select_next_page, |
| 428 | gui_synclist_select_previous_page, |
| 429 | gui_synclist_add_item, |
| 430 | gui_synclist_del_item, |
| 431 | gui_synclist_limit_scroll, |
| 432 | gui_synclist_flash, |
| 433 | #ifdef HAVE_LCD_BITMAP |
| 434 | gui_synclist_scroll_right, |
| 435 | gui_synclist_scroll_left, |
| 436 | #endif |
| 437 | gui_synclist_do_button, |
Zakk Roberts | 07fcf77 | 2006-05-01 05:45:18 +0000 | [diff] [blame] | 438 | |
| 439 | #ifdef HAVE_LCD_BITMAP |
| 440 | lcd_setmargins, |
| 441 | #endif |
Jens Arnold | 93ff949 | 2006-05-02 21:44:04 +0000 | [diff] [blame] | 442 | utf8seek, |
Antoine Cellerier | 06e6acd | 2006-07-19 19:47:34 +0000 | [diff] [blame] | 443 | |
Jens Arnold | 2343a19 | 2006-05-03 23:16:53 +0000 | [diff] [blame] | 444 | set_int, |
Hardeep Sidhu | ab3e71c | 2006-06-04 16:36:49 +0000 | [diff] [blame] | 445 | reload_directory, |
Kevin Ferrare | 0028b05 | 2006-07-01 10:14:27 +0000 | [diff] [blame] | 446 | set_bool, |
| 447 | #if NB_SCREENS == 2 |
| 448 | {&screens[SCREEN_MAIN], &screens[SCREEN_REMOTE]}, |
| 449 | #else |
| 450 | {&screens[SCREEN_MAIN]}, |
| 451 | #endif |
Antoine Cellerier | 06e6acd | 2006-07-19 19:47:34 +0000 | [diff] [blame] | 452 | #ifdef HAVE_LCD_BITMAP |
| 453 | bidi_l2v, |
| 454 | font_get_bits, |
| 455 | font_load, |
| 456 | #endif |
Jens Arnold | 05ddd9a | 2006-07-28 07:35:45 +0000 | [diff] [blame] | 457 | #if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1) |
| 458 | lcd_remote_set_foreground, |
| 459 | lcd_remote_get_foreground, |
| 460 | lcd_remote_set_background, |
| 461 | lcd_remote_get_background, |
| 462 | lcd_remote_bitmap_part, |
| 463 | lcd_remote_bitmap, |
| 464 | #endif |
Dave Chapman | c9d6656 | 2006-08-07 22:11:07 +0000 | [diff] [blame] | 465 | |
Jens Arnold | c5a309a | 2006-08-08 13:44:43 +0000 | [diff] [blame^] | 466 | #if (CONFIG_LCD == LCD_IPODCOLOR || CONFIG_LCD == LCD_IPODNANO \ |
| 467 | || CONFIG_LCD == LCD_H300) && !defined(SIMULATOR) |
Dave Chapman | c9d6656 | 2006-08-07 22:11:07 +0000 | [diff] [blame] | 468 | lcd_yuv_blit, |
| 469 | #endif |
Dan Everton | 5814551 | 2006-08-08 10:46:39 +0000 | [diff] [blame] | 470 | |
| 471 | PREFIX(rmdir), |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 472 | }; |
| 473 | |
Jens Arnold | 8fb3361 | 2004-08-18 01:09:31 +0000 | [diff] [blame] | 474 | int plugin_load(const char* plugin, void* parameter) |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 475 | { |
Jens Arnold | 38b7547 | 2006-03-02 01:08:38 +0000 | [diff] [blame] | 476 | int rc; |
Jens Arnold | a790277 | 2006-01-16 23:20:58 +0000 | [diff] [blame] | 477 | struct plugin_header *hdr; |
Jens Arnold | 38b7547 | 2006-03-02 01:08:38 +0000 | [diff] [blame] | 478 | #ifdef SIMULATOR |
| 479 | void *pd; |
| 480 | #else |
| 481 | int fd; |
Jens Arnold | a40d355 | 2006-01-17 20:39:44 +0000 | [diff] [blame] | 482 | ssize_t readsize; |
Daniel Stenberg | ca42601 | 2005-02-22 12:56:58 +0000 | [diff] [blame] | 483 | #endif |
Jörg Hohensohn | 1bad055 | 2004-05-01 15:14:09 +0000 | [diff] [blame] | 484 | #ifdef HAVE_LCD_BITMAP |
Jens Arnold | a790277 | 2006-01-16 23:20:58 +0000 | [diff] [blame] | 485 | int xm, ym; |
Jörg Hohensohn | 1bad055 | 2004-05-01 15:14:09 +0000 | [diff] [blame] | 486 | #endif |
Jens Arnold | 35e05ca | 2006-02-18 00:13:44 +0000 | [diff] [blame] | 487 | #ifdef HAVE_REMOTE_LCD |
| 488 | int rxm, rym; |
| 489 | #endif |
Dave Chapman | d9e5b67 | 2006-02-02 20:42:56 +0000 | [diff] [blame] | 490 | #ifdef HAVE_LCD_COLOR |
| 491 | fb_data* old_backdrop; |
| 492 | #endif |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 493 | |
Jörg Hohensohn | 6800276 | 2004-04-30 20:37:11 +0000 | [diff] [blame] | 494 | if (pfn_tsr_exit != NULL) /* if we have a resident old plugin: */ |
| 495 | { |
| 496 | pfn_tsr_exit(); /* force it to exit now */ |
| 497 | pfn_tsr_exit = NULL; |
Hardeep Sidhu | b060d3a | 2005-11-10 08:07:31 +0000 | [diff] [blame] | 498 | plugin_loaded = false; |
Jörg Hohensohn | 6800276 | 2004-04-30 20:37:11 +0000 | [diff] [blame] | 499 | } |
| 500 | |
Jens Arnold | 7ea4d59 | 2006-02-16 22:36:04 +0000 | [diff] [blame] | 501 | gui_syncsplash(0, true, str(LANG_WAIT)); |
| 502 | |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 503 | #ifdef SIMULATOR |
Jens Arnold | 38b7547 | 2006-03-02 01:08:38 +0000 | [diff] [blame] | 504 | hdr = sim_plugin_load((char *)plugin, &pd); |
| 505 | if (pd == NULL) { |
Jens Arnold | a790277 | 2006-01-16 23:20:58 +0000 | [diff] [blame] | 506 | gui_syncsplash(HZ*2, true, str(LANG_PLUGIN_CANT_OPEN), plugin); |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 507 | return -1; |
Jens Arnold | a790277 | 2006-01-16 23:20:58 +0000 | [diff] [blame] | 508 | } |
| 509 | if (hdr == NULL |
| 510 | || hdr->magic != PLUGIN_MAGIC |
Jens Arnold | a8c408c | 2006-01-18 08:34:32 +0000 | [diff] [blame] | 511 | || hdr->target_id != TARGET_ID) { |
Jens Arnold | 38b7547 | 2006-03-02 01:08:38 +0000 | [diff] [blame] | 512 | sim_plugin_close(pd); |
Jens Arnold | a790277 | 2006-01-16 23:20:58 +0000 | [diff] [blame] | 513 | gui_syncsplash(HZ*2, true, str(LANG_PLUGIN_WRONG_MODEL)); |
| 514 | return -1; |
| 515 | } |
| 516 | if (hdr->api_version > PLUGIN_API_VERSION |
| 517 | || hdr->api_version < PLUGIN_MIN_API_VERSION) { |
Jens Arnold | 38b7547 | 2006-03-02 01:08:38 +0000 | [diff] [blame] | 518 | sim_plugin_close(pd); |
Jens Arnold | a790277 | 2006-01-16 23:20:58 +0000 | [diff] [blame] | 519 | gui_syncsplash(HZ*2, true, str(LANG_PLUGIN_WRONG_VERSION)); |
| 520 | return -1; |
| 521 | } |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 522 | #else |
| 523 | fd = open(plugin, O_RDONLY); |
| 524 | if (fd < 0) { |
Jens Arnold | a36b1d4 | 2006-01-15 18:20:18 +0000 | [diff] [blame] | 525 | gui_syncsplash(HZ*2, true, str(LANG_PLUGIN_CANT_OPEN), plugin); |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 526 | return fd; |
| 527 | } |
Jens Arnold | a36b1d4 | 2006-01-15 18:20:18 +0000 | [diff] [blame] | 528 | |
Jens Arnold | a40d355 | 2006-01-17 20:39:44 +0000 | [diff] [blame] | 529 | readsize = read(fd, pluginbuf, PLUGIN_BUFFER_SIZE); |
| 530 | close(fd); |
| 531 | |
Jens Arnold | a8c408c | 2006-01-18 08:34:32 +0000 | [diff] [blame] | 532 | if (readsize < 0) { |
Jens Arnold | a36b1d4 | 2006-01-15 18:20:18 +0000 | [diff] [blame] | 533 | gui_syncsplash(HZ*2, true, str(LANG_READ_FAILED), plugin); |
| 534 | return -1; |
| 535 | } |
Jens Arnold | a40d355 | 2006-01-17 20:39:44 +0000 | [diff] [blame] | 536 | hdr = (struct plugin_header *)pluginbuf; |
| 537 | |
Jens Arnold | a8c408c | 2006-01-18 08:34:32 +0000 | [diff] [blame] | 538 | if ((unsigned)readsize <= sizeof(struct plugin_header) |
| 539 | || hdr->magic != PLUGIN_MAGIC |
Jens Arnold | a40d355 | 2006-01-17 20:39:44 +0000 | [diff] [blame] | 540 | || hdr->target_id != TARGET_ID |
| 541 | || hdr->load_addr != pluginbuf |
| 542 | || hdr->end_addr > pluginbuf + PLUGIN_BUFFER_SIZE) { |
Jens Arnold | a36b1d4 | 2006-01-15 18:20:18 +0000 | [diff] [blame] | 543 | gui_syncsplash(HZ*2, true, str(LANG_PLUGIN_WRONG_MODEL)); |
| 544 | return -1; |
| 545 | } |
Jens Arnold | a40d355 | 2006-01-17 20:39:44 +0000 | [diff] [blame] | 546 | if (hdr->api_version > PLUGIN_API_VERSION |
| 547 | || hdr->api_version < PLUGIN_MIN_API_VERSION) { |
Jens Arnold | a36b1d4 | 2006-01-15 18:20:18 +0000 | [diff] [blame] | 548 | gui_syncsplash(HZ*2, true, str(LANG_PLUGIN_WRONG_VERSION)); |
| 549 | return -1; |
| 550 | } |
Jens Arnold | a40d355 | 2006-01-17 20:39:44 +0000 | [diff] [blame] | 551 | plugin_size = hdr->end_addr - pluginbuf; |
Jens Arnold | b509ff5 | 2006-04-06 18:26:14 +0000 | [diff] [blame] | 552 | |
| 553 | /* zero out bss area only, above guards end of pluginbuf */ |
| 554 | memset(pluginbuf + readsize, 0, plugin_size - readsize); |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 555 | #endif |
| 556 | |
Hardeep Sidhu | 48c2d0f | 2003-07-25 23:04:59 +0000 | [diff] [blame] | 557 | plugin_loaded = true; |
Linus Nielsen Feltzing | 40e9e41 | 2005-02-09 14:19:14 +0000 | [diff] [blame] | 558 | |
Jens Arnold | 7ea4d59 | 2006-02-16 22:36:04 +0000 | [diff] [blame] | 559 | #ifdef HAVE_LCD_BITMAP |
| 560 | xm = lcd_getxmargin(); |
| 561 | ym = lcd_getymargin(); |
| 562 | lcd_setmargins(0,0); |
Dave Chapman | 1c39855 | 2006-02-14 00:39:11 +0000 | [diff] [blame] | 563 | #ifdef HAVE_LCD_COLOR |
| 564 | old_backdrop = lcd_get_backdrop(); |
| 565 | lcd_set_backdrop(NULL); |
Jens Arnold | 7ea4d59 | 2006-02-16 22:36:04 +0000 | [diff] [blame] | 566 | #endif |
| 567 | lcd_clear_display(); |
Dave Chapman | 1c39855 | 2006-02-14 00:39:11 +0000 | [diff] [blame] | 568 | lcd_update(); |
Jens Arnold | 7ea4d59 | 2006-02-16 22:36:04 +0000 | [diff] [blame] | 569 | #else /* !HAVE_LCD_BITMAP */ |
| 570 | lcd_clear_display(); |
Dave Chapman | 1c39855 | 2006-02-14 00:39:11 +0000 | [diff] [blame] | 571 | #endif |
| 572 | |
Jens Arnold | 35e05ca | 2006-02-18 00:13:44 +0000 | [diff] [blame] | 573 | #ifdef HAVE_REMOTE_LCD |
| 574 | rxm = lcd_remote_getxmargin(); |
| 575 | rym = lcd_remote_getymargin(); |
| 576 | lcd_remote_setmargins(0, 0); |
| 577 | lcd_remote_clear_display(); |
| 578 | lcd_remote_update(); |
| 579 | #endif |
| 580 | |
Linus Nielsen Feltzing | 40e9e41 | 2005-02-09 14:19:14 +0000 | [diff] [blame] | 581 | invalidate_icache(); |
| 582 | |
Jens Arnold | a40d355 | 2006-01-17 20:39:44 +0000 | [diff] [blame] | 583 | rc = hdr->entry_point((struct plugin_api*) &rockbox_api, parameter); |
Linus Nielsen Feltzing | a754dd8 | 2004-07-21 08:02:23 +0000 | [diff] [blame] | 584 | /* explicitly casting the pointer here to avoid touching every plugin. */ |
| 585 | |
| 586 | button_clear_queue(); |
Jens Arnold | 35e05ca | 2006-02-18 00:13:44 +0000 | [diff] [blame] | 587 | |
Jens Arnold | 04daef1 | 2005-06-24 22:33:21 +0000 | [diff] [blame] | 588 | #ifdef HAVE_LCD_BITMAP |
Jens Arnold | 34a610b | 2005-07-14 18:12:27 +0000 | [diff] [blame] | 589 | #if LCD_DEPTH > 1 |
Dave Chapman | 603f87f | 2006-02-26 02:48:05 +0000 | [diff] [blame] | 590 | #ifdef HAVE_LCD_COLOR |
Zakk Roberts | 07fcf77 | 2006-05-01 05:45:18 +0000 | [diff] [blame] | 591 | lcd_set_drawinfo(DRMODE_SOLID, global_settings.fg_color, |
Dave Chapman | 603f87f | 2006-02-26 02:48:05 +0000 | [diff] [blame] | 592 | global_settings.bg_color); |
| 593 | #else |
Jens Arnold | 5b2cba1 | 2005-11-16 21:09:23 +0000 | [diff] [blame] | 594 | lcd_set_drawinfo(DRMODE_SOLID, LCD_DEFAULT_FG, LCD_DEFAULT_BG); |
Dave Chapman | 603f87f | 2006-02-26 02:48:05 +0000 | [diff] [blame] | 595 | #endif |
Jens Arnold | b0e056b | 2005-07-19 10:33:41 +0000 | [diff] [blame] | 596 | #else /* LCD_DEPTH == 1 */ |
Jens Arnold | 04daef1 | 2005-06-24 22:33:21 +0000 | [diff] [blame] | 597 | lcd_set_drawmode(DRMODE_SOLID); |
Jens Arnold | b0e056b | 2005-07-19 10:33:41 +0000 | [diff] [blame] | 598 | #endif /* LCD_DEPTH */ |
Jens Arnold | a790277 | 2006-01-16 23:20:58 +0000 | [diff] [blame] | 599 | /* restore margins */ |
| 600 | lcd_setmargins(xm,ym); |
Dave Chapman | d9e5b67 | 2006-02-02 20:42:56 +0000 | [diff] [blame] | 601 | #ifdef HAVE_LCD_COLOR |
| 602 | lcd_set_backdrop(old_backdrop); |
| 603 | #endif |
Jens Arnold | 7ea4d59 | 2006-02-16 22:36:04 +0000 | [diff] [blame] | 604 | lcd_clear_display(); |
| 605 | lcd_update(); |
| 606 | #endif /* HAVE_LCD_BITMAP */ |
Jens Arnold | 35e05ca | 2006-02-18 00:13:44 +0000 | [diff] [blame] | 607 | |
| 608 | #ifdef HAVE_REMOTE_LCD |
| 609 | lcd_remote_set_drawmode(DRMODE_SOLID); |
| 610 | lcd_remote_setmargins(rxm, rym); |
| 611 | lcd_remote_clear_display(); |
| 612 | lcd_remote_update(); |
| 613 | #endif |
| 614 | |
Hardeep Sidhu | b060d3a | 2005-11-10 08:07:31 +0000 | [diff] [blame] | 615 | if (pfn_tsr_exit == NULL) |
| 616 | plugin_loaded = false; |
Hardeep Sidhu | 48c2d0f | 2003-07-25 23:04:59 +0000 | [diff] [blame] | 617 | |
Jens Arnold | 38b7547 | 2006-03-02 01:08:38 +0000 | [diff] [blame] | 618 | sim_plugin_close(pd); |
Jens Arnold | a790277 | 2006-01-16 23:20:58 +0000 | [diff] [blame] | 619 | |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 620 | switch (rc) { |
| 621 | case PLUGIN_OK: |
| 622 | break; |
| 623 | |
| 624 | case PLUGIN_USB_CONNECTED: |
| 625 | return PLUGIN_USB_CONNECTED; |
| 626 | |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 627 | default: |
Kevin Ferrare | e991bee | 2005-11-16 15:12:15 +0000 | [diff] [blame] | 628 | gui_syncsplash(HZ*2, true, str(LANG_PLUGIN_ERROR)); |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 629 | break; |
| 630 | } |
| 631 | |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 632 | return PLUGIN_OK; |
| 633 | } |
| 634 | |
Hardeep Sidhu | 48c2d0f | 2003-07-25 23:04:59 +0000 | [diff] [blame] | 635 | /* Returns a pointer to the portion of the plugin buffer that is not already |
| 636 | being used. If no plugin is loaded, returns the entire plugin buffer */ |
| 637 | void* plugin_get_buffer(int* buffer_size) |
Björn Stenberg | ba371fb | 2003-06-29 16:33:04 +0000 | [diff] [blame] | 638 | { |
Hardeep Sidhu | 48c2d0f | 2003-07-25 23:04:59 +0000 | [diff] [blame] | 639 | int buffer_pos; |
| 640 | |
| 641 | if (plugin_loaded) |
| 642 | { |
| 643 | if (plugin_size >= PLUGIN_BUFFER_SIZE) |
| 644 | return NULL; |
Zakk Roberts | 07fcf77 | 2006-05-01 05:45:18 +0000 | [diff] [blame] | 645 | |
Hardeep Sidhu | 48c2d0f | 2003-07-25 23:04:59 +0000 | [diff] [blame] | 646 | *buffer_size = PLUGIN_BUFFER_SIZE-plugin_size; |
| 647 | buffer_pos = plugin_size; |
| 648 | } |
| 649 | else |
| 650 | { |
| 651 | *buffer_size = PLUGIN_BUFFER_SIZE; |
| 652 | buffer_pos = 0; |
| 653 | } |
| 654 | |
| 655 | return &pluginbuf[buffer_pos]; |
| 656 | } |
| 657 | |
Zakk Roberts | 07fcf77 | 2006-05-01 05:45:18 +0000 | [diff] [blame] | 658 | /* Returns a pointer to the mp3 buffer. |
Jörg Hohensohn | 95298a9 | 2004-01-30 22:30:40 +0000 | [diff] [blame] | 659 | Playback gets stopped, to avoid conflicts. */ |
Linus Nielsen Feltzing | d34865a | 2005-04-05 11:33:58 +0000 | [diff] [blame] | 660 | void* plugin_get_audio_buffer(int* buffer_size) |
Jörg Hohensohn | 95298a9 | 2004-01-30 22:30:40 +0000 | [diff] [blame] | 661 | { |
Linus Nielsen Feltzing | 8a237a8 | 2005-04-04 12:06:29 +0000 | [diff] [blame] | 662 | audio_stop(); |
Jörg Hohensohn | 4f36ea8 | 2004-03-14 21:33:53 +0000 | [diff] [blame] | 663 | talk_buffer_steal(); /* we use the mp3 buffer, need to tell */ |
Linus Nielsen Feltzing | d34865a | 2005-04-05 11:33:58 +0000 | [diff] [blame] | 664 | *buffer_size = audiobufend - audiobuf; |
| 665 | return audiobuf; |
Jörg Hohensohn | 95298a9 | 2004-01-30 22:30:40 +0000 | [diff] [blame] | 666 | } |
| 667 | |
Jörg Hohensohn | 6800276 | 2004-04-30 20:37:11 +0000 | [diff] [blame] | 668 | /* The plugin wants to stay resident after leaving its main function, e.g. |
Zakk Roberts | 07fcf77 | 2006-05-01 05:45:18 +0000 | [diff] [blame] | 669 | runs from timer or own thread. The callback is registered to later |
Jörg Hohensohn | 6800276 | 2004-04-30 20:37:11 +0000 | [diff] [blame] | 670 | instruct it to free its resources before a new plugin gets loaded. */ |
| 671 | void plugin_tsr(void (*exit_callback)(void)) |
| 672 | { |
| 673 | pfn_tsr_exit = exit_callback; /* remember the callback for later */ |
| 674 | } |