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