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