Allow sims to shut down normally from panic code.
[maemo-rb.git] / apps / plugin.h
blob6b198686f25f9524b2c2e203842dcfa43edd982a
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 #include "../recorder/bmp.h"
82 #endif
83 #include "statusbar.h"
84 #include "menu.h"
85 #include "rbunicode.h"
86 #include "list.h"
87 #include "tree.h"
88 #include "color_picker.h"
89 #include "buffering.h"
90 #include "tagcache.h"
91 #include "viewport.h"
92 #include "ata_idle_notify.h"
93 #include "settings_list.h"
95 #ifdef HAVE_ALBUMART
96 #include "albumart.h"
97 #endif
99 #ifdef HAVE_REMOTE_LCD
100 #include "lcd-remote.h"
101 #endif
103 #include "yesno.h"
105 #ifdef PLUGIN
107 #if defined(DEBUG) || defined(SIMULATOR)
108 #undef DEBUGF
109 #define DEBUGF rb->debugf
110 #undef LDEBUGF
111 #define LDEBUGF rb->debugf
112 #else
113 #define DEBUGF(...)
114 #define LDEBUGF(...)
115 #endif
117 #ifdef ROCKBOX_HAS_LOGF
118 #undef LOGF
119 #define LOGF rb->logf
120 #else
121 #define LOGF(...)
122 #endif
124 #endif
126 #define PLUGIN_MAGIC 0x526F634B /* RocK */
128 /* increase this every time the api struct changes */
129 #define PLUGIN_API_VERSION 135
131 /* update this to latest version if a change to the api struct breaks
132 backwards compatibility (and please take the opportunity to sort in any
133 new function which are "waiting" at the end of the function table) */
134 #define PLUGIN_MIN_API_VERSION 135
136 /* plugin return codes */
137 enum plugin_status {
138 PLUGIN_OK = 0,
139 PLUGIN_USB_CONNECTED,
140 PLUGIN_ERROR = -1,
143 /* NOTE: To support backwards compatibility, only add new functions at
144 the end of the structure. Every time you add a new function,
145 remember to increase PLUGIN_API_VERSION. If you make changes to the
146 existing APIs then also update PLUGIN_MIN_API_VERSION to current
147 version
149 struct plugin_api {
151 /* lcd */
152 void (*lcd_set_contrast)(int x);
153 void (*lcd_update)(void);
154 void (*lcd_clear_display)(void);
155 int (*lcd_getstringsize)(const unsigned char *str, int *w, int *h);
156 void (*lcd_putsxy)(int x, int y, const unsigned char *string);
157 void (*lcd_puts)(int x, int y, const unsigned char *string);
158 void (*lcd_puts_scroll)(int x, int y, const unsigned char* string);
159 void (*lcd_stop_scroll)(void);
160 #ifdef HAVE_LCD_CHARCELLS
161 void (*lcd_define_pattern)(unsigned long ucs, const char *pattern);
162 unsigned long (*lcd_get_locked_pattern)(void);
163 void (*lcd_unlock_pattern)(unsigned long ucs);
164 void (*lcd_putc)(int x, int y, unsigned long ucs);
165 void (*lcd_put_cursor)(int x, int y, unsigned long ucs);
166 void (*lcd_remove_cursor)(void);
167 void (*lcd_icon)(int icon, bool enable);
168 void (*lcd_double_height)(bool on);
169 #else /* HAVE_LCD_BITMAP */
170 fb_data* lcd_framebuffer;
171 void (*lcd_update_rect)(int x, int y, int width, int height);
172 void (*lcd_set_drawmode)(int mode);
173 int (*lcd_get_drawmode)(void);
174 void (*lcd_setfont)(int font);
175 void (*lcd_drawpixel)(int x, int y);
176 void (*lcd_drawline)(int x1, int y1, int x2, int y2);
177 void (*lcd_hline)(int x1, int x2, int y);
178 void (*lcd_vline)(int x, int y1, int y2);
179 void (*lcd_drawrect)(int x, int y, int width, int height);
180 void (*lcd_fillrect)(int x, int y, int width, int height);
181 void (*lcd_mono_bitmap_part)(const unsigned char *src, int src_x, int src_y,
182 int stride, int x, int y, int width, int height);
183 void (*lcd_mono_bitmap)(const unsigned char *src, int x, int y,
184 int width, int height);
185 #if LCD_DEPTH > 1
186 void (*lcd_set_foreground)(unsigned foreground);
187 unsigned (*lcd_get_foreground)(void);
188 void (*lcd_set_background)(unsigned foreground);
189 unsigned (*lcd_get_background)(void);
190 void (*lcd_bitmap_part)(const fb_data *src, int src_x, int src_y,
191 int stride, int x, int y, int width, int height);
192 void (*lcd_bitmap)(const fb_data *src, int x, int y, int width,
193 int height);
194 fb_data* (*lcd_get_backdrop)(void);
195 void (*lcd_set_backdrop)(fb_data* backdrop);
196 #endif
197 #if LCD_DEPTH == 16
198 void (*lcd_bitmap_transparent_part)(const fb_data *src,
199 int src_x, int src_y, int stride,
200 int x, int y, int width, int height);
201 void (*lcd_bitmap_transparent)(const fb_data *src, int x, int y,
202 int width, int height);
203 void (*lcd_blit_yuv)(unsigned char * const src[3],
204 int src_x, int src_y, int stride,
205 int x, int y, int width, int height);
206 #if defined(TOSHIBA_GIGABEAT_F) || defined(SANSA_E200) || defined(SANSA_C200) \
207 || defined(IRIVER_H10) || defined(COWON_D2)
208 void (*lcd_yuv_set_options)(unsigned options);
209 #endif
210 #elif (LCD_DEPTH < 4) && !defined(SIMULATOR)
211 void (*lcd_blit_mono)(const unsigned char *data, int x, int by, int width,
212 int bheight, int stride);
213 void (*lcd_blit_grey_phase)(unsigned char *values, unsigned char *phases,
214 int bx, int by, int bwidth, int bheight,
215 int stride);
216 #endif /* LCD_DEPTH */
217 void (*lcd_puts_style)(int x, int y, const unsigned char *str, int style);
218 void (*lcd_puts_scroll_style)(int x, int y, const unsigned char* string,
219 int style);
220 #ifdef HAVE_LCD_INVERT
221 void (*lcd_set_invert_display)(bool yesno);
222 #endif /* HAVE_LCD_INVERT */
224 #if defined(HAVE_LCD_ENABLE) && defined(HAVE_LCD_COLOR)
225 void (*lcd_set_enable_hook)(void (*enable_hook)(void));
226 struct event_queue *button_queue;
227 #endif
228 unsigned short *(*bidi_l2v)( const unsigned char *str, int orientation );
229 const unsigned char *(*font_get_bits)( struct font *pf, unsigned short char_code );
230 struct font* (*font_load)(const char *path);
231 struct font* (*font_get)(int font);
232 int (*font_getstringsize)(const unsigned char *str, int *w, int *h,
233 int fontnumber);
234 int (*font_get_width)(struct font* pf, unsigned short char_code);
235 void (*screen_clear_area)(struct screen * display, int xstart, int ystart,
236 int width, int height);
237 void (*gui_scrollbar_draw)(struct screen * screen, int x, int y,
238 int width, int height, int items,
239 int min_shown, int max_shown,
240 unsigned flags);
241 #endif /* HAVE_LCD_BITMAP */
242 const char* (*get_codepage_name)(int cp);
244 /* backlight */
245 /* The backlight_* functions must be present in the API regardless whether
246 * HAVE_BACKLIGHT is defined or not. The reason is that the stock Ondio has
247 * no backlight but can be modded to have backlight (it's prepared on the
248 * PCB). This makes backlight an all-target feature API wise, and keeps API
249 * compatible between stock and modded Ondio.
250 * For OLED targets like the Sansa Clip, the backlight_* functions control
251 * the display enable, which has essentially the same effect. */
252 void (*backlight_on)(void);
253 void (*backlight_off)(void);
254 void (*backlight_set_timeout)(int index);
255 #ifdef HAVE_BACKLIGHT_BRIGHTNESS
256 void (*backlight_set_brightness)(int val);
257 #endif /* HAVE_BACKLIGHT_BRIGHTNESS */
259 #if CONFIG_CHARGING
260 void (*backlight_set_timeout_plugged)(int index);
261 #endif
262 bool (*is_backlight_on)(bool ignore_always_off);
263 void (*splash)(int ticks, const char *str);
264 void (*splashf)(int ticks, const char *fmt, ...) ATTRIBUTE_PRINTF(2, 3);
266 #ifdef HAVE_REMOTE_LCD
267 /* remote lcd */
268 void (*lcd_remote_set_contrast)(int x);
269 void (*lcd_remote_clear_display)(void);
270 void (*lcd_remote_puts)(int x, int y, const unsigned char *string);
271 void (*lcd_remote_puts_scroll)(int x, int y, const unsigned char* string);
272 void (*lcd_remote_stop_scroll)(void);
273 void (*lcd_remote_set_drawmode)(int mode);
274 int (*lcd_remote_get_drawmode)(void);
275 void (*lcd_remote_setfont)(int font);
276 int (*lcd_remote_getstringsize)(const unsigned char *str, int *w, int *h);
277 void (*lcd_remote_drawpixel)(int x, int y);
278 void (*lcd_remote_drawline)(int x1, int y1, int x2, int y2);
279 void (*lcd_remote_hline)(int x1, int x2, int y);
280 void (*lcd_remote_vline)(int x, int y1, int y2);
281 void (*lcd_remote_drawrect)(int x, int y, int nx, int ny);
282 void (*lcd_remote_fillrect)(int x, int y, int nx, int ny);
283 void (*lcd_remote_mono_bitmap_part)(const unsigned char *src, int src_x,
284 int src_y, int stride, int x, int y,
285 int width, int height);
286 void (*lcd_remote_mono_bitmap)(const unsigned char *src, int x, int y,
287 int width, int height);
288 void (*lcd_remote_putsxy)(int x, int y, const unsigned char *string);
289 void (*lcd_remote_puts_style)(int x, int y, const unsigned char *str, int style);
290 void (*lcd_remote_puts_scroll_style)(int x, int y, const unsigned char* string,
291 int style);
292 fb_remote_data* lcd_remote_framebuffer;
293 void (*lcd_remote_update)(void);
294 void (*lcd_remote_update_rect)(int x, int y, int width, int height);
296 void (*remote_backlight_on)(void);
297 void (*remote_backlight_off)(void);
298 void (*remote_backlight_set_timeout)(int index);
299 #if CONFIG_CHARGING
300 void (*remote_backlight_set_timeout_plugged)(int index);
301 #endif
302 #endif /* HAVE_REMOTE_LCD */
303 struct screen* screens[NB_SCREENS];
304 #if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)
305 void (*lcd_remote_set_foreground)(unsigned foreground);
306 unsigned (*lcd_remote_get_foreground)(void);
307 void (*lcd_remote_set_background)(unsigned background);
308 unsigned (*lcd_remote_get_background)(void);
309 void (*lcd_remote_bitmap_part)(const fb_remote_data *src, int src_x, int src_y,
310 int stride, int x, int y, int width, int height);
311 void (*lcd_remote_bitmap)(const fb_remote_data *src, int x, int y, int width,
312 int height);
313 #endif
314 void (*viewport_set_defaults)(struct viewport *vp, enum screen_type screen);
315 bool (*viewportmanager_set_statusbar)(bool enabled);
316 /* list */
317 void (*gui_synclist_init)(struct gui_synclist * lists,
318 list_get_name callback_get_item_name, void * data,
319 bool scroll_all,int selected_size,
320 struct viewport parent[NB_SCREENS]);
321 void (*gui_synclist_set_nb_items)(struct gui_synclist * lists, int nb_items);
322 void (*gui_synclist_set_icon_callback)(struct gui_synclist * lists, list_get_icon icon_callback);
323 int (*gui_synclist_get_nb_items)(struct gui_synclist * lists);
324 int (*gui_synclist_get_sel_pos)(struct gui_synclist * lists);
325 void (*gui_synclist_draw)(struct gui_synclist * lists);
326 void (*gui_synclist_select_item)(struct gui_synclist * lists,
327 int item_number);
328 void (*gui_synclist_add_item)(struct gui_synclist * lists);
329 void (*gui_synclist_del_item)(struct gui_synclist * lists);
330 void (*gui_synclist_limit_scroll)(struct gui_synclist * lists, bool scroll);
331 bool (*gui_synclist_do_button)(struct gui_synclist * lists,
332 int *action, enum list_wrap wrap);
333 void (*gui_synclist_set_title)(struct gui_synclist *lists, char* title, int icon);
334 enum yesno_res (*gui_syncyesno_run)(const struct text_message * main_message,
335 const struct text_message * yes_message,
336 const struct text_message * no_message);
337 void (*simplelist_info_init)(struct simplelist_info *info, char* title,
338 int count, void* data);
339 bool (*simplelist_show_list)(struct simplelist_info *info);
341 /* button */
342 long (*button_get)(bool block);
343 long (*button_get_w_tmo)(int ticks);
344 int (*button_status)(void);
345 #ifdef HAVE_BUTTON_DATA
346 intptr_t (*button_get_data)(void);
347 #endif
348 void (*button_clear_queue)(void);
349 int (*button_queue_count)(void);
350 #ifdef HAS_BUTTON_HOLD
351 bool (*button_hold)(void);
352 #endif
353 #ifdef HAVE_TOUCHSCREEN
354 void (*touchscreen_set_mode)(enum touchscreen_mode);
355 #endif
356 #ifdef HAVE_BUTTON_LIGHT
357 void (*buttonlight_set_timeout)(int value);
358 void (*buttonlight_off)(void);
359 void (*buttonlight_on)(void);
360 #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS
361 void (*buttonlight_set_brightness)(int val);
362 #endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */
363 #endif /* HAVE_BUTTON_LIGHT */
365 /* file */
366 int (*open)(const char* pathname, int flags);
367 int (*close)(int fd);
368 ssize_t (*read)(int fd, void* buf, size_t count);
369 off_t (*lseek)(int fd, off_t offset, int whence);
370 int (*creat)(const char *pathname);
371 ssize_t (*write)(int fd, const void* buf, size_t count);
372 int (*remove)(const char* pathname);
373 int (*rename)(const char* path, const char* newname);
374 int (*ftruncate)(int fd, off_t length);
375 off_t (*filesize)(int fd);
376 int (*fdprintf)(int fd, const char *fmt, ...) ATTRIBUTE_PRINTF(2, 3);
377 int (*read_line)(int fd, char* buffer, int buffer_size);
378 bool (*settings_parseline)(char* line, char** name, char** value);
379 void (*storage_sleep)(void);
380 void (*storage_spin)(void);
381 void (*storage_spindown)(int seconds);
382 #if USING_STORAGE_CALLBACK
383 void (*register_storage_idle_func)(storage_idle_notify function);
384 void (*unregister_storage_idle_func)(storage_idle_notify function, bool run);
385 #endif /* USING_STORAGE_CALLBACK */
386 void (*reload_directory)(void);
387 char *(*create_numbered_filename)(char *buffer, const char *path,
388 const char *prefix, const char *suffix,
389 int numberlen IF_CNFN_NUM_(, int *num));
390 bool (*file_exists)(const char *file);
393 /* dir */
394 DIR* (*opendir)(const char* name);
395 int (*closedir)(DIR* dir);
396 struct dirent* (*readdir)(DIR* dir);
397 int (*mkdir)(const char *name);
398 int (*rmdir)(const char *name);
399 bool (*dir_exists)(const char *path);
401 /* kernel/ system */
402 void (*sleep)(int ticks);
403 void (*yield)(void);
404 volatile long* current_tick;
405 long (*default_event_handler)(long event);
406 long (*default_event_handler_ex)(long event, void (*callback)(void *), void *parameter);
407 unsigned int (*create_thread)(void (*function)(void), void* stack,
408 size_t stack_size, unsigned flags,
409 const char *name
410 IF_PRIO(, int priority)
411 IF_COP(, unsigned int core));
412 void (*thread_exit)(void);
413 void (*thread_wait)(unsigned int thread_id);
414 #if CONFIG_CODEC == SWCODEC
415 void (*thread_thaw)(unsigned int thread_id);
416 #ifdef HAVE_PRIORITY_SCHEDULING
417 int (*thread_set_priority)(unsigned int thread_id, int priority);
418 #endif
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 unsigned int thread_id);
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 (*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* (*get_settings_list)(int*count);
620 const struct settings_list* (*find_setting)(const void* variable, int *id);
621 bool (*option_screen)(const struct settings_list *setting,
622 struct viewport parent[NB_SCREENS],
623 bool use_temp_var, unsigned char* option_title);
624 bool (*set_option)(const char* string, const void* variable,
625 enum optiontype type, const struct opt_items* options,
626 int numoptions, void (*function)(int));
627 bool (*set_bool_options)(const char* string, const bool* variable,
628 const char* yes_str, int yes_voice,
629 const char* no_str, int no_voice,
630 void (*function)(bool));
631 bool (*set_int)(const unsigned char* string, const char* unit, int voice_unit,
632 const int* variable, void (*function)(int), int step,
633 int min, int max,
634 void (*formatter)(char*, size_t, int, const char*) );
635 bool (*set_bool)(const char* string, const bool* variable );
637 #ifdef HAVE_LCD_COLOR
638 bool (*set_color)(struct screen *display, char *title, unsigned *color,
639 unsigned banned_color);
640 #endif
641 /* action handling */
642 int (*get_custom_action)(int context,int timeout,
643 const struct button_mapping* (*get_context_map)(int));
644 int (*get_action)(int context, int timeout);
645 bool (*action_userabort)(int timeout);
647 /* power */
648 int (*battery_level)(void);
649 bool (*battery_level_safe)(void);
650 int (*battery_time)(void);
651 #ifndef SIMULATOR
652 unsigned int (*battery_voltage)(void);
653 #endif
654 #if CONFIG_CHARGING
655 bool (*charger_inserted)(void);
656 # if CONFIG_CHARGING == CHARGING_MONITOR
657 bool (*charging_state)(void);
658 # endif
659 #endif
660 #ifdef HAVE_USB_POWER
661 bool (*usb_powered)(void);
662 #endif
664 /* misc */
665 void (*srand)(unsigned int seed);
666 int (*rand)(void);
667 void (*qsort)(void *base, size_t nmemb, size_t size,
668 int(*compar)(const void *, const void *));
669 int (*kbd_input)(char* buffer, int buflen);
670 struct tm* (*get_time)(void);
671 int (*set_time)(const struct tm *tm);
672 #if CONFIG_RTC
673 time_t (*mktime)(struct tm *t);
674 #endif
675 void* (*plugin_get_buffer)(size_t *buffer_size);
676 void* (*plugin_get_audio_buffer)(size_t *buffer_size);
677 void (*plugin_tsr)(bool (*exit_callback)(bool reenter));
678 char* (*plugin_get_current_filename)(void);
679 #ifdef PLUGIN_USE_IRAM
680 void (*plugin_iram_init)(char *iramstart, char *iramcopy, size_t iram_size,
681 char *iedata, size_t iedata_size);
682 #endif
683 #if defined(DEBUG) || defined(SIMULATOR)
684 void (*debugf)(const char *fmt, ...) ATTRIBUTE_PRINTF(1, 2);
685 #endif
686 #ifdef ROCKBOX_HAS_LOGF
687 void (*logf)(const char *fmt, ...) ATTRIBUTE_PRINTF(1, 2);
688 #endif
689 struct user_settings* global_settings;
690 struct system_status *global_status;
691 void (*talk_disable)(bool disable);
692 #if CONFIG_CODEC == SWCODEC
693 void (*codec_thread_do_callback)(void (*fn)(void),
694 unsigned int *audio_thread_id);
695 int (*codec_load_file)(const char* codec, struct codec_api *api);
696 const char *(*get_codec_filename)(int cod_spec);
697 bool (*get_metadata)(struct mp3entry* id3, int fd, const char* trackname);
698 #endif
699 bool (*mp3info)(struct mp3entry *entry, const char *filename);
700 int (*count_mp3_frames)(int fd, int startpos, int filesize,
701 void (*progressfunc)(int));
702 int (*create_xing_header)(int fd, long startpos, long filesize,
703 unsigned char *buf, unsigned long num_frames,
704 unsigned long rec_time, unsigned long header_template,
705 void (*progressfunc)(int), bool generate_toc);
706 unsigned long (*find_next_frame)(int fd, long *offset,
707 long max_offset, unsigned long last_header);
709 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
710 unsigned short (*peak_meter_scale_value)(unsigned short val,
711 int meterwidth);
712 void (*peak_meter_set_use_dbfs)(bool use);
713 bool (*peak_meter_get_use_dbfs)(void);
714 #endif
715 #ifdef HAVE_LCD_BITMAP
716 int (*read_bmp_file)(const char* filename, struct bitmap *bm, int maxsize,
717 int format, const struct custom_format *cformat);
718 void (*screen_dump_set_hook)(void (*hook)(int fh));
719 #endif
720 int (*show_logo)(void);
721 struct tree_context* (*tree_get_context)(void);
722 void (*set_current_file)(char* path);
723 void (*set_dirfilter)(int l_dirfilter);
725 #ifdef HAVE_WHEEL_POSITION
726 int (*wheel_status)(void);
727 void (*wheel_send_events)(bool send);
728 #endif
730 #ifdef IRIVER_H100_SERIES
731 /* Routines for the iriver_flash -plugin. */
732 bool (*detect_original_firmware)(void);
733 bool (*detect_flashed_ramimage)(void);
734 bool (*detect_flashed_romimage)(void);
735 #endif
737 void (*led)(bool on);
739 #if (CONFIG_CODEC == SWCODEC)
740 /* buffering API */
741 int (*bufopen)(const char *file, size_t offset, enum data_type type);
742 int (*bufalloc)(const void *src, size_t size, enum data_type type);
743 bool (*bufclose)(int handle_id);
744 int (*bufseek)(int handle_id, size_t newpos);
745 int (*bufadvance)(int handle_id, off_t offset);
746 ssize_t (*bufread)(int handle_id, size_t size, void *dest);
747 ssize_t (*bufgetdata)(int handle_id, size_t size, void **data);
748 ssize_t (*bufgettail)(int handle_id, size_t size, void **data);
749 ssize_t (*bufcuttail)(int handle_id, size_t size);
751 ssize_t (*buf_get_offset)(int handle_id, void *ptr);
752 ssize_t (*buf_handle_offset)(int handle_id);
753 void (*buf_request_buffer_handle)(int handle_id);
754 void (*buf_set_base_handle)(int handle_id);
755 size_t (*buf_used)(void);
756 #endif
758 #ifdef HAVE_TAGCACHE
759 bool (*tagcache_search)(struct tagcache_search *tcs, int tag);
760 void (*tagcache_search_set_uniqbuf)(struct tagcache_search *tcs,
761 void *buffer, long length);
762 bool (*tagcache_search_add_filter)(struct tagcache_search *tcs,
763 int tag, int seek);
764 bool (*tagcache_get_next)(struct tagcache_search *tcs);
765 bool (*tagcache_retrieve)(struct tagcache_search *tcs, int idxid,
766 int tag, char *buf, long size);
767 void (*tagcache_search_finish)(struct tagcache_search *tcs);
768 long (*tagcache_get_numeric)(const struct tagcache_search *tcs, int tag);
769 #endif
771 #ifdef HAVE_ALBUMART
772 bool (*find_albumart)(const struct mp3entry *id3, char *buf, int buflen);
773 bool (*search_albumart_files)(const struct mp3entry *id3, const char *size_string,
774 char *buf, int buflen);
775 #endif
777 #ifdef HAVE_SEMAPHORE_OBJECTS
778 void (*semaphore_init)(struct semaphore *s, int max, int start);
779 void (*semaphore_wait)(struct semaphore *s);
780 void (*semaphore_release)(struct semaphore *s);
781 #endif
783 const char *appsversion;
784 /* new stuff at the end, sort into place next time
785 the API gets incompatible */
788 /* plugin header */
789 struct plugin_header {
790 unsigned long magic;
791 unsigned short target_id;
792 unsigned short api_version;
793 unsigned char *load_addr;
794 unsigned char *end_addr;
795 enum plugin_status(*entry_point)(const struct plugin_api*, const void*);
798 #ifdef PLUGIN
799 #ifndef SIMULATOR
800 extern unsigned char plugin_start_addr[];
801 extern unsigned char plugin_end_addr[];
802 #define PLUGIN_HEADER \
803 const struct plugin_header __header \
804 __attribute__ ((section (".header")))= { \
805 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
806 plugin_start_addr, plugin_end_addr, plugin_start };
807 #else /* SIMULATOR */
808 #define PLUGIN_HEADER \
809 const struct plugin_header __header \
810 __attribute__((visibility("default"))) = { \
811 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
812 NULL, NULL, plugin_start };
813 #endif /* SIMULATOR */
815 #ifdef PLUGIN_USE_IRAM
816 /* Declare IRAM variables */
817 #define PLUGIN_IRAM_DECLARE \
818 extern char iramcopy[]; \
819 extern char iramstart[]; \
820 extern char iramend[]; \
821 extern char iedata[]; \
822 extern char iend[];
823 /* Initialize IRAM */
824 #define PLUGIN_IRAM_INIT(api) \
825 (api)->plugin_iram_init(iramstart, iramcopy, iramend-iramstart, \
826 iedata, iend-iedata);
827 #else
828 #define PLUGIN_IRAM_DECLARE
829 #define PLUGIN_IRAM_INIT(api)
830 #endif /* PLUGIN_USE_IRAM */
831 #endif /* PLUGIN */
833 int plugin_load(const char* plugin, const void* parameter);
834 void* plugin_get_audio_buffer(size_t *buffer_size);
835 #ifdef PLUGIN_USE_IRAM
836 void plugin_iram_init(char *iramstart, char *iramcopy, size_t iram_size,
837 char *iedata, size_t iedata_size);
838 #endif
840 /* plugin_tsr,
841 callback returns true to allow the new plugin to load,
842 reenter means the currently running plugin is being reloaded */
843 void plugin_tsr(bool (*exit_callback)(bool reenter));
845 /* defined by the plugin */
846 enum plugin_status plugin_start(const struct plugin_api* rockbox, const void* parameter)
847 NO_PROF_ATTR;
849 /* Use this macro in plugins where gcc tries to optimize by calling
850 * these functions directly */
851 #define MEM_FUNCTION_WRAPPERS(api) \
852 void *memcpy(void *dest, const void *src, size_t n) \
854 return (api)->memcpy(dest, src, n); \
856 void *memset(void *dest, int c, size_t n) \
858 return (api)->memset(dest, c, n); \
860 void *memmove(void *dest, const void *src, size_t n) \
862 return (api)->memmove(dest, src, n); \
864 int memcmp(const void *s1, const void *s2, size_t n) \
866 return (api)->memcmp(s1, s2, n); \
869 #ifndef CACHE_FUNCTION_WRAPPERS
871 #ifdef CACHE_FUNCTIONS_AS_CALL
872 #define CACHE_FUNCTION_WRAPPERS(api) \
873 void flush_icache(void) \
875 (api)->flush_icache(); \
877 void invalidate_icache(void) \
879 (api)->invalidate_icache(); \
881 #else
882 #define CACHE_FUNCTION_WRAPPERS(api)
883 #endif /* CACHE_FUNCTIONS_AS_CALL */
885 #endif /* CACHE_FUNCTION_WRAPPERS */
887 #ifndef ALIGN_BUFFER_WRAPPER
888 #define ALIGN_BUFFER_WRAPPER(api) \
889 size_t align_buffer(void **start, size_t size, size_t align) \
891 return (api)->align_buffer(start, size, align); \
893 #endif /* ALIGN_BUFFER_WRAPPER */
895 #endif /* __PCTOOL__ */
896 #endif