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