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 194
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 194
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
);
457 struct dirinfo (*dir_get_info
)(DIR* parent
, struct dirent
*entry
);
460 #if defined(CPU_ARM) && CONFIG_PLATFORM & PLATFORM_NATIVE
461 void (*__div0
)(void);
463 unsigned (*sleep
)(unsigned ticks
);
465 volatile long* current_tick
;
466 long (*default_event_handler
)(long event
);
467 long (*default_event_handler_ex
)(long event
,
468 void (*callback
)(void *), void *parameter
);
469 unsigned int (*create_thread
)(void (*function
)(void), void* stack
,
470 size_t stack_size
, unsigned flags
,
472 IF_PRIO(, int priority
)
473 IF_COP(, unsigned int core
));
474 void (*thread_exit
)(void);
475 void (*thread_wait
)(unsigned int thread_id
);
476 #if CONFIG_CODEC == SWCODEC
477 void (*thread_thaw
)(unsigned int thread_id
);
478 #ifdef HAVE_PRIORITY_SCHEDULING
479 int (*thread_set_priority
)(unsigned int thread_id
, int priority
);
481 void (*mutex_init
)(struct mutex
*m
);
482 void (*mutex_lock
)(struct mutex
*m
);
483 void (*mutex_unlock
)(struct mutex
*m
);
486 void (*reset_poweroff_timer
)(void);
487 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
488 int (*system_memory_guard
)(int newmode
);
490 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
491 #ifdef CPU_BOOST_LOGGING
492 void (*cpu_boost_
)(bool on_off
,char*location
,int line
);
494 void (*cpu_boost
)(bool on_off
);
496 #endif /* HAVE_ADJUSTABLE_CPU_FREQ */
497 #endif /* PLATFORM_NATIVE */
498 #ifdef HAVE_SCHEDULER_BOOSTCTRL
499 void (*trigger_cpu_boost
)(void);
500 void (*cancel_cpu_boost
)(void);
503 void (*cpucache_flush
)(void);
504 void (*cpucache_invalidate
)(void);
506 /* load code api for overlay */
507 void* (*lc_open
)(const char *filename
, unsigned char *buf
, size_t buf_size
);
508 void* (*lc_open_from_mem
)(void* addr
, size_t blob_size
);
509 void* (*lc_get_header
)(void *handle
);
510 void (*lc_close
)(void *handle
);
512 bool (*timer_register
)(int reg_prio
, void (*unregister_callback
)(void),
513 long cycles
, void (*timer_callback
)(void)
515 void (*timer_unregister
)(void);
516 bool (*timer_set_period
)(long count
);
518 void (*queue_init
)(struct event_queue
*q
, bool register_queue
);
519 void (*queue_delete
)(struct event_queue
*q
);
520 void (*queue_post
)(struct event_queue
*q
, long id
, intptr_t data
);
521 void (*queue_wait_w_tmo
)(struct event_queue
*q
, struct queue_event
*ev
,
523 #if CONFIG_CODEC == SWCODEC
524 void (*queue_enable_queue_send
)(struct event_queue
*q
,
525 struct queue_sender_list
*send
,
526 unsigned int thread_id
);
527 bool (*queue_empty
)(const struct event_queue
*q
);
528 void (*queue_wait
)(struct event_queue
*q
, struct queue_event
*ev
);
529 intptr_t (*queue_send
)(struct event_queue
*q
, long id
,
531 void (*queue_reply
)(struct event_queue
*q
, intptr_t retval
);
532 #endif /* CONFIG_CODEC == SWCODEC */
534 void (*usb_acknowledge
)(long id
);
535 #ifdef USB_ENABLE_HID
536 void (*usb_hid_send
)(usage_page_t usage_page
, int id
);
539 void (*profile_thread
)(void);
540 void (*profstop
)(void);
541 void (*profile_func_enter
)(void *this_fn
, void *call_site
);
542 void (*profile_func_exit
)(void *this_fn
, void *call_site
);
545 bool (*add_event
)(unsigned short id
, bool oneshot
, void (*handler
)(void *data
));
546 void (*remove_event
)(unsigned short id
, void (*handler
)(void *data
));
547 void (*send_event
)(unsigned short id
, void *data
);
549 #if (CONFIG_PLATFORM & PLATFORM_HOSTED)
550 /* special simulator hooks */
551 #if defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8
552 void (*sim_lcd_ex_init
)(unsigned long (*getpixel
)(int, int));
553 void (*sim_lcd_ex_update_rect
)(int x
, int y
, int width
, int height
);
557 /* strings and memory */
558 int (*snprintf
)(char *buf
, size_t size
, const char *fmt
, ...)
559 ATTRIBUTE_PRINTF(3, 4);
560 int (*vsnprintf
)(char *buf
, size_t size
, const char *fmt
, va_list ap
);
561 char* (*strcpy
)(char *dst
, const char *src
);
562 size_t (*strlcpy
)(char *dst
, const char *src
, size_t length
);
563 size_t (*strlen
)(const char *str
);
564 char * (*strrchr
)(const char *s
, int c
);
565 int (*strcmp
)(const char *, const char *);
566 int (*strncmp
)(const char *, const char *, size_t);
567 int (*strcasecmp
)(const char *, const char *);
568 int (*strncasecmp
)(const char *s1
, const char *s2
, size_t n
);
569 void* (*memset
)(void *dst
, int c
, size_t length
);
570 void* (*memcpy
)(void *out
, const void *in
, size_t n
);
571 void* (*memmove
)(void *out
, const void *in
, size_t n
);
572 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
573 const unsigned char *_rbctype_
;
575 int (*atoi
)(const char *str
);
576 char *(*strchr
)(const char *s
, int c
);
577 char *(*strcat
)(char *s1
, const char *s2
);
578 size_t (*strlcat
)(char *dst
, const char *src
, size_t length
);
579 void *(*memchr
)(const void *s1
, int c
, size_t n
);
580 int (*memcmp
)(const void *s1
, const void *s2
, size_t n
);
581 char *(*strcasestr
) (const char* phaystack
, const char* pneedle
);
582 char* (*strtok_r
)(char *ptr
, const char *sep
, char **end
);
584 const unsigned char* (*utf8decode
)(const unsigned char *utf8
, unsigned short *ucs
);
585 unsigned char* (*iso_decode
)(const unsigned char *iso
, unsigned char *utf8
, int cp
, int count
);
586 unsigned char* (*utf16LEdecode
)(const unsigned char *utf16
, unsigned char *utf8
, int count
);
587 unsigned char* (*utf16BEdecode
)(const unsigned char *utf16
, unsigned char *utf8
, int count
);
588 unsigned char* (*utf8encode
)(unsigned long ucs
, unsigned char *utf8
);
589 unsigned long (*utf8length
)(const unsigned char *utf8
);
590 int (*utf8seek
)(const unsigned char* utf8
, int offset
);
593 void (*sound_set
)(int setting
, int value
);
594 int (*sound_default
)(int setting
);
595 int (*sound_min
)(int setting
);
596 int (*sound_max
)(int setting
);
597 const char * (*sound_unit
)(int setting
);
598 int (*sound_val2phys
)(int setting
, int value
);
599 #ifdef AUDIOHW_HAVE_EQ
600 int (*sound_enum_hw_eq_band_setting
)(unsigned int band
,
601 unsigned int band_setting
);
602 #endif /* AUDIOHW_HAVE_EQ */
603 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
604 void (*mp3_play_data
)(const unsigned char* start
, int size
,
605 void (*get_more
)(unsigned char** start
, size_t* size
));
606 void (*mp3_play_pause
)(bool play
);
607 void (*mp3_play_stop
)(void);
608 bool (*mp3_is_playing
)(void);
609 #if CONFIG_CODEC != SWCODEC
610 void (*bitswap
)(unsigned char *data
, int length
);
612 #endif /* PLATFORM_NATIVE */
613 #if CONFIG_CODEC == SWCODEC
614 const unsigned long *audio_master_sampr_list
;
615 const unsigned long *hw_freq_sampr
;
616 void (*pcm_apply_settings
)(void);
617 void (*pcm_play_data
)(pcm_play_callback_type get_more
,
618 unsigned char* start
, size_t size
);
619 void (*pcm_play_stop
)(void);
620 void (*pcm_set_frequency
)(unsigned int frequency
);
621 bool (*pcm_is_playing
)(void);
622 bool (*pcm_is_paused
)(void);
623 void (*pcm_play_pause
)(bool play
);
624 size_t (*pcm_get_bytes_waiting
)(void);
625 void (*pcm_calculate_peaks
)(int *left
, int *right
);
626 const void* (*pcm_get_peak_buffer
)(int *count
);
627 void (*pcm_play_lock
)(void);
628 void (*pcm_play_unlock
)(void);
629 void (*pcmbuf_beep
)(unsigned int frequency
,
632 #ifdef HAVE_RECORDING
633 const unsigned long *rec_freq_sampr
;
634 void (*pcm_init_recording
)(void);
635 void (*pcm_close_recording
)(void);
636 void (*pcm_record_data
)(pcm_rec_callback_type more_ready
,
637 void *start
, size_t size
);
638 void (*pcm_stop_recording
)(void);
639 void (*pcm_calculate_rec_peaks
)(int *left
, int *right
);
640 void (*audio_set_recording_gain
)(int left
, int right
, int type
);
641 #endif /* HAVE_RECORDING */
642 #if INPUT_SRC_CAPS != 0
643 void (*audio_set_output_source
)(int monitor
);
644 void (*audio_set_input_source
)(int source
, unsigned flags
);
646 void (*dsp_set_crossfeed
)(bool enable
);
647 void (*dsp_set_eq
)(bool enable
);
648 void (*dsp_dither_enable
)(bool enable
);
649 intptr_t (*dsp_configure
)(struct dsp_config
*dsp
, int setting
,
651 int (*dsp_process
)(struct dsp_config
*dsp
, char *dest
,
652 const char *src
[], int count
);
653 int (*dsp_input_count
)(struct dsp_config
*dsp
, int count
);
654 int (*dsp_output_count
)(struct dsp_config
*dsp
, int count
);
655 #endif /* CONFIG_CODEC == SWCODC */
657 /* playback control */
658 int (*playlist_amount
)(void);
659 int (*playlist_resume
)(void);
660 void (*playlist_start
)(int start_index
, int offset
);
661 int (*playlist_add
)(const char *filename
);
662 void (*playlist_sync
)(struct playlist_info
* playlist
);
663 int (*playlist_remove_all_tracks
)(struct playlist_info
*playlist
);
664 int (*playlist_create
)(const char *dir
, const char *file
);
665 int (*playlist_insert_track
)(struct playlist_info
* playlist
,
666 const char *filename
, int position
, bool queue
, bool sync
);
667 int (*playlist_insert_directory
)(struct playlist_info
* playlist
,
668 const char *dirname
, int position
, bool queue
,
670 int (*playlist_shuffle
)(int random_seed
, int start_index
);
671 void (*audio_play
)(long offset
);
672 void (*audio_stop
)(void);
673 void (*audio_pause
)(void);
674 void (*audio_resume
)(void);
675 void (*audio_next
)(void);
676 void (*audio_prev
)(void);
677 void (*audio_ff_rewind
)(long newtime
);
678 struct mp3entry
* (*audio_next_track
)(void);
679 int (*audio_status
)(void);
680 struct mp3entry
* (*audio_current_track
)(void);
681 void (*audio_flush_and_reload_tracks
)(void);
682 int (*audio_get_file_pos
)(void);
683 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
684 unsigned long (*mpeg_get_last_header
)(void);
686 #if ((CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) || \
687 (CONFIG_CODEC == SWCODEC)) && defined (HAVE_PITCHSCREEN)
688 void (*sound_set_pitch
)(int32_t pitch
);
691 /* MAS communication */
692 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
693 int (*mas_readmem
)(int bank
, int addr
, unsigned long* dest
, int len
);
694 int (*mas_writemem
)(int bank
, int addr
, const unsigned long* src
, int len
);
695 int (*mas_readreg
)(int reg
);
696 int (*mas_writereg
)(int reg
, unsigned int val
);
697 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
698 int (*mas_codec_writereg
)(int reg
, unsigned int val
);
699 int (*mas_codec_readreg
)(int reg
);
700 void (*i2c_begin
)(void);
701 void (*i2c_end
)(void);
702 int (*i2c_write
)(int address
, const unsigned char* buf
, int count
);
707 int (*do_menu
)(const struct menu_item_ex
*menu
, int *start_selected
,
708 struct viewport parent
[NB_SCREENS
], bool hide_theme
);
711 struct gui_syncstatusbar
*statusbars
;
712 void (*gui_syncstatusbar_draw
)(struct gui_syncstatusbar
* bars
, bool force_redraw
);
715 const struct settings_list
* (*get_settings_list
)(int*count
);
716 const struct settings_list
* (*find_setting
)(const void* variable
, int *id
);
717 bool (*option_screen
)(const struct settings_list
*setting
,
718 struct viewport parent
[NB_SCREENS
],
719 bool use_temp_var
, unsigned char* option_title
);
720 bool (*set_option
)(const char* string
, const void* variable
,
721 enum optiontype type
, const struct opt_items
* options
,
722 int numoptions
, void (*function
)(int));
723 bool (*set_bool_options
)(const char* string
, const bool* variable
,
724 const char* yes_str
, int yes_voice
,
725 const char* no_str
, int no_voice
,
726 void (*function
)(bool));
727 bool (*set_int
)(const unsigned char* string
, const char* unit
, int voice_unit
,
728 const int* variable
, void (*function
)(int), int step
,
730 const char* (*formatter
)(char*, size_t, int, const char*) );
731 bool (*set_bool
)(const char* string
, const bool* variable
);
733 #ifdef HAVE_LCD_COLOR
734 bool (*set_color
)(struct screen
*display
, char *title
,
735 unsigned *color
, unsigned banned_color
);
737 /* action handling */
738 int (*get_custom_action
)(int context
,int timeout
,
739 const struct button_mapping
* (*get_context_map
)(int));
740 int (*get_action
)(int context
, int timeout
);
741 #ifdef HAVE_TOUCHSCREEN
742 int (*action_get_touchscreen_press
)(short *x
, short *y
);
744 bool (*action_userabort
)(int timeout
);
747 int (*battery_level
)(void);
748 bool (*battery_level_safe
)(void);
749 int (*battery_time
)(void);
750 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
751 unsigned int (*battery_voltage
)(void);
754 bool (*charger_inserted
)(void);
755 # if CONFIG_CHARGING >= CHARGING_MONITOR
756 bool (*charging_state
)(void);
759 #ifdef HAVE_USB_POWER
760 bool (*usb_powered
)(void);
764 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
767 void (*srand
)(unsigned int seed
);
769 void (*qsort
)(void *base
, size_t nmemb
, size_t size
,
770 int(*compar
)(const void *, const void *));
771 int (*kbd_input
)(char* buffer
, int buflen
);
772 struct tm
* (*get_time
)(void);
773 int (*set_time
)(const struct tm
*tm
);
775 time_t (*mktime
)(struct tm
*t
);
777 void* (*plugin_get_buffer
)(size_t *buffer_size
);
778 void* (*plugin_get_audio_buffer
)(size_t *buffer_size
);
779 void (*plugin_tsr
)(bool (*exit_callback
)(bool reenter
));
780 char* (*plugin_get_current_filename
)(void);
781 #if defined(DEBUG) || defined(SIMULATOR)
782 void (*debugf
)(const char *fmt
, ...) ATTRIBUTE_PRINTF(1, 2);
784 #ifdef ROCKBOX_HAS_LOGF
785 void (*logf
)(const char *fmt
, ...) ATTRIBUTE_PRINTF(1, 2);
787 struct user_settings
* global_settings
;
788 struct system_status
*global_status
;
789 void (*talk_disable
)(bool disable
);
790 #if CONFIG_CODEC == SWCODEC
791 void (*codec_thread_do_callback
)(void (*fn
)(void),
792 unsigned int *audio_thread_id
);
793 int (*codec_load_file
)(const char* codec
, struct codec_api
*api
);
794 const char *(*get_codec_filename
)(int cod_spec
);
795 void ** (*find_array_ptr
)(void **arr
, void *ptr
);
796 int (*remove_array_ptr
)(void **arr
, void *ptr
);
797 int (*round_value_to_list32
)(unsigned long value
,
798 const unsigned long list
[],
801 #endif /* CONFIG_CODEC == SWCODEC */
802 bool (*get_metadata
)(struct mp3entry
* id3
, int fd
, const char* trackname
);
803 bool (*mp3info
)(struct mp3entry
*entry
, const char *filename
);
804 int (*count_mp3_frames
)(int fd
, int startpos
, int filesize
,
805 void (*progressfunc
)(int));
806 int (*create_xing_header
)(int fd
, long startpos
, long filesize
,
807 unsigned char *buf
, unsigned long num_frames
,
808 unsigned long rec_time
, unsigned long header_template
,
809 void (*progressfunc
)(int), bool generate_toc
);
810 unsigned long (*find_next_frame
)(int fd
, long *offset
,
811 long max_offset
, unsigned long last_header
);
813 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
814 unsigned short (*peak_meter_scale_value
)(unsigned short val
,
816 void (*peak_meter_set_use_dbfs
)(bool use
);
817 bool (*peak_meter_get_use_dbfs
)(void);
819 #ifdef HAVE_LCD_BITMAP
820 int (*read_bmp_file
)(const char* filename
, struct bitmap
*bm
, int maxsize
,
821 int format
, const struct custom_format
*cformat
);
822 int (*read_bmp_fd
)(int fd
, struct bitmap
*bm
, int maxsize
,
823 int format
, const struct custom_format
*cformat
);
825 int (*read_jpeg_file
)(const char* filename
, struct bitmap
*bm
, int maxsize
,
826 int format
, const struct custom_format
*cformat
);
827 int (*read_jpeg_fd
)(int fd
, struct bitmap
*bm
, int maxsize
,
828 int format
, const struct custom_format
*cformat
);
830 void (*screen_dump_set_hook
)(void (*hook
)(int fh
));
832 int (*show_logo
)(void);
833 struct tree_context
* (*tree_get_context
)(void);
834 void (*set_current_file
)(const char* path
);
835 void (*set_dirfilter
)(int l_dirfilter
);
837 #ifdef HAVE_WHEEL_POSITION
838 int (*wheel_status
)(void);
839 void (*wheel_send_events
)(bool send
);
842 #ifdef IRIVER_H100_SERIES
843 /* Routines for the iriver_flash -plugin. */
844 bool (*detect_original_firmware
)(void);
845 bool (*detect_flashed_ramimage
)(void);
846 bool (*detect_flashed_romimage
)(void);
849 void (*led
)(bool on
);
851 #if (CONFIG_CODEC == SWCODEC)
853 int (*bufopen
)(const char *file
, size_t offset
, enum data_type type
,
855 int (*bufalloc
)(const void *src
, size_t size
, enum data_type type
);
856 bool (*bufclose
)(int handle_id
);
857 int (*bufseek
)(int handle_id
, size_t newpos
);
858 int (*bufadvance
)(int handle_id
, off_t offset
);
859 ssize_t (*bufread
)(int handle_id
, size_t size
, void *dest
);
860 ssize_t (*bufgetdata
)(int handle_id
, size_t size
, void **data
);
861 ssize_t (*bufgettail
)(int handle_id
, size_t size
, void **data
);
862 ssize_t (*bufcuttail
)(int handle_id
, size_t size
);
864 ssize_t (*buf_get_offset
)(int handle_id
, void *ptr
);
865 ssize_t (*buf_handle_offset
)(int handle_id
);
866 void (*buf_request_buffer_handle
)(int handle_id
);
867 void (*buf_set_base_handle
)(int handle_id
);
868 size_t (*buf_used
)(void);
872 bool (*tagcache_search
)(struct tagcache_search
*tcs
, int tag
);
873 void (*tagcache_search_set_uniqbuf
)(struct tagcache_search
*tcs
,
874 void *buffer
, long length
);
875 bool (*tagcache_search_add_filter
)(struct tagcache_search
*tcs
,
877 bool (*tagcache_get_next
)(struct tagcache_search
*tcs
);
878 bool (*tagcache_retrieve
)(struct tagcache_search
*tcs
, int idxid
,
879 int tag
, char *buf
, long size
);
880 void (*tagcache_search_finish
)(struct tagcache_search
*tcs
);
881 long (*tagcache_get_numeric
)(const struct tagcache_search
*tcs
, int tag
);
882 #if defined(HAVE_TC_RAMCACHE) && defined(HAVE_DIRCACHE)
883 bool (*tagcache_fill_tags
)(struct mp3entry
*id3
, const char *filename
);
888 bool (*search_albumart_files
)(const struct mp3entry
*id3
, const char *size_string
,
889 char *buf
, int buflen
);
892 #ifdef HAVE_SEMAPHORE_OBJECTS
893 void (*semaphore_init
)(struct semaphore
*s
, int max
, int start
);
894 void (*semaphore_wait
)(struct semaphore
*s
);
895 void (*semaphore_release
)(struct semaphore
*s
);
898 const char *rbversion
;
900 /* new stuff at the end, sort into place next time
901 the API gets incompatible */
905 struct plugin_header
{
906 struct lc_header lc_hdr
; /* must be the first */
907 enum plugin_status(*entry_point
)(const void*);
908 const struct plugin_api
**api
;
912 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
913 extern unsigned char plugin_start_addr
[];
914 extern unsigned char plugin_end_addr
[];
915 #define PLUGIN_HEADER \
916 const struct plugin_api *rb DATA_ATTR; \
917 const struct plugin_header __header \
918 __attribute__ ((section (".header")))= { \
919 { PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
920 plugin_start_addr, plugin_end_addr }, plugin__start, &rb };
921 #else /* PLATFORM_HOSTED */
922 #define PLUGIN_HEADER \
923 const struct plugin_api *rb DATA_ATTR; \
924 const struct plugin_header __header \
925 __attribute__((visibility("default"))) = { \
926 { PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, NULL, NULL }, \
927 plugin__start, &rb };
928 #endif /* CONFIG_PLATFORM */
931 int plugin_load(const char* plugin
, const void* parameter
);
932 void* plugin_get_audio_buffer(size_t *buffer_size
);
935 callback returns true to allow the new plugin to load,
936 reenter means the currently running plugin is being reloaded */
937 void plugin_tsr(bool (*exit_callback
)(bool reenter
));
939 /* defined by the plugin */
940 extern const struct plugin_api
*rb
;
941 enum plugin_status
plugin__start(const void* parameter
)
944 #endif /* __PCTOOL__ */