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