extend the text editor plugin to be able to modify the .colors file
[Rockbox.git] / apps / plugin.h
blob29e7f5d318e9b5553c9b5c682a57192e2ad2a09a
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 #ifndef SIMULATOR
41 #include "dircache.h"
42 #endif
43 #include "kernel.h"
44 #include "thread.h"
45 #include "button.h"
46 #include "action.h"
47 #include "usb.h"
48 #include "font.h"
49 #include "lcd.h"
50 #include "id3.h"
51 #include "sound.h"
52 #include "mpeg.h"
53 #include "audio.h"
54 #include "mp3_playback.h"
55 #include "talk.h"
56 #ifdef RB_PROFILE
57 #include "profile.h"
58 #endif
59 #include "misc.h"
60 #if (CONFIG_CODEC == SWCODEC)
61 #include "dsp.h"
62 #include "codecs.h"
63 #include "playback.h"
64 #include "metadata.h"
65 #ifdef HAVE_RECORDING
66 #include "recording.h"
67 #endif
68 #else
69 #include "mas.h"
70 #endif /* CONFIG_CODEC == SWCODEC */
71 #include "settings.h"
72 #include "timer.h"
73 #include "playlist.h"
74 #ifdef HAVE_LCD_BITMAP
75 #include "scrollbar.h"
76 #endif
77 #include "statusbar.h"
78 #include "menu.h"
79 #include "rbunicode.h"
80 #include "list.h"
81 #include "tree.h"
82 #include "color_picker.h"
84 #ifdef HAVE_REMOTE_LCD
85 #include "lcd-remote.h"
86 #endif
88 #ifdef PLUGIN
90 #if defined(DEBUG) || defined(SIMULATOR)
91 #undef DEBUGF
92 #define DEBUGF rb->debugf
93 #undef LDEBUGF
94 #define LDEBUGF rb->debugf
95 #else
96 #define DEBUGF(...)
97 #define LDEBUGF(...)
98 #endif
100 #ifdef ROCKBOX_HAS_LOGF
101 #undef LOGF
102 #define LOGF rb->logf
103 #else
104 #define LOGF(...)
105 #endif
107 #endif
109 #ifdef SIMULATOR
110 #define PREFIX(_x_) sim_ ## _x_
111 #else
112 #define PREFIX(_x_) _x_
113 #endif
115 #define PLUGIN_MAGIC 0x526F634B /* RocK */
117 /* increase this every time the api struct changes */
118 #define PLUGIN_API_VERSION 59
120 /* update this to latest version if a change to the api struct breaks
121 backwards compatibility (and please take the opportunity to sort in any
122 new function which are "waiting" at the end of the function table) */
123 #define PLUGIN_MIN_API_VERSION 58
125 /* plugin return codes */
126 enum plugin_status {
127 PLUGIN_OK = 0,
128 PLUGIN_USB_CONNECTED,
129 PLUGIN_ERROR = -1,
132 /* NOTE: To support backwards compatibility, only add new functions at
133 the end of the structure. Every time you add a new function,
134 remember to increase PLUGIN_API_VERSION. If you make changes to the
135 existing APIs then also update PLUGIN_MIN_API_VERSION to current
136 version
138 struct plugin_api {
140 /* lcd */
141 void (*lcd_set_contrast)(int x);
142 void (*lcd_update)(void);
143 void (*lcd_clear_display)(void);
144 void (*lcd_setmargins)(int x, int y);
145 int (*lcd_getstringsize)(const unsigned char *str, int *w, int *h);
146 void (*lcd_putsxy)(int x, int y, const unsigned char *string);
147 void (*lcd_puts)(int x, int y, const unsigned char *string);
148 void (*lcd_puts_scroll)(int x, int y, const unsigned char* string);
149 void (*lcd_stop_scroll)(void);
150 #ifdef HAVE_LCD_CHARCELLS
151 void (*lcd_define_pattern)(unsigned long ucs, const char *pattern);
152 unsigned long (*lcd_get_locked_pattern)(void);
153 void (*lcd_unlock_pattern)(unsigned long ucs);
154 void (*lcd_putc)(int x, int y, unsigned long ucs);
155 void (*lcd_put_cursor)(int x, int y, unsigned long ucs);
156 void (*lcd_remove_cursor)(void);
157 void (*lcd_icon)(int icon, bool enable);
158 void (*lcd_double_height)(bool on);
159 #else
160 void (*lcd_set_drawmode)(int mode);
161 int (*lcd_get_drawmode)(void);
162 void (*lcd_setfont)(int font);
163 void (*lcd_drawpixel)(int x, int y);
164 void (*lcd_drawline)(int x1, int y1, int x2, int y2);
165 void (*lcd_hline)(int x1, int x2, int y);
166 void (*lcd_vline)(int x, int y1, int y2);
167 void (*lcd_drawrect)(int x, int y, int width, int height);
168 void (*lcd_fillrect)(int x, int y, int width, int height);
169 void (*lcd_mono_bitmap_part)(const unsigned char *src, int src_x, int src_y,
170 int stride, int x, int y, int width, int height);
171 void (*lcd_mono_bitmap)(const unsigned char *src, int x, int y,
172 int width, int height);
173 #if LCD_DEPTH > 1
174 void (*lcd_set_foreground)(unsigned foreground);
175 unsigned (*lcd_get_foreground)(void);
176 void (*lcd_set_background)(unsigned foreground);
177 unsigned (*lcd_get_background)(void);
178 void (*lcd_bitmap_part)(const fb_data *src, int src_x, int src_y,
179 int stride, int x, int y, int width, int height);
180 void (*lcd_bitmap)(const fb_data *src, int x, int y, int width,
181 int height);
182 void (*lcd_set_backdrop)(fb_data* backdrop);
183 #endif
184 #if LCD_DEPTH == 16
185 void (*lcd_bitmap_transparent_part)(const fb_data *src,
186 int src_x, int src_y, int stride,
187 int x, int y, int width, int height);
188 void (*lcd_bitmap_transparent)(const fb_data *src, int x, int y,
189 int width, int height);
190 #endif
191 unsigned short *(*bidi_l2v)( const unsigned char *str, int orientation );
192 const unsigned char *(*font_get_bits)( struct font *pf, unsigned short char_code );
193 struct font* (*font_load)(const char *path);
194 void (*lcd_puts_style)(int x, int y, const unsigned char *str, int style);
195 void (*lcd_puts_scroll_style)(int x, int y, const unsigned char* string,
196 int style);
197 fb_data* lcd_framebuffer;
198 void (*lcd_blit) (const fb_data* data, int x, int by, int width,
199 int bheight, int stride);
200 void (*lcd_update_rect)(int x, int y, int width, int height);
201 void (*gui_scrollbar_draw)(struct screen * screen, int x, int y,
202 int width, int height, int items,
203 int min_shown, int max_shown,
204 unsigned flags);
205 struct font* (*font_get)(int font);
206 int (*font_getstringsize)(const unsigned char *str, int *w, int *h,
207 int fontnumber);
208 int (*font_get_width)(struct font* pf, unsigned short char_code);
209 #endif
210 void (*backlight_on)(void);
211 void (*backlight_off)(void);
212 void (*backlight_set_timeout)(int index);
213 void (*splash)(int ticks, const char *fmt, ...) ATTRIBUTE_PRINTF(2, 3);
215 #ifdef HAVE_REMOTE_LCD
216 /* remote lcd */
217 void (*lcd_remote_set_contrast)(int x);
218 void (*lcd_remote_clear_display)(void);
219 void (*lcd_remote_puts)(int x, int y, const unsigned char *string);
220 void (*lcd_remote_lcd_puts_scroll)(int x, int y, const unsigned char* string);
221 void (*lcd_remote_lcd_stop_scroll)(void);
222 void (*lcd_remote_set_drawmode)(int mode);
223 int (*lcd_remote_get_drawmode)(void);
224 void (*lcd_remote_setfont)(int font);
225 int (*lcd_remote_getstringsize)(const unsigned char *str, int *w, int *h);
226 void (*lcd_remote_drawpixel)(int x, int y);
227 void (*lcd_remote_drawline)(int x1, int y1, int x2, int y2);
228 void (*lcd_remote_hline)(int x1, int x2, int y);
229 void (*lcd_remote_vline)(int x, int y1, int y2);
230 void (*lcd_remote_drawrect)(int x, int y, int nx, int ny);
231 void (*lcd_remote_fillrect)(int x, int y, int nx, int ny);
232 void (*lcd_remote_mono_bitmap_part)(const unsigned char *src, int src_x,
233 int src_y, int stride, int x, int y,
234 int width, int height);
235 void (*lcd_remote_mono_bitmap)(const unsigned char *src, int x, int y,
236 int width, int height);
237 void (*lcd_remote_putsxy)(int x, int y, const unsigned char *string);
238 void (*lcd_remote_puts_style)(int x, int y, const unsigned char *str, int style);
239 void (*lcd_remote_puts_scroll_style)(int x, int y, const unsigned char* string,
240 int style);
241 fb_remote_data* lcd_remote_framebuffer;
242 void (*lcd_remote_update)(void);
243 void (*lcd_remote_update_rect)(int x, int y, int width, int height);
245 void (*remote_backlight_on)(void);
246 void (*remote_backlight_off)(void);
247 #endif
248 struct screen* screens[NB_SCREENS];
249 #if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)
250 void (*lcd_remote_set_foreground)(unsigned foreground);
251 unsigned (*lcd_remote_get_foreground)(void);
252 void (*lcd_remote_set_background)(unsigned background);
253 unsigned (*lcd_remote_get_background)(void);
254 void (*lcd_remote_bitmap_part)(const fb_remote_data *src, int src_x, int src_y,
255 int stride, int x, int y, int width, int height);
256 void (*lcd_remote_bitmap)(const fb_remote_data *src, int x, int y, int width,
257 int height);
258 #endif
259 #if defined(HAVE_LCD_COLOR) && !defined(SIMULATOR)
260 void (*lcd_yuv_blit)(unsigned char * const src[3],
261 int src_x, int src_y, int stride,
262 int x, int y, int width, int height);
263 #endif
265 /* list */
266 void (*gui_synclist_init)(struct gui_synclist * lists,
267 list_get_name callback_get_item_name,void * data,
268 bool scroll_all,int selected_size);
269 void (*gui_synclist_set_nb_items)(struct gui_synclist * lists, int nb_items);
270 void (*gui_synclist_set_icon_callback)(struct gui_synclist * lists, list_get_icon icon_callback);
271 int (*gui_synclist_get_nb_items)(struct gui_synclist * lists);
272 int (*gui_synclist_get_sel_pos)(struct gui_synclist * lists);
273 void (*gui_synclist_draw)(struct gui_synclist * lists);
274 void (*gui_synclist_select_item)(struct gui_synclist * lists,
275 int item_number);
276 void (*gui_synclist_add_item)(struct gui_synclist * lists);
277 void (*gui_synclist_del_item)(struct gui_synclist * lists);
278 void (*gui_synclist_limit_scroll)(struct gui_synclist * lists, bool scroll);
279 void (*gui_synclist_flash)(struct gui_synclist * lists);
280 unsigned (*gui_synclist_do_button)(struct gui_synclist * lists,
281 unsigned button,enum list_wrap wrap);
282 void (*gui_synclist_set_title)(struct gui_synclist *lists, char* title, int icon);
284 /* button */
285 long (*button_get)(bool block);
286 long (*button_get_w_tmo)(int ticks);
287 int (*button_status)(void);
288 void (*button_clear_queue)(void);
289 #ifdef HAS_BUTTON_HOLD
290 bool (*button_hold)(void);
291 #endif
293 /* file */
294 int (*PREFIX(open))(const char* pathname, int flags);
295 int (*close)(int fd);
296 ssize_t (*read)(int fd, void* buf, size_t count);
297 off_t (*PREFIX(lseek))(int fd, off_t offset, int whence);
298 int (*PREFIX(creat))(const char *pathname);
299 ssize_t (*write)(int fd, const void* buf, size_t count);
300 int (*PREFIX(remove))(const char* pathname);
301 int (*PREFIX(rename))(const char* path, const char* newname);
302 int (*PREFIX(ftruncate))(int fd, off_t length);
303 off_t (*PREFIX(filesize))(int fd);
304 int (*fdprintf)(int fd, const char *fmt, ...) ATTRIBUTE_PRINTF(2, 3);
305 int (*read_line)(int fd, char* buffer, int buffer_size);
306 bool (*settings_parseline)(char* line, char** name, char** value);
307 #ifndef SIMULATOR
308 void (*ata_sleep)(void);
309 bool (*ata_disk_is_active)(void);
310 #endif
311 void (*ata_spindown)(int seconds);
312 void (*reload_directory)(void);
314 /* dir */
315 DIR* (*PREFIX(opendir))(const char* name);
316 int (*PREFIX(closedir))(DIR* dir);
317 struct dirent* (*PREFIX(readdir))(DIR* dir);
318 int (*PREFIX(mkdir))(const char *name);
319 int (*PREFIX(rmdir))(const char *name);
320 /* dir, cached */
321 #ifdef HAVE_DIRCACHE
322 DIRCACHED* (*opendir_cached)(const char* name);
323 struct dircache_entry* (*readdir_cached)(DIRCACHED* dir);
324 int (*closedir_cached)(DIRCACHED* dir);
325 #endif
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 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* (*create_thread)(void (*function)(void), void* stack,
337 int stack_size, const char *name
338 IF_PRIO(, int priority)
339 IF_COP(, unsigned int core, bool fallback));
340 void (*remove_thread)(struct thread_entry *thread);
341 void (*reset_poweroff_timer)(void);
342 #ifndef SIMULATOR
343 int (*system_memory_guard)(int newmode);
344 long *cpu_frequency;
345 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
346 #ifdef CPU_BOOST_LOGGING
347 void (*cpu_boost_)(bool on_off,char*location,int line);
348 #else
349 void (*cpu_boost)(bool on_off);
350 #endif
351 #endif
352 bool (*timer_register)(int reg_prio, void (*unregister_callback)(void),
353 long cycles, int int_prio,
354 void (*timer_callback)(void));
355 void (*timer_unregister)(void);
356 bool (*timer_set_period)(long count);
357 #endif
358 void (*queue_init)(struct event_queue *q, bool register_queue);
359 void (*queue_delete)(struct event_queue *q);
360 void (*queue_post)(struct event_queue *q, long id, intptr_t data);
361 void (*queue_wait_w_tmo)(struct event_queue *q, struct event *ev,
362 int ticks);
363 void (*usb_acknowledge)(long id);
364 #ifdef RB_PROFILE
365 void (*profile_thread)(void);
366 void (*profstop)(void);
367 void (*profile_func_enter)(void *this_fn, void *call_site);
368 void (*profile_func_exit)(void *this_fn, void *call_site);
369 #endif
371 #ifdef SIMULATOR
372 /* special simulator hooks */
373 #if defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8
374 void (*sim_lcd_ex_init)(int shades, unsigned long (*getpixel)(int, int));
375 void (*sim_lcd_ex_update_rect)(int x, int y, int width, int height);
376 #endif
377 #endif
379 /* strings and memory */
380 int (*snprintf)(char *buf, size_t size, const char *fmt, ...)
381 ATTRIBUTE_PRINTF(3, 4);
382 int (*vsnprintf)(char *buf, int size, const char *fmt, va_list ap);
383 char* (*strcpy)(char *dst, const char *src);
384 char* (*strncpy)(char *dst, const char *src, size_t length);
385 size_t (*strlen)(const char *str);
386 char * (*strrchr)(const char *s, int c);
387 int (*strcmp)(const char *, const char *);
388 int (*strncmp)(const char *, const char *, size_t);
389 int (*strcasecmp)(const char *, const char *);
390 int (*strncasecmp)(const char *s1, const char *s2, size_t n);
391 void* (*memset)(void *dst, int c, size_t length);
392 void* (*memcpy)(void *out, const void *in, size_t n);
393 void* (*memmove)(void *out, const void *in, size_t n);
394 const unsigned char *_ctype_;
395 int (*atoi)(const char *str);
396 char *(*strchr)(const char *s, int c);
397 char *(*strcat)(char *s1, const char *s2);
398 void *(*memchr)(const void *s1, int c, size_t n);
399 int (*memcmp)(const void *s1, const void *s2, size_t n);
400 char *(*strcasestr) (const char* phaystack, const char* pneedle);
401 char* (*strtok_r)(char *ptr, const char *sep, char **end);
402 /* unicode stuff */
403 const unsigned char* (*utf8decode)(const unsigned char *utf8, unsigned short *ucs);
404 unsigned char* (*iso_decode)(const unsigned char *iso, unsigned char *utf8, int cp, int count);
405 unsigned char* (*utf16LEdecode)(const unsigned char *utf16, unsigned char *utf8, int count);
406 unsigned char* (*utf16BEdecode)(const unsigned char *utf16, unsigned char *utf8, int count);
407 unsigned char* (*utf8encode)(unsigned long ucs, unsigned char *utf8);
408 unsigned long (*utf8length)(const unsigned char *utf8);
409 int (*utf8seek)(const unsigned char* utf8, int offset);
411 /* sound */
412 #if CONFIG_CODEC == SWCODEC
413 int (*sound_default)(int setting);
414 #endif
415 void (*sound_set)(int setting, int value);
416 bool (*set_sound)(const unsigned char * string,
417 int* variable, int setting);
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 bool (*set_option)(const char* string, void* variable,
508 enum optiontype type, const struct opt_items* options,
509 int numoptions, void (*function)(int));
510 bool (*set_int)(const unsigned char* string, const char* unit, int voice_unit,
511 int* variable, void (*function)(int), int step, int min,
512 int max, void (*formatter)(char*, int, int, const char*) );
513 bool (*set_bool)(const char* string, bool* variable );
515 /* action handling */
516 int (*get_custom_action)(int context,int timeout,
517 const struct button_mapping* (*get_context_map)(int));
518 int (*get_action)(int context, int timeout);
519 void (*action_signalscreenchange)(void);
520 bool (*action_userabort)(int timeout);
522 /* power */
523 int (*battery_level)(void);
524 bool (*battery_level_safe)(void);
525 int (*battery_time)(void);
526 #ifndef SIMULATOR
527 unsigned int (*battery_voltage)(void);
528 #endif
529 #if CONFIG_CHARGING
530 bool (*charger_inserted)(void);
531 # if CONFIG_CHARGING == CHARGING_MONITOR
532 bool (*charging_state)(void);
533 # endif
534 #endif
535 #ifdef HAVE_USB_POWER
536 bool (*usb_powered)(void);
537 #endif
539 /* misc */
540 void (*srand)(unsigned int seed);
541 int (*rand)(void);
542 void (*qsort)(void *base, size_t nmemb, size_t size,
543 int(*compar)(const void *, const void *));
544 int (*kbd_input)(char* buffer, int buflen);
545 struct tm* (*get_time)(void);
546 int (*set_time)(const struct tm *tm);
547 void* (*plugin_get_buffer)(size_t *buffer_size);
548 void* (*plugin_get_audio_buffer)(size_t *buffer_size);
549 void (*plugin_tsr)(bool (*exit_callback)(bool reenter));
550 #ifdef IRAM_STEAL
551 void (*plugin_iram_init)(char *iramstart, char *iramcopy, size_t iram_size,
552 char *iedata, size_t iedata_size);
553 #endif
554 #if defined(DEBUG) || defined(SIMULATOR)
555 void (*debugf)(const char *fmt, ...) ATTRIBUTE_PRINTF(1, 2);
556 #endif
557 #ifdef ROCKBOX_HAS_LOGF
558 void (*logf)(const char *fmt, ...) ATTRIBUTE_PRINTF(1, 2);
559 #endif
560 struct user_settings* global_settings;
561 struct system_status *global_status;
562 bool (*mp3info)(struct mp3entry *entry, const char *filename, bool v1first);
563 int (*count_mp3_frames)(int fd, int startpos, int filesize,
564 void (*progressfunc)(int));
565 int (*create_xing_header)(int fd, long startpos, long filesize,
566 unsigned char *buf, unsigned long num_frames,
567 unsigned long rec_time, unsigned long header_template,
568 void (*progressfunc)(int), bool generate_toc);
569 unsigned long (*find_next_frame)(int fd, long *offset,
570 long max_offset, unsigned long last_header);
572 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
573 unsigned short (*peak_meter_scale_value)(unsigned short val,
574 int meterwidth);
575 void (*peak_meter_set_use_dbfs)(bool use);
576 bool (*peak_meter_get_use_dbfs)(void);
577 #endif
578 #ifdef HAVE_LCD_BITMAP
579 int (*read_bmp_file)(char* filename, struct bitmap *bm, int maxsize,
580 int format);
581 void (*screen_dump_set_hook)(void (*hook)(int fh));
582 #endif
583 int (*show_logo)(void);
584 struct tree_context* (*tree_get_context)(void);
586 #ifdef HAVE_WHEEL_POSITION
587 int (*wheel_status)(void);
588 void (*wheel_send_events)(bool send);
589 #endif
590 #if LCD_DEPTH > 1
591 fb_data* (*lcd_get_backdrop)(void);
592 #endif
593 /* new stuff at the end, sort into place next time
594 the API gets incompatible */
596 #ifdef IRIVER_H100_SERIES
597 /* Routines for the iriver_flash -plugin. */
598 bool (*detect_original_firmware)(void);
599 bool (*detect_flashed_ramimage)(void);
600 bool (*detect_flashed_romimage)(void);
601 #endif
603 #if NUM_CORES > 1
604 void (*spinlock_init)(struct mutex *m);
605 void (*spinlock_lock)(struct mutex *m);
606 void (*spinlock_unlock)(struct mutex *m);
607 #endif
609 #if (CONFIG_CODEC == SWCODEC)
610 int (*codec_load_file)(const char* codec, struct codec_api *api);
611 bool (*get_metadata)(struct track_info* track, int fd, const char* trackname,
612 bool v1first);
613 const char *(*get_codec_filename)(int cod_spec);
614 #endif
615 struct thread_entry* threads;
617 char *(*create_numbered_filename)(char *buffer, const char *path,
618 const char *prefix, const char *suffix,
619 int numberlen IF_CNFN_NUM_(, int *num));
621 bool (*set_bool_options)(const char* string, bool* variable,
622 const char* yes_str, int yes_voice,
623 const char* no_str, int no_voice,
624 void (*function)(bool));
625 #ifdef HAVE_LCD_COLOR
626 bool (*set_color)(struct screen *display, char *title, unsigned *color,
627 unsigned banned_color);
628 #endif
631 /* plugin header */
632 struct plugin_header {
633 unsigned long magic;
634 unsigned short target_id;
635 unsigned short api_version;
636 unsigned char *load_addr;
637 unsigned char *end_addr;
638 enum plugin_status(*entry_point)(struct plugin_api*, void*);
641 #ifdef PLUGIN
642 #ifndef SIMULATOR
643 extern unsigned char plugin_start_addr[];
644 extern unsigned char plugin_end_addr[];
645 #define PLUGIN_HEADER \
646 const struct plugin_header __header \
647 __attribute__ ((section (".header")))= { \
648 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
649 plugin_start_addr, plugin_end_addr, plugin_start };
650 #else /* SIMULATOR */
651 #define PLUGIN_HEADER \
652 const struct plugin_header __header = { \
653 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
654 NULL, NULL, plugin_start };
655 #endif /* SIMULATOR */
657 #ifdef USE_IRAM
658 /* Declare IRAM variables */
659 #define PLUGIN_IRAM_DECLARE \
660 extern char iramcopy[]; \
661 extern char iramstart[]; \
662 extern char iramend[]; \
663 extern char iedata[]; \
664 extern char iend[];
665 /* Initialize IRAM */
666 #define PLUGIN_IRAM_INIT(api) \
667 (api)->plugin_iram_init(iramstart, iramcopy, iramend-iramstart, \
668 iedata, iend-iedata);
669 #else
670 #define PLUGIN_IRAM_DECLARE
671 #define PLUGIN_IRAM_INIT(api)
672 #endif /* USE_IRAM */
673 #endif /* PLUGIN */
675 int plugin_load(const char* plugin, void* parameter);
676 void* plugin_get_buffer(size_t *buffer_size);
677 void* plugin_get_audio_buffer(size_t *buffer_size);
678 #ifdef IRAM_STEAL
679 void plugin_iram_init(char *iramstart, char *iramcopy, size_t iram_size,
680 char *iedata, size_t iedata_size);
681 #endif
683 /* plugin_tsr,
684 callback returns true to allow the new plugin to load,
685 reenter means the currently running plugin is being reloaded */
686 void plugin_tsr(bool (*exit_callback)(bool reenter));
688 /* defined by the plugin */
689 enum plugin_status plugin_start(struct plugin_api* rockbox, void* parameter)
690 NO_PROF_ATTR;
692 /* Use this macro in plugins where gcc tries to optimize by calling
693 * these functions directly */
694 #define MEM_FUNCTION_WRAPPERS(api) \
695 void *memcpy(void *dest, const void *src, size_t n) \
697 return (api)->memcpy(dest, src, n); \
699 void *memset(void *dest, int c, size_t n) \
701 return (api)->memset(dest, c, n); \
703 void *memmove(void *dest, const void *src, size_t n) \
705 return (api)->memmove(dest, src, n); \
707 int memcmp(const void *s1, const void *s2, size_t n) \
709 return (api)->memcmp(s1, s2, n); \
712 #endif