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