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