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