Theme Editor: Factored out code to skip over enum/arg lists while scanning for childr...
[kugel-rb.git] / apps / plugin.h
bloba6b864ba44e8b87d8fd9eff2d34a5063af44a764
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2002 Björn Stenberg
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
21 #ifndef _PLUGIN_H_
22 #define _PLUGIN_H_
24 /* instruct simulator code to not redefine any symbols when compiling plugins.
25 (the PLUGIN macro is defined in apps/plugins/Makefile) */
26 #ifdef PLUGIN
27 #define NO_REDEFINES_PLEASE
28 #endif
30 #ifndef MEM
31 #define MEM 2
32 #endif
34 #include <stdbool.h>
35 #include <inttypes.h>
36 #include <sys/types.h>
37 #include <stdarg.h>
38 #include <stdio.h>
39 #include <stdlib.h>
40 #include <string.h>
41 #include "string-extra.h"
43 char* strncpy(char *, const char *, size_t);
44 void* plugin_get_buffer(size_t *buffer_size);
46 #ifndef __PCTOOL__
47 #include "config.h"
48 #include "system.h"
49 #include "dir.h"
50 #include "general.h"
51 #include "kernel.h"
52 #include "thread.h"
53 #include "button.h"
54 #include "action.h"
55 #include "usb.h"
56 #include "font.h"
57 #include "lcd.h"
58 #include "metadata.h"
59 #include "sound.h"
60 #include "mpeg.h"
61 #include "audio.h"
62 #include "mp3_playback.h"
63 #include "talk.h"
64 #ifdef RB_PROFILE
65 #include "profile.h"
66 #endif
67 #include "misc.h"
68 #if (CONFIG_CODEC == SWCODEC)
69 #include "dsp.h"
70 #include "codecs.h"
71 #include "playback.h"
72 #include "codec_thread.h"
73 #ifdef HAVE_RECORDING
74 #include "recording.h"
75 #endif
76 #else
77 #include "mas.h"
78 #endif /* CONFIG_CODEC == SWCODEC */
79 #include "settings.h"
80 #include "timer.h"
81 #include "playlist.h"
82 #ifdef HAVE_LCD_BITMAP
83 #include "screendump.h"
84 #include "scrollbar.h"
85 #include "jpeg_load.h"
86 #include "../recorder/bmp.h"
87 #endif
88 #include "statusbar.h"
89 #include "menu.h"
90 #include "rbunicode.h"
91 #include "list.h"
92 #include "tree.h"
93 #include "color_picker.h"
94 #include "buffering.h"
95 #include "tagcache.h"
96 #include "viewport.h"
97 #include "ata_idle_notify.h"
98 #include "settings_list.h"
99 #include "timefuncs.h"
100 #include "crc32.h"
102 #ifdef HAVE_ALBUMART
103 #include "albumart.h"
104 #endif
106 #ifdef HAVE_REMOTE_LCD
107 #include "lcd-remote.h"
108 #endif
110 #include "yesno.h"
112 #ifdef USB_ENABLE_HID
113 #include "usbstack/usb_hid_usage_tables.h"
114 #endif
117 /* on some platforms strcmp() seems to be a tricky define which
118 * breaks if we write down strcmp's prototype */
119 #undef strcmp
121 #ifdef PLUGIN
123 #if defined(DEBUG) || defined(SIMULATOR)
124 #undef DEBUGF
125 #define DEBUGF rb->debugf
126 #undef LDEBUGF
127 #define LDEBUGF rb->debugf
128 #else
129 #undef DEBUGF
130 #define DEBUGF(...) do { } while(0)
131 #undef LDEBUGF
132 #define LDEBUGF(...) do { } while(0)
133 #endif
135 #ifdef ROCKBOX_HAS_LOGF
136 #undef LOGF
137 #define LOGF rb->logf
138 #else
139 #define LOGF(...)
140 #endif
142 #endif
144 #define PLUGIN_MAGIC 0x526F634B /* RocK */
146 /* increase this every time the api struct changes */
147 #define PLUGIN_API_VERSION 187
149 /* update this to latest version if a change to the api struct breaks
150 backwards compatibility (and please take the opportunity to sort in any
151 new function which are "waiting" at the end of the function table) */
152 #define PLUGIN_MIN_API_VERSION 187
154 /* plugin return codes */
155 enum plugin_status {
156 PLUGIN_OK = 0,
157 PLUGIN_USB_CONNECTED,
158 PLUGIN_GOTO_WPS,
159 PLUGIN_ERROR = -1,
162 /* NOTE: To support backwards compatibility, only add new functions at
163 the end of the structure. Every time you add a new function,
164 remember to increase PLUGIN_API_VERSION. If you make changes to the
165 existing APIs then also update PLUGIN_MIN_API_VERSION to current
166 version
168 struct plugin_api {
170 /* lcd */
172 #ifdef HAVE_LCD_CONTRAST
173 void (*lcd_set_contrast)(int x);
174 #endif
175 void (*lcd_update)(void);
176 void (*lcd_clear_display)(void);
177 int (*lcd_getstringsize)(const unsigned char *str, int *w, int *h);
178 void (*lcd_putsxy)(int x, int y, const unsigned char *string);
179 void (*lcd_puts)(int x, int y, const unsigned char *string);
180 void (*lcd_puts_scroll)(int x, int y, const unsigned char* string);
181 void (*lcd_stop_scroll)(void);
182 #ifdef HAVE_LCD_CHARCELLS
183 void (*lcd_define_pattern)(unsigned long ucs, const char *pattern);
184 unsigned long (*lcd_get_locked_pattern)(void);
185 void (*lcd_unlock_pattern)(unsigned long ucs);
186 void (*lcd_putc)(int x, int y, unsigned long ucs);
187 void (*lcd_put_cursor)(int x, int y, unsigned long ucs);
188 void (*lcd_remove_cursor)(void);
189 void (*lcd_icon)(int icon, bool enable);
190 void (*lcd_double_height)(bool on);
191 #else /* HAVE_LCD_BITMAP */
192 fb_data* lcd_framebuffer;
193 void (*lcd_update_rect)(int x, int y, int width, int height);
194 void (*lcd_set_drawmode)(int mode);
195 int (*lcd_get_drawmode)(void);
196 void (*lcd_setfont)(int font);
197 void (*lcd_drawpixel)(int x, int y);
198 void (*lcd_drawline)(int x1, int y1, int x2, int y2);
199 void (*lcd_hline)(int x1, int x2, int y);
200 void (*lcd_vline)(int x, int y1, int y2);
201 void (*lcd_drawrect)(int x, int y, int width, int height);
202 void (*lcd_fillrect)(int x, int y, int width, int height);
203 void (*lcd_mono_bitmap_part)(const unsigned char *src, int src_x, int src_y,
204 int stride, int x, int y, int width, int height);
205 void (*lcd_mono_bitmap)(const unsigned char *src, int x, int y,
206 int width, int height);
207 #if LCD_DEPTH > 1
208 void (*lcd_set_foreground)(unsigned foreground);
209 unsigned (*lcd_get_foreground)(void);
210 void (*lcd_set_background)(unsigned foreground);
211 unsigned (*lcd_get_background)(void);
212 void (*lcd_bitmap_part)(const fb_data *src, int src_x, int src_y,
213 int stride, int x, int y, int width, int height);
214 void (*lcd_bitmap)(const fb_data *src, int x, int y, int width,
215 int height);
216 fb_data* (*lcd_get_backdrop)(void);
217 void (*lcd_set_backdrop)(fb_data* backdrop);
218 #endif
219 #if LCD_DEPTH == 16
220 void (*lcd_bitmap_transparent_part)(const fb_data *src,
221 int src_x, int src_y, int stride,
222 int x, int y, int width, int height);
223 void (*lcd_bitmap_transparent)(const fb_data *src, int x, int y,
224 int width, int height);
225 #if MEMORYSIZE > 2
226 void (*lcd_blit_yuv)(unsigned char * const src[3],
227 int src_x, int src_y, int stride,
228 int x, int y, int width, int height);
229 #if defined(TOSHIBA_GIGABEAT_F) || defined(SANSA_E200) || defined(SANSA_C200) \
230 || defined(IRIVER_H10) || defined(COWON_D2) || defined(PHILIPS_HDD1630) \
231 || defined(SANSA_FUZE) || defined(SANSA_E200V2) || defined(SANSA_FUZEV2) \
232 || defined(TOSHIBA_GIGABEAT_S)
233 void (*lcd_yuv_set_options)(unsigned options);
234 #endif
235 #endif /* MEMORYSIZE > 2 */
236 #elif (LCD_DEPTH < 4) && !defined(SIMULATOR)
237 void (*lcd_blit_mono)(const unsigned char *data, int x, int by, int width,
238 int bheight, int stride);
239 void (*lcd_blit_grey_phase)(unsigned char *values, unsigned char *phases,
240 int bx, int by, int bwidth, int bheight,
241 int stride);
242 #endif /* LCD_DEPTH */
243 #if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256)
244 void (*lcd_blit_pal256)(unsigned char *src, int src_x, int src_y, int x, int y,
245 int width, int height);
246 void (*lcd_pal256_update_pal)(fb_data *palette);
247 #endif
248 void (*lcd_puts_style)(int x, int y, const unsigned char *str, int style);
249 void (*lcd_puts_scroll_style)(int x, int y, const unsigned char* string,
250 int style);
251 #ifdef HAVE_LCD_INVERT
252 void (*lcd_set_invert_display)(bool yesno);
253 #endif /* HAVE_LCD_INVERT */
254 #if defined(HAVE_LCD_MODES)
255 void (*lcd_set_mode)(int mode);
256 #endif
258 #if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP)
259 struct event_queue *button_queue;
260 #endif
261 unsigned short *(*bidi_l2v)( const unsigned char *str, int orientation );
262 #ifdef HAVE_LCD_BITMAP
263 bool (*is_diacritic)(const unsigned short char_code, bool *is_rtl);
264 #endif
265 const unsigned char *(*font_get_bits)( struct font *pf, unsigned short char_code );
266 int (*font_load)(struct font*, const char *path);
267 struct font* (*font_get)(int font);
268 int (*font_getstringsize)(const unsigned char *str, int *w, int *h,
269 int fontnumber);
270 int (*font_get_width)(struct font* pf, unsigned short char_code);
271 void (*screen_clear_area)(struct screen * display, int xstart, int ystart,
272 int width, int height);
273 void (*gui_scrollbar_draw)(struct screen * screen, int x, int y,
274 int width, int height, int items,
275 int min_shown, int max_shown,
276 unsigned flags);
277 #endif /* HAVE_LCD_BITMAP */
278 const char* (*get_codepage_name)(int cp);
280 /* backlight */
281 /* The backlight_* functions must be present in the API regardless whether
282 * HAVE_BACKLIGHT is defined or not. The reason is that the stock Ondio has
283 * no backlight but can be modded to have backlight (it's prepared on the
284 * PCB). This makes backlight an all-target feature API wise, and keeps API
285 * compatible between stock and modded Ondio.
286 * For OLED targets like the Sansa Clip, the backlight_* functions control
287 * the display enable, which has essentially the same effect. */
288 void (*backlight_on)(void);
289 void (*backlight_off)(void);
290 void (*backlight_set_timeout)(int index);
291 #ifdef HAVE_BACKLIGHT_BRIGHTNESS
292 void (*backlight_set_brightness)(int val);
293 #endif /* HAVE_BACKLIGHT_BRIGHTNESS */
295 #if CONFIG_CHARGING
296 void (*backlight_set_timeout_plugged)(int index);
297 #endif
298 bool (*is_backlight_on)(bool ignore_always_off);
299 void (*splash)(int ticks, const char *str);
300 void (*splashf)(int ticks, const char *fmt, ...) ATTRIBUTE_PRINTF(2, 3);
302 #ifdef HAVE_REMOTE_LCD
303 /* remote lcd */
304 void (*lcd_remote_set_contrast)(int x);
305 void (*lcd_remote_clear_display)(void);
306 void (*lcd_remote_puts)(int x, int y, const unsigned char *string);
307 void (*lcd_remote_puts_scroll)(int x, int y, const unsigned char* string);
308 void (*lcd_remote_stop_scroll)(void);
309 void (*lcd_remote_set_drawmode)(int mode);
310 int (*lcd_remote_get_drawmode)(void);
311 void (*lcd_remote_setfont)(int font);
312 int (*lcd_remote_getstringsize)(const unsigned char *str, int *w, int *h);
313 void (*lcd_remote_drawpixel)(int x, int y);
314 void (*lcd_remote_drawline)(int x1, int y1, int x2, int y2);
315 void (*lcd_remote_hline)(int x1, int x2, int y);
316 void (*lcd_remote_vline)(int x, int y1, int y2);
317 void (*lcd_remote_drawrect)(int x, int y, int nx, int ny);
318 void (*lcd_remote_fillrect)(int x, int y, int nx, int ny);
319 void (*lcd_remote_mono_bitmap_part)(const unsigned char *src, int src_x,
320 int src_y, int stride, int x, int y,
321 int width, int height);
322 void (*lcd_remote_mono_bitmap)(const unsigned char *src, int x, int y,
323 int width, int height);
324 void (*lcd_remote_putsxy)(int x, int y, const unsigned char *string);
325 void (*lcd_remote_puts_style)(int x, int y, const unsigned char *str, int style);
326 void (*lcd_remote_puts_scroll_style)(int x, int y, const unsigned char* string,
327 int style);
328 fb_remote_data* lcd_remote_framebuffer;
329 void (*lcd_remote_update)(void);
330 void (*lcd_remote_update_rect)(int x, int y, int width, int height);
332 void (*remote_backlight_on)(void);
333 void (*remote_backlight_off)(void);
334 void (*remote_backlight_set_timeout)(int index);
335 #if CONFIG_CHARGING
336 void (*remote_backlight_set_timeout_plugged)(int index);
337 #endif
338 #endif /* HAVE_REMOTE_LCD */
339 struct screen* screens[NB_SCREENS];
340 #if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)
341 void (*lcd_remote_set_foreground)(unsigned foreground);
342 unsigned (*lcd_remote_get_foreground)(void);
343 void (*lcd_remote_set_background)(unsigned background);
344 unsigned (*lcd_remote_get_background)(void);
345 void (*lcd_remote_bitmap_part)(const fb_remote_data *src,
346 int src_x, int src_y, int stride,
347 int x, int y, int width, int height);
348 void (*lcd_remote_bitmap)(const fb_remote_data *src, int x, int y,
349 int width, int height);
350 #endif
351 void (*viewport_set_defaults)(struct viewport *vp,
352 const enum screen_type screen);
353 #ifdef HAVE_LCD_BITMAP
354 void (*viewportmanager_theme_enable)(enum screen_type screen, bool enable,
355 struct viewport *viewport);
356 void (*viewportmanager_theme_undo)(enum screen_type screen, bool force_redraw);
357 #endif
358 /* list */
359 void (*gui_synclist_init)(struct gui_synclist * lists,
360 list_get_name callback_get_item_name, void * data,
361 bool scroll_all,int selected_size,
362 struct viewport parent[NB_SCREENS]);
363 void (*gui_synclist_set_nb_items)(struct gui_synclist * lists, int nb_items);
364 void (*gui_synclist_set_icon_callback)(struct gui_synclist * lists,
365 list_get_icon icon_callback);
366 int (*gui_synclist_get_nb_items)(struct gui_synclist * lists);
367 int (*gui_synclist_get_sel_pos)(struct gui_synclist * lists);
368 void (*gui_synclist_draw)(struct gui_synclist * lists);
369 void (*gui_synclist_select_item)(struct gui_synclist * lists,
370 int item_number);
371 void (*gui_synclist_add_item)(struct gui_synclist * lists);
372 void (*gui_synclist_del_item)(struct gui_synclist * lists);
373 void (*gui_synclist_limit_scroll)(struct gui_synclist * lists, bool scroll);
374 bool (*gui_synclist_do_button)(struct gui_synclist * lists,
375 int *action, enum list_wrap wrap);
376 void (*gui_synclist_set_title)(struct gui_synclist *lists, char* title,
377 enum themable_icons icon);
378 enum yesno_res (*gui_syncyesno_run)(const struct text_message * main_message,
379 const struct text_message * yes_message,
380 const struct text_message * no_message);
381 void (*simplelist_info_init)(struct simplelist_info *info, char* title,
382 int count, void* data);
383 bool (*simplelist_show_list)(struct simplelist_info *info);
385 /* button */
386 long (*button_get)(bool block);
387 long (*button_get_w_tmo)(int ticks);
388 int (*button_status)(void);
389 #ifdef HAVE_BUTTON_DATA
390 intptr_t (*button_get_data)(void);
391 int (*button_status_wdata)(int *pdata);
392 #endif
393 void (*button_clear_queue)(void);
394 int (*button_queue_count)(void);
395 #ifdef HAS_BUTTON_HOLD
396 bool (*button_hold)(void);
397 #endif
398 #ifdef HAVE_TOUCHSCREEN
399 void (*touchscreen_set_mode)(enum touchscreen_mode);
400 #endif
401 #ifdef HAVE_BUTTON_LIGHT
402 void (*buttonlight_set_timeout)(int value);
403 void (*buttonlight_off)(void);
404 void (*buttonlight_on)(void);
405 #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS
406 void (*buttonlight_set_brightness)(int val);
407 #endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */
408 #endif /* HAVE_BUTTON_LIGHT */
410 /* file */
411 int (*open_utf8)(const char* pathname, int flags);
412 int (*open)(const char* pathname, int flags, ...);
413 int (*close)(int fd);
414 ssize_t (*read)(int fd, void* buf, size_t count);
415 off_t (*lseek)(int fd, off_t offset, int whence);
416 int (*creat)(const char *pathname, mode_t mode);
417 ssize_t (*write)(int fd, const void* buf, size_t count);
418 int (*remove)(const char* pathname);
419 int (*rename)(const char* path, const char* newname);
420 int (*ftruncate)(int fd, off_t length);
421 off_t (*filesize)(int fd);
422 int (*fdprintf)(int fd, const char *fmt, ...) ATTRIBUTE_PRINTF(2, 3);
423 int (*read_line)(int fd, char* buffer, int buffer_size);
424 bool (*settings_parseline)(char* line, char** name, char** value);
425 void (*storage_sleep)(void);
426 void (*storage_spin)(void);
427 void (*storage_spindown)(int seconds);
428 #if USING_STORAGE_CALLBACK
429 void (*register_storage_idle_func)(void (*function)(void *data));
430 void (*unregister_storage_idle_func)(void (*function)(void *data), bool run);
431 #endif /* USING_STORAGE_CALLBACK */
432 void (*reload_directory)(void);
433 char *(*create_numbered_filename)(char *buffer, const char *path,
434 const char *prefix, const char *suffix,
435 int numberlen IF_CNFN_NUM_(, int *num));
436 bool (*file_exists)(const char *file);
437 char* (*strip_extension)(char* buffer, int buffer_size, const char *filename);
438 unsigned (*crc_32)(const void *src, unsigned len, unsigned crc32);
441 /* dir */
442 DIR* (*opendir)(const char* name);
443 int (*closedir)(DIR* dir);
444 struct dirent* (*readdir)(DIR* dir);
445 int (*mkdir)(const char *name);
446 int (*rmdir)(const char *name);
447 bool (*dir_exists)(const char *path);
449 /* kernel/ system */
450 #ifdef CPU_ARM
451 void (*__div0)(void);
452 #endif
453 void (*sleep)(int ticks);
454 void (*yield)(void);
455 volatile long* current_tick;
456 long (*default_event_handler)(long event);
457 long (*default_event_handler_ex)(long event,
458 void (*callback)(void *), void *parameter);
459 unsigned int (*create_thread)(void (*function)(void), void* stack,
460 size_t stack_size, unsigned flags,
461 const char *name
462 IF_PRIO(, int priority)
463 IF_COP(, unsigned int core));
464 void (*thread_exit)(void);
465 void (*thread_wait)(unsigned int thread_id);
466 #if CONFIG_CODEC == SWCODEC
467 void (*thread_thaw)(unsigned int thread_id);
468 #ifdef HAVE_PRIORITY_SCHEDULING
469 int (*thread_set_priority)(unsigned int thread_id, int priority);
470 #endif
471 void (*mutex_init)(struct mutex *m);
472 void (*mutex_lock)(struct mutex *m);
473 void (*mutex_unlock)(struct mutex *m);
474 #endif
476 void (*reset_poweroff_timer)(void);
477 #ifndef SIMULATOR
478 int (*system_memory_guard)(int newmode);
479 long *cpu_frequency;
480 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
481 #ifdef CPU_BOOST_LOGGING
482 void (*cpu_boost_)(bool on_off,char*location,int line);
483 #else
484 void (*cpu_boost)(bool on_off);
485 #endif
486 #endif /* HAVE_ADJUSTABLE_CPU_FREQ */
487 #endif /* !SIMULATOR */
488 #ifdef HAVE_SCHEDULER_BOOSTCTRL
489 void (*trigger_cpu_boost)(void);
490 void (*cancel_cpu_boost)(void);
491 #endif
492 #if NUM_CORES > 1
493 void (*cpucache_flush)(void);
494 void (*cpucache_invalidate)(void);
495 #endif
496 bool (*timer_register)(int reg_prio, void (*unregister_callback)(void),
497 long cycles, void (*timer_callback)(void)
498 IF_COP(, int core));
499 void (*timer_unregister)(void);
500 bool (*timer_set_period)(long count);
502 void (*queue_init)(struct event_queue *q, bool register_queue);
503 void (*queue_delete)(struct event_queue *q);
504 void (*queue_post)(struct event_queue *q, long id, intptr_t data);
505 void (*queue_wait_w_tmo)(struct event_queue *q, struct queue_event *ev,
506 int ticks);
507 #if CONFIG_CODEC == SWCODEC
508 void (*queue_enable_queue_send)(struct event_queue *q,
509 struct queue_sender_list *send,
510 unsigned int thread_id);
511 bool (*queue_empty)(const struct event_queue *q);
512 void (*queue_wait)(struct event_queue *q, struct queue_event *ev);
513 intptr_t (*queue_send)(struct event_queue *q, long id,
514 intptr_t data);
515 void (*queue_reply)(struct event_queue *q, intptr_t retval);
516 #endif /* CONFIG_CODEC == SWCODEC */
518 void (*usb_acknowledge)(long id);
519 #ifdef USB_ENABLE_HID
520 void (*usb_hid_send)(usage_page_t usage_page, int id);
521 #endif
522 #ifdef RB_PROFILE
523 void (*profile_thread)(void);
524 void (*profstop)(void);
525 void (*profile_func_enter)(void *this_fn, void *call_site);
526 void (*profile_func_exit)(void *this_fn, void *call_site);
527 #endif
528 /* event api */
529 bool (*add_event)(unsigned short id, bool oneshot, void (*handler)(void *data));
530 void (*remove_event)(unsigned short id, void (*handler)(void *data));
531 void (*send_event)(unsigned short id, void *data);
533 #ifdef SIMULATOR
534 /* special simulator hooks */
535 #if defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8
536 void (*sim_lcd_ex_init)(unsigned long (*getpixel)(int, int));
537 void (*sim_lcd_ex_update_rect)(int x, int y, int width, int height);
538 #endif
539 #endif
541 /* strings and memory */
542 int (*snprintf)(char *buf, size_t size, const char *fmt, ...)
543 ATTRIBUTE_PRINTF(3, 4);
544 int (*vsnprintf)(char *buf, size_t size, const char *fmt, va_list ap);
545 char* (*strcpy)(char *dst, const char *src);
546 size_t (*strlcpy)(char *dst, const char *src, size_t length);
547 size_t (*strlen)(const char *str);
548 char * (*strrchr)(const char *s, int c);
549 int (*strcmp)(const char *, const char *);
550 int (*strncmp)(const char *, const char *, size_t);
551 int (*strcasecmp)(const char *, const char *);
552 int (*strncasecmp)(const char *s1, const char *s2, size_t n);
553 void* (*memset)(void *dst, int c, size_t length);
554 void* (*memcpy)(void *out, const void *in, size_t n);
555 void* (*memmove)(void *out, const void *in, size_t n);
556 #ifndef SIMULATOR
557 const unsigned char *_rbctype_;
558 #endif
559 int (*atoi)(const char *str);
560 char *(*strchr)(const char *s, int c);
561 char *(*strcat)(char *s1, const char *s2);
562 size_t (*strlcat)(char *dst, const char *src, size_t length);
563 void *(*memchr)(const void *s1, int c, size_t n);
564 int (*memcmp)(const void *s1, const void *s2, size_t n);
565 char *(*strcasestr) (const char* phaystack, const char* pneedle);
566 char* (*strtok_r)(char *ptr, const char *sep, char **end);
567 /* unicode stuff */
568 const unsigned char* (*utf8decode)(const unsigned char *utf8, unsigned short *ucs);
569 unsigned char* (*iso_decode)(const unsigned char *iso, unsigned char *utf8, int cp, int count);
570 unsigned char* (*utf16LEdecode)(const unsigned char *utf16, unsigned char *utf8, int count);
571 unsigned char* (*utf16BEdecode)(const unsigned char *utf16, unsigned char *utf8, int count);
572 unsigned char* (*utf8encode)(unsigned long ucs, unsigned char *utf8);
573 unsigned long (*utf8length)(const unsigned char *utf8);
574 int (*utf8seek)(const unsigned char* utf8, int offset);
576 /* sound */
577 void (*sound_set)(int setting, int value);
578 int (*sound_default)(int setting);
579 int (*sound_min)(int setting);
580 int (*sound_max)(int setting);
581 const char * (*sound_unit)(int setting);
582 int (*sound_val2phys)(int setting, int value);
583 #ifdef AUDIOHW_HAVE_EQ
584 int (*sound_enum_hw_eq_band_setting)(unsigned int band,
585 unsigned int band_setting);
586 #endif /* AUDIOHW_HAVE_EQ */
587 #ifndef SIMULATOR
588 void (*mp3_play_data)(const unsigned char* start, int size,
589 void (*get_more)(unsigned char** start, size_t* size));
590 void (*mp3_play_pause)(bool play);
591 void (*mp3_play_stop)(void);
592 bool (*mp3_is_playing)(void);
593 #if CONFIG_CODEC != SWCODEC
594 void (*bitswap)(unsigned char *data, int length);
595 #endif
596 #endif /* !SIMULATOR */
597 #if CONFIG_CODEC == SWCODEC
598 const unsigned long *audio_master_sampr_list;
599 const unsigned long *hw_freq_sampr;
600 void (*pcm_apply_settings)(void);
601 void (*pcm_play_data)(pcm_play_callback_type get_more,
602 unsigned char* start, size_t size);
603 void (*pcm_play_stop)(void);
604 void (*pcm_set_frequency)(unsigned int frequency);
605 bool (*pcm_is_playing)(void);
606 bool (*pcm_is_paused)(void);
607 void (*pcm_play_pause)(bool play);
608 size_t (*pcm_get_bytes_waiting)(void);
609 void (*pcm_calculate_peaks)(int *left, int *right);
610 const void* (*pcm_get_peak_buffer)(int *count);
611 void (*pcm_play_lock)(void);
612 void (*pcm_play_unlock)(void);
613 void (*pcmbuf_beep)(unsigned int frequency,
614 size_t duration,
615 int amplitude);
616 #ifdef HAVE_RECORDING
617 const unsigned long *rec_freq_sampr;
618 void (*pcm_init_recording)(void);
619 void (*pcm_close_recording)(void);
620 void (*pcm_record_data)(pcm_rec_callback_type more_ready,
621 void *start, size_t size);
622 void (*pcm_stop_recording)(void);
623 void (*pcm_calculate_rec_peaks)(int *left, int *right);
624 void (*audio_set_recording_gain)(int left, int right, int type);
625 #endif /* HAVE_RECORDING */
626 #if INPUT_SRC_CAPS != 0
627 void (*audio_set_output_source)(int monitor);
628 void (*audio_set_input_source)(int source, unsigned flags);
629 #endif
630 void (*dsp_set_crossfeed)(bool enable);
631 void (*dsp_set_eq)(bool enable);
632 void (*dsp_dither_enable)(bool enable);
633 intptr_t (*dsp_configure)(struct dsp_config *dsp, int setting,
634 intptr_t value);
635 int (*dsp_process)(struct dsp_config *dsp, char *dest,
636 const char *src[], int count);
637 int (*dsp_input_count)(struct dsp_config *dsp, int count);
638 int (*dsp_output_count)(struct dsp_config *dsp, int count);
639 #endif /* CONFIG_CODEC == SWCODC */
641 /* playback control */
642 int (*playlist_amount)(void);
643 int (*playlist_resume)(void);
644 void (*playlist_start)(int start_index, int offset);
645 int (*playlist_add)(const char *filename);
646 void (*playlist_sync)(struct playlist_info* playlist);
647 int (*playlist_remove_all_tracks)(struct playlist_info *playlist);
648 int (*playlist_create)(const char *dir, const char *file);
649 int (*playlist_insert_track)(struct playlist_info* playlist,
650 const char *filename, int position, bool queue, bool sync);
651 int (*playlist_insert_directory)(struct playlist_info* playlist,
652 const char *dirname, int position, bool queue,
653 bool recurse);
654 int (*playlist_shuffle)(int random_seed, int start_index);
655 void (*audio_play)(long offset);
656 void (*audio_stop)(void);
657 void (*audio_pause)(void);
658 void (*audio_resume)(void);
659 void (*audio_next)(void);
660 void (*audio_prev)(void);
661 void (*audio_ff_rewind)(long newtime);
662 struct mp3entry* (*audio_next_track)(void);
663 int (*audio_status)(void);
664 struct mp3entry* (*audio_current_track)(void);
665 void (*audio_flush_and_reload_tracks)(void);
666 int (*audio_get_file_pos)(void);
667 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
668 unsigned long (*mpeg_get_last_header)(void);
669 #endif
670 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) || \
671 (CONFIG_CODEC == SWCODEC)
672 void (*sound_set_pitch)(int32_t pitch);
673 #endif
675 /* MAS communication */
676 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
677 int (*mas_readmem)(int bank, int addr, unsigned long* dest, int len);
678 int (*mas_writemem)(int bank, int addr, const unsigned long* src, int len);
679 int (*mas_readreg)(int reg);
680 int (*mas_writereg)(int reg, unsigned int val);
681 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
682 int (*mas_codec_writereg)(int reg, unsigned int val);
683 int (*mas_codec_readreg)(int reg);
684 void (*i2c_begin)(void);
685 void (*i2c_end)(void);
686 int (*i2c_write)(int address, const unsigned char* buf, int count );
687 #endif
688 #endif
690 /* menu */
691 int (*do_menu)(const struct menu_item_ex *menu, int *start_selected,
692 struct viewport parent[NB_SCREENS], bool hide_theme);
694 /* scroll bar */
695 struct gui_syncstatusbar *statusbars;
696 void (*gui_syncstatusbar_draw)(struct gui_syncstatusbar * bars, bool force_redraw);
698 /* options */
699 const struct settings_list* (*get_settings_list)(int*count);
700 const struct settings_list* (*find_setting)(const void* variable, int *id);
701 bool (*option_screen)(const struct settings_list *setting,
702 struct viewport parent[NB_SCREENS],
703 bool use_temp_var, unsigned char* option_title);
704 bool (*set_option)(const char* string, const void* variable,
705 enum optiontype type, const struct opt_items* options,
706 int numoptions, void (*function)(int));
707 bool (*set_bool_options)(const char* string, const bool* variable,
708 const char* yes_str, int yes_voice,
709 const char* no_str, int no_voice,
710 void (*function)(bool));
711 bool (*set_int)(const unsigned char* string, const char* unit, int voice_unit,
712 const int* variable, void (*function)(int), int step,
713 int min, int max,
714 const char* (*formatter)(char*, size_t, int, const char*) );
715 bool (*set_bool)(const char* string, const bool* variable );
717 #ifdef HAVE_LCD_COLOR
718 bool (*set_color)(struct screen *display, char *title,
719 unsigned *color, unsigned banned_color);
720 #endif
721 /* action handling */
722 int (*get_custom_action)(int context,int timeout,
723 const struct button_mapping* (*get_context_map)(int));
724 int (*get_action)(int context, int timeout);
725 #ifdef HAVE_TOUCHSCREEN
726 int (*action_get_touchscreen_press)(short *x, short *y);
727 #endif
728 bool (*action_userabort)(int timeout);
730 /* power */
731 int (*battery_level)(void);
732 bool (*battery_level_safe)(void);
733 int (*battery_time)(void);
734 #ifndef SIMULATOR
735 unsigned int (*battery_voltage)(void);
736 #endif
737 #if CONFIG_CHARGING
738 bool (*charger_inserted)(void);
739 # if CONFIG_CHARGING >= CHARGING_MONITOR
740 bool (*charging_state)(void);
741 # endif
742 #endif
743 #ifdef HAVE_USB_POWER
744 bool (*usb_powered)(void);
745 #endif
747 /* misc */
748 #if !defined(SIMULATOR)
749 int* __errno;
750 #endif
751 void (*srand)(unsigned int seed);
752 int (*rand)(void);
753 void (*qsort)(void *base, size_t nmemb, size_t size,
754 int(*compar)(const void *, const void *));
755 int (*kbd_input)(char* buffer, int buflen);
756 struct tm* (*get_time)(void);
757 int (*set_time)(const struct tm *tm);
758 #if CONFIG_RTC
759 time_t (*mktime)(struct tm *t);
760 #endif
761 void* (*plugin_get_buffer)(size_t *buffer_size);
762 void* (*plugin_get_audio_buffer)(size_t *buffer_size);
763 void (*plugin_tsr)(bool (*exit_callback)(bool reenter));
764 char* (*plugin_get_current_filename)(void);
765 #ifdef PLUGIN_USE_IRAM
766 void (*plugin_iram_init)(char *iramstart, char *iramcopy, size_t iram_size,
767 char *iedata, size_t iedata_size);
768 #endif
769 #if defined(DEBUG) || defined(SIMULATOR)
770 void (*debugf)(const char *fmt, ...) ATTRIBUTE_PRINTF(1, 2);
771 #endif
772 #ifdef ROCKBOX_HAS_LOGF
773 void (*logf)(const char *fmt, ...) ATTRIBUTE_PRINTF(1, 2);
774 #endif
775 struct user_settings* global_settings;
776 struct system_status *global_status;
777 void (*talk_disable)(bool disable);
778 #if CONFIG_CODEC == SWCODEC
779 void (*codec_thread_do_callback)(void (*fn)(void),
780 unsigned int *audio_thread_id);
781 int (*codec_load_file)(const char* codec, struct codec_api *api);
782 const char *(*get_codec_filename)(int cod_spec);
783 void ** (*find_array_ptr)(void **arr, void *ptr);
784 int (*remove_array_ptr)(void **arr, void *ptr);
785 #if defined(HAVE_RECORDING) && (defined(HAVE_LINE_IN) || defined(HAVE_MIC_IN))
786 int (*round_value_to_list32)(unsigned long value,
787 const unsigned long list[],
788 int count,
789 bool signd);
790 #endif
791 #endif /* CONFIG_CODEC == SWCODEC */
792 bool (*get_metadata)(struct mp3entry* id3, int fd, const char* trackname);
793 bool (*mp3info)(struct mp3entry *entry, const char *filename);
794 int (*count_mp3_frames)(int fd, int startpos, int filesize,
795 void (*progressfunc)(int));
796 int (*create_xing_header)(int fd, long startpos, long filesize,
797 unsigned char *buf, unsigned long num_frames,
798 unsigned long rec_time, unsigned long header_template,
799 void (*progressfunc)(int), bool generate_toc);
800 unsigned long (*find_next_frame)(int fd, long *offset,
801 long max_offset, unsigned long last_header);
803 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
804 unsigned short (*peak_meter_scale_value)(unsigned short val,
805 int meterwidth);
806 void (*peak_meter_set_use_dbfs)(bool use);
807 bool (*peak_meter_get_use_dbfs)(void);
808 #endif
809 #ifdef HAVE_LCD_BITMAP
810 int (*read_bmp_file)(const char* filename, struct bitmap *bm, int maxsize,
811 int format, const struct custom_format *cformat);
812 int (*read_bmp_fd)(int fd, struct bitmap *bm, int maxsize,
813 int format, const struct custom_format *cformat);
814 #ifdef HAVE_JPEG
815 int (*read_jpeg_file)(const char* filename, struct bitmap *bm, int maxsize,
816 int format, const struct custom_format *cformat);
817 int (*read_jpeg_fd)(int fd, struct bitmap *bm, int maxsize,
818 int format, const struct custom_format *cformat);
819 #endif
820 void (*screen_dump_set_hook)(void (*hook)(int fh));
821 #endif
822 int (*show_logo)(void);
823 struct tree_context* (*tree_get_context)(void);
824 void (*set_current_file)(char* path);
825 void (*set_dirfilter)(int l_dirfilter);
827 #ifdef HAVE_WHEEL_POSITION
828 int (*wheel_status)(void);
829 void (*wheel_send_events)(bool send);
830 #endif
832 #ifdef IRIVER_H100_SERIES
833 /* Routines for the iriver_flash -plugin. */
834 bool (*detect_original_firmware)(void);
835 bool (*detect_flashed_ramimage)(void);
836 bool (*detect_flashed_romimage)(void);
837 #endif
839 void (*led)(bool on);
841 #if (CONFIG_CODEC == SWCODEC)
842 /* buffering API */
843 int (*bufopen)(const char *file, size_t offset, enum data_type type,
844 void *user_data);
845 int (*bufalloc)(const void *src, size_t size, enum data_type type);
846 bool (*bufclose)(int handle_id);
847 int (*bufseek)(int handle_id, size_t newpos);
848 int (*bufadvance)(int handle_id, off_t offset);
849 ssize_t (*bufread)(int handle_id, size_t size, void *dest);
850 ssize_t (*bufgetdata)(int handle_id, size_t size, void **data);
851 ssize_t (*bufgettail)(int handle_id, size_t size, void **data);
852 ssize_t (*bufcuttail)(int handle_id, size_t size);
854 ssize_t (*buf_get_offset)(int handle_id, void *ptr);
855 ssize_t (*buf_handle_offset)(int handle_id);
856 void (*buf_request_buffer_handle)(int handle_id);
857 void (*buf_set_base_handle)(int handle_id);
858 size_t (*buf_used)(void);
859 #endif
861 #ifdef HAVE_TAGCACHE
862 bool (*tagcache_search)(struct tagcache_search *tcs, int tag);
863 void (*tagcache_search_set_uniqbuf)(struct tagcache_search *tcs,
864 void *buffer, long length);
865 bool (*tagcache_search_add_filter)(struct tagcache_search *tcs,
866 int tag, int seek);
867 bool (*tagcache_get_next)(struct tagcache_search *tcs);
868 bool (*tagcache_retrieve)(struct tagcache_search *tcs, int idxid,
869 int tag, char *buf, long size);
870 void (*tagcache_search_finish)(struct tagcache_search *tcs);
871 long (*tagcache_get_numeric)(const struct tagcache_search *tcs, int tag);
872 #ifdef HAVE_TC_RAMCACHE
873 bool (*tagcache_fill_tags)(struct mp3entry *id3, const char *filename);
874 #endif
875 #endif
877 #ifdef HAVE_ALBUMART
878 bool (*search_albumart_files)(const struct mp3entry *id3, const char *size_string,
879 char *buf, int buflen);
880 #endif
882 #ifdef HAVE_SEMAPHORE_OBJECTS
883 void (*semaphore_init)(struct semaphore *s, int max, int start);
884 void (*semaphore_wait)(struct semaphore *s);
885 void (*semaphore_release)(struct semaphore *s);
886 #endif
888 const char *rbversion;
889 /* new stuff at the end, sort into place next time
890 the API gets incompatible */
893 /* plugin header */
894 struct plugin_header {
895 unsigned long magic;
896 unsigned short target_id;
897 unsigned short api_version;
898 unsigned char *load_addr;
899 unsigned char *end_addr;
900 enum plugin_status(*entry_point)(const void*);
901 const struct plugin_api **api;
904 #ifdef PLUGIN
905 #ifndef SIMULATOR
906 extern unsigned char plugin_start_addr[];
907 extern unsigned char plugin_end_addr[];
908 #define PLUGIN_HEADER \
909 const struct plugin_api *rb DATA_ATTR; \
910 const struct plugin_header __header \
911 __attribute__ ((section (".header")))= { \
912 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
913 plugin_start_addr, plugin_end_addr, plugin_start, &rb };
914 #else /* SIMULATOR */
915 #define PLUGIN_HEADER \
916 const struct plugin_api *rb DATA_ATTR; \
917 const struct plugin_header __header \
918 __attribute__((visibility("default"))) = { \
919 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
920 NULL, NULL, plugin_start, &rb };
921 #endif /* SIMULATOR */
923 #ifdef PLUGIN_USE_IRAM
924 /* Declare IRAM variables */
925 #define PLUGIN_IRAM_DECLARE \
926 extern char iramcopy[]; \
927 extern char iramstart[]; \
928 extern char iramend[]; \
929 extern char iedata[]; \
930 extern char iend[];
931 /* Initialize IRAM */
932 #define PLUGIN_IRAM_INIT(api) \
933 (api)->plugin_iram_init(iramstart, iramcopy, iramend-iramstart, \
934 iedata, iend-iedata);
935 #else
936 #define PLUGIN_IRAM_DECLARE
937 #define PLUGIN_IRAM_INIT(api)
938 #endif /* PLUGIN_USE_IRAM */
939 #endif /* PLUGIN */
941 int plugin_load(const char* plugin, const void* parameter);
942 void* plugin_get_audio_buffer(size_t *buffer_size);
943 #ifdef PLUGIN_USE_IRAM
944 void plugin_iram_init(char *iramstart, char *iramcopy, size_t iram_size,
945 char *iedata, size_t iedata_size);
946 #endif
948 /* plugin_tsr,
949 callback returns true to allow the new plugin to load,
950 reenter means the currently running plugin is being reloaded */
951 void plugin_tsr(bool (*exit_callback)(bool reenter));
953 /* defined by the plugin */
954 extern const struct plugin_api *rb;
955 enum plugin_status plugin_start(const void* parameter)
956 NO_PROF_ATTR;
958 #endif /* __PCTOOL__ */
959 #endif