1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
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 ****************************************************************************/
24 /* instruct simulator code to not redefine any symbols when compiling plugins.
25 (the PLUGIN macro is defined in apps/plugins/Makefile) */
27 #define NO_REDEFINES_PLEASE
36 #include <sys/types.h>
41 #include "string-extra.h"
42 #include "gcc_extensions.h"
44 char* strncpy(char *, const char *, size_t);
45 void* plugin_get_buffer(size_t *buffer_size
);
56 #include "load_code.h"
64 #include "mp3_playback.h"
70 #include "filefuncs.h"
71 #if (CONFIG_CODEC == SWCODEC)
75 #include "codec_thread.h"
77 #include "recording.h"
81 #endif /* CONFIG_CODEC == SWCODEC */
85 #ifdef HAVE_LCD_BITMAP
86 #include "screendump.h"
87 #include "scrollbar.h"
88 #include "jpeg_load.h"
89 #include "../recorder/bmp.h"
91 #include "statusbar.h"
93 #include "rbunicode.h"
96 #include "color_picker.h"
97 #include "buffering.h"
100 #include "ata_idle_notify.h"
101 #include "settings_list.h"
102 #include "timefuncs.h"
106 #include "albumart.h"
109 #ifdef HAVE_REMOTE_LCD
110 #include "lcd-remote.h"
115 #ifdef USB_ENABLE_HID
116 #include "usbstack/usb_hid_usage_tables.h"
120 /* on some platforms strcmp() seems to be a tricky define which
121 * breaks if we write down strcmp's prototype */
126 #if defined(DEBUG) || defined(SIMULATOR)
128 #define DEBUGF rb->debugf
130 #define LDEBUGF rb->debugf
133 #define DEBUGF(...) do { } while(0)
135 #define LDEBUGF(...) do { } while(0)
138 #ifdef ROCKBOX_HAS_LOGF
140 #define LOGF rb->logf
147 #define PLUGIN_MAGIC 0x526F634B /* RocK */
149 /* increase this every time the api struct changes */
150 #define PLUGIN_API_VERSION 193
152 /* update this to latest version if a change to the api struct breaks
153 backwards compatibility (and please take the opportunity to sort in any
154 new function which are "waiting" at the end of the function table) */
155 #define PLUGIN_MIN_API_VERSION 192
157 /* plugin return codes */
158 /* internal returns start at 0x100 to make exit(1..255) work */
159 #define INTERNAL_PLUGIN_RETVAL_START 0x100
161 PLUGIN_OK
= 0, /* PLUGIN_OK == EXIT_SUCCESS */
162 /* 1...255 reserved for exit() */
163 PLUGIN_USB_CONNECTED
= INTERNAL_PLUGIN_RETVAL_START
,
169 /* NOTE: To support backwards compatibility, only add new functions at
170 the end of the structure. Every time you add a new function,
171 remember to increase PLUGIN_API_VERSION. If you make changes to the
172 existing APIs then also update PLUGIN_MIN_API_VERSION to current
179 #ifdef HAVE_LCD_CONTRAST
180 void (*lcd_set_contrast
)(int x
);
182 void (*lcd_update
)(void);
183 void (*lcd_clear_display
)(void);
184 int (*lcd_getstringsize
)(const unsigned char *str
, int *w
, int *h
);
185 void (*lcd_putsxy
)(int x
, int y
, const unsigned char *string
);
186 void (*lcd_putsxyf
)(int x
, int y
, const unsigned char *fmt
, ...);
187 void (*lcd_puts
)(int x
, int y
, const unsigned char *string
);
188 void (*lcd_putsf
)(int x
, int y
, const unsigned char *fmt
, ...);
189 void (*lcd_puts_scroll
)(int x
, int y
, const unsigned char* string
);
190 void (*lcd_stop_scroll
)(void);
191 #ifdef HAVE_LCD_CHARCELLS
192 void (*lcd_define_pattern
)(unsigned long ucs
, const char *pattern
);
193 unsigned long (*lcd_get_locked_pattern
)(void);
194 void (*lcd_unlock_pattern
)(unsigned long ucs
);
195 void (*lcd_putc
)(int x
, int y
, unsigned long ucs
);
196 void (*lcd_put_cursor
)(int x
, int y
, unsigned long ucs
);
197 void (*lcd_remove_cursor
)(void);
198 void (*lcd_icon
)(int icon
, bool enable
);
199 void (*lcd_double_height
)(bool on
);
200 #else /* HAVE_LCD_BITMAP */
201 fb_data
* lcd_framebuffer
;
202 void (*lcd_update_rect
)(int x
, int y
, int width
, int height
);
203 void (*lcd_set_drawmode
)(int mode
);
204 int (*lcd_get_drawmode
)(void);
205 void (*lcd_setfont
)(int font
);
206 void (*lcd_drawpixel
)(int x
, int y
);
207 void (*lcd_drawline
)(int x1
, int y1
, int x2
, int y2
);
208 void (*lcd_hline
)(int x1
, int x2
, int y
);
209 void (*lcd_vline
)(int x
, int y1
, int y2
);
210 void (*lcd_drawrect
)(int x
, int y
, int width
, int height
);
211 void (*lcd_fillrect
)(int x
, int y
, int width
, int height
);
212 void (*lcd_mono_bitmap_part
)(const unsigned char *src
, int src_x
, int src_y
,
213 int stride
, int x
, int y
, int width
, int height
);
214 void (*lcd_mono_bitmap
)(const unsigned char *src
, int x
, int y
,
215 int width
, int height
);
217 void (*lcd_set_foreground
)(unsigned foreground
);
218 unsigned (*lcd_get_foreground
)(void);
219 void (*lcd_set_background
)(unsigned foreground
);
220 unsigned (*lcd_get_background
)(void);
221 void (*lcd_bitmap_part
)(const fb_data
*src
, int src_x
, int src_y
,
222 int stride
, int x
, int y
, int width
, int height
);
223 void (*lcd_bitmap
)(const fb_data
*src
, int x
, int y
, int width
,
225 fb_data
* (*lcd_get_backdrop
)(void);
226 void (*lcd_set_backdrop
)(fb_data
* backdrop
);
229 void (*lcd_bitmap_transparent_part
)(const fb_data
*src
,
230 int src_x
, int src_y
, int stride
,
231 int x
, int y
, int width
, int height
);
232 void (*lcd_bitmap_transparent
)(const fb_data
*src
, int x
, int y
,
233 int width
, int height
);
235 void (*lcd_blit_yuv
)(unsigned char * const src
[3],
236 int src_x
, int src_y
, int stride
,
237 int x
, int y
, int width
, int height
);
238 #if defined(TOSHIBA_GIGABEAT_F) || defined(SANSA_E200) || defined(SANSA_C200) \
239 || defined(IRIVER_H10) || defined(COWON_D2) || defined(PHILIPS_HDD1630) \
240 || defined(SANSA_FUZE) || defined(SANSA_E200V2) || defined(SANSA_FUZEV2) \
241 || defined(TOSHIBA_GIGABEAT_S)
242 void (*lcd_yuv_set_options
)(unsigned options
);
244 #endif /* MEMORYSIZE > 2 */
245 #elif (LCD_DEPTH < 4) && (CONFIG_PLATFORM & PLATFORM_NATIVE)
246 void (*lcd_blit_mono
)(const unsigned char *data
, int x
, int by
, int width
,
247 int bheight
, int stride
);
248 void (*lcd_blit_grey_phase
)(unsigned char *values
, unsigned char *phases
,
249 int bx
, int by
, int bwidth
, int bheight
,
251 #endif /* LCD_DEPTH */
252 #if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256)
253 void (*lcd_blit_pal256
)(unsigned char *src
, int src_x
, int src_y
, int x
, int y
,
254 int width
, int height
);
255 void (*lcd_pal256_update_pal
)(fb_data
*palette
);
257 void (*lcd_puts_style
)(int x
, int y
, const unsigned char *str
, int style
);
258 void (*lcd_puts_scroll_style
)(int x
, int y
, const unsigned char* string
,
260 #ifdef HAVE_LCD_INVERT
261 void (*lcd_set_invert_display
)(bool yesno
);
262 #endif /* HAVE_LCD_INVERT */
263 #if defined(HAVE_LCD_MODES)
264 void (*lcd_set_mode
)(int mode
);
267 #if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP)
268 struct event_queue
*button_queue
;
270 unsigned short *(*bidi_l2v
)( const unsigned char *str
, int orientation
);
271 #ifdef HAVE_LCD_BITMAP
272 bool (*is_diacritic
)(const unsigned short char_code
, bool *is_rtl
);
274 const unsigned char *(*font_get_bits
)( struct font
*pf
, unsigned short char_code
);
275 int (*font_load
)(struct font
*, const char *path
);
276 struct font
* (*font_get
)(int font
);
277 int (*font_getstringsize
)(const unsigned char *str
, int *w
, int *h
,
279 int (*font_get_width
)(struct font
* pf
, unsigned short char_code
);
280 void (*screen_clear_area
)(struct screen
* display
, int xstart
, int ystart
,
281 int width
, int height
);
282 void (*gui_scrollbar_draw
)(struct screen
* screen
, int x
, int y
,
283 int width
, int height
, int items
,
284 int min_shown
, int max_shown
,
286 #endif /* HAVE_LCD_BITMAP */
287 const char* (*get_codepage_name
)(int cp
);
290 /* The backlight_* functions must be present in the API regardless whether
291 * HAVE_BACKLIGHT is defined or not. The reason is that the stock Ondio has
292 * no backlight but can be modded to have backlight (it's prepared on the
293 * PCB). This makes backlight an all-target feature API wise, and keeps API
294 * compatible between stock and modded Ondio.
295 * For OLED targets like the Sansa Clip, the backlight_* functions control
296 * the display enable, which has essentially the same effect. */
297 void (*backlight_on
)(void);
298 void (*backlight_off
)(void);
299 void (*backlight_set_timeout
)(int index
);
300 #ifdef HAVE_BACKLIGHT_BRIGHTNESS
301 void (*backlight_set_brightness
)(int val
);
302 #endif /* HAVE_BACKLIGHT_BRIGHTNESS */
305 void (*backlight_set_timeout_plugged
)(int index
);
307 bool (*is_backlight_on
)(bool ignore_always_off
);
308 void (*splash
)(int ticks
, const char *str
);
309 void (*splashf
)(int ticks
, const char *fmt
, ...) ATTRIBUTE_PRINTF(2, 3);
311 #ifdef HAVE_REMOTE_LCD
313 void (*lcd_remote_set_contrast
)(int x
);
314 void (*lcd_remote_clear_display
)(void);
315 void (*lcd_remote_puts
)(int x
, int y
, const unsigned char *string
);
316 void (*lcd_remote_puts_scroll
)(int x
, int y
, const unsigned char* string
);
317 void (*lcd_remote_stop_scroll
)(void);
318 void (*lcd_remote_set_drawmode
)(int mode
);
319 int (*lcd_remote_get_drawmode
)(void);
320 void (*lcd_remote_setfont
)(int font
);
321 int (*lcd_remote_getstringsize
)(const unsigned char *str
, int *w
, int *h
);
322 void (*lcd_remote_drawpixel
)(int x
, int y
);
323 void (*lcd_remote_drawline
)(int x1
, int y1
, int x2
, int y2
);
324 void (*lcd_remote_hline
)(int x1
, int x2
, int y
);
325 void (*lcd_remote_vline
)(int x
, int y1
, int y2
);
326 void (*lcd_remote_drawrect
)(int x
, int y
, int nx
, int ny
);
327 void (*lcd_remote_fillrect
)(int x
, int y
, int nx
, int ny
);
328 void (*lcd_remote_mono_bitmap_part
)(const unsigned char *src
, int src_x
,
329 int src_y
, int stride
, int x
, int y
,
330 int width
, int height
);
331 void (*lcd_remote_mono_bitmap
)(const unsigned char *src
, int x
, int y
,
332 int width
, int height
);
333 void (*lcd_remote_putsxy
)(int x
, int y
, const unsigned char *string
);
334 void (*lcd_remote_puts_style
)(int x
, int y
, const unsigned char *str
, int style
);
335 void (*lcd_remote_puts_scroll_style
)(int x
, int y
, const unsigned char* string
,
337 fb_remote_data
* lcd_remote_framebuffer
;
338 void (*lcd_remote_update
)(void);
339 void (*lcd_remote_update_rect
)(int x
, int y
, int width
, int height
);
341 void (*remote_backlight_on
)(void);
342 void (*remote_backlight_off
)(void);
343 void (*remote_backlight_set_timeout
)(int index
);
345 void (*remote_backlight_set_timeout_plugged
)(int index
);
347 #endif /* HAVE_REMOTE_LCD */
348 struct screen
* screens
[NB_SCREENS
];
349 #if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)
350 void (*lcd_remote_set_foreground
)(unsigned foreground
);
351 unsigned (*lcd_remote_get_foreground
)(void);
352 void (*lcd_remote_set_background
)(unsigned background
);
353 unsigned (*lcd_remote_get_background
)(void);
354 void (*lcd_remote_bitmap_part
)(const fb_remote_data
*src
,
355 int src_x
, int src_y
, int stride
,
356 int x
, int y
, int width
, int height
);
357 void (*lcd_remote_bitmap
)(const fb_remote_data
*src
, int x
, int y
,
358 int width
, int height
);
360 void (*viewport_set_defaults
)(struct viewport
*vp
,
361 const enum screen_type screen
);
362 #ifdef HAVE_LCD_BITMAP
363 void (*viewportmanager_theme_enable
)(enum screen_type screen
, bool enable
,
364 struct viewport
*viewport
);
365 void (*viewportmanager_theme_undo
)(enum screen_type screen
, bool force_redraw
);
368 void (*gui_synclist_init
)(struct gui_synclist
* lists
,
369 list_get_name callback_get_item_name
, void * data
,
370 bool scroll_all
,int selected_size
,
371 struct viewport parent
[NB_SCREENS
]);
372 void (*gui_synclist_set_nb_items
)(struct gui_synclist
* lists
, int nb_items
);
373 void (*gui_synclist_set_icon_callback
)(struct gui_synclist
* lists
,
374 list_get_icon icon_callback
);
375 int (*gui_synclist_get_nb_items
)(struct gui_synclist
* lists
);
376 int (*gui_synclist_get_sel_pos
)(struct gui_synclist
* lists
);
377 void (*gui_synclist_draw
)(struct gui_synclist
* lists
);
378 void (*gui_synclist_select_item
)(struct gui_synclist
* lists
,
380 void (*gui_synclist_add_item
)(struct gui_synclist
* lists
);
381 void (*gui_synclist_del_item
)(struct gui_synclist
* lists
);
382 void (*gui_synclist_limit_scroll
)(struct gui_synclist
* lists
, bool scroll
);
383 bool (*gui_synclist_do_button
)(struct gui_synclist
* lists
,
384 int *action
, enum list_wrap wrap
);
385 void (*gui_synclist_set_title
)(struct gui_synclist
*lists
, char* title
,
386 enum themable_icons icon
);
387 enum yesno_res (*gui_syncyesno_run
)(const struct text_message
* main_message
,
388 const struct text_message
* yes_message
,
389 const struct text_message
* no_message
);
390 void (*simplelist_info_init
)(struct simplelist_info
*info
, char* title
,
391 int count
, void* data
);
392 bool (*simplelist_show_list
)(struct simplelist_info
*info
);
395 long (*button_get
)(bool block
);
396 long (*button_get_w_tmo
)(int ticks
);
397 int (*button_status
)(void);
398 #ifdef HAVE_BUTTON_DATA
399 intptr_t (*button_get_data
)(void);
400 int (*button_status_wdata
)(int *pdata
);
402 void (*button_clear_queue
)(void);
403 int (*button_queue_count
)(void);
404 #ifdef HAS_BUTTON_HOLD
405 bool (*button_hold
)(void);
407 #ifdef HAVE_TOUCHSCREEN
408 void (*touchscreen_set_mode
)(enum touchscreen_mode
);
410 #ifdef HAVE_BUTTON_LIGHT
411 void (*buttonlight_set_timeout
)(int value
);
412 void (*buttonlight_off
)(void);
413 void (*buttonlight_on
)(void);
414 #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS
415 void (*buttonlight_set_brightness
)(int val
);
416 #endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */
417 #endif /* HAVE_BUTTON_LIGHT */
420 int (*open_utf8
)(const char* pathname
, int flags
);
421 int (*open
)(const char* pathname
, int flags
, ...);
422 int (*close
)(int fd
);
423 ssize_t (*read
)(int fd
, void* buf
, size_t count
);
424 off_t (*lseek
)(int fd
, off_t offset
, int whence
);
425 int (*creat
)(const char *pathname
, mode_t mode
);
426 ssize_t (*write
)(int fd
, const void* buf
, size_t count
);
427 int (*remove
)(const char* pathname
);
428 int (*rename
)(const char* path
, const char* newname
);
429 int (*ftruncate
)(int fd
, off_t length
);
430 off_t (*filesize
)(int fd
);
431 int (*fdprintf
)(int fd
, const char *fmt
, ...) ATTRIBUTE_PRINTF(2, 3);
432 int (*read_line
)(int fd
, char* buffer
, int buffer_size
);
433 bool (*settings_parseline
)(char* line
, char** name
, char** value
);
434 void (*storage_sleep
)(void);
435 void (*storage_spin
)(void);
436 void (*storage_spindown
)(int seconds
);
437 #if USING_STORAGE_CALLBACK
438 void (*register_storage_idle_func
)(void (*function
)(void *data
));
439 void (*unregister_storage_idle_func
)(void (*function
)(void *data
), bool run
);
440 #endif /* USING_STORAGE_CALLBACK */
441 void (*reload_directory
)(void);
442 char *(*create_numbered_filename
)(char *buffer
, const char *path
,
443 const char *prefix
, const char *suffix
,
444 int numberlen
IF_CNFN_NUM_(, int *num
));
445 bool (*file_exists
)(const char *file
);
446 char* (*strip_extension
)(char* buffer
, int buffer_size
, const char *filename
);
447 unsigned (*crc_32
)(const void *src
, unsigned len
, unsigned crc32
);
451 DIR* (*opendir
)(const char* name
);
452 int (*closedir
)(DIR* dir
);
453 struct dirent
* (*readdir
)(DIR* dir
);
454 int (*mkdir
)(const char *name
);
455 int (*rmdir
)(const char *name
);
456 bool (*dir_exists
)(const char *path
);
459 #if defined(CPU_ARM) && CONFIG_PLATFORM & PLATFORM_NATIVE
460 void (*__div0
)(void);
462 unsigned (*sleep
)(unsigned ticks
);
464 volatile long* current_tick
;
465 long (*default_event_handler
)(long event
);
466 long (*default_event_handler_ex
)(long event
,
467 void (*callback
)(void *), void *parameter
);
468 unsigned int (*create_thread
)(void (*function
)(void), void* stack
,
469 size_t stack_size
, unsigned flags
,
471 IF_PRIO(, int priority
)
472 IF_COP(, unsigned int core
));
473 void (*thread_exit
)(void);
474 void (*thread_wait
)(unsigned int thread_id
);
475 #if CONFIG_CODEC == SWCODEC
476 void (*thread_thaw
)(unsigned int thread_id
);
477 #ifdef HAVE_PRIORITY_SCHEDULING
478 int (*thread_set_priority
)(unsigned int thread_id
, int priority
);
480 void (*mutex_init
)(struct mutex
*m
);
481 void (*mutex_lock
)(struct mutex
*m
);
482 void (*mutex_unlock
)(struct mutex
*m
);
485 void (*reset_poweroff_timer
)(void);
486 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
487 int (*system_memory_guard
)(int newmode
);
489 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
490 #ifdef CPU_BOOST_LOGGING
491 void (*cpu_boost_
)(bool on_off
,char*location
,int line
);
493 void (*cpu_boost
)(bool on_off
);
495 #endif /* HAVE_ADJUSTABLE_CPU_FREQ */
496 #endif /* PLATFORM_NATIVE */
497 #ifdef HAVE_SCHEDULER_BOOSTCTRL
498 void (*trigger_cpu_boost
)(void);
499 void (*cancel_cpu_boost
)(void);
501 #ifdef HAVE_CPUCACHE_FLUSH
502 void (*cpucache_flush
)(void);
504 #ifdef HAVE_CPUCACHE_INVALIDATE
505 void (*cpucache_invalidate
)(void);
507 bool (*timer_register
)(int reg_prio
, void (*unregister_callback
)(void),
508 long cycles
, void (*timer_callback
)(void)
510 void (*timer_unregister
)(void);
511 bool (*timer_set_period
)(long count
);
513 void (*queue_init
)(struct event_queue
*q
, bool register_queue
);
514 void (*queue_delete
)(struct event_queue
*q
);
515 void (*queue_post
)(struct event_queue
*q
, long id
, intptr_t data
);
516 void (*queue_wait_w_tmo
)(struct event_queue
*q
, struct queue_event
*ev
,
518 #if CONFIG_CODEC == SWCODEC
519 void (*queue_enable_queue_send
)(struct event_queue
*q
,
520 struct queue_sender_list
*send
,
521 unsigned int thread_id
);
522 bool (*queue_empty
)(const struct event_queue
*q
);
523 void (*queue_wait
)(struct event_queue
*q
, struct queue_event
*ev
);
524 intptr_t (*queue_send
)(struct event_queue
*q
, long id
,
526 void (*queue_reply
)(struct event_queue
*q
, intptr_t retval
);
527 #endif /* CONFIG_CODEC == SWCODEC */
529 void (*usb_acknowledge
)(long id
);
530 #ifdef USB_ENABLE_HID
531 void (*usb_hid_send
)(usage_page_t usage_page
, int id
);
534 void (*profile_thread
)(void);
535 void (*profstop
)(void);
536 void (*profile_func_enter
)(void *this_fn
, void *call_site
);
537 void (*profile_func_exit
)(void *this_fn
, void *call_site
);
540 bool (*add_event
)(unsigned short id
, bool oneshot
, void (*handler
)(void *data
));
541 void (*remove_event
)(unsigned short id
, void (*handler
)(void *data
));
542 void (*send_event
)(unsigned short id
, void *data
);
544 #if (CONFIG_PLATFORM & PLATFORM_HOSTED)
545 /* special simulator hooks */
546 #if defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8
547 void (*sim_lcd_ex_init
)(unsigned long (*getpixel
)(int, int));
548 void (*sim_lcd_ex_update_rect
)(int x
, int y
, int width
, int height
);
552 /* strings and memory */
553 int (*snprintf
)(char *buf
, size_t size
, const char *fmt
, ...)
554 ATTRIBUTE_PRINTF(3, 4);
555 int (*vsnprintf
)(char *buf
, size_t size
, const char *fmt
, va_list ap
);
556 char* (*strcpy
)(char *dst
, const char *src
);
557 size_t (*strlcpy
)(char *dst
, const char *src
, size_t length
);
558 size_t (*strlen
)(const char *str
);
559 char * (*strrchr
)(const char *s
, int c
);
560 int (*strcmp
)(const char *, const char *);
561 int (*strncmp
)(const char *, const char *, size_t);
562 int (*strcasecmp
)(const char *, const char *);
563 int (*strncasecmp
)(const char *s1
, const char *s2
, size_t n
);
564 void* (*memset
)(void *dst
, int c
, size_t length
);
565 void* (*memcpy
)(void *out
, const void *in
, size_t n
);
566 void* (*memmove
)(void *out
, const void *in
, size_t n
);
567 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
568 const unsigned char *_rbctype_
;
570 int (*atoi
)(const char *str
);
571 char *(*strchr
)(const char *s
, int c
);
572 char *(*strcat
)(char *s1
, const char *s2
);
573 size_t (*strlcat
)(char *dst
, const char *src
, size_t length
);
574 void *(*memchr
)(const void *s1
, int c
, size_t n
);
575 int (*memcmp
)(const void *s1
, const void *s2
, size_t n
);
576 char *(*strcasestr
) (const char* phaystack
, const char* pneedle
);
577 char* (*strtok_r
)(char *ptr
, const char *sep
, char **end
);
579 const unsigned char* (*utf8decode
)(const unsigned char *utf8
, unsigned short *ucs
);
580 unsigned char* (*iso_decode
)(const unsigned char *iso
, unsigned char *utf8
, int cp
, int count
);
581 unsigned char* (*utf16LEdecode
)(const unsigned char *utf16
, unsigned char *utf8
, int count
);
582 unsigned char* (*utf16BEdecode
)(const unsigned char *utf16
, unsigned char *utf8
, int count
);
583 unsigned char* (*utf8encode
)(unsigned long ucs
, unsigned char *utf8
);
584 unsigned long (*utf8length
)(const unsigned char *utf8
);
585 int (*utf8seek
)(const unsigned char* utf8
, int offset
);
588 void (*sound_set
)(int setting
, int value
);
589 int (*sound_default
)(int setting
);
590 int (*sound_min
)(int setting
);
591 int (*sound_max
)(int setting
);
592 const char * (*sound_unit
)(int setting
);
593 int (*sound_val2phys
)(int setting
, int value
);
594 #ifdef AUDIOHW_HAVE_EQ
595 int (*sound_enum_hw_eq_band_setting
)(unsigned int band
,
596 unsigned int band_setting
);
597 #endif /* AUDIOHW_HAVE_EQ */
598 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
599 void (*mp3_play_data
)(const unsigned char* start
, int size
,
600 void (*get_more
)(unsigned char** start
, size_t* size
));
601 void (*mp3_play_pause
)(bool play
);
602 void (*mp3_play_stop
)(void);
603 bool (*mp3_is_playing
)(void);
604 #if CONFIG_CODEC != SWCODEC
605 void (*bitswap
)(unsigned char *data
, int length
);
607 #endif /* PLATFORM_NATIVE */
608 #if CONFIG_CODEC == SWCODEC
609 const unsigned long *audio_master_sampr_list
;
610 const unsigned long *hw_freq_sampr
;
611 void (*pcm_apply_settings
)(void);
612 void (*pcm_play_data
)(pcm_play_callback_type get_more
,
613 unsigned char* start
, size_t size
);
614 void (*pcm_play_stop
)(void);
615 void (*pcm_set_frequency
)(unsigned int frequency
);
616 bool (*pcm_is_playing
)(void);
617 bool (*pcm_is_paused
)(void);
618 void (*pcm_play_pause
)(bool play
);
619 size_t (*pcm_get_bytes_waiting
)(void);
620 void (*pcm_calculate_peaks
)(int *left
, int *right
);
621 const void* (*pcm_get_peak_buffer
)(int *count
);
622 void (*pcm_play_lock
)(void);
623 void (*pcm_play_unlock
)(void);
624 void (*pcmbuf_beep
)(unsigned int frequency
,
627 #ifdef HAVE_RECORDING
628 const unsigned long *rec_freq_sampr
;
629 void (*pcm_init_recording
)(void);
630 void (*pcm_close_recording
)(void);
631 void (*pcm_record_data
)(pcm_rec_callback_type more_ready
,
632 void *start
, size_t size
);
633 void (*pcm_stop_recording
)(void);
634 void (*pcm_calculate_rec_peaks
)(int *left
, int *right
);
635 void (*audio_set_recording_gain
)(int left
, int right
, int type
);
636 #endif /* HAVE_RECORDING */
637 #if INPUT_SRC_CAPS != 0
638 void (*audio_set_output_source
)(int monitor
);
639 void (*audio_set_input_source
)(int source
, unsigned flags
);
641 void (*dsp_set_crossfeed
)(bool enable
);
642 void (*dsp_set_eq
)(bool enable
);
643 void (*dsp_dither_enable
)(bool enable
);
644 intptr_t (*dsp_configure
)(struct dsp_config
*dsp
, int setting
,
646 int (*dsp_process
)(struct dsp_config
*dsp
, char *dest
,
647 const char *src
[], int count
);
648 int (*dsp_input_count
)(struct dsp_config
*dsp
, int count
);
649 int (*dsp_output_count
)(struct dsp_config
*dsp
, int count
);
650 #endif /* CONFIG_CODEC == SWCODC */
652 /* playback control */
653 int (*playlist_amount
)(void);
654 int (*playlist_resume
)(void);
655 void (*playlist_start
)(int start_index
, int offset
);
656 int (*playlist_add
)(const char *filename
);
657 void (*playlist_sync
)(struct playlist_info
* playlist
);
658 int (*playlist_remove_all_tracks
)(struct playlist_info
*playlist
);
659 int (*playlist_create
)(const char *dir
, const char *file
);
660 int (*playlist_insert_track
)(struct playlist_info
* playlist
,
661 const char *filename
, int position
, bool queue
, bool sync
);
662 int (*playlist_insert_directory
)(struct playlist_info
* playlist
,
663 const char *dirname
, int position
, bool queue
,
665 int (*playlist_shuffle
)(int random_seed
, int start_index
);
666 void (*audio_play
)(long offset
);
667 void (*audio_stop
)(void);
668 void (*audio_pause
)(void);
669 void (*audio_resume
)(void);
670 void (*audio_next
)(void);
671 void (*audio_prev
)(void);
672 void (*audio_ff_rewind
)(long newtime
);
673 struct mp3entry
* (*audio_next_track
)(void);
674 int (*audio_status
)(void);
675 struct mp3entry
* (*audio_current_track
)(void);
676 void (*audio_flush_and_reload_tracks
)(void);
677 int (*audio_get_file_pos
)(void);
678 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
679 unsigned long (*mpeg_get_last_header
)(void);
681 #if ((CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) || \
682 (CONFIG_CODEC == SWCODEC)) && defined (HAVE_PITCHSCREEN)
683 void (*sound_set_pitch
)(int32_t pitch
);
686 /* MAS communication */
687 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
688 int (*mas_readmem
)(int bank
, int addr
, unsigned long* dest
, int len
);
689 int (*mas_writemem
)(int bank
, int addr
, const unsigned long* src
, int len
);
690 int (*mas_readreg
)(int reg
);
691 int (*mas_writereg
)(int reg
, unsigned int val
);
692 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
693 int (*mas_codec_writereg
)(int reg
, unsigned int val
);
694 int (*mas_codec_readreg
)(int reg
);
695 void (*i2c_begin
)(void);
696 void (*i2c_end
)(void);
697 int (*i2c_write
)(int address
, const unsigned char* buf
, int count
);
702 int (*do_menu
)(const struct menu_item_ex
*menu
, int *start_selected
,
703 struct viewport parent
[NB_SCREENS
], bool hide_theme
);
706 struct gui_syncstatusbar
*statusbars
;
707 void (*gui_syncstatusbar_draw
)(struct gui_syncstatusbar
* bars
, bool force_redraw
);
710 const struct settings_list
* (*get_settings_list
)(int*count
);
711 const struct settings_list
* (*find_setting
)(const void* variable
, int *id
);
712 bool (*option_screen
)(const struct settings_list
*setting
,
713 struct viewport parent
[NB_SCREENS
],
714 bool use_temp_var
, unsigned char* option_title
);
715 bool (*set_option
)(const char* string
, const void* variable
,
716 enum optiontype type
, const struct opt_items
* options
,
717 int numoptions
, void (*function
)(int));
718 bool (*set_bool_options
)(const char* string
, const bool* variable
,
719 const char* yes_str
, int yes_voice
,
720 const char* no_str
, int no_voice
,
721 void (*function
)(bool));
722 bool (*set_int
)(const unsigned char* string
, const char* unit
, int voice_unit
,
723 const int* variable
, void (*function
)(int), int step
,
725 const char* (*formatter
)(char*, size_t, int, const char*) );
726 bool (*set_bool
)(const char* string
, const bool* variable
);
728 #ifdef HAVE_LCD_COLOR
729 bool (*set_color
)(struct screen
*display
, char *title
,
730 unsigned *color
, unsigned banned_color
);
732 /* action handling */
733 int (*get_custom_action
)(int context
,int timeout
,
734 const struct button_mapping
* (*get_context_map
)(int));
735 int (*get_action
)(int context
, int timeout
);
736 #ifdef HAVE_TOUCHSCREEN
737 int (*action_get_touchscreen_press
)(short *x
, short *y
);
739 bool (*action_userabort
)(int timeout
);
742 int (*battery_level
)(void);
743 bool (*battery_level_safe
)(void);
744 int (*battery_time
)(void);
745 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
746 unsigned int (*battery_voltage
)(void);
749 bool (*charger_inserted
)(void);
750 # if CONFIG_CHARGING >= CHARGING_MONITOR
751 bool (*charging_state
)(void);
754 #ifdef HAVE_USB_POWER
755 bool (*usb_powered
)(void);
759 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
762 void (*srand
)(unsigned int seed
);
764 void (*qsort
)(void *base
, size_t nmemb
, size_t size
,
765 int(*compar
)(const void *, const void *));
766 int (*kbd_input
)(char* buffer
, int buflen
);
767 struct tm
* (*get_time
)(void);
768 int (*set_time
)(const struct tm
*tm
);
770 time_t (*mktime
)(struct tm
*t
);
772 void* (*plugin_get_buffer
)(size_t *buffer_size
);
773 void* (*plugin_get_audio_buffer
)(size_t *buffer_size
);
774 void (*plugin_tsr
)(bool (*exit_callback
)(bool reenter
));
775 char* (*plugin_get_current_filename
)(void);
776 #if defined(DEBUG) || defined(SIMULATOR)
777 void (*debugf
)(const char *fmt
, ...) ATTRIBUTE_PRINTF(1, 2);
779 #ifdef ROCKBOX_HAS_LOGF
780 void (*logf
)(const char *fmt
, ...) ATTRIBUTE_PRINTF(1, 2);
782 struct user_settings
* global_settings
;
783 struct system_status
*global_status
;
784 void (*talk_disable
)(bool disable
);
785 #if CONFIG_CODEC == SWCODEC
786 void (*codec_thread_do_callback
)(void (*fn
)(void),
787 unsigned int *audio_thread_id
);
788 int (*codec_load_file
)(const char* codec
, struct codec_api
*api
);
789 const char *(*get_codec_filename
)(int cod_spec
);
790 void ** (*find_array_ptr
)(void **arr
, void *ptr
);
791 int (*remove_array_ptr
)(void **arr
, void *ptr
);
792 int (*round_value_to_list32
)(unsigned long value
,
793 const unsigned long list
[],
796 #endif /* CONFIG_CODEC == SWCODEC */
797 bool (*get_metadata
)(struct mp3entry
* id3
, int fd
, const char* trackname
);
798 bool (*mp3info
)(struct mp3entry
*entry
, const char *filename
);
799 int (*count_mp3_frames
)(int fd
, int startpos
, int filesize
,
800 void (*progressfunc
)(int));
801 int (*create_xing_header
)(int fd
, long startpos
, long filesize
,
802 unsigned char *buf
, unsigned long num_frames
,
803 unsigned long rec_time
, unsigned long header_template
,
804 void (*progressfunc
)(int), bool generate_toc
);
805 unsigned long (*find_next_frame
)(int fd
, long *offset
,
806 long max_offset
, unsigned long last_header
);
808 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
809 unsigned short (*peak_meter_scale_value
)(unsigned short val
,
811 void (*peak_meter_set_use_dbfs
)(bool use
);
812 bool (*peak_meter_get_use_dbfs
)(void);
814 #ifdef HAVE_LCD_BITMAP
815 int (*read_bmp_file
)(const char* filename
, struct bitmap
*bm
, int maxsize
,
816 int format
, const struct custom_format
*cformat
);
817 int (*read_bmp_fd
)(int fd
, struct bitmap
*bm
, int maxsize
,
818 int format
, const struct custom_format
*cformat
);
820 int (*read_jpeg_file
)(const char* filename
, struct bitmap
*bm
, int maxsize
,
821 int format
, const struct custom_format
*cformat
);
822 int (*read_jpeg_fd
)(int fd
, struct bitmap
*bm
, int maxsize
,
823 int format
, const struct custom_format
*cformat
);
825 void (*screen_dump_set_hook
)(void (*hook
)(int fh
));
827 int (*show_logo
)(void);
828 struct tree_context
* (*tree_get_context
)(void);
829 void (*set_current_file
)(char* path
);
830 void (*set_dirfilter
)(int l_dirfilter
);
832 #ifdef HAVE_WHEEL_POSITION
833 int (*wheel_status
)(void);
834 void (*wheel_send_events
)(bool send
);
837 #ifdef IRIVER_H100_SERIES
838 /* Routines for the iriver_flash -plugin. */
839 bool (*detect_original_firmware
)(void);
840 bool (*detect_flashed_ramimage
)(void);
841 bool (*detect_flashed_romimage
)(void);
844 void (*led
)(bool on
);
846 #if (CONFIG_CODEC == SWCODEC)
848 int (*bufopen
)(const char *file
, size_t offset
, enum data_type type
,
850 int (*bufalloc
)(const void *src
, size_t size
, enum data_type type
);
851 bool (*bufclose
)(int handle_id
);
852 int (*bufseek
)(int handle_id
, size_t newpos
);
853 int (*bufadvance
)(int handle_id
, off_t offset
);
854 ssize_t (*bufread
)(int handle_id
, size_t size
, void *dest
);
855 ssize_t (*bufgetdata
)(int handle_id
, size_t size
, void **data
);
856 ssize_t (*bufgettail
)(int handle_id
, size_t size
, void **data
);
857 ssize_t (*bufcuttail
)(int handle_id
, size_t size
);
859 ssize_t (*buf_get_offset
)(int handle_id
, void *ptr
);
860 ssize_t (*buf_handle_offset
)(int handle_id
);
861 void (*buf_request_buffer_handle
)(int handle_id
);
862 void (*buf_set_base_handle
)(int handle_id
);
863 size_t (*buf_used
)(void);
867 bool (*tagcache_search
)(struct tagcache_search
*tcs
, int tag
);
868 void (*tagcache_search_set_uniqbuf
)(struct tagcache_search
*tcs
,
869 void *buffer
, long length
);
870 bool (*tagcache_search_add_filter
)(struct tagcache_search
*tcs
,
872 bool (*tagcache_get_next
)(struct tagcache_search
*tcs
);
873 bool (*tagcache_retrieve
)(struct tagcache_search
*tcs
, int idxid
,
874 int tag
, char *buf
, long size
);
875 void (*tagcache_search_finish
)(struct tagcache_search
*tcs
);
876 long (*tagcache_get_numeric
)(const struct tagcache_search
*tcs
, int tag
);
877 #if defined(HAVE_TC_RAMCACHE) && defined(HAVE_DIRCACHE)
878 bool (*tagcache_fill_tags
)(struct mp3entry
*id3
, const char *filename
);
883 bool (*search_albumart_files
)(const struct mp3entry
*id3
, const char *size_string
,
884 char *buf
, int buflen
);
887 #ifdef HAVE_SEMAPHORE_OBJECTS
888 void (*semaphore_init
)(struct semaphore
*s
, int max
, int start
);
889 void (*semaphore_wait
)(struct semaphore
*s
);
890 void (*semaphore_release
)(struct semaphore
*s
);
893 const char *rbversion
;
895 /* new stuff at the end, sort into place next time
896 the API gets incompatible */
897 struct dirinfo (*dir_get_info
)(DIR* parent
, struct dirent
*entry
);
899 /* load code api for overlay */
900 void* (*lc_open
)(const char *filename
, unsigned char *buf
, size_t buf_size
);
901 void* (*lc_open_from_mem
)(void* addr
, size_t blob_size
);
902 void* (*lc_get_header
)(void *handle
);
903 void (*lc_close
)(void *handle
);
907 struct plugin_header
{
908 struct lc_header lc_hdr
; /* must be the first */
909 enum plugin_status(*entry_point
)(const void*);
910 const struct plugin_api
**api
;
914 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
915 extern unsigned char plugin_start_addr
[];
916 extern unsigned char plugin_end_addr
[];
917 #define PLUGIN_HEADER \
918 const struct plugin_api *rb DATA_ATTR; \
919 const struct plugin_header __header \
920 __attribute__ ((section (".header")))= { \
921 { PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
922 plugin_start_addr, plugin_end_addr }, plugin__start, &rb };
923 #else /* PLATFORM_HOSTED */
924 #define PLUGIN_HEADER \
925 const struct plugin_api *rb DATA_ATTR; \
926 const struct plugin_header __header \
927 __attribute__((visibility("default"))) = { \
928 { PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, NULL, NULL }, \
929 plugin__start, &rb };
930 #endif /* CONFIG_PLATFORM */
933 int plugin_load(const char* plugin
, const void* parameter
);
934 void* plugin_get_audio_buffer(size_t *buffer_size
);
937 callback returns true to allow the new plugin to load,
938 reenter means the currently running plugin is being reloaded */
939 void plugin_tsr(bool (*exit_callback
)(bool reenter
));
941 /* defined by the plugin */
942 extern const struct plugin_api
*rb
;
943 enum plugin_status
plugin__start(const void* parameter
)
946 #endif /* __PCTOOL__ */