Rbutil now supports the Nano 2G.
[kugel-rb.git] / apps / plugin.h
blobe5766c68b5408d9bc7d52cdefdfbda5b538b3576
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 180
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 180
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(TOSHIBA_GIGABEAT_S)
223 void (*lcd_yuv_set_options)(unsigned options);
224 #endif
225 #endif /* MEMORYSIZE > 2 */
226 #elif (LCD_DEPTH < 4) && !defined(SIMULATOR)
227 void (*lcd_blit_mono)(const unsigned char *data, int x, int by, int width,
228 int bheight, int stride);
229 void (*lcd_blit_grey_phase)(unsigned char *values, unsigned char *phases,
230 int bx, int by, int bwidth, int bheight,
231 int stride);
232 #endif /* LCD_DEPTH */
233 #if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256)
234 void (*lcd_blit_pal256)(unsigned char *src, int src_x, int src_y, int x, int y,
235 int width, int height);
236 void (*lcd_pal256_update_pal)(fb_data *palette);
237 #endif
238 void (*lcd_puts_style)(int x, int y, const unsigned char *str, int style);
239 void (*lcd_puts_scroll_style)(int x, int y, const unsigned char* string,
240 int style);
241 #ifdef HAVE_LCD_INVERT
242 void (*lcd_set_invert_display)(bool yesno);
243 #endif /* HAVE_LCD_INVERT */
244 #if defined(HAVE_LCD_MODES)
245 void (*lcd_set_mode)(int mode);
246 #endif
248 #if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP)
249 struct event_queue *button_queue;
250 #endif
251 unsigned short *(*bidi_l2v)( const unsigned char *str, int orientation );
252 const unsigned char *(*font_get_bits)( struct font *pf, unsigned short char_code );
253 struct font* (*font_load)(const char *path);
254 struct font* (*font_get)(int font);
255 int (*font_getstringsize)(const unsigned char *str, int *w, int *h,
256 int fontnumber);
257 int (*font_get_width)(struct font* pf, unsigned short char_code);
258 void (*screen_clear_area)(struct screen * display, int xstart, int ystart,
259 int width, int height);
260 void (*gui_scrollbar_draw)(struct screen * screen, int x, int y,
261 int width, int height, int items,
262 int min_shown, int max_shown,
263 unsigned flags);
264 #endif /* HAVE_LCD_BITMAP */
265 const char* (*get_codepage_name)(int cp);
267 /* backlight */
268 /* The backlight_* functions must be present in the API regardless whether
269 * HAVE_BACKLIGHT is defined or not. The reason is that the stock Ondio has
270 * no backlight but can be modded to have backlight (it's prepared on the
271 * PCB). This makes backlight an all-target feature API wise, and keeps API
272 * compatible between stock and modded Ondio.
273 * For OLED targets like the Sansa Clip, the backlight_* functions control
274 * the display enable, which has essentially the same effect. */
275 void (*backlight_on)(void);
276 void (*backlight_off)(void);
277 void (*backlight_set_timeout)(int index);
278 #ifdef HAVE_BACKLIGHT_BRIGHTNESS
279 void (*backlight_set_brightness)(int val);
280 #endif /* HAVE_BACKLIGHT_BRIGHTNESS */
282 #if CONFIG_CHARGING
283 void (*backlight_set_timeout_plugged)(int index);
284 #endif
285 bool (*is_backlight_on)(bool ignore_always_off);
286 void (*splash)(int ticks, const char *str);
287 void (*splashf)(int ticks, const char *fmt, ...) ATTRIBUTE_PRINTF(2, 3);
289 #ifdef HAVE_REMOTE_LCD
290 /* remote lcd */
291 void (*lcd_remote_set_contrast)(int x);
292 void (*lcd_remote_clear_display)(void);
293 void (*lcd_remote_puts)(int x, int y, const unsigned char *string);
294 void (*lcd_remote_puts_scroll)(int x, int y, const unsigned char* string);
295 void (*lcd_remote_stop_scroll)(void);
296 void (*lcd_remote_set_drawmode)(int mode);
297 int (*lcd_remote_get_drawmode)(void);
298 void (*lcd_remote_setfont)(int font);
299 int (*lcd_remote_getstringsize)(const unsigned char *str, int *w, int *h);
300 void (*lcd_remote_drawpixel)(int x, int y);
301 void (*lcd_remote_drawline)(int x1, int y1, int x2, int y2);
302 void (*lcd_remote_hline)(int x1, int x2, int y);
303 void (*lcd_remote_vline)(int x, int y1, int y2);
304 void (*lcd_remote_drawrect)(int x, int y, int nx, int ny);
305 void (*lcd_remote_fillrect)(int x, int y, int nx, int ny);
306 void (*lcd_remote_mono_bitmap_part)(const unsigned char *src, int src_x,
307 int src_y, int stride, int x, int y,
308 int width, int height);
309 void (*lcd_remote_mono_bitmap)(const unsigned char *src, int x, int y,
310 int width, int height);
311 void (*lcd_remote_putsxy)(int x, int y, const unsigned char *string);
312 void (*lcd_remote_puts_style)(int x, int y, const unsigned char *str, int style);
313 void (*lcd_remote_puts_scroll_style)(int x, int y, const unsigned char* string,
314 int style);
315 fb_remote_data* lcd_remote_framebuffer;
316 void (*lcd_remote_update)(void);
317 void (*lcd_remote_update_rect)(int x, int y, int width, int height);
319 void (*remote_backlight_on)(void);
320 void (*remote_backlight_off)(void);
321 void (*remote_backlight_set_timeout)(int index);
322 #if CONFIG_CHARGING
323 void (*remote_backlight_set_timeout_plugged)(int index);
324 #endif
325 #endif /* HAVE_REMOTE_LCD */
326 struct screen* screens[NB_SCREENS];
327 #if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)
328 void (*lcd_remote_set_foreground)(unsigned foreground);
329 unsigned (*lcd_remote_get_foreground)(void);
330 void (*lcd_remote_set_background)(unsigned background);
331 unsigned (*lcd_remote_get_background)(void);
332 void (*lcd_remote_bitmap_part)(const fb_remote_data *src,
333 int src_x, int src_y, int stride,
334 int x, int y, int width, int height);
335 void (*lcd_remote_bitmap)(const fb_remote_data *src, int x, int y,
336 int width, int height);
337 #endif
338 void (*viewport_set_defaults)(struct viewport *vp,
339 const enum screen_type screen);
340 /* list */
341 void (*gui_synclist_init)(struct gui_synclist * lists,
342 list_get_name callback_get_item_name, void * data,
343 bool scroll_all,int selected_size,
344 struct viewport parent[NB_SCREENS]);
345 void (*gui_synclist_set_nb_items)(struct gui_synclist * lists, int nb_items);
346 void (*gui_synclist_set_icon_callback)(struct gui_synclist * lists,
347 list_get_icon icon_callback);
348 int (*gui_synclist_get_nb_items)(struct gui_synclist * lists);
349 int (*gui_synclist_get_sel_pos)(struct gui_synclist * lists);
350 void (*gui_synclist_draw)(struct gui_synclist * lists);
351 void (*gui_synclist_select_item)(struct gui_synclist * lists,
352 int item_number);
353 void (*gui_synclist_add_item)(struct gui_synclist * lists);
354 void (*gui_synclist_del_item)(struct gui_synclist * lists);
355 void (*gui_synclist_limit_scroll)(struct gui_synclist * lists, bool scroll);
356 bool (*gui_synclist_do_button)(struct gui_synclist * lists,
357 int *action, enum list_wrap wrap);
358 void (*gui_synclist_set_title)(struct gui_synclist *lists, char* title,
359 enum themable_icons icon);
360 enum yesno_res (*gui_syncyesno_run)(const struct text_message * main_message,
361 const struct text_message * yes_message,
362 const struct text_message * no_message);
363 void (*simplelist_info_init)(struct simplelist_info *info, char* title,
364 int count, void* data);
365 bool (*simplelist_show_list)(struct simplelist_info *info);
367 /* button */
368 long (*button_get)(bool block);
369 long (*button_get_w_tmo)(int ticks);
370 int (*button_status)(void);
371 #ifdef HAVE_BUTTON_DATA
372 intptr_t (*button_get_data)(void);
373 int (*button_status_wdata)(int *pdata);
374 #endif
375 void (*button_clear_queue)(void);
376 int (*button_queue_count)(void);
377 #ifdef HAS_BUTTON_HOLD
378 bool (*button_hold)(void);
379 #endif
380 #ifdef HAVE_TOUCHSCREEN
381 void (*touchscreen_set_mode)(enum touchscreen_mode);
382 #endif
383 #ifdef HAVE_BUTTON_LIGHT
384 void (*buttonlight_set_timeout)(int value);
385 void (*buttonlight_off)(void);
386 void (*buttonlight_on)(void);
387 #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS
388 void (*buttonlight_set_brightness)(int val);
389 #endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */
390 #endif /* HAVE_BUTTON_LIGHT */
392 /* file */
393 int (*open)(const char* pathname, int flags);
394 int (*close)(int fd);
395 ssize_t (*read)(int fd, void* buf, size_t count);
396 off_t (*lseek)(int fd, off_t offset, int whence);
397 int (*creat)(const char *pathname);
398 ssize_t (*write)(int fd, const void* buf, size_t count);
399 int (*remove)(const char* pathname);
400 int (*rename)(const char* path, const char* newname);
401 int (*ftruncate)(int fd, off_t length);
402 off_t (*filesize)(int fd);
403 int (*fdprintf)(int fd, const char *fmt, ...) ATTRIBUTE_PRINTF(2, 3);
404 int (*read_line)(int fd, char* buffer, int buffer_size);
405 bool (*settings_parseline)(char* line, char** name, char** value);
406 void (*storage_sleep)(void);
407 void (*storage_spin)(void);
408 void (*storage_spindown)(int seconds);
409 #if USING_STORAGE_CALLBACK
410 void (*register_storage_idle_func)(void (*function)(void *data));
411 void (*unregister_storage_idle_func)(void (*function)(void *data), bool run);
412 #endif /* USING_STORAGE_CALLBACK */
413 void (*reload_directory)(void);
414 char *(*create_numbered_filename)(char *buffer, const char *path,
415 const char *prefix, const char *suffix,
416 int numberlen IF_CNFN_NUM_(, int *num));
417 bool (*file_exists)(const char *file);
418 char* (*strip_extension)(char* buffer, int buffer_size, const char *filename);
421 /* dir */
422 DIR* (*opendir)(const char* name);
423 int (*closedir)(DIR* dir);
424 struct dirent* (*readdir)(DIR* dir);
425 int (*mkdir)(const char *name);
426 int (*rmdir)(const char *name);
427 bool (*dir_exists)(const char *path);
429 /* kernel/ system */
430 #ifdef CPU_ARM
431 void (*__div0)(void);
432 #endif
433 void (*sleep)(int ticks);
434 void (*yield)(void);
435 volatile long* current_tick;
436 long (*default_event_handler)(long event);
437 long (*default_event_handler_ex)(long event,
438 void (*callback)(void *), void *parameter);
439 unsigned int (*create_thread)(void (*function)(void), void* stack,
440 size_t stack_size, unsigned flags,
441 const char *name
442 IF_PRIO(, int priority)
443 IF_COP(, unsigned int core));
444 void (*thread_exit)(void);
445 void (*thread_wait)(unsigned int thread_id);
446 #if CONFIG_CODEC == SWCODEC
447 void (*thread_thaw)(unsigned int thread_id);
448 #ifdef HAVE_PRIORITY_SCHEDULING
449 int (*thread_set_priority)(unsigned int thread_id, int priority);
450 #endif
451 void (*mutex_init)(struct mutex *m);
452 void (*mutex_lock)(struct mutex *m);
453 void (*mutex_unlock)(struct mutex *m);
454 #endif
456 void (*reset_poweroff_timer)(void);
457 #ifndef SIMULATOR
458 int (*system_memory_guard)(int newmode);
459 long *cpu_frequency;
460 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
461 #ifdef CPU_BOOST_LOGGING
462 void (*cpu_boost_)(bool on_off,char*location,int line);
463 #else
464 void (*cpu_boost)(bool on_off);
465 #endif
466 #endif /* HAVE_ADJUSTABLE_CPU_FREQ */
467 #endif /* !SIMULATOR */
468 #ifdef HAVE_SCHEDULER_BOOSTCTRL
469 void (*trigger_cpu_boost)(void);
470 void (*cancel_cpu_boost)(void);
471 #endif
472 #if NUM_CORES > 1
473 void (*cpucache_flush)(void);
474 void (*cpucache_invalidate)(void);
475 #endif
476 bool (*timer_register)(int reg_prio, void (*unregister_callback)(void),
477 long cycles, void (*timer_callback)(void)
478 IF_COP(, int core));
479 void (*timer_unregister)(void);
480 bool (*timer_set_period)(long count);
482 void (*queue_init)(struct event_queue *q, bool register_queue);
483 void (*queue_delete)(struct event_queue *q);
484 void (*queue_post)(struct event_queue *q, long id, intptr_t data);
485 void (*queue_wait_w_tmo)(struct event_queue *q, struct queue_event *ev,
486 int ticks);
487 #if CONFIG_CODEC == SWCODEC
488 void (*queue_enable_queue_send)(struct event_queue *q,
489 struct queue_sender_list *send,
490 unsigned int thread_id);
491 bool (*queue_empty)(const struct event_queue *q);
492 void (*queue_wait)(struct event_queue *q, struct queue_event *ev);
493 intptr_t (*queue_send)(struct event_queue *q, long id,
494 intptr_t data);
495 void (*queue_reply)(struct event_queue *q, intptr_t retval);
496 #endif /* CONFIG_CODEC == SWCODEC */
498 void (*usb_acknowledge)(long id);
499 #ifdef USB_ENABLE_HID
500 void (*usb_hid_send)(usage_page_t usage_page, int id);
501 #endif
502 #ifdef RB_PROFILE
503 void (*profile_thread)(void);
504 void (*profstop)(void);
505 void (*profile_func_enter)(void *this_fn, void *call_site);
506 void (*profile_func_exit)(void *this_fn, void *call_site);
507 #endif
508 /* event api */
509 bool (*add_event)(unsigned short id, bool oneshot, void (*handler)(void *data));
510 void (*remove_event)(unsigned short id, void (*handler)(void *data));
511 void (*send_event)(unsigned short id, void *data);
513 #ifdef SIMULATOR
514 /* special simulator hooks */
515 #if defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8
516 void (*sim_lcd_ex_init)(unsigned long (*getpixel)(int, int));
517 void (*sim_lcd_ex_update_rect)(int x, int y, int width, int height);
518 #endif
519 #endif
521 /* strings and memory */
522 int (*snprintf)(char *buf, size_t size, const char *fmt, ...)
523 ATTRIBUTE_PRINTF(3, 4);
524 int (*vsnprintf)(char *buf, int size, const char *fmt, va_list ap);
525 char* (*strcpy)(char *dst, const char *src);
526 size_t (*strlcpy)(char *dst, const char *src, size_t length);
527 size_t (*strlen)(const char *str);
528 char * (*strrchr)(const char *s, int c);
529 int (*strcmp)(const char *, const char *);
530 int (*strncmp)(const char *, const char *, size_t);
531 int (*strcasecmp)(const char *, const char *);
532 int (*strncasecmp)(const char *s1, const char *s2, size_t n);
533 void* (*memset)(void *dst, int c, size_t length);
534 void* (*memcpy)(void *out, const void *in, size_t n);
535 void* (*memmove)(void *out, const void *in, size_t n);
536 const unsigned char *_rbctype_;
537 int (*atoi)(const char *str);
538 char *(*strchr)(const char *s, int c);
539 char *(*strcat)(char *s1, const char *s2);
540 void *(*memchr)(const void *s1, int c, size_t n);
541 int (*memcmp)(const void *s1, const void *s2, size_t n);
542 char *(*strcasestr) (const char* phaystack, const char* pneedle);
543 char* (*strtok_r)(char *ptr, const char *sep, char **end);
544 /* unicode stuff */
545 const unsigned char* (*utf8decode)(const unsigned char *utf8, unsigned short *ucs);
546 unsigned char* (*iso_decode)(const unsigned char *iso, unsigned char *utf8, int cp, int count);
547 unsigned char* (*utf16LEdecode)(const unsigned char *utf16, unsigned char *utf8, int count);
548 unsigned char* (*utf16BEdecode)(const unsigned char *utf16, unsigned char *utf8, int count);
549 unsigned char* (*utf8encode)(unsigned long ucs, unsigned char *utf8);
550 unsigned long (*utf8length)(const unsigned char *utf8);
551 int (*utf8seek)(const unsigned char* utf8, int offset);
553 /* sound */
554 void (*sound_set)(int setting, int value);
555 int (*sound_default)(int setting);
556 int (*sound_min)(int setting);
557 int (*sound_max)(int setting);
558 const char * (*sound_unit)(int setting);
559 int (*sound_val2phys)(int setting, int value);
560 #ifndef SIMULATOR
561 void (*mp3_play_data)(const unsigned char* start, int size,
562 void (*get_more)(unsigned char** start, size_t* size));
563 void (*mp3_play_pause)(bool play);
564 void (*mp3_play_stop)(void);
565 bool (*mp3_is_playing)(void);
566 #if CONFIG_CODEC != SWCODEC
567 void (*bitswap)(unsigned char *data, int length);
568 #endif
569 #endif /* !SIMULATOR */
570 #if CONFIG_CODEC == SWCODEC
571 const unsigned long *audio_master_sampr_list;
572 const unsigned long *hw_freq_sampr;
573 void (*pcm_apply_settings)(void);
574 void (*pcm_play_data)(pcm_more_callback_type get_more,
575 unsigned char* start, size_t size);
576 void (*pcm_play_stop)(void);
577 void (*pcm_set_frequency)(unsigned int frequency);
578 bool (*pcm_is_playing)(void);
579 bool (*pcm_is_paused)(void);
580 void (*pcm_play_pause)(bool play);
581 size_t (*pcm_get_bytes_waiting)(void);
582 void (*pcm_calculate_peaks)(int *left, int *right);
583 const void* (*pcm_get_peak_buffer)(int *count);
584 void (*pcm_play_lock)(void);
585 void (*pcm_play_unlock)(void);
586 #ifdef HAVE_RECORDING
587 const unsigned long *rec_freq_sampr;
588 void (*pcm_init_recording)(void);
589 void (*pcm_close_recording)(void);
590 void (*pcm_record_data)(pcm_more_callback_type2 more_ready,
591 void *start, size_t size);
592 void (*pcm_record_more)(void *start, size_t size);
593 void (*pcm_stop_recording)(void);
594 void (*pcm_calculate_rec_peaks)(int *left, int *right);
595 void (*audio_set_recording_gain)(int left, int right, int type);
596 #endif /* HAVE_RECORDING */
597 #if INPUT_SRC_CAPS != 0
598 void (*audio_set_output_source)(int monitor);
599 void (*audio_set_input_source)(int source, unsigned flags);
600 #endif
601 void (*dsp_set_crossfeed)(bool enable);
602 void (*dsp_set_eq)(bool enable);
603 void (*dsp_dither_enable)(bool enable);
604 intptr_t (*dsp_configure)(struct dsp_config *dsp, int setting,
605 intptr_t value);
606 int (*dsp_process)(struct dsp_config *dsp, char *dest,
607 const char *src[], int count);
608 int (*dsp_input_count)(struct dsp_config *dsp, int count);
609 int (*dsp_output_count)(struct dsp_config *dsp, int count);
610 #endif /* CONFIG_CODEC == SWCODC */
612 /* playback control */
613 int (*playlist_amount)(void);
614 int (*playlist_resume)(void);
615 void (*playlist_start)(int start_index, int offset);
616 int (*playlist_add)(const char *filename);
617 void (*playlist_sync)(struct playlist_info* playlist);
618 int (*playlist_remove_all_tracks)(struct playlist_info *playlist);
619 int (*playlist_create)(const char *dir, const char *file);
620 int (*playlist_insert_track)(struct playlist_info* playlist,
621 const char *filename, int position, bool queue, bool sync);
622 int (*playlist_insert_directory)(struct playlist_info* playlist,
623 const char *dirname, int position, bool queue,
624 bool recurse);
625 int (*playlist_shuffle)(int random_seed, int start_index);
626 void (*audio_play)(long offset);
627 void (*audio_stop)(void);
628 void (*audio_pause)(void);
629 void (*audio_resume)(void);
630 void (*audio_next)(void);
631 void (*audio_prev)(void);
632 void (*audio_ff_rewind)(long newtime);
633 struct mp3entry* (*audio_next_track)(void);
634 int (*audio_status)(void);
635 struct mp3entry* (*audio_current_track)(void);
636 void (*audio_flush_and_reload_tracks)(void);
637 int (*audio_get_file_pos)(void);
638 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
639 unsigned long (*mpeg_get_last_header)(void);
640 #endif
641 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) || \
642 (CONFIG_CODEC == SWCODEC)
643 void (*sound_set_pitch)(int32_t pitch);
644 #endif
646 /* MAS communication */
647 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
648 int (*mas_readmem)(int bank, int addr, unsigned long* dest, int len);
649 int (*mas_writemem)(int bank, int addr, const unsigned long* src, int len);
650 int (*mas_readreg)(int reg);
651 int (*mas_writereg)(int reg, unsigned int val);
652 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
653 int (*mas_codec_writereg)(int reg, unsigned int val);
654 int (*mas_codec_readreg)(int reg);
655 void (*i2c_begin)(void);
656 void (*i2c_end)(void);
657 int (*i2c_write)(int address, const unsigned char* buf, int count );
658 #endif
659 #endif
661 /* menu */
662 int (*do_menu)(const struct menu_item_ex *menu, int *start_selected,
663 struct viewport parent[NB_SCREENS], bool hide_theme);
665 /* scroll bar */
666 struct gui_syncstatusbar *statusbars;
667 void (*gui_syncstatusbar_draw)(struct gui_syncstatusbar * bars, bool force_redraw);
669 /* options */
670 const struct settings_list* (*get_settings_list)(int*count);
671 const struct settings_list* (*find_setting)(const void* variable, int *id);
672 bool (*option_screen)(const struct settings_list *setting,
673 struct viewport parent[NB_SCREENS],
674 bool use_temp_var, unsigned char* option_title);
675 bool (*set_option)(const char* string, const void* variable,
676 enum optiontype type, const struct opt_items* options,
677 int numoptions, void (*function)(int));
678 bool (*set_bool_options)(const char* string, const bool* variable,
679 const char* yes_str, int yes_voice,
680 const char* no_str, int no_voice,
681 void (*function)(bool));
682 bool (*set_int)(const unsigned char* string, const char* unit, int voice_unit,
683 const int* variable, void (*function)(int), int step,
684 int min, int max,
685 const char* (*formatter)(char*, size_t, int, const char*) );
686 bool (*set_bool)(const char* string, const bool* variable );
688 #ifdef HAVE_LCD_COLOR
689 bool (*set_color)(struct screen *display, char *title,
690 unsigned *color, unsigned banned_color);
691 #endif
692 /* action handling */
693 int (*get_custom_action)(int context,int timeout,
694 const struct button_mapping* (*get_context_map)(int));
695 int (*get_action)(int context, int timeout);
696 #ifdef HAVE_TOUCHSCREEN
697 int (*action_get_touchscreen_press)(short *x, short *y);
698 #endif
699 bool (*action_userabort)(int timeout);
701 /* power */
702 int (*battery_level)(void);
703 bool (*battery_level_safe)(void);
704 int (*battery_time)(void);
705 #ifndef SIMULATOR
706 unsigned int (*battery_voltage)(void);
707 #endif
708 #if CONFIG_CHARGING
709 bool (*charger_inserted)(void);
710 # if CONFIG_CHARGING >= CHARGING_MONITOR
711 bool (*charging_state)(void);
712 # endif
713 #endif
714 #ifdef HAVE_USB_POWER
715 bool (*usb_powered)(void);
716 #endif
718 /* misc */
719 void (*srand)(unsigned int seed);
720 int (*rand)(void);
721 void (*qsort)(void *base, size_t nmemb, size_t size,
722 int(*compar)(const void *, const void *));
723 int (*kbd_input)(char* buffer, int buflen);
724 struct tm* (*get_time)(void);
725 int (*set_time)(const struct tm *tm);
726 #if CONFIG_RTC
727 time_t (*mktime)(struct tm *t);
728 #endif
729 void* (*plugin_get_buffer)(size_t *buffer_size);
730 void* (*plugin_get_audio_buffer)(size_t *buffer_size);
731 void (*plugin_tsr)(bool (*exit_callback)(bool reenter));
732 char* (*plugin_get_current_filename)(void);
733 #ifdef PLUGIN_USE_IRAM
734 void (*plugin_iram_init)(char *iramstart, char *iramcopy, size_t iram_size,
735 char *iedata, size_t iedata_size);
736 #endif
737 #if defined(DEBUG) || defined(SIMULATOR)
738 void (*debugf)(const char *fmt, ...) ATTRIBUTE_PRINTF(1, 2);
739 #endif
740 #ifdef ROCKBOX_HAS_LOGF
741 void (*logf)(const char *fmt, ...) ATTRIBUTE_PRINTF(1, 2);
742 #endif
743 struct user_settings* global_settings;
744 struct system_status *global_status;
745 void (*talk_disable)(bool disable);
746 #if CONFIG_CODEC == SWCODEC
747 void (*codec_thread_do_callback)(void (*fn)(void),
748 unsigned int *audio_thread_id);
749 int (*codec_load_file)(const char* codec, struct codec_api *api);
750 const char *(*get_codec_filename)(int cod_spec);
751 #endif
752 bool (*get_metadata)(struct mp3entry* id3, int fd, const char* trackname);
753 bool (*mp3info)(struct mp3entry *entry, const char *filename);
754 int (*count_mp3_frames)(int fd, int startpos, int filesize,
755 void (*progressfunc)(int));
756 int (*create_xing_header)(int fd, long startpos, long filesize,
757 unsigned char *buf, unsigned long num_frames,
758 unsigned long rec_time, unsigned long header_template,
759 void (*progressfunc)(int), bool generate_toc);
760 unsigned long (*find_next_frame)(int fd, long *offset,
761 long max_offset, unsigned long last_header);
763 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
764 unsigned short (*peak_meter_scale_value)(unsigned short val,
765 int meterwidth);
766 void (*peak_meter_set_use_dbfs)(bool use);
767 bool (*peak_meter_get_use_dbfs)(void);
768 #endif
769 #ifdef HAVE_LCD_BITMAP
770 int (*read_bmp_file)(const char* filename, struct bitmap *bm, int maxsize,
771 int format, const struct custom_format *cformat);
772 int (*read_bmp_fd)(int fd, struct bitmap *bm, int maxsize,
773 int format, const struct custom_format *cformat);
774 #ifdef HAVE_JPEG
775 int (*read_jpeg_file)(const char* filename, struct bitmap *bm, int maxsize,
776 int format, const struct custom_format *cformat);
777 int (*read_jpeg_fd)(int fd, struct bitmap *bm, int maxsize,
778 int format, const struct custom_format *cformat);
779 #endif
780 void (*screen_dump_set_hook)(void (*hook)(int fh));
781 #endif
782 int (*show_logo)(void);
783 struct tree_context* (*tree_get_context)(void);
784 void (*set_current_file)(char* path);
785 void (*set_dirfilter)(int l_dirfilter);
787 #ifdef HAVE_WHEEL_POSITION
788 int (*wheel_status)(void);
789 void (*wheel_send_events)(bool send);
790 #endif
792 #ifdef IRIVER_H100_SERIES
793 /* Routines for the iriver_flash -plugin. */
794 bool (*detect_original_firmware)(void);
795 bool (*detect_flashed_ramimage)(void);
796 bool (*detect_flashed_romimage)(void);
797 #endif
799 void (*led)(bool on);
801 #if (CONFIG_CODEC == SWCODEC)
802 /* buffering API */
803 int (*bufopen)(const char *file, size_t offset, enum data_type type,
804 void *user_data);
805 int (*bufalloc)(const void *src, size_t size, enum data_type type);
806 bool (*bufclose)(int handle_id);
807 int (*bufseek)(int handle_id, size_t newpos);
808 int (*bufadvance)(int handle_id, off_t offset);
809 ssize_t (*bufread)(int handle_id, size_t size, void *dest);
810 ssize_t (*bufgetdata)(int handle_id, size_t size, void **data);
811 ssize_t (*bufgettail)(int handle_id, size_t size, void **data);
812 ssize_t (*bufcuttail)(int handle_id, size_t size);
814 ssize_t (*buf_get_offset)(int handle_id, void *ptr);
815 ssize_t (*buf_handle_offset)(int handle_id);
816 void (*buf_request_buffer_handle)(int handle_id);
817 void (*buf_set_base_handle)(int handle_id);
818 size_t (*buf_used)(void);
819 #endif
821 #ifdef HAVE_TAGCACHE
822 bool (*tagcache_search)(struct tagcache_search *tcs, int tag);
823 void (*tagcache_search_set_uniqbuf)(struct tagcache_search *tcs,
824 void *buffer, long length);
825 bool (*tagcache_search_add_filter)(struct tagcache_search *tcs,
826 int tag, int seek);
827 bool (*tagcache_get_next)(struct tagcache_search *tcs);
828 bool (*tagcache_retrieve)(struct tagcache_search *tcs, int idxid,
829 int tag, char *buf, long size);
830 void (*tagcache_search_finish)(struct tagcache_search *tcs);
831 long (*tagcache_get_numeric)(const struct tagcache_search *tcs, int tag);
832 #ifdef HAVE_TC_RAMCACHE
833 bool (*tagcache_fill_tags)(struct mp3entry *id3, const char *filename);
834 #endif
835 #endif
837 #ifdef HAVE_ALBUMART
838 bool (*search_albumart_files)(const struct mp3entry *id3, const char *size_string,
839 char *buf, int buflen);
840 #endif
842 #ifdef HAVE_SEMAPHORE_OBJECTS
843 void (*semaphore_init)(struct semaphore *s, int max, int start);
844 void (*semaphore_wait)(struct semaphore *s);
845 void (*semaphore_release)(struct semaphore *s);
846 #endif
848 const char *appsversion;
849 /* new stuff at the end, sort into place next time
850 the API gets incompatible */
852 #if (CONFIG_CODEC == SWCODEC)
853 void (*pcmbuf_beep)(unsigned int frequency,
854 size_t duration,
855 int amplitude);
856 #endif
857 unsigned (*crc_32)(const void *src, unsigned len, unsigned crc32);
858 int (*open_utf8)(const char* pathname, int flags);
859 #ifdef HAVE_LCD_BITMAP
860 void (*viewportmanager_theme_enable)(enum screen_type screen, bool enable,
861 struct viewport *viewport);
862 void (*viewportmanager_theme_undo)(enum screen_type screen, bool force_redraw);
863 #endif
864 #if !defined(SIMULATOR) || defined(__MINGW32__) || defined(__CYGWIN__)
865 int* __errno;
866 #endif
867 size_t (*strlcat)(char *dst, const char *src, size_t length);
870 /* plugin header */
871 struct plugin_header {
872 unsigned long magic;
873 unsigned short target_id;
874 unsigned short api_version;
875 unsigned char *load_addr;
876 unsigned char *end_addr;
877 enum plugin_status(*entry_point)(const void*);
878 const struct plugin_api **api;
881 #ifdef PLUGIN
882 #ifndef SIMULATOR
883 extern unsigned char plugin_start_addr[];
884 extern unsigned char plugin_end_addr[];
885 #define PLUGIN_HEADER \
886 const struct plugin_api *rb DATA_ATTR; \
887 const struct plugin_header __header \
888 __attribute__ ((section (".header")))= { \
889 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
890 plugin_start_addr, plugin_end_addr, plugin_start, &rb };
891 #else /* SIMULATOR */
892 #define PLUGIN_HEADER \
893 const struct plugin_api *rb DATA_ATTR; \
894 const struct plugin_header __header \
895 __attribute__((visibility("default"))) = { \
896 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
897 NULL, NULL, plugin_start, &rb };
898 #endif /* SIMULATOR */
900 #ifdef PLUGIN_USE_IRAM
901 /* Declare IRAM variables */
902 #define PLUGIN_IRAM_DECLARE \
903 extern char iramcopy[]; \
904 extern char iramstart[]; \
905 extern char iramend[]; \
906 extern char iedata[]; \
907 extern char iend[];
908 /* Initialize IRAM */
909 #define PLUGIN_IRAM_INIT(api) \
910 (api)->plugin_iram_init(iramstart, iramcopy, iramend-iramstart, \
911 iedata, iend-iedata);
912 #else
913 #define PLUGIN_IRAM_DECLARE
914 #define PLUGIN_IRAM_INIT(api)
915 #endif /* PLUGIN_USE_IRAM */
916 #endif /* PLUGIN */
918 int plugin_load(const char* plugin, const void* parameter);
919 void* plugin_get_audio_buffer(size_t *buffer_size);
920 #ifdef PLUGIN_USE_IRAM
921 void plugin_iram_init(char *iramstart, char *iramcopy, size_t iram_size,
922 char *iedata, size_t iedata_size);
923 #endif
925 /* plugin_tsr,
926 callback returns true to allow the new plugin to load,
927 reenter means the currently running plugin is being reloaded */
928 void plugin_tsr(bool (*exit_callback)(bool reenter));
930 /* defined by the plugin */
931 extern const struct plugin_api *rb;
932 enum plugin_status plugin_start(const void* parameter)
933 NO_PROF_ATTR;
935 #endif /* __PCTOOL__ */
936 #endif