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