Prettify debug menu for logf
[kugel-rb.git] / apps / plugin.h
blobade7f1584bba057b75cb5658dcbaae18ee67f9ce
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 175
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 173
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, int src_x, int src_y,
333 int stride, int x, int y, int width, int height);
334 void (*lcd_remote_bitmap)(const fb_remote_data *src, int x, int y, int width,
335 int height);
336 #endif
337 void (*viewport_set_defaults)(struct viewport *vp, enum screen_type screen);
338 int (*viewportmanager_set_statusbar)(int enable_status);
339 /* list */
340 void (*gui_synclist_init)(struct gui_synclist * lists,
341 list_get_name callback_get_item_name, void * data,
342 bool scroll_all,int selected_size,
343 struct viewport parent[NB_SCREENS]);
344 void (*gui_synclist_set_nb_items)(struct gui_synclist * lists, int nb_items);
345 void (*gui_synclist_set_icon_callback)(struct gui_synclist * lists, list_get_icon icon_callback);
346 int (*gui_synclist_get_nb_items)(struct gui_synclist * lists);
347 int (*gui_synclist_get_sel_pos)(struct gui_synclist * lists);
348 void (*gui_synclist_draw)(struct gui_synclist * lists);
349 void (*gui_synclist_select_item)(struct gui_synclist * lists,
350 int item_number);
351 void (*gui_synclist_add_item)(struct gui_synclist * lists);
352 void (*gui_synclist_del_item)(struct gui_synclist * lists);
353 void (*gui_synclist_limit_scroll)(struct gui_synclist * lists, bool scroll);
354 bool (*gui_synclist_do_button)(struct gui_synclist * lists,
355 int *action, enum list_wrap wrap);
356 void (*gui_synclist_set_title)(struct gui_synclist *lists, char* title,
357 enum themable_icons icon);
358 enum yesno_res (*gui_syncyesno_run)(const struct text_message * main_message,
359 const struct text_message * yes_message,
360 const struct text_message * no_message);
361 void (*simplelist_info_init)(struct simplelist_info *info, char* title,
362 int count, void* data);
363 bool (*simplelist_show_list)(struct simplelist_info *info);
365 /* button */
366 long (*button_get)(bool block);
367 long (*button_get_w_tmo)(int ticks);
368 int (*button_status)(void);
369 #ifdef HAVE_BUTTON_DATA
370 intptr_t (*button_get_data)(void);
371 int (*button_status_wdata)(int *pdata);
372 #endif
373 void (*button_clear_queue)(void);
374 int (*button_queue_count)(void);
375 #ifdef HAS_BUTTON_HOLD
376 bool (*button_hold)(void);
377 #endif
378 #ifdef HAVE_TOUCHSCREEN
379 void (*touchscreen_set_mode)(enum touchscreen_mode);
380 #endif
381 #ifdef HAVE_BUTTON_LIGHT
382 void (*buttonlight_set_timeout)(int value);
383 void (*buttonlight_off)(void);
384 void (*buttonlight_on)(void);
385 #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS
386 void (*buttonlight_set_brightness)(int val);
387 #endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */
388 #endif /* HAVE_BUTTON_LIGHT */
390 /* file */
391 int (*open)(const char* pathname, int flags);
392 int (*close)(int fd);
393 ssize_t (*read)(int fd, void* buf, size_t count);
394 off_t (*lseek)(int fd, off_t offset, int whence);
395 int (*creat)(const char *pathname);
396 ssize_t (*write)(int fd, const void* buf, size_t count);
397 int (*remove)(const char* pathname);
398 int (*rename)(const char* path, const char* newname);
399 int (*ftruncate)(int fd, off_t length);
400 off_t (*filesize)(int fd);
401 int (*fdprintf)(int fd, const char *fmt, ...) ATTRIBUTE_PRINTF(2, 3);
402 int (*read_line)(int fd, char* buffer, int buffer_size);
403 bool (*settings_parseline)(char* line, char** name, char** value);
404 void (*storage_sleep)(void);
405 void (*storage_spin)(void);
406 void (*storage_spindown)(int seconds);
407 #if USING_STORAGE_CALLBACK
408 void (*register_storage_idle_func)(void (*function)(void *data));
409 void (*unregister_storage_idle_func)(void (*function)(void *data), bool run);
410 #endif /* USING_STORAGE_CALLBACK */
411 void (*reload_directory)(void);
412 char *(*create_numbered_filename)(char *buffer, const char *path,
413 const char *prefix, const char *suffix,
414 int numberlen IF_CNFN_NUM_(, int *num));
415 bool (*file_exists)(const char *file);
416 char* (*strip_extension)(char* buffer, int buffer_size, const char *filename);
419 /* dir */
420 DIR* (*opendir)(const char* name);
421 int (*closedir)(DIR* dir);
422 struct dirent* (*readdir)(DIR* dir);
423 int (*mkdir)(const char *name);
424 int (*rmdir)(const char *name);
425 bool (*dir_exists)(const char *path);
427 /* kernel/ system */
428 #ifdef CPU_ARM
429 void (*__div0)(void);
430 #endif
431 void (*sleep)(int ticks);
432 void (*yield)(void);
433 volatile long* current_tick;
434 long (*default_event_handler)(long event);
435 long (*default_event_handler_ex)(long event, void (*callback)(void *), void *parameter);
436 unsigned int (*create_thread)(void (*function)(void), void* stack,
437 size_t stack_size, unsigned flags,
438 const char *name
439 IF_PRIO(, int priority)
440 IF_COP(, unsigned int core));
441 void (*thread_exit)(void);
442 void (*thread_wait)(unsigned int thread_id);
443 #if CONFIG_CODEC == SWCODEC
444 void (*thread_thaw)(unsigned int thread_id);
445 #ifdef HAVE_PRIORITY_SCHEDULING
446 int (*thread_set_priority)(unsigned int thread_id, int priority);
447 #endif
448 void (*mutex_init)(struct mutex *m);
449 void (*mutex_lock)(struct mutex *m);
450 void (*mutex_unlock)(struct mutex *m);
451 #endif
453 void (*reset_poweroff_timer)(void);
454 #ifndef SIMULATOR
455 int (*system_memory_guard)(int newmode);
456 long *cpu_frequency;
457 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
458 #ifdef CPU_BOOST_LOGGING
459 void (*cpu_boost_)(bool on_off,char*location,int line);
460 #else
461 void (*cpu_boost)(bool on_off);
462 #endif
463 #endif /* HAVE_ADJUSTABLE_CPU_FREQ */
464 #endif /* !SIMULATOR */
465 #ifdef HAVE_SCHEDULER_BOOSTCTRL
466 void (*trigger_cpu_boost)(void);
467 void (*cancel_cpu_boost)(void);
468 #endif
469 #if NUM_CORES > 1
470 void (*cpucache_flush)(void);
471 void (*cpucache_invalidate)(void);
472 #endif
473 bool (*timer_register)(int reg_prio, void (*unregister_callback)(void),
474 long cycles, void (*timer_callback)(void)
475 IF_COP(, int core));
476 void (*timer_unregister)(void);
477 bool (*timer_set_period)(long count);
479 void (*queue_init)(struct event_queue *q, bool register_queue);
480 void (*queue_delete)(struct event_queue *q);
481 void (*queue_post)(struct event_queue *q, long id, intptr_t data);
482 void (*queue_wait_w_tmo)(struct event_queue *q, struct queue_event *ev,
483 int ticks);
484 #if CONFIG_CODEC == SWCODEC
485 void (*queue_enable_queue_send)(struct event_queue *q,
486 struct queue_sender_list *send,
487 unsigned int thread_id);
488 bool (*queue_empty)(const struct event_queue *q);
489 void (*queue_wait)(struct event_queue *q, struct queue_event *ev);
490 intptr_t (*queue_send)(struct event_queue *q, long id,
491 intptr_t data);
492 void (*queue_reply)(struct event_queue *q, intptr_t retval);
493 #endif /* CONFIG_CODEC == SWCODEC */
495 void (*usb_acknowledge)(long id);
496 #ifdef USB_ENABLE_HID
497 void (*usb_hid_send)(usage_page_t usage_page, int id);
498 #endif
499 #ifdef RB_PROFILE
500 void (*profile_thread)(void);
501 void (*profstop)(void);
502 void (*profile_func_enter)(void *this_fn, void *call_site);
503 void (*profile_func_exit)(void *this_fn, void *call_site);
504 #endif
505 /* event api */
506 bool (*add_event)(unsigned short id, bool oneshot, void (*handler)(void *data));
507 void (*remove_event)(unsigned short id, void (*handler)(void *data));
508 void (*send_event)(unsigned short id, void *data);
510 #ifdef SIMULATOR
511 /* special simulator hooks */
512 #if defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8
513 void (*sim_lcd_ex_init)(unsigned long (*getpixel)(int, int));
514 void (*sim_lcd_ex_update_rect)(int x, int y, int width, int height);
515 #endif
516 #endif
518 /* strings and memory */
519 int (*snprintf)(char *buf, size_t size, const char *fmt, ...)
520 ATTRIBUTE_PRINTF(3, 4);
521 int (*vsnprintf)(char *buf, int size, const char *fmt, va_list ap);
522 char* (*strcpy)(char *dst, const char *src);
523 size_t (*strlcpy)(char *dst, const char *src, size_t length);
524 size_t (*strlen)(const char *str);
525 char * (*strrchr)(const char *s, int c);
526 int (*strcmp)(const char *, const char *);
527 int (*strncmp)(const char *, const char *, size_t);
528 int (*strcasecmp)(const char *, const char *);
529 int (*strncasecmp)(const char *s1, const char *s2, size_t n);
530 void* (*memset)(void *dst, int c, size_t length);
531 void* (*memcpy)(void *out, const void *in, size_t n);
532 void* (*memmove)(void *out, const void *in, size_t n);
533 const unsigned char *_rbctype_;
534 int (*atoi)(const char *str);
535 char *(*strchr)(const char *s, int c);
536 char *(*strcat)(char *s1, const char *s2);
537 void *(*memchr)(const void *s1, int c, size_t n);
538 int (*memcmp)(const void *s1, const void *s2, size_t n);
539 char *(*strcasestr) (const char* phaystack, const char* pneedle);
540 char* (*strtok_r)(char *ptr, const char *sep, char **end);
541 /* unicode stuff */
542 const unsigned char* (*utf8decode)(const unsigned char *utf8, unsigned short *ucs);
543 unsigned char* (*iso_decode)(const unsigned char *iso, unsigned char *utf8, int cp, int count);
544 unsigned char* (*utf16LEdecode)(const unsigned char *utf16, unsigned char *utf8, int count);
545 unsigned char* (*utf16BEdecode)(const unsigned char *utf16, unsigned char *utf8, int count);
546 unsigned char* (*utf8encode)(unsigned long ucs, unsigned char *utf8);
547 unsigned long (*utf8length)(const unsigned char *utf8);
548 int (*utf8seek)(const unsigned char* utf8, int offset);
550 /* sound */
551 void (*sound_set)(int setting, int value);
552 int (*sound_default)(int setting);
553 int (*sound_min)(int setting);
554 int (*sound_max)(int setting);
555 const char * (*sound_unit)(int setting);
556 int (*sound_val2phys)(int setting, int value);
557 #ifndef SIMULATOR
558 void (*mp3_play_data)(const unsigned char* start, int size, void (*get_more)(unsigned char** start, size_t* size));
559 void (*mp3_play_pause)(bool play);
560 void (*mp3_play_stop)(void);
561 bool (*mp3_is_playing)(void);
562 #if CONFIG_CODEC != SWCODEC
563 void (*bitswap)(unsigned char *data, int length);
564 #endif
565 #endif /* !SIMULATOR */
566 #if CONFIG_CODEC == SWCODEC
567 const unsigned long *audio_master_sampr_list;
568 const unsigned long *hw_freq_sampr;
569 void (*pcm_apply_settings)(void);
570 void (*pcm_play_data)(pcm_more_callback_type get_more,
571 unsigned char* start, size_t size);
572 void (*pcm_play_stop)(void);
573 void (*pcm_set_frequency)(unsigned int frequency);
574 bool (*pcm_is_playing)(void);
575 bool (*pcm_is_paused)(void);
576 void (*pcm_play_pause)(bool play);
577 size_t (*pcm_get_bytes_waiting)(void);
578 void (*pcm_calculate_peaks)(int *left, int *right);
579 void (*pcm_play_lock)(void);
580 void (*pcm_play_unlock)(void);
581 #ifdef HAVE_RECORDING
582 const unsigned long *rec_freq_sampr;
583 void (*pcm_init_recording)(void);
584 void (*pcm_close_recording)(void);
585 void (*pcm_record_data)(pcm_more_callback_type2 more_ready,
586 void *start, size_t size);
587 void (*pcm_record_more)(void *start, size_t size);
588 void (*pcm_stop_recording)(void);
589 void (*pcm_calculate_rec_peaks)(int *left, int *right);
590 void (*audio_set_recording_gain)(int left, int right, int type);
591 #endif /* HAVE_RECORDING */
592 #if INPUT_SRC_CAPS != 0
593 void (*audio_set_output_source)(int monitor);
594 void (*audio_set_input_source)(int source, unsigned flags);
595 #endif
596 void (*dsp_set_crossfeed)(bool enable);
597 void (*dsp_set_eq)(bool enable);
598 void (*dsp_dither_enable)(bool enable);
599 intptr_t (*dsp_configure)(struct dsp_config *dsp, int setting,
600 intptr_t value);
601 int (*dsp_process)(struct dsp_config *dsp, char *dest,
602 const char *src[], int count);
603 int (*dsp_input_count)(struct dsp_config *dsp, int count);
604 int (*dsp_output_count)(struct dsp_config *dsp, int count);
605 #endif /* CONFIG_CODEC == SWCODC */
607 /* playback control */
608 int (*playlist_amount)(void);
609 int (*playlist_resume)(void);
610 void (*playlist_start)(int start_index, int offset);
611 int (*playlist_add)(const char *filename);
612 void (*playlist_sync)(struct playlist_info* playlist);
613 int (*playlist_remove_all_tracks)(struct playlist_info *playlist);
614 int (*playlist_create)(const char *dir, const char *file);
615 int (*playlist_insert_track)(struct playlist_info* playlist,
616 const char *filename, int position, bool queue, bool sync);
617 int (*playlist_insert_directory)(struct playlist_info* playlist,
618 const char *dirname, int position, bool queue,
619 bool recurse);
620 int (*playlist_shuffle)(int random_seed, int start_index);
621 void (*audio_play)(long offset);
622 void (*audio_stop)(void);
623 void (*audio_pause)(void);
624 void (*audio_resume)(void);
625 void (*audio_next)(void);
626 void (*audio_prev)(void);
627 void (*audio_ff_rewind)(long newtime);
628 struct mp3entry* (*audio_next_track)(void);
629 int (*audio_status)(void);
630 struct mp3entry* (*audio_current_track)(void);
631 void (*audio_flush_and_reload_tracks)(void);
632 int (*audio_get_file_pos)(void);
633 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
634 unsigned long (*mpeg_get_last_header)(void);
635 #endif
636 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) || \
637 (CONFIG_CODEC == SWCODEC)
638 void (*sound_set_pitch)(int32_t pitch);
639 #endif
641 /* MAS communication */
642 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
643 int (*mas_readmem)(int bank, int addr, unsigned long* dest, int len);
644 int (*mas_writemem)(int bank, int addr, const unsigned long* src, int len);
645 int (*mas_readreg)(int reg);
646 int (*mas_writereg)(int reg, unsigned int val);
647 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
648 int (*mas_codec_writereg)(int reg, unsigned int val);
649 int (*mas_codec_readreg)(int reg);
650 void (*i2c_begin)(void);
651 void (*i2c_end)(void);
652 int (*i2c_write)(int address, const unsigned char* buf, int count );
653 #endif
654 #endif
656 /* menu */
657 int (*do_menu)(const struct menu_item_ex *menu, int *start_selected,
658 struct viewport parent[NB_SCREENS], bool hide_bars);
660 /* scroll bar */
661 struct gui_syncstatusbar *statusbars;
662 void (*gui_syncstatusbar_draw)(struct gui_syncstatusbar * bars, bool force_redraw);
664 /* options */
665 const struct settings_list* (*get_settings_list)(int*count);
666 const struct settings_list* (*find_setting)(const void* variable, int *id);
667 bool (*option_screen)(const struct settings_list *setting,
668 struct viewport parent[NB_SCREENS],
669 bool use_temp_var, unsigned char* option_title);
670 bool (*set_option)(const char* string, const void* variable,
671 enum optiontype type, const struct opt_items* options,
672 int numoptions, void (*function)(int));
673 bool (*set_bool_options)(const char* string, const bool* variable,
674 const char* yes_str, int yes_voice,
675 const char* no_str, int no_voice,
676 void (*function)(bool));
677 bool (*set_int)(const unsigned char* string, const char* unit, int voice_unit,
678 const int* variable, void (*function)(int), int step,
679 int min, int max,
680 const char* (*formatter)(char*, size_t, int, const char*) );
681 bool (*set_bool)(const char* string, const bool* variable );
683 #ifdef HAVE_LCD_COLOR
684 bool (*set_color)(struct screen *display, char *title, unsigned *color,
685 unsigned banned_color);
686 #endif
687 /* action handling */
688 int (*get_custom_action)(int context,int timeout,
689 const struct button_mapping* (*get_context_map)(int));
690 int (*get_action)(int context, int timeout);
691 #ifdef HAVE_TOUCHSCREEN
692 int (*action_get_touchscreen_press)(short *x, short *y);
693 #endif
694 bool (*action_userabort)(int timeout);
696 /* power */
697 int (*battery_level)(void);
698 bool (*battery_level_safe)(void);
699 int (*battery_time)(void);
700 #ifndef SIMULATOR
701 unsigned int (*battery_voltage)(void);
702 #endif
703 #if CONFIG_CHARGING
704 bool (*charger_inserted)(void);
705 # if CONFIG_CHARGING >= CHARGING_MONITOR
706 bool (*charging_state)(void);
707 # endif
708 #endif
709 #ifdef HAVE_USB_POWER
710 bool (*usb_powered)(void);
711 #endif
713 /* misc */
714 void (*srand)(unsigned int seed);
715 int (*rand)(void);
716 void (*qsort)(void *base, size_t nmemb, size_t size,
717 int(*compar)(const void *, const void *));
718 int (*kbd_input)(char* buffer, int buflen);
719 struct tm* (*get_time)(void);
720 int (*set_time)(const struct tm *tm);
721 #if CONFIG_RTC
722 time_t (*mktime)(struct tm *t);
723 #endif
724 void* (*plugin_get_buffer)(size_t *buffer_size);
725 void* (*plugin_get_audio_buffer)(size_t *buffer_size);
726 void (*plugin_tsr)(bool (*exit_callback)(bool reenter));
727 char* (*plugin_get_current_filename)(void);
728 #ifdef PLUGIN_USE_IRAM
729 void (*plugin_iram_init)(char *iramstart, char *iramcopy, size_t iram_size,
730 char *iedata, size_t iedata_size);
731 #endif
732 #if defined(DEBUG) || defined(SIMULATOR)
733 void (*debugf)(const char *fmt, ...) ATTRIBUTE_PRINTF(1, 2);
734 #endif
735 #ifdef ROCKBOX_HAS_LOGF
736 void (*logf)(const char *fmt, ...) ATTRIBUTE_PRINTF(1, 2);
737 #endif
738 struct user_settings* global_settings;
739 struct system_status *global_status;
740 void (*talk_disable)(bool disable);
741 #if CONFIG_CODEC == SWCODEC
742 void (*codec_thread_do_callback)(void (*fn)(void),
743 unsigned int *audio_thread_id);
744 int (*codec_load_file)(const char* codec, struct codec_api *api);
745 const char *(*get_codec_filename)(int cod_spec);
746 #endif
747 bool (*get_metadata)(struct mp3entry* id3, int fd, const char* trackname);
748 bool (*mp3info)(struct mp3entry *entry, const char *filename);
749 int (*count_mp3_frames)(int fd, int startpos, int filesize,
750 void (*progressfunc)(int));
751 int (*create_xing_header)(int fd, long startpos, long filesize,
752 unsigned char *buf, unsigned long num_frames,
753 unsigned long rec_time, unsigned long header_template,
754 void (*progressfunc)(int), bool generate_toc);
755 unsigned long (*find_next_frame)(int fd, long *offset,
756 long max_offset, unsigned long last_header);
758 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
759 unsigned short (*peak_meter_scale_value)(unsigned short val,
760 int meterwidth);
761 void (*peak_meter_set_use_dbfs)(bool use);
762 bool (*peak_meter_get_use_dbfs)(void);
763 #endif
764 #ifdef HAVE_LCD_BITMAP
765 int (*read_bmp_file)(const char* filename, struct bitmap *bm, int maxsize,
766 int format, const struct custom_format *cformat);
767 int (*read_bmp_fd)(int fd, struct bitmap *bm, int maxsize,
768 int format, const struct custom_format *cformat);
769 #ifdef HAVE_JPEG
770 int (*read_jpeg_file)(const char* filename, struct bitmap *bm, int maxsize,
771 int format, const struct custom_format *cformat);
772 int (*read_jpeg_fd)(int fd, struct bitmap *bm, int maxsize,
773 int format, const struct custom_format *cformat);
774 #endif
775 void (*screen_dump_set_hook)(void (*hook)(int fh));
776 #endif
777 int (*show_logo)(void);
778 struct tree_context* (*tree_get_context)(void);
779 void (*set_current_file)(char* path);
780 void (*set_dirfilter)(int l_dirfilter);
782 #ifdef HAVE_WHEEL_POSITION
783 int (*wheel_status)(void);
784 void (*wheel_send_events)(bool send);
785 #endif
787 #ifdef IRIVER_H100_SERIES
788 /* Routines for the iriver_flash -plugin. */
789 bool (*detect_original_firmware)(void);
790 bool (*detect_flashed_ramimage)(void);
791 bool (*detect_flashed_romimage)(void);
792 #endif
794 void (*led)(bool on);
796 #if (CONFIG_CODEC == SWCODEC)
797 /* buffering API */
798 int (*bufopen)(const char *file, size_t offset, enum data_type type,
799 void *user_data);
800 int (*bufalloc)(const void *src, size_t size, enum data_type type);
801 bool (*bufclose)(int handle_id);
802 int (*bufseek)(int handle_id, size_t newpos);
803 int (*bufadvance)(int handle_id, off_t offset);
804 ssize_t (*bufread)(int handle_id, size_t size, void *dest);
805 ssize_t (*bufgetdata)(int handle_id, size_t size, void **data);
806 ssize_t (*bufgettail)(int handle_id, size_t size, void **data);
807 ssize_t (*bufcuttail)(int handle_id, size_t size);
809 ssize_t (*buf_get_offset)(int handle_id, void *ptr);
810 ssize_t (*buf_handle_offset)(int handle_id);
811 void (*buf_request_buffer_handle)(int handle_id);
812 void (*buf_set_base_handle)(int handle_id);
813 size_t (*buf_used)(void);
814 #endif
816 #ifdef HAVE_TAGCACHE
817 bool (*tagcache_search)(struct tagcache_search *tcs, int tag);
818 void (*tagcache_search_set_uniqbuf)(struct tagcache_search *tcs,
819 void *buffer, long length);
820 bool (*tagcache_search_add_filter)(struct tagcache_search *tcs,
821 int tag, int seek);
822 bool (*tagcache_get_next)(struct tagcache_search *tcs);
823 bool (*tagcache_retrieve)(struct tagcache_search *tcs, int idxid,
824 int tag, char *buf, long size);
825 void (*tagcache_search_finish)(struct tagcache_search *tcs);
826 long (*tagcache_get_numeric)(const struct tagcache_search *tcs, int tag);
827 #ifdef HAVE_TC_RAMCACHE
828 bool (*tagcache_fill_tags)(struct mp3entry *id3, const char *filename);
829 #endif
830 #endif
832 #ifdef HAVE_ALBUMART
833 bool (*search_albumart_files)(const struct mp3entry *id3, const char *size_string,
834 char *buf, int buflen);
835 #endif
837 #ifdef HAVE_SEMAPHORE_OBJECTS
838 void (*semaphore_init)(struct semaphore *s, int max, int start);
839 void (*semaphore_wait)(struct semaphore *s);
840 void (*semaphore_release)(struct semaphore *s);
841 #endif
843 const char *appsversion;
844 /* new stuff at the end, sort into place next time
845 the API gets incompatible */
847 #if (CONFIG_CODEC == SWCODEC)
848 void (*pcmbuf_beep)(unsigned int frequency,
849 size_t duration,
850 int amplitude);
851 #endif
852 unsigned (*crc_32)(const void *src, unsigned len, unsigned crc32);
855 /* plugin header */
856 struct plugin_header {
857 unsigned long magic;
858 unsigned short target_id;
859 unsigned short api_version;
860 unsigned char *load_addr;
861 unsigned char *end_addr;
862 enum plugin_status(*entry_point)(const void*);
863 const struct plugin_api **api;
866 #ifdef PLUGIN
867 #ifndef SIMULATOR
868 extern unsigned char plugin_start_addr[];
869 extern unsigned char plugin_end_addr[];
870 #define PLUGIN_HEADER \
871 const struct plugin_api *rb DATA_ATTR; \
872 const struct plugin_header __header \
873 __attribute__ ((section (".header")))= { \
874 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
875 plugin_start_addr, plugin_end_addr, plugin_start, &rb };
876 #else /* SIMULATOR */
877 #define PLUGIN_HEADER \
878 const struct plugin_api *rb DATA_ATTR; \
879 const struct plugin_header __header \
880 __attribute__((visibility("default"))) = { \
881 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
882 NULL, NULL, plugin_start, &rb };
883 #endif /* SIMULATOR */
885 #ifdef PLUGIN_USE_IRAM
886 /* Declare IRAM variables */
887 #define PLUGIN_IRAM_DECLARE \
888 extern char iramcopy[]; \
889 extern char iramstart[]; \
890 extern char iramend[]; \
891 extern char iedata[]; \
892 extern char iend[];
893 /* Initialize IRAM */
894 #define PLUGIN_IRAM_INIT(api) \
895 (api)->plugin_iram_init(iramstart, iramcopy, iramend-iramstart, \
896 iedata, iend-iedata);
897 #else
898 #define PLUGIN_IRAM_DECLARE
899 #define PLUGIN_IRAM_INIT(api)
900 #endif /* PLUGIN_USE_IRAM */
901 #endif /* PLUGIN */
903 int plugin_load(const char* plugin, const void* parameter);
904 void* plugin_get_audio_buffer(size_t *buffer_size);
905 #ifdef PLUGIN_USE_IRAM
906 void plugin_iram_init(char *iramstart, char *iramcopy, size_t iram_size,
907 char *iedata, size_t iedata_size);
908 #endif
910 /* plugin_tsr,
911 callback returns true to allow the new plugin to load,
912 reenter means the currently running plugin is being reloaded */
913 void plugin_tsr(bool (*exit_callback)(bool reenter));
915 /* defined by the plugin */
916 extern const struct plugin_api *rb;
917 enum plugin_status plugin_start(const void* parameter)
918 NO_PROF_ATTR;
920 #endif /* __PCTOOL__ */
921 #endif