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
32 #include <sys/types.h>
37 #include "string-extra.h"
38 #include "gcc_extensions.h"
40 char* strncpy(char *, const char *, size_t);
41 void* plugin_get_buffer(size_t *buffer_size
);
52 #include "load_code.h"
60 #include "mp3_playback.h"
66 #include "filefuncs.h"
67 #if (CONFIG_CODEC == SWCODEC)
68 #include "pcm_mixer.h"
72 #include "codec_thread.h"
74 #include "recording.h"
78 #endif /* CONFIG_CODEC == SWCODEC */
82 #ifdef HAVE_LCD_BITMAP
83 #include "screendump.h"
84 #include "scrollbar.h"
85 #include "jpeg_load.h"
86 #include "../recorder/bmp.h"
88 #include "statusbar.h"
90 #include "rbunicode.h"
93 #include "color_picker.h"
95 #include "buffering.h"
98 #include "ata_idle_notify.h"
99 #include "settings_list.h"
100 #include "timefuncs.h"
104 #include "albumart.h"
107 #ifdef HAVE_REMOTE_LCD
108 #include "lcd-remote.h"
113 #include "filetypes.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 212
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 210
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) || defined(PHILIPS_SA9200)
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
);
449 int (*filetype_get_attr
)(const char* file
);
454 DIR* (*opendir
)(const char* name
);
455 int (*closedir
)(DIR* dir
);
456 struct dirent
* (*readdir
)(DIR* dir
);
457 int (*mkdir
)(const char *name
);
458 int (*rmdir
)(const char *name
);
459 bool (*dir_exists
)(const char *path
);
460 struct dirinfo (*dir_get_info
)(DIR* parent
, struct dirent
*entry
);
463 void (*browse_context_init
)(struct browse_context
*browse
,
464 int dirfilter
, unsigned flags
,
465 char *title
, enum themable_icons icon
,
466 const char *root
, const char *selected
);
467 int (*rockbox_browse
)(struct browse_context
*browse
);
470 #if defined(CPU_ARM) && CONFIG_PLATFORM & PLATFORM_NATIVE
471 void (*__div0
)(void);
473 unsigned (*sleep
)(unsigned ticks
);
475 volatile long* current_tick
;
476 long (*default_event_handler
)(long event
);
477 long (*default_event_handler_ex
)(long event
,
478 void (*callback
)(void *), void *parameter
);
479 unsigned int (*create_thread
)(void (*function
)(void), void* stack
,
480 size_t stack_size
, unsigned flags
,
482 IF_PRIO(, int priority
)
483 IF_COP(, unsigned int core
));
484 unsigned int (*thread_self
)(void);
485 void (*thread_exit
)(void);
486 void (*thread_wait
)(unsigned int thread_id
);
487 #if CONFIG_CODEC == SWCODEC
488 void (*thread_thaw
)(unsigned int thread_id
);
489 #ifdef HAVE_PRIORITY_SCHEDULING
490 int (*thread_set_priority
)(unsigned int thread_id
, int priority
);
492 void (*mutex_init
)(struct mutex
*m
);
493 void (*mutex_lock
)(struct mutex
*m
);
494 void (*mutex_unlock
)(struct mutex
*m
);
497 void (*reset_poweroff_timer
)(void);
498 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
499 int (*system_memory_guard
)(int newmode
);
501 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
502 #ifdef CPU_BOOST_LOGGING
503 void (*cpu_boost_
)(bool on_off
,char*location
,int line
);
505 void (*cpu_boost
)(bool on_off
);
507 #endif /* HAVE_ADJUSTABLE_CPU_FREQ */
508 #endif /* PLATFORM_NATIVE */
509 #ifdef HAVE_SCHEDULER_BOOSTCTRL
510 void (*trigger_cpu_boost
)(void);
511 void (*cancel_cpu_boost
)(void);
514 void (*cpucache_flush
)(void);
515 void (*cpucache_invalidate
)(void);
517 /* load code api for overlay */
518 void* (*lc_open
)(const char *filename
, unsigned char *buf
, size_t buf_size
);
519 void* (*lc_open_from_mem
)(void* addr
, size_t blob_size
);
520 void* (*lc_get_header
)(void *handle
);
521 void (*lc_close
)(void *handle
);
523 bool (*timer_register
)(int reg_prio
, void (*unregister_callback
)(void),
524 long cycles
, void (*timer_callback
)(void)
526 void (*timer_unregister
)(void);
527 bool (*timer_set_period
)(long count
);
529 void (*queue_init
)(struct event_queue
*q
, bool register_queue
);
530 void (*queue_delete
)(struct event_queue
*q
);
531 void (*queue_post
)(struct event_queue
*q
, long id
, intptr_t data
);
532 void (*queue_wait_w_tmo
)(struct event_queue
*q
, struct queue_event
*ev
,
534 #if CONFIG_CODEC == SWCODEC
535 void (*queue_enable_queue_send
)(struct event_queue
*q
,
536 struct queue_sender_list
*send
,
537 unsigned int thread_id
);
538 bool (*queue_empty
)(const struct event_queue
*q
);
539 void (*queue_wait
)(struct event_queue
*q
, struct queue_event
*ev
);
540 intptr_t (*queue_send
)(struct event_queue
*q
, long id
,
542 void (*queue_reply
)(struct event_queue
*q
, intptr_t retval
);
543 #endif /* CONFIG_CODEC == SWCODEC */
545 void (*usb_acknowledge
)(long id
);
546 #ifdef USB_ENABLE_HID
547 void (*usb_hid_send
)(usage_page_t usage_page
, int id
);
550 void (*profile_thread
)(void);
551 void (*profstop
)(void);
552 void (*profile_func_enter
)(void *this_fn
, void *call_site
);
553 void (*profile_func_exit
)(void *this_fn
, void *call_site
);
556 bool (*add_event
)(unsigned short id
, bool oneshot
, void (*handler
)(void *data
));
557 void (*remove_event
)(unsigned short id
, void (*handler
)(void *data
));
558 void (*send_event
)(unsigned short id
, void *data
);
560 #if (CONFIG_PLATFORM & PLATFORM_HOSTED)
561 /* special simulator hooks */
562 #if defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8
563 void (*sim_lcd_ex_init
)(unsigned long (*getpixel
)(int, int));
564 void (*sim_lcd_ex_update_rect
)(int x
, int y
, int width
, int height
);
568 /* strings and memory */
569 int (*snprintf
)(char *buf
, size_t size
, const char *fmt
, ...)
570 ATTRIBUTE_PRINTF(3, 4);
571 int (*vsnprintf
)(char *buf
, size_t size
, const char *fmt
, va_list ap
);
572 char* (*strcpy
)(char *dst
, const char *src
);
573 size_t (*strlcpy
)(char *dst
, const char *src
, size_t length
);
574 size_t (*strlen
)(const char *str
);
575 char * (*strrchr
)(const char *s
, int c
);
576 int (*strcmp
)(const char *, const char *);
577 int (*strncmp
)(const char *, const char *, size_t);
578 int (*strcasecmp
)(const char *, const char *);
579 int (*strncasecmp
)(const char *s1
, const char *s2
, size_t n
);
580 void* (*memset
)(void *dst
, int c
, size_t length
);
581 void* (*memcpy
)(void *out
, const void *in
, size_t n
);
582 void* (*memmove
)(void *out
, const void *in
, size_t n
);
583 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
584 const unsigned char *_rbctype_
;
586 int (*atoi
)(const char *str
);
587 char *(*strchr
)(const char *s
, int c
);
588 char *(*strcat
)(char *s1
, const char *s2
);
589 size_t (*strlcat
)(char *dst
, const char *src
, size_t length
);
590 void *(*memchr
)(const void *s1
, int c
, size_t n
);
591 int (*memcmp
)(const void *s1
, const void *s2
, size_t n
);
592 char *(*strcasestr
) (const char* phaystack
, const char* pneedle
);
593 char* (*strtok_r
)(char *ptr
, const char *sep
, char **end
);
595 const unsigned char* (*utf8decode
)(const unsigned char *utf8
, unsigned short *ucs
);
596 unsigned char* (*iso_decode
)(const unsigned char *iso
, unsigned char *utf8
, int cp
, int count
);
597 unsigned char* (*utf16LEdecode
)(const unsigned char *utf16
, unsigned char *utf8
, int count
);
598 unsigned char* (*utf16BEdecode
)(const unsigned char *utf16
, unsigned char *utf8
, int count
);
599 unsigned char* (*utf8encode
)(unsigned long ucs
, unsigned char *utf8
);
600 unsigned long (*utf8length
)(const unsigned char *utf8
);
601 int (*utf8seek
)(const unsigned char* utf8
, int offset
);
604 void (*sound_set
)(int setting
, int value
);
605 int (*sound_default
)(int setting
);
606 int (*sound_min
)(int setting
);
607 int (*sound_max
)(int setting
);
608 const char * (*sound_unit
)(int setting
);
609 int (*sound_val2phys
)(int setting
, int value
);
610 #ifdef AUDIOHW_HAVE_EQ
611 int (*sound_enum_hw_eq_band_setting
)(unsigned int band
,
612 unsigned int band_setting
);
613 #endif /* AUDIOHW_HAVE_EQ */
614 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
615 void (*mp3_play_data
)(const unsigned char* start
, int size
,
616 void (*get_more
)(unsigned char** start
, size_t* size
));
617 void (*mp3_play_pause
)(bool play
);
618 void (*mp3_play_stop
)(void);
619 bool (*mp3_is_playing
)(void);
620 #if CONFIG_CODEC != SWCODEC
621 void (*bitswap
)(unsigned char *data
, int length
);
623 #endif /* PLATFORM_NATIVE */
624 #if CONFIG_CODEC == SWCODEC
625 const unsigned long *audio_master_sampr_list
;
626 const unsigned long *hw_freq_sampr
;
627 void (*pcm_apply_settings
)(void);
628 void (*pcm_play_data
)(pcm_play_callback_type get_more
,
629 unsigned char* start
, size_t size
);
630 void (*pcm_play_stop
)(void);
631 void (*pcm_set_frequency
)(unsigned int frequency
);
632 bool (*pcm_is_playing
)(void);
633 bool (*pcm_is_paused
)(void);
634 void (*pcm_play_pause
)(bool play
);
635 size_t (*pcm_get_bytes_waiting
)(void);
636 void (*pcm_calculate_peaks
)(int *left
, int *right
);
637 const void* (*pcm_get_peak_buffer
)(int *count
);
638 void (*pcm_play_lock
)(void);
639 void (*pcm_play_unlock
)(void);
640 void (*beep_play
)(unsigned int frequency
, unsigned int duration
,
641 unsigned int amplitude
);
642 #ifdef HAVE_RECORDING
643 const unsigned long *rec_freq_sampr
;
644 void (*pcm_init_recording
)(void);
645 void (*pcm_close_recording
)(void);
646 void (*pcm_record_data
)(pcm_rec_callback_type more_ready
,
647 void *start
, size_t size
);
648 void (*pcm_stop_recording
)(void);
649 void (*pcm_calculate_rec_peaks
)(int *left
, int *right
);
650 void (*audio_set_recording_gain
)(int left
, int right
, int type
);
651 #endif /* HAVE_RECORDING */
652 #if INPUT_SRC_CAPS != 0
653 void (*audio_set_output_source
)(int monitor
);
654 void (*audio_set_input_source
)(int source
, unsigned flags
);
656 void (*dsp_set_crossfeed
)(bool enable
);
657 void (*dsp_set_eq
)(bool enable
);
658 void (*dsp_dither_enable
)(bool enable
);
659 intptr_t (*dsp_configure
)(struct dsp_config
*dsp
, int setting
,
661 int (*dsp_process
)(struct dsp_config
*dsp
, char *dest
,
662 const char *src
[], int count
);
663 int (*dsp_input_count
)(struct dsp_config
*dsp
, int count
);
664 int (*dsp_output_count
)(struct dsp_config
*dsp
, int count
);
666 enum channel_status (*mixer_channel_status
)(enum pcm_mixer_channel channel
);
667 void * (*mixer_channel_get_buffer
)(enum pcm_mixer_channel channel
, int *count
);
668 void (*mixer_channel_calculate_peaks
)(enum pcm_mixer_channel channel
,
669 int *left
, int *right
);
670 void (*mixer_channel_play_data
)(enum pcm_mixer_channel channel
,
671 pcm_play_callback_type get_more
,
672 unsigned char *start
, size_t size
);
673 void (*mixer_channel_play_pause
)(enum pcm_mixer_channel channel
, bool play
);
674 void (*mixer_channel_stop
)(enum pcm_mixer_channel channel
);
675 void (*mixer_channel_set_amplitude
)(enum pcm_mixer_channel channel
,
676 unsigned int amplitude
);
677 size_t (*mixer_channel_get_bytes_waiting
)(enum pcm_mixer_channel channel
);
679 void (*system_sound_play
)(enum system_sound sound
);
680 void (*keyclick_click
)(int button
);
681 #endif /* CONFIG_CODEC == SWCODC */
683 /* playback control */
684 int (*playlist_amount
)(void);
685 int (*playlist_resume
)(void);
686 void (*playlist_start
)(int start_index
, int offset
);
687 int (*playlist_add
)(const char *filename
);
688 void (*playlist_sync
)(struct playlist_info
* playlist
);
689 int (*playlist_remove_all_tracks
)(struct playlist_info
*playlist
);
690 int (*playlist_create
)(const char *dir
, const char *file
);
691 int (*playlist_insert_track
)(struct playlist_info
* playlist
,
692 const char *filename
, int position
, bool queue
, bool sync
);
693 int (*playlist_insert_directory
)(struct playlist_info
* playlist
,
694 const char *dirname
, int position
, bool queue
,
696 int (*playlist_shuffle
)(int random_seed
, int start_index
);
697 void (*audio_play
)(long offset
);
698 void (*audio_stop
)(void);
699 void (*audio_pause
)(void);
700 void (*audio_resume
)(void);
701 void (*audio_next
)(void);
702 void (*audio_prev
)(void);
703 void (*audio_ff_rewind
)(long newtime
);
704 struct mp3entry
* (*audio_next_track
)(void);
705 int (*audio_status
)(void);
706 struct mp3entry
* (*audio_current_track
)(void);
707 void (*audio_flush_and_reload_tracks
)(void);
708 int (*audio_get_file_pos
)(void);
709 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
710 unsigned long (*mpeg_get_last_header
)(void);
712 #if ((CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) || \
713 (CONFIG_CODEC == SWCODEC)) && defined (HAVE_PITCHSCREEN)
714 void (*sound_set_pitch
)(int32_t pitch
);
717 /* MAS communication */
718 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
719 int (*mas_readmem
)(int bank
, int addr
, unsigned long* dest
, int len
);
720 int (*mas_writemem
)(int bank
, int addr
, const unsigned long* src
, int len
);
721 int (*mas_readreg
)(int reg
);
722 int (*mas_writereg
)(int reg
, unsigned int val
);
723 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
724 int (*mas_codec_writereg
)(int reg
, unsigned int val
);
725 int (*mas_codec_readreg
)(int reg
);
726 void (*i2c_begin
)(void);
727 void (*i2c_end
)(void);
728 int (*i2c_write
)(int address
, const unsigned char* buf
, int count
);
733 int (*do_menu
)(const struct menu_item_ex
*menu
, int *start_selected
,
734 struct viewport parent
[NB_SCREENS
], bool hide_theme
);
737 struct gui_syncstatusbar
*statusbars
;
738 void (*gui_syncstatusbar_draw
)(struct gui_syncstatusbar
* bars
, bool force_redraw
);
741 const struct settings_list
* (*get_settings_list
)(int*count
);
742 const struct settings_list
* (*find_setting
)(const void* variable
, int *id
);
743 bool (*option_screen
)(const struct settings_list
*setting
,
744 struct viewport parent
[NB_SCREENS
],
745 bool use_temp_var
, unsigned char* option_title
);
746 bool (*set_option
)(const char* string
, const void* variable
,
747 enum optiontype type
, const struct opt_items
* options
,
748 int numoptions
, void (*function
)(int));
749 bool (*set_bool_options
)(const char* string
, const bool* variable
,
750 const char* yes_str
, int yes_voice
,
751 const char* no_str
, int no_voice
,
752 void (*function
)(bool));
753 bool (*set_int
)(const unsigned char* string
, const char* unit
, int voice_unit
,
754 const int* variable
, void (*function
)(int), int step
,
756 const char* (*formatter
)(char*, size_t, int, const char*) );
757 bool (*set_bool
)(const char* string
, const bool* variable
);
759 #ifdef HAVE_LCD_COLOR
760 bool (*set_color
)(struct screen
*display
, char *title
,
761 unsigned *color
, unsigned banned_color
);
763 /* action handling */
764 int (*get_custom_action
)(int context
,int timeout
,
765 const struct button_mapping
* (*get_context_map
)(int));
766 int (*get_action
)(int context
, int timeout
);
767 #ifdef HAVE_TOUCHSCREEN
768 int (*action_get_touchscreen_press
)(short *x
, short *y
);
770 bool (*action_userabort
)(int timeout
);
773 int (*battery_level
)(void);
774 bool (*battery_level_safe
)(void);
775 int (*battery_time
)(void);
776 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
777 unsigned int (*battery_voltage
)(void);
780 bool (*charger_inserted
)(void);
781 # if CONFIG_CHARGING >= CHARGING_MONITOR
782 bool (*charging_state
)(void);
785 #ifdef HAVE_USB_POWER
786 bool (*usb_powered
)(void);
790 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
793 void (*srand
)(unsigned int seed
);
795 void (*qsort
)(void *base
, size_t nmemb
, size_t size
,
796 int(*compar
)(const void *, const void *));
797 int (*kbd_input
)(char* buffer
, int buflen
);
798 struct tm
* (*get_time
)(void);
799 int (*set_time
)(const struct tm
*tm
);
801 time_t (*mktime
)(struct tm
*t
);
803 void* (*plugin_get_buffer
)(size_t *buffer_size
);
804 void* (*plugin_get_audio_buffer
)(size_t *buffer_size
);
805 void (*plugin_tsr
)(bool (*exit_callback
)(bool reenter
));
806 char* (*plugin_get_current_filename
)(void);
807 #if defined(DEBUG) || defined(SIMULATOR)
808 void (*debugf
)(const char *fmt
, ...) ATTRIBUTE_PRINTF(1, 2);
810 #ifdef ROCKBOX_HAS_LOGF
811 void (*logf
)(const char *fmt
, ...) ATTRIBUTE_PRINTF(1, 2);
813 struct user_settings
* global_settings
;
814 struct system_status
*global_status
;
815 void (*talk_disable
)(bool disable
);
816 #if CONFIG_CODEC == SWCODEC
817 void (*codec_thread_do_callback
)(void (*fn
)(void),
818 unsigned int *audio_thread_id
);
819 int (*codec_load_file
)(const char* codec
, struct codec_api
*api
);
820 int (*codec_run_proc
)(void);
821 int (*codec_close
)(void);
822 const char *(*get_codec_filename
)(int cod_spec
);
823 void ** (*find_array_ptr
)(void **arr
, void *ptr
);
824 int (*remove_array_ptr
)(void **arr
, void *ptr
);
825 int (*round_value_to_list32
)(unsigned long value
,
826 const unsigned long list
[],
829 #endif /* CONFIG_CODEC == SWCODEC */
830 bool (*get_metadata
)(struct mp3entry
* id3
, int fd
, const char* trackname
);
831 bool (*mp3info
)(struct mp3entry
*entry
, const char *filename
);
832 int (*count_mp3_frames
)(int fd
, int startpos
, int filesize
,
833 void (*progressfunc
)(int),
834 unsigned char* buf
, size_t buflen
);
835 int (*create_xing_header
)(int fd
, long startpos
, long filesize
,
836 unsigned char *buf
, unsigned long num_frames
,
837 unsigned long rec_time
, unsigned long header_template
,
838 void (*progressfunc
)(int), bool generate_toc
,
839 unsigned char* tempbuf
, size_t tempbuf_len
);
840 unsigned long (*find_next_frame
)(int fd
, long *offset
,
841 long max_offset
, unsigned long reference_header
);
843 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
844 unsigned short (*peak_meter_scale_value
)(unsigned short val
,
846 void (*peak_meter_set_use_dbfs
)(bool use
);
847 bool (*peak_meter_get_use_dbfs
)(void);
849 #ifdef HAVE_LCD_BITMAP
850 int (*read_bmp_file
)(const char* filename
, struct bitmap
*bm
, int maxsize
,
851 int format
, const struct custom_format
*cformat
);
852 int (*read_bmp_fd
)(int fd
, struct bitmap
*bm
, int maxsize
,
853 int format
, const struct custom_format
*cformat
);
855 int (*read_jpeg_file
)(const char* filename
, struct bitmap
*bm
, int maxsize
,
856 int format
, const struct custom_format
*cformat
);
857 int (*read_jpeg_fd
)(int fd
, struct bitmap
*bm
, int maxsize
,
858 int format
, const struct custom_format
*cformat
);
860 void (*screen_dump_set_hook
)(void (*hook
)(int fh
));
862 int (*show_logo
)(void);
863 struct tree_context
* (*tree_get_context
)(void);
864 void (*set_current_file
)(const char* path
);
865 void (*set_dirfilter
)(int l_dirfilter
);
867 #ifdef HAVE_WHEEL_POSITION
868 int (*wheel_status
)(void);
869 void (*wheel_send_events
)(bool send
);
872 #ifdef IRIVER_H100_SERIES
873 /* Routines for the iriver_flash -plugin. */
874 bool (*detect_original_firmware
)(void);
875 bool (*detect_flashed_ramimage
)(void);
876 bool (*detect_flashed_romimage
)(void);
879 void (*led
)(bool on
);
881 #if (CONFIG_CODEC == SWCODEC)
883 int (*bufopen
)(const char *file
, size_t offset
, enum data_type type
,
885 int (*bufalloc
)(const void *src
, size_t size
, enum data_type type
);
886 bool (*bufclose
)(int handle_id
);
887 int (*bufseek
)(int handle_id
, size_t newpos
);
888 int (*bufadvance
)(int handle_id
, off_t offset
);
889 ssize_t (*bufread
)(int handle_id
, size_t size
, void *dest
);
890 ssize_t (*bufgetdata
)(int handle_id
, size_t size
, void **data
);
891 ssize_t (*bufgettail
)(int handle_id
, size_t size
, void **data
);
892 ssize_t (*bufcuttail
)(int handle_id
, size_t size
);
894 ssize_t (*buf_handle_offset
)(int handle_id
);
895 void (*buf_set_base_handle
)(int handle_id
);
896 size_t (*buf_used
)(void);
900 bool (*tagcache_search
)(struct tagcache_search
*tcs
, int tag
);
901 void (*tagcache_search_set_uniqbuf
)(struct tagcache_search
*tcs
,
902 void *buffer
, long length
);
903 bool (*tagcache_search_add_filter
)(struct tagcache_search
*tcs
,
905 bool (*tagcache_get_next
)(struct tagcache_search
*tcs
);
906 bool (*tagcache_retrieve
)(struct tagcache_search
*tcs
, int idxid
,
907 int tag
, char *buf
, long size
);
908 void (*tagcache_search_finish
)(struct tagcache_search
*tcs
);
909 long (*tagcache_get_numeric
)(const struct tagcache_search
*tcs
, int tag
);
910 #if defined(HAVE_TC_RAMCACHE) && defined(HAVE_DIRCACHE)
911 bool (*tagcache_fill_tags
)(struct mp3entry
*id3
, const char *filename
);
916 bool (*search_albumart_files
)(const struct mp3entry
*id3
, const char *size_string
,
917 char *buf
, int buflen
);
920 #ifdef HAVE_SEMAPHORE_OBJECTS
921 void (*semaphore_init
)(struct semaphore
*s
, int max
, int start
);
922 int (*semaphore_wait
)(struct semaphore
*s
, int timeout
);
923 void (*semaphore_release
)(struct semaphore
*s
);
926 const char *rbversion
;
928 /* new stuff at the end, sort into place next time
929 the API gets incompatible */
930 struct entry
* (*tree_get_entries
)(struct tree_context
* t
);
931 struct entry
* (*tree_get_entry_at
)(struct tree_context
* t
, int index
);
933 /* the buflib memory management library */
934 void (*buflib_init
)(struct buflib_context
* ctx
, void* buf
, size_t size
);
935 size_t (*buflib_available
)(struct buflib_context
* ctx
);
936 int (*buflib_alloc
)(struct buflib_context
* ctx
, size_t size
);
937 int (*buflib_alloc_ex
)(struct buflib_context
* ctx
, size_t size
,
938 const char* name
, struct buflib_callbacks
*ops
);
939 int (*buflib_alloc_maximum
)(struct buflib_context
* ctx
, const char* name
,
940 size_t* size
, struct buflib_callbacks
*ops
);
941 void (*buflib_buffer_in
)(struct buflib_context
* ctx
, int size
);
942 void* (*buflib_buffer_out
)(struct buflib_context
* ctx
, size_t* size
);
943 int (*buflib_free
)(struct buflib_context
* ctx
, int handle
);
944 bool (*buflib_shrink
)(struct buflib_context
* ctx
, int handle
,
945 void* new_start
, size_t new_size
);
946 void* (*buflib_get_data
)(struct buflib_context
* ctx
, int handle
);
947 const char* (*buflib_get_name
)(struct buflib_context
* ctx
, int handle
);
952 struct plugin_header
{
953 struct lc_header lc_hdr
; /* must be the first */
954 enum plugin_status(*entry_point
)(const void*);
955 const struct plugin_api
**api
;
959 #if (CONFIG_PLATFORM & PLATFORM_NATIVE)
960 extern unsigned char plugin_start_addr
[];
961 extern unsigned char plugin_end_addr
[];
962 #define PLUGIN_HEADER \
963 const struct plugin_api *rb DATA_ATTR; \
964 const struct plugin_header __header \
965 __attribute__ ((section (".header")))= { \
966 { PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
967 plugin_start_addr, plugin_end_addr }, plugin__start, &rb };
968 #else /* PLATFORM_HOSTED */
969 #define PLUGIN_HEADER \
970 const struct plugin_api *rb DATA_ATTR; \
971 const struct plugin_header __header \
972 __attribute__((visibility("default"))) = { \
973 { PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, NULL, NULL }, \
974 plugin__start, &rb };
975 #endif /* CONFIG_PLATFORM */
978 int plugin_load(const char* plugin
, const void* parameter
);
979 void* plugin_get_audio_buffer(size_t *buffer_size
);
982 callback returns true to allow the new plugin to load,
983 reenter means the currently running plugin is being reloaded */
984 void plugin_tsr(bool (*exit_callback
)(bool reenter
));
986 /* defined by the plugin */
987 extern const struct plugin_api
*rb
;
988 enum plugin_status
plugin__start(const void* parameter
)
991 #endif /* __PCTOOL__ */