Sim I/O and threading that runs more like on target. Tweakable if any genuine slownes...
[Rockbox.git] / apps / plugin.h
blob2580d43eb07121d5df739daf1debadc2cd41e0e6
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2002 Björn Stenberg
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.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
19 #ifndef _PLUGIN_H_
20 #define _PLUGIN_H_
22 /* instruct simulator code to not redefine any symbols when compiling plugins.
23 (the PLUGIN macro is defined in apps/plugins/Makefile) */
24 #ifdef PLUGIN
25 #define NO_REDEFINES_PLEASE
26 #endif
28 #ifndef MEM
29 #define MEM 2
30 #endif
32 #include <stdbool.h>
33 #include <sys/types.h>
34 #include <stdarg.h>
35 #include <stdio.h>
36 #include <stdlib.h>
37 #include "config.h"
38 #include "system.h"
39 #include "dir.h"
40 #include "kernel.h"
41 #include "thread.h"
42 #include "button.h"
43 #include "action.h"
44 #include "usb.h"
45 #include "font.h"
46 #include "lcd.h"
47 #include "id3.h"
48 #include "sound.h"
49 #include "mpeg.h"
50 #include "audio.h"
51 #include "mp3_playback.h"
52 #include "talk.h"
53 #ifdef RB_PROFILE
54 #include "profile.h"
55 #endif
56 #include "misc.h"
57 #if (CONFIG_CODEC == SWCODEC)
58 #include "dsp.h"
59 #include "codecs.h"
60 #include "playback.h"
61 #include "metadata.h"
62 #ifdef HAVE_RECORDING
63 #include "recording.h"
64 #endif
65 #else
66 #include "mas.h"
67 #endif /* CONFIG_CODEC == SWCODEC */
68 #include "settings.h"
69 #include "timer.h"
70 #include "playlist.h"
71 #ifdef HAVE_LCD_BITMAP
72 #include "scrollbar.h"
73 #endif
74 #include "statusbar.h"
75 #include "menu.h"
76 #include "rbunicode.h"
77 #include "list.h"
78 #include "tree.h"
79 #include "color_picker.h"
81 #ifdef HAVE_REMOTE_LCD
82 #include "lcd-remote.h"
83 #endif
85 #ifdef PLUGIN
87 #if defined(DEBUG) || defined(SIMULATOR)
88 #undef DEBUGF
89 #define DEBUGF rb->debugf
90 #undef LDEBUGF
91 #define LDEBUGF rb->debugf
92 #else
93 #define DEBUGF(...)
94 #define LDEBUGF(...)
95 #endif
97 #ifdef ROCKBOX_HAS_LOGF
98 #undef LOGF
99 #define LOGF rb->logf
100 #else
101 #define LOGF(...)
102 #endif
104 #endif
106 #ifdef SIMULATOR
107 #define PREFIX(_x_) sim_ ## _x_
108 #else
109 #define PREFIX(_x_) _x_
110 #endif
112 #define PLUGIN_MAGIC 0x526F634B /* RocK */
114 /* increase this every time the api struct changes */
115 #define PLUGIN_API_VERSION 73
117 /* update this to latest version if a change to the api struct breaks
118 backwards compatibility (and please take the opportunity to sort in any
119 new function which are "waiting" at the end of the function table) */
120 #define PLUGIN_MIN_API_VERSION 73
122 /* plugin return codes */
123 enum plugin_status {
124 PLUGIN_OK = 0,
125 PLUGIN_USB_CONNECTED,
126 PLUGIN_ERROR = -1,
129 /* NOTE: To support backwards compatibility, only add new functions at
130 the end of the structure. Every time you add a new function,
131 remember to increase PLUGIN_API_VERSION. If you make changes to the
132 existing APIs then also update PLUGIN_MIN_API_VERSION to current
133 version
135 struct plugin_api {
137 /* lcd */
138 void (*lcd_set_contrast)(int x);
139 void (*lcd_update)(void);
140 void (*lcd_clear_display)(void);
141 void (*lcd_setmargins)(int x, int y);
142 int (*lcd_getstringsize)(const unsigned char *str, int *w, int *h);
143 void (*lcd_putsxy)(int x, int y, const unsigned char *string);
144 void (*lcd_puts)(int x, int y, const unsigned char *string);
145 void (*lcd_puts_scroll)(int x, int y, const unsigned char* string);
146 void (*lcd_stop_scroll)(void);
147 #ifdef HAVE_LCD_CHARCELLS
148 void (*lcd_define_pattern)(unsigned long ucs, const char *pattern);
149 unsigned long (*lcd_get_locked_pattern)(void);
150 void (*lcd_unlock_pattern)(unsigned long ucs);
151 void (*lcd_putc)(int x, int y, unsigned long ucs);
152 void (*lcd_put_cursor)(int x, int y, unsigned long ucs);
153 void (*lcd_remove_cursor)(void);
154 void (*lcd_icon)(int icon, bool enable);
155 void (*lcd_double_height)(bool on);
156 #else
157 void (*lcd_set_drawmode)(int mode);
158 int (*lcd_get_drawmode)(void);
159 void (*lcd_setfont)(int font);
160 void (*lcd_drawpixel)(int x, int y);
161 void (*lcd_drawline)(int x1, int y1, int x2, int y2);
162 void (*lcd_hline)(int x1, int x2, int y);
163 void (*lcd_vline)(int x, int y1, int y2);
164 void (*lcd_drawrect)(int x, int y, int width, int height);
165 void (*lcd_fillrect)(int x, int y, int width, int height);
166 void (*lcd_mono_bitmap_part)(const unsigned char *src, int src_x, int src_y,
167 int stride, int x, int y, int width, int height);
168 void (*lcd_mono_bitmap)(const unsigned char *src, int x, int y,
169 int width, int height);
170 #if LCD_DEPTH > 1
171 void (*lcd_set_foreground)(unsigned foreground);
172 unsigned (*lcd_get_foreground)(void);
173 void (*lcd_set_background)(unsigned foreground);
174 unsigned (*lcd_get_background)(void);
175 void (*lcd_bitmap_part)(const fb_data *src, int src_x, int src_y,
176 int stride, int x, int y, int width, int height);
177 void (*lcd_bitmap)(const fb_data *src, int x, int y, int width,
178 int height);
179 fb_data* (*lcd_get_backdrop)(void);
180 void (*lcd_set_backdrop)(fb_data* backdrop);
181 #endif
182 #if LCD_DEPTH == 16
183 void (*lcd_bitmap_transparent_part)(const fb_data *src,
184 int src_x, int src_y, int stride,
185 int x, int y, int width, int height);
186 void (*lcd_bitmap_transparent)(const fb_data *src, int x, int y,
187 int width, int height);
188 #endif
189 unsigned short *(*bidi_l2v)( const unsigned char *str, int orientation );
190 const unsigned char *(*font_get_bits)( struct font *pf, unsigned short char_code );
191 struct font* (*font_load)(const char *path);
192 void (*lcd_puts_style)(int x, int y, const unsigned char *str, int style);
193 void (*lcd_puts_scroll_style)(int x, int y, const unsigned char* string,
194 int style);
195 fb_data* lcd_framebuffer;
196 void (*lcd_blit) (const fb_data* data, int x, int by, int width,
197 int bheight, int stride);
198 void (*lcd_update_rect)(int x, int y, int width, int height);
199 void (*gui_scrollbar_draw)(struct screen * screen, int x, int y,
200 int width, int height, int items,
201 int min_shown, int max_shown,
202 unsigned flags);
203 struct font* (*font_get)(int font);
204 int (*font_getstringsize)(const unsigned char *str, int *w, int *h,
205 int fontnumber);
206 int (*font_get_width)(struct font* pf, unsigned short char_code);
207 void (*screen_clear_area)(struct screen * display, int xstart, int ystart,
208 int width, int height);
209 #endif
210 void (*backlight_on)(void);
211 void (*backlight_off)(void);
212 void (*backlight_set_timeout)(int index);
213 #if CONFIG_CHARGING
214 void (*backlight_set_timeout_plugged)(int index);
215 #endif
216 void (*splash)(int ticks, const char *fmt, ...) ATTRIBUTE_PRINTF(2, 3);
218 #ifdef HAVE_REMOTE_LCD
219 /* remote lcd */
220 void (*lcd_remote_set_contrast)(int x);
221 void (*lcd_remote_clear_display)(void);
222 void (*lcd_remote_puts)(int x, int y, const unsigned char *string);
223 void (*lcd_remote_lcd_puts_scroll)(int x, int y, const unsigned char* string);
224 void (*lcd_remote_lcd_stop_scroll)(void);
225 void (*lcd_remote_set_drawmode)(int mode);
226 int (*lcd_remote_get_drawmode)(void);
227 void (*lcd_remote_setfont)(int font);
228 int (*lcd_remote_getstringsize)(const unsigned char *str, int *w, int *h);
229 void (*lcd_remote_drawpixel)(int x, int y);
230 void (*lcd_remote_drawline)(int x1, int y1, int x2, int y2);
231 void (*lcd_remote_hline)(int x1, int x2, int y);
232 void (*lcd_remote_vline)(int x, int y1, int y2);
233 void (*lcd_remote_drawrect)(int x, int y, int nx, int ny);
234 void (*lcd_remote_fillrect)(int x, int y, int nx, int ny);
235 void (*lcd_remote_mono_bitmap_part)(const unsigned char *src, int src_x,
236 int src_y, int stride, int x, int y,
237 int width, int height);
238 void (*lcd_remote_mono_bitmap)(const unsigned char *src, int x, int y,
239 int width, int height);
240 void (*lcd_remote_putsxy)(int x, int y, const unsigned char *string);
241 void (*lcd_remote_puts_style)(int x, int y, const unsigned char *str, int style);
242 void (*lcd_remote_puts_scroll_style)(int x, int y, const unsigned char* string,
243 int style);
244 fb_remote_data* lcd_remote_framebuffer;
245 void (*lcd_remote_update)(void);
246 void (*lcd_remote_update_rect)(int x, int y, int width, int height);
248 void (*remote_backlight_on)(void);
249 void (*remote_backlight_off)(void);
250 #endif
251 struct screen* screens[NB_SCREENS];
252 #if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)
253 void (*lcd_remote_set_foreground)(unsigned foreground);
254 unsigned (*lcd_remote_get_foreground)(void);
255 void (*lcd_remote_set_background)(unsigned background);
256 unsigned (*lcd_remote_get_background)(void);
257 void (*lcd_remote_bitmap_part)(const fb_remote_data *src, int src_x, int src_y,
258 int stride, int x, int y, int width, int height);
259 void (*lcd_remote_bitmap)(const fb_remote_data *src, int x, int y, int width,
260 int height);
261 #endif
262 #if defined(HAVE_LCD_COLOR) && !defined(SIMULATOR)
263 void (*lcd_yuv_blit)(unsigned char * const src[3],
264 int src_x, int src_y, int stride,
265 int x, int y, int width, int height);
266 #endif
268 /* list */
269 void (*gui_synclist_init)(struct gui_synclist * lists,
270 list_get_name callback_get_item_name,void * data,
271 bool scroll_all,int selected_size);
272 void (*gui_synclist_set_nb_items)(struct gui_synclist * lists, int nb_items);
273 void (*gui_synclist_set_icon_callback)(struct gui_synclist * lists, list_get_icon icon_callback);
274 int (*gui_synclist_get_nb_items)(struct gui_synclist * lists);
275 int (*gui_synclist_get_sel_pos)(struct gui_synclist * lists);
276 void (*gui_synclist_draw)(struct gui_synclist * lists);
277 void (*gui_synclist_select_item)(struct gui_synclist * lists,
278 int item_number);
279 void (*gui_synclist_add_item)(struct gui_synclist * lists);
280 void (*gui_synclist_del_item)(struct gui_synclist * lists);
281 void (*gui_synclist_limit_scroll)(struct gui_synclist * lists, bool scroll);
282 void (*gui_synclist_flash)(struct gui_synclist * lists);
283 unsigned (*gui_synclist_do_button)(struct gui_synclist * lists,
284 unsigned button,enum list_wrap wrap);
285 void (*gui_synclist_set_title)(struct gui_synclist *lists, char* title, int icon);
287 /* button */
288 long (*button_get)(bool block);
289 long (*button_get_w_tmo)(int ticks);
290 int (*button_status)(void);
291 void (*button_clear_queue)(void);
292 #ifdef HAS_BUTTON_HOLD
293 bool (*button_hold)(void);
294 #endif
296 /* file */
297 int (*PREFIX(open))(const char* pathname, int flags);
298 int (*close)(int fd);
299 ssize_t (*PREFIX(read))(int fd, void* buf, size_t count);
300 off_t (*PREFIX(lseek))(int fd, off_t offset, int whence);
301 int (*PREFIX(creat))(const char *pathname);
302 ssize_t (*PREFIX(write))(int fd, const void* buf, size_t count);
303 int (*PREFIX(remove))(const char* pathname);
304 int (*PREFIX(rename))(const char* path, const char* newname);
305 int (*PREFIX(ftruncate))(int fd, off_t length);
306 off_t (*PREFIX(filesize))(int fd);
307 int (*fdprintf)(int fd, const char *fmt, ...) ATTRIBUTE_PRINTF(2, 3);
308 int (*read_line)(int fd, char* buffer, int buffer_size);
309 bool (*settings_parseline)(char* line, char** name, char** value);
310 #ifndef SIMULATOR
311 void (*ata_sleep)(void);
312 bool (*ata_disk_is_active)(void);
313 #endif
314 void (*ata_spindown)(int seconds);
315 void (*reload_directory)(void);
316 char *(*create_numbered_filename)(char *buffer, const char *path,
317 const char *prefix, const char *suffix,
318 int numberlen IF_CNFN_NUM_(, int *num));
320 /* dir */
321 DIR* (*opendir)(const char* name);
322 int (*closedir)(DIR* dir);
323 struct dirent* (*readdir)(DIR* dir);
324 int (*mkdir)(const char *name);
325 int (*rmdir)(const char *name);
327 /* kernel/ system */
328 void (*PREFIX(sleep))(int ticks);
329 void (*yield)(void);
330 #ifdef HAVE_PRIORITY_SCHEDULING
331 void (*priority_yield)(void);
332 #endif
333 volatile long* current_tick;
334 long (*default_event_handler)(long event);
335 long (*default_event_handler_ex)(long event, void (*callback)(void *), void *parameter);
336 struct thread_entry* threads;
337 struct thread_entry* (*create_thread)(void (*function)(void), void* stack,
338 int stack_size, const char *name
339 IF_PRIO(, int priority)
340 IF_COP(, unsigned int core, bool fallback));
341 void (*remove_thread)(struct thread_entry *thread);
342 void (*reset_poweroff_timer)(void);
343 #ifndef SIMULATOR
344 int (*system_memory_guard)(int newmode);
345 long *cpu_frequency;
346 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
347 #ifdef CPU_BOOST_LOGGING
348 void (*cpu_boost_)(bool on_off,char*location,int line);
349 #else
350 void (*cpu_boost)(bool on_off);
351 #endif
352 #endif
353 #endif
354 bool (*timer_register)(int reg_prio, void (*unregister_callback)(void),
355 long cycles, int int_prio,
356 void (*timer_callback)(void));
357 void (*timer_unregister)(void);
358 bool (*timer_set_period)(long count);
360 void (*queue_init)(struct event_queue *q, bool register_queue);
361 void (*queue_delete)(struct event_queue *q);
362 void (*queue_post)(struct event_queue *q, long id, intptr_t data);
363 void (*queue_wait_w_tmo)(struct event_queue *q, struct event *ev,
364 int ticks);
365 void (*usb_acknowledge)(long id);
366 #ifdef RB_PROFILE
367 void (*profile_thread)(void);
368 void (*profstop)(void);
369 void (*profile_func_enter)(void *this_fn, void *call_site);
370 void (*profile_func_exit)(void *this_fn, void *call_site);
371 #endif
373 #ifdef SIMULATOR
374 /* special simulator hooks */
375 #if defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8
376 void (*sim_lcd_ex_init)(int shades, unsigned long (*getpixel)(int, int));
377 void (*sim_lcd_ex_update_rect)(int x, int y, int width, int height);
378 #endif
379 #endif
381 /* strings and memory */
382 int (*snprintf)(char *buf, size_t size, const char *fmt, ...)
383 ATTRIBUTE_PRINTF(3, 4);
384 int (*vsnprintf)(char *buf, int size, const char *fmt, va_list ap);
385 char* (*strcpy)(char *dst, const char *src);
386 char* (*strncpy)(char *dst, const char *src, size_t length);
387 size_t (*strlen)(const char *str);
388 char * (*strrchr)(const char *s, int c);
389 int (*strcmp)(const char *, const char *);
390 int (*strncmp)(const char *, const char *, size_t);
391 int (*strcasecmp)(const char *, const char *);
392 int (*strncasecmp)(const char *s1, const char *s2, size_t n);
393 void* (*memset)(void *dst, int c, size_t length);
394 void* (*memcpy)(void *out, const void *in, size_t n);
395 void* (*memmove)(void *out, const void *in, size_t n);
396 const unsigned char *_ctype_;
397 int (*atoi)(const char *str);
398 char *(*strchr)(const char *s, int c);
399 char *(*strcat)(char *s1, const char *s2);
400 void *(*memchr)(const void *s1, int c, size_t n);
401 int (*memcmp)(const void *s1, const void *s2, size_t n);
402 char *(*strcasestr) (const char* phaystack, const char* pneedle);
403 char* (*strtok_r)(char *ptr, const char *sep, char **end);
404 /* unicode stuff */
405 const unsigned char* (*utf8decode)(const unsigned char *utf8, unsigned short *ucs);
406 unsigned char* (*iso_decode)(const unsigned char *iso, unsigned char *utf8, int cp, int count);
407 unsigned char* (*utf16LEdecode)(const unsigned char *utf16, unsigned char *utf8, int count);
408 unsigned char* (*utf16BEdecode)(const unsigned char *utf16, unsigned char *utf8, int count);
409 unsigned char* (*utf8encode)(unsigned long ucs, unsigned char *utf8);
410 unsigned long (*utf8length)(const unsigned char *utf8);
411 int (*utf8seek)(const unsigned char* utf8, int offset);
413 /* sound */
414 #if CONFIG_CODEC == SWCODEC
415 int (*sound_default)(int setting);
416 #endif
417 void (*sound_set)(int setting, int value);
418 int (*sound_min)(int setting);
419 int (*sound_max)(int setting);
420 #ifndef SIMULATOR
421 void (*mp3_play_data)(const unsigned char* start, int size, void (*get_more)(unsigned char** start, size_t* size));
422 void (*mp3_play_pause)(bool play);
423 void (*mp3_play_stop)(void);
424 bool (*mp3_is_playing)(void);
425 #if CONFIG_CODEC != SWCODEC
426 void (*bitswap)(unsigned char *data, int length);
427 #endif
428 #endif /* !SIMULATOR */
429 #if CONFIG_CODEC == SWCODEC
430 const unsigned long *audio_master_sampr_list;
431 const unsigned long *hw_freq_sampr;
432 void (*pcm_apply_settings)(void);
433 void (*pcm_play_data)(pcm_more_callback_type get_more,
434 unsigned char* start, size_t size);
435 void (*pcm_play_stop)(void);
436 void (*pcm_set_frequency)(unsigned int frequency);
437 bool (*pcm_is_playing)(void);
438 bool (*pcm_is_paused)(void);
439 void (*pcm_play_pause)(bool play);
440 size_t (*pcm_get_bytes_waiting)(void);
441 void (*pcm_calculate_peaks)(int *left, int *right);
442 #ifdef HAVE_RECORDING
443 const unsigned long *rec_freq_sampr;
444 void (*pcm_init_recording)(void);
445 void (*pcm_close_recording)(void);
446 void (*pcm_record_data)(pcm_more_callback_type2 more_ready,
447 void *start, size_t size);
448 void (*pcm_record_more)(void *start, size_t size);
449 void (*pcm_stop_recording)(void);
450 void (*pcm_calculate_rec_peaks)(int *left, int *right);
451 void (*audio_set_recording_gain)(int left, int right, int type);
452 #endif /* HAVE_RECORDING */
453 #if INPUT_SRC_CAPS != 0
454 void (*audio_set_output_source)(int monitor);
455 void (*audio_set_input_source)(int source, unsigned flags);
456 #endif
457 #endif /* CONFIG_CODEC == SWCODC */
459 /* playback control */
460 int (*playlist_amount)(void);
461 int (*playlist_resume)(void);
462 int (*playlist_start)(int start_index, int offset);
463 void (*PREFIX(audio_play))(long offset);
464 void (*audio_stop)(void);
465 void (*audio_pause)(void);
466 void (*audio_resume)(void);
467 void (*audio_next)(void);
468 void (*audio_prev)(void);
469 void (*audio_ff_rewind)(long newtime);
470 struct mp3entry* (*audio_next_track)(void);
471 int (*audio_status)(void);
472 bool (*audio_has_changed_track)(void);
473 struct mp3entry* (*audio_current_track)(void);
474 void (*audio_flush_and_reload_tracks)(void);
475 int (*audio_get_file_pos)(void);
476 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
477 unsigned long (*mpeg_get_last_header)(void);
478 #endif
479 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) || \
480 (CONFIG_CODEC == SWCODEC)
481 void (*sound_set_pitch)(int pitch);
482 #endif
484 /* MAS communication */
485 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
486 int (*mas_readmem)(int bank, int addr, unsigned long* dest, int len);
487 int (*mas_writemem)(int bank, int addr, const unsigned long* src, int len);
488 int (*mas_readreg)(int reg);
489 int (*mas_writereg)(int reg, unsigned int val);
490 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
491 int (*mas_codec_writereg)(int reg, unsigned int val);
492 int (*mas_codec_readreg)(int reg);
493 void (*i2c_begin)(void);
494 void (*i2c_end)(void);
495 int (*i2c_write)(int address, unsigned char* buf, int count );
496 #endif
497 #endif
499 /* menu */
500 int (*do_menu)(const struct menu_item_ex *menu, int *start_selected);
502 /* scroll bar */
503 struct gui_syncstatusbar *statusbars;
504 void (*gui_syncstatusbar_draw)(struct gui_syncstatusbar * bars, bool force_redraw);
506 /* options */
507 const struct settings_list* (*find_setting)(void* variable, int *id);
508 bool (*option_screen)(struct settings_list *setting,
509 bool use_temp_var, unsigned char* option_title);
510 bool (*set_option)(const char* string, void* variable,
511 enum optiontype type, const struct opt_items* options,
512 int numoptions, void (*function)(int));
513 bool (*set_bool_options)(const char* string, bool* variable,
514 const char* yes_str, int yes_voice,
515 const char* no_str, int no_voice,
516 void (*function)(bool));
517 bool (*set_int)(const unsigned char* string, const char* unit, int voice_unit,
518 int* variable, void (*function)(int), int step, int min,
519 int max, void (*formatter)(char*, size_t, int, const char*) );
520 bool (*set_bool)(const char* string, bool* variable );
522 #ifdef HAVE_LCD_COLOR
523 bool (*set_color)(struct screen *display, char *title, unsigned *color,
524 unsigned banned_color);
525 #endif
526 /* action handling */
527 int (*get_custom_action)(int context,int timeout,
528 const struct button_mapping* (*get_context_map)(int));
529 int (*get_action)(int context, int timeout);
530 bool (*action_userabort)(int timeout);
532 /* power */
533 int (*battery_level)(void);
534 bool (*battery_level_safe)(void);
535 int (*battery_time)(void);
536 #ifndef SIMULATOR
537 unsigned int (*battery_voltage)(void);
538 #endif
539 #if CONFIG_CHARGING
540 bool (*charger_inserted)(void);
541 # if CONFIG_CHARGING == CHARGING_MONITOR
542 bool (*charging_state)(void);
543 # endif
544 #endif
545 #ifdef HAVE_USB_POWER
546 bool (*usb_powered)(void);
547 #endif
549 /* misc */
550 void (*srand)(unsigned int seed);
551 int (*rand)(void);
552 void (*qsort)(void *base, size_t nmemb, size_t size,
553 int(*compar)(const void *, const void *));
554 int (*kbd_input)(char* buffer, int buflen);
555 struct tm* (*get_time)(void);
556 int (*set_time)(const struct tm *tm);
557 #if CONFIG_RTC
558 time_t (*mktime)(struct tm *t);
559 #endif
560 void* (*plugin_get_buffer)(size_t *buffer_size);
561 void* (*plugin_get_audio_buffer)(size_t *buffer_size);
562 void (*plugin_tsr)(bool (*exit_callback)(bool reenter));
563 char* (*plugin_get_current_filename)(void);
564 #ifdef IRAM_STEAL
565 void (*plugin_iram_init)(char *iramstart, char *iramcopy, size_t iram_size,
566 char *iedata, size_t iedata_size);
567 #endif
568 #if defined(DEBUG) || defined(SIMULATOR)
569 void (*debugf)(const char *fmt, ...) ATTRIBUTE_PRINTF(1, 2);
570 #endif
571 #ifdef ROCKBOX_HAS_LOGF
572 void (*logf)(const char *fmt, ...) ATTRIBUTE_PRINTF(1, 2);
573 #endif
574 struct user_settings* global_settings;
575 struct system_status *global_status;
576 bool (*mp3info)(struct mp3entry *entry, const char *filename, bool v1first);
577 int (*count_mp3_frames)(int fd, int startpos, int filesize,
578 void (*progressfunc)(int));
579 int (*create_xing_header)(int fd, long startpos, long filesize,
580 unsigned char *buf, unsigned long num_frames,
581 unsigned long rec_time, unsigned long header_template,
582 void (*progressfunc)(int), bool generate_toc);
583 unsigned long (*find_next_frame)(int fd, long *offset,
584 long max_offset, unsigned long last_header);
586 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
587 unsigned short (*peak_meter_scale_value)(unsigned short val,
588 int meterwidth);
589 void (*peak_meter_set_use_dbfs)(bool use);
590 bool (*peak_meter_get_use_dbfs)(void);
591 #endif
592 #ifdef HAVE_LCD_BITMAP
593 int (*read_bmp_file)(char* filename, struct bitmap *bm, int maxsize,
594 int format);
595 void (*screen_dump_set_hook)(void (*hook)(int fh));
596 #endif
597 int (*show_logo)(void);
598 struct tree_context* (*tree_get_context)(void);
599 void (*set_current_file)(char* path);
600 void (*set_dirfilter)(int l_dirfilter);
602 #ifdef HAVE_WHEEL_POSITION
603 int (*wheel_status)(void);
604 void (*wheel_send_events)(bool send);
605 #endif
607 #ifdef IRIVER_H100_SERIES
608 /* Routines for the iriver_flash -plugin. */
609 bool (*detect_original_firmware)(void);
610 bool (*detect_flashed_ramimage)(void);
611 bool (*detect_flashed_romimage)(void);
612 #endif
613 /* new stuff at the end, sort into place next time
614 the API gets incompatible */
616 #if (CONFIG_CODEC == SWCODEC)
617 void (*spinlock_init)(struct mutex *m);
618 void (*spinlock_lock)(struct mutex *m);
619 void (*spinlock_unlock)(struct mutex *m);
621 int (*codec_load_file)(const char* codec, struct codec_api *api);
622 const char *(*get_codec_filename)(int cod_spec);
623 bool (*get_metadata)(struct mp3entry* id3, int fd, const char* trackname,
624 bool v1first);
625 #endif
626 void (*led)(bool on);
629 /* plugin header */
630 struct plugin_header {
631 unsigned long magic;
632 unsigned short target_id;
633 unsigned short api_version;
634 unsigned char *load_addr;
635 unsigned char *end_addr;
636 enum plugin_status(*entry_point)(struct plugin_api*, void*);
639 #ifdef PLUGIN
640 #ifndef SIMULATOR
641 extern unsigned char plugin_start_addr[];
642 extern unsigned char plugin_end_addr[];
643 #define PLUGIN_HEADER \
644 const struct plugin_header __header \
645 __attribute__ ((section (".header")))= { \
646 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
647 plugin_start_addr, plugin_end_addr, plugin_start };
648 #else /* SIMULATOR */
649 #define PLUGIN_HEADER \
650 const struct plugin_header __header = { \
651 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
652 NULL, NULL, plugin_start };
653 #endif /* SIMULATOR */
655 #ifdef USE_IRAM
656 /* Declare IRAM variables */
657 #define PLUGIN_IRAM_DECLARE \
658 extern char iramcopy[]; \
659 extern char iramstart[]; \
660 extern char iramend[]; \
661 extern char iedata[]; \
662 extern char iend[];
663 /* Initialize IRAM */
664 #define PLUGIN_IRAM_INIT(api) \
665 (api)->plugin_iram_init(iramstart, iramcopy, iramend-iramstart, \
666 iedata, iend-iedata);
667 #else
668 #define PLUGIN_IRAM_DECLARE
669 #define PLUGIN_IRAM_INIT(api)
670 #endif /* USE_IRAM */
671 #endif /* PLUGIN */
673 int plugin_load(const char* plugin, void* parameter);
674 void* plugin_get_buffer(size_t *buffer_size);
675 void* plugin_get_audio_buffer(size_t *buffer_size);
676 #ifdef IRAM_STEAL
677 void plugin_iram_init(char *iramstart, char *iramcopy, size_t iram_size,
678 char *iedata, size_t iedata_size);
679 #endif
681 /* plugin_tsr,
682 callback returns true to allow the new plugin to load,
683 reenter means the currently running plugin is being reloaded */
684 void plugin_tsr(bool (*exit_callback)(bool reenter));
686 /* defined by the plugin */
687 enum plugin_status plugin_start(struct plugin_api* rockbox, void* parameter)
688 NO_PROF_ATTR;
690 /* Use this macro in plugins where gcc tries to optimize by calling
691 * these functions directly */
692 #define MEM_FUNCTION_WRAPPERS(api) \
693 void *memcpy(void *dest, const void *src, size_t n) \
695 return (api)->memcpy(dest, src, n); \
697 void *memset(void *dest, int c, size_t n) \
699 return (api)->memset(dest, c, n); \
701 void *memmove(void *dest, const void *src, size_t n) \
703 return (api)->memmove(dest, src, n); \
705 int memcmp(const void *s1, const void *s2, size_t n) \
707 return (api)->memcmp(s1, s2, n); \
710 #endif