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"
43 char* strncpy(char *, const char *, size_t);
44 void* plugin_get_buffer(size_t *buffer_size
);
62 #include "mp3_playback.h"
68 #if (CONFIG_CODEC == SWCODEC)
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"
94 #include "buffering.h"
97 #include "ata_idle_notify.h"
98 #include "settings_list.h"
99 #include "timefuncs.h"
103 #include "albumart.h"
106 #ifdef HAVE_REMOTE_LCD
107 #include "lcd-remote.h"
112 #ifdef USB_ENABLE_HID
113 #include "usbstack/usb_hid_usage_tables.h"
117 /* on some platforms strcmp() seems to be a tricky define which
118 * breaks if we write down strcmp's prototype */
123 #if defined(DEBUG) || defined(SIMULATOR)
125 #define DEBUGF rb->debugf
127 #define LDEBUGF rb->debugf
133 #ifdef ROCKBOX_HAS_LOGF
135 #define LOGF rb->logf
142 #define PLUGIN_MAGIC 0x526F634B /* RocK */
144 /* increase this every time the api struct changes */
145 #define PLUGIN_API_VERSION 183
147 /* update this to latest version if a change to the api struct breaks
148 backwards compatibility (and please take the opportunity to sort in any
149 new function which are "waiting" at the end of the function table) */
150 #define PLUGIN_MIN_API_VERSION 182
152 /* plugin return codes */
155 PLUGIN_USB_CONNECTED
,
160 /* NOTE: To support backwards compatibility, only add new functions at
161 the end of the structure. Every time you add a new function,
162 remember to increase PLUGIN_API_VERSION. If you make changes to the
163 existing APIs then also update PLUGIN_MIN_API_VERSION to current
170 #ifdef HAVE_LCD_CONTRAST
171 void (*lcd_set_contrast
)(int x
);
173 void (*lcd_update
)(void);
174 void (*lcd_clear_display
)(void);
175 int (*lcd_getstringsize
)(const unsigned char *str
, int *w
, int *h
);
176 void (*lcd_putsxy
)(int x
, int y
, const unsigned char *string
);
177 void (*lcd_puts
)(int x
, int y
, const unsigned char *string
);
178 void (*lcd_puts_scroll
)(int x
, int y
, const unsigned char* string
);
179 void (*lcd_stop_scroll
)(void);
180 #ifdef HAVE_LCD_CHARCELLS
181 void (*lcd_define_pattern
)(unsigned long ucs
, const char *pattern
);
182 unsigned long (*lcd_get_locked_pattern
)(void);
183 void (*lcd_unlock_pattern
)(unsigned long ucs
);
184 void (*lcd_putc
)(int x
, int y
, unsigned long ucs
);
185 void (*lcd_put_cursor
)(int x
, int y
, unsigned long ucs
);
186 void (*lcd_remove_cursor
)(void);
187 void (*lcd_icon
)(int icon
, bool enable
);
188 void (*lcd_double_height
)(bool on
);
189 #else /* HAVE_LCD_BITMAP */
190 fb_data
* lcd_framebuffer
;
191 void (*lcd_update_rect
)(int x
, int y
, int width
, int height
);
192 void (*lcd_set_drawmode
)(int mode
);
193 int (*lcd_get_drawmode
)(void);
194 void (*lcd_setfont
)(int font
);
195 void (*lcd_drawpixel
)(int x
, int y
);
196 void (*lcd_drawline
)(int x1
, int y1
, int x2
, int y2
);
197 void (*lcd_hline
)(int x1
, int x2
, int y
);
198 void (*lcd_vline
)(int x
, int y1
, int y2
);
199 void (*lcd_drawrect
)(int x
, int y
, int width
, int height
);
200 void (*lcd_fillrect
)(int x
, int y
, int width
, int height
);
201 void (*lcd_mono_bitmap_part
)(const unsigned char *src
, int src_x
, int src_y
,
202 int stride
, int x
, int y
, int width
, int height
);
203 void (*lcd_mono_bitmap
)(const unsigned char *src
, int x
, int y
,
204 int width
, int height
);
206 void (*lcd_set_foreground
)(unsigned foreground
);
207 unsigned (*lcd_get_foreground
)(void);
208 void (*lcd_set_background
)(unsigned foreground
);
209 unsigned (*lcd_get_background
)(void);
210 void (*lcd_bitmap_part
)(const fb_data
*src
, int src_x
, int src_y
,
211 int stride
, int x
, int y
, int width
, int height
);
212 void (*lcd_bitmap
)(const fb_data
*src
, int x
, int y
, int width
,
214 fb_data
* (*lcd_get_backdrop
)(void);
215 void (*lcd_set_backdrop
)(fb_data
* backdrop
);
218 void (*lcd_bitmap_transparent_part
)(const fb_data
*src
,
219 int src_x
, int src_y
, int stride
,
220 int x
, int y
, int width
, int height
);
221 void (*lcd_bitmap_transparent
)(const fb_data
*src
, int x
, int y
,
222 int width
, int height
);
224 void (*lcd_blit_yuv
)(unsigned char * const src
[3],
225 int src_x
, int src_y
, int stride
,
226 int x
, int y
, int width
, int height
);
227 #if defined(TOSHIBA_GIGABEAT_F) || defined(SANSA_E200) || defined(SANSA_C200) \
228 || defined(IRIVER_H10) || defined(COWON_D2) || defined(PHILIPS_HDD1630) \
229 || defined(SANSA_FUZE) || defined(SANSA_E200V2) || defined(SANSA_FUZEV2) \
230 || defined(TOSHIBA_GIGABEAT_S)
231 void (*lcd_yuv_set_options
)(unsigned options
);
233 #endif /* MEMORYSIZE > 2 */
234 #elif (LCD_DEPTH < 4) && !defined(SIMULATOR)
235 void (*lcd_blit_mono
)(const unsigned char *data
, int x
, int by
, int width
,
236 int bheight
, int stride
);
237 void (*lcd_blit_grey_phase
)(unsigned char *values
, unsigned char *phases
,
238 int bx
, int by
, int bwidth
, int bheight
,
240 #endif /* LCD_DEPTH */
241 #if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256)
242 void (*lcd_blit_pal256
)(unsigned char *src
, int src_x
, int src_y
, int x
, int y
,
243 int width
, int height
);
244 void (*lcd_pal256_update_pal
)(fb_data
*palette
);
246 void (*lcd_puts_style
)(int x
, int y
, const unsigned char *str
, int style
);
247 void (*lcd_puts_scroll_style
)(int x
, int y
, const unsigned char* string
,
249 #ifdef HAVE_LCD_INVERT
250 void (*lcd_set_invert_display
)(bool yesno
);
251 #endif /* HAVE_LCD_INVERT */
252 #if defined(HAVE_LCD_MODES)
253 void (*lcd_set_mode
)(int mode
);
256 #if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP)
257 struct event_queue
*button_queue
;
259 unsigned short *(*bidi_l2v
)( const unsigned char *str
, int orientation
);
260 const unsigned char *(*font_get_bits
)( struct font
*pf
, unsigned short char_code
);
261 int (*font_load
)(struct font
*, const char *path
);
262 struct font
* (*font_get
)(int font
);
263 int (*font_getstringsize
)(const unsigned char *str
, int *w
, int *h
,
265 int (*font_get_width
)(struct font
* pf
, unsigned short char_code
);
266 void (*screen_clear_area
)(struct screen
* display
, int xstart
, int ystart
,
267 int width
, int height
);
268 void (*gui_scrollbar_draw
)(struct screen
* screen
, int x
, int y
,
269 int width
, int height
, int items
,
270 int min_shown
, int max_shown
,
272 #endif /* HAVE_LCD_BITMAP */
273 const char* (*get_codepage_name
)(int cp
);
276 /* The backlight_* functions must be present in the API regardless whether
277 * HAVE_BACKLIGHT is defined or not. The reason is that the stock Ondio has
278 * no backlight but can be modded to have backlight (it's prepared on the
279 * PCB). This makes backlight an all-target feature API wise, and keeps API
280 * compatible between stock and modded Ondio.
281 * For OLED targets like the Sansa Clip, the backlight_* functions control
282 * the display enable, which has essentially the same effect. */
283 void (*backlight_on
)(void);
284 void (*backlight_off
)(void);
285 void (*backlight_set_timeout
)(int index
);
286 #ifdef HAVE_BACKLIGHT_BRIGHTNESS
287 void (*backlight_set_brightness
)(int val
);
288 #endif /* HAVE_BACKLIGHT_BRIGHTNESS */
291 void (*backlight_set_timeout_plugged
)(int index
);
293 bool (*is_backlight_on
)(bool ignore_always_off
);
294 void (*splash
)(int ticks
, const char *str
);
295 void (*splashf
)(int ticks
, const char *fmt
, ...) ATTRIBUTE_PRINTF(2, 3);
297 #ifdef HAVE_REMOTE_LCD
299 void (*lcd_remote_set_contrast
)(int x
);
300 void (*lcd_remote_clear_display
)(void);
301 void (*lcd_remote_puts
)(int x
, int y
, const unsigned char *string
);
302 void (*lcd_remote_puts_scroll
)(int x
, int y
, const unsigned char* string
);
303 void (*lcd_remote_stop_scroll
)(void);
304 void (*lcd_remote_set_drawmode
)(int mode
);
305 int (*lcd_remote_get_drawmode
)(void);
306 void (*lcd_remote_setfont
)(int font
);
307 int (*lcd_remote_getstringsize
)(const unsigned char *str
, int *w
, int *h
);
308 void (*lcd_remote_drawpixel
)(int x
, int y
);
309 void (*lcd_remote_drawline
)(int x1
, int y1
, int x2
, int y2
);
310 void (*lcd_remote_hline
)(int x1
, int x2
, int y
);
311 void (*lcd_remote_vline
)(int x
, int y1
, int y2
);
312 void (*lcd_remote_drawrect
)(int x
, int y
, int nx
, int ny
);
313 void (*lcd_remote_fillrect
)(int x
, int y
, int nx
, int ny
);
314 void (*lcd_remote_mono_bitmap_part
)(const unsigned char *src
, int src_x
,
315 int src_y
, int stride
, int x
, int y
,
316 int width
, int height
);
317 void (*lcd_remote_mono_bitmap
)(const unsigned char *src
, int x
, int y
,
318 int width
, int height
);
319 void (*lcd_remote_putsxy
)(int x
, int y
, const unsigned char *string
);
320 void (*lcd_remote_puts_style
)(int x
, int y
, const unsigned char *str
, int style
);
321 void (*lcd_remote_puts_scroll_style
)(int x
, int y
, const unsigned char* string
,
323 fb_remote_data
* lcd_remote_framebuffer
;
324 void (*lcd_remote_update
)(void);
325 void (*lcd_remote_update_rect
)(int x
, int y
, int width
, int height
);
327 void (*remote_backlight_on
)(void);
328 void (*remote_backlight_off
)(void);
329 void (*remote_backlight_set_timeout
)(int index
);
331 void (*remote_backlight_set_timeout_plugged
)(int index
);
333 #endif /* HAVE_REMOTE_LCD */
334 struct screen
* screens
[NB_SCREENS
];
335 #if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)
336 void (*lcd_remote_set_foreground
)(unsigned foreground
);
337 unsigned (*lcd_remote_get_foreground
)(void);
338 void (*lcd_remote_set_background
)(unsigned background
);
339 unsigned (*lcd_remote_get_background
)(void);
340 void (*lcd_remote_bitmap_part
)(const fb_remote_data
*src
,
341 int src_x
, int src_y
, int stride
,
342 int x
, int y
, int width
, int height
);
343 void (*lcd_remote_bitmap
)(const fb_remote_data
*src
, int x
, int y
,
344 int width
, int height
);
346 void (*viewport_set_defaults
)(struct viewport
*vp
,
347 const enum screen_type screen
);
348 #ifdef HAVE_LCD_BITMAP
349 void (*viewportmanager_theme_enable
)(enum screen_type screen
, bool enable
,
350 struct viewport
*viewport
);
351 void (*viewportmanager_theme_undo
)(enum screen_type screen
, bool force_redraw
);
354 void (*gui_synclist_init
)(struct gui_synclist
* lists
,
355 list_get_name callback_get_item_name
, void * data
,
356 bool scroll_all
,int selected_size
,
357 struct viewport parent
[NB_SCREENS
]);
358 void (*gui_synclist_set_nb_items
)(struct gui_synclist
* lists
, int nb_items
);
359 void (*gui_synclist_set_icon_callback
)(struct gui_synclist
* lists
,
360 list_get_icon icon_callback
);
361 int (*gui_synclist_get_nb_items
)(struct gui_synclist
* lists
);
362 int (*gui_synclist_get_sel_pos
)(struct gui_synclist
* lists
);
363 void (*gui_synclist_draw
)(struct gui_synclist
* lists
);
364 void (*gui_synclist_select_item
)(struct gui_synclist
* lists
,
366 void (*gui_synclist_add_item
)(struct gui_synclist
* lists
);
367 void (*gui_synclist_del_item
)(struct gui_synclist
* lists
);
368 void (*gui_synclist_limit_scroll
)(struct gui_synclist
* lists
, bool scroll
);
369 bool (*gui_synclist_do_button
)(struct gui_synclist
* lists
,
370 int *action
, enum list_wrap wrap
);
371 void (*gui_synclist_set_title
)(struct gui_synclist
*lists
, char* title
,
372 enum themable_icons icon
);
373 enum yesno_res (*gui_syncyesno_run
)(const struct text_message
* main_message
,
374 const struct text_message
* yes_message
,
375 const struct text_message
* no_message
);
376 void (*simplelist_info_init
)(struct simplelist_info
*info
, char* title
,
377 int count
, void* data
);
378 bool (*simplelist_show_list
)(struct simplelist_info
*info
);
381 long (*button_get
)(bool block
);
382 long (*button_get_w_tmo
)(int ticks
);
383 int (*button_status
)(void);
384 #ifdef HAVE_BUTTON_DATA
385 intptr_t (*button_get_data
)(void);
386 int (*button_status_wdata
)(int *pdata
);
388 void (*button_clear_queue
)(void);
389 int (*button_queue_count
)(void);
390 #ifdef HAS_BUTTON_HOLD
391 bool (*button_hold
)(void);
393 #ifdef HAVE_TOUCHSCREEN
394 void (*touchscreen_set_mode
)(enum touchscreen_mode
);
396 #ifdef HAVE_BUTTON_LIGHT
397 void (*buttonlight_set_timeout
)(int value
);
398 void (*buttonlight_off
)(void);
399 void (*buttonlight_on
)(void);
400 #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS
401 void (*buttonlight_set_brightness
)(int val
);
402 #endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */
403 #endif /* HAVE_BUTTON_LIGHT */
406 int (*open_utf8
)(const char* pathname
, int flags
);
407 int (*open
)(const char* pathname
, int flags
, ...);
408 int (*close
)(int fd
);
409 ssize_t (*read
)(int fd
, void* buf
, size_t count
);
410 off_t (*lseek
)(int fd
, off_t offset
, int whence
);
411 int (*creat
)(const char *pathname
, mode_t mode
);
412 ssize_t (*write
)(int fd
, const void* buf
, size_t count
);
413 int (*remove
)(const char* pathname
);
414 int (*rename
)(const char* path
, const char* newname
);
415 int (*ftruncate
)(int fd
, off_t length
);
416 off_t (*filesize
)(int fd
);
417 int (*fdprintf
)(int fd
, const char *fmt
, ...) ATTRIBUTE_PRINTF(2, 3);
418 int (*read_line
)(int fd
, char* buffer
, int buffer_size
);
419 bool (*settings_parseline
)(char* line
, char** name
, char** value
);
420 void (*storage_sleep
)(void);
421 void (*storage_spin
)(void);
422 void (*storage_spindown
)(int seconds
);
423 #if USING_STORAGE_CALLBACK
424 void (*register_storage_idle_func
)(void (*function
)(void *data
));
425 void (*unregister_storage_idle_func
)(void (*function
)(void *data
), bool run
);
426 #endif /* USING_STORAGE_CALLBACK */
427 void (*reload_directory
)(void);
428 char *(*create_numbered_filename
)(char *buffer
, const char *path
,
429 const char *prefix
, const char *suffix
,
430 int numberlen
IF_CNFN_NUM_(, int *num
));
431 bool (*file_exists
)(const char *file
);
432 char* (*strip_extension
)(char* buffer
, int buffer_size
, const char *filename
);
433 unsigned (*crc_32
)(const void *src
, unsigned len
, unsigned crc32
);
437 DIR* (*opendir
)(const char* name
);
438 int (*closedir
)(DIR* dir
);
439 struct dirent
* (*readdir
)(DIR* dir
);
440 int (*mkdir
)(const char *name
);
441 int (*rmdir
)(const char *name
);
442 bool (*dir_exists
)(const char *path
);
446 void (*__div0
)(void);
448 void (*sleep
)(int ticks
);
450 volatile long* current_tick
;
451 long (*default_event_handler
)(long event
);
452 long (*default_event_handler_ex
)(long event
,
453 void (*callback
)(void *), void *parameter
);
454 unsigned int (*create_thread
)(void (*function
)(void), void* stack
,
455 size_t stack_size
, unsigned flags
,
457 IF_PRIO(, int priority
)
458 IF_COP(, unsigned int core
));
459 void (*thread_exit
)(void);
460 void (*thread_wait
)(unsigned int thread_id
);
461 #if CONFIG_CODEC == SWCODEC
462 void (*thread_thaw
)(unsigned int thread_id
);
463 #ifdef HAVE_PRIORITY_SCHEDULING
464 int (*thread_set_priority
)(unsigned int thread_id
, int priority
);
466 void (*mutex_init
)(struct mutex
*m
);
467 void (*mutex_lock
)(struct mutex
*m
);
468 void (*mutex_unlock
)(struct mutex
*m
);
471 void (*reset_poweroff_timer
)(void);
473 int (*system_memory_guard
)(int newmode
);
475 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
476 #ifdef CPU_BOOST_LOGGING
477 void (*cpu_boost_
)(bool on_off
,char*location
,int line
);
479 void (*cpu_boost
)(bool on_off
);
481 #endif /* HAVE_ADJUSTABLE_CPU_FREQ */
482 #endif /* !SIMULATOR */
483 #ifdef HAVE_SCHEDULER_BOOSTCTRL
484 void (*trigger_cpu_boost
)(void);
485 void (*cancel_cpu_boost
)(void);
488 void (*cpucache_flush
)(void);
489 void (*cpucache_invalidate
)(void);
491 bool (*timer_register
)(int reg_prio
, void (*unregister_callback
)(void),
492 long cycles
, void (*timer_callback
)(void)
494 void (*timer_unregister
)(void);
495 bool (*timer_set_period
)(long count
);
497 void (*queue_init
)(struct event_queue
*q
, bool register_queue
);
498 void (*queue_delete
)(struct event_queue
*q
);
499 void (*queue_post
)(struct event_queue
*q
, long id
, intptr_t data
);
500 void (*queue_wait_w_tmo
)(struct event_queue
*q
, struct queue_event
*ev
,
502 #if CONFIG_CODEC == SWCODEC
503 void (*queue_enable_queue_send
)(struct event_queue
*q
,
504 struct queue_sender_list
*send
,
505 unsigned int thread_id
);
506 bool (*queue_empty
)(const struct event_queue
*q
);
507 void (*queue_wait
)(struct event_queue
*q
, struct queue_event
*ev
);
508 intptr_t (*queue_send
)(struct event_queue
*q
, long id
,
510 void (*queue_reply
)(struct event_queue
*q
, intptr_t retval
);
511 #endif /* CONFIG_CODEC == SWCODEC */
513 void (*usb_acknowledge
)(long id
);
514 #ifdef USB_ENABLE_HID
515 void (*usb_hid_send
)(usage_page_t usage_page
, int id
);
518 void (*profile_thread
)(void);
519 void (*profstop
)(void);
520 void (*profile_func_enter
)(void *this_fn
, void *call_site
);
521 void (*profile_func_exit
)(void *this_fn
, void *call_site
);
524 bool (*add_event
)(unsigned short id
, bool oneshot
, void (*handler
)(void *data
));
525 void (*remove_event
)(unsigned short id
, void (*handler
)(void *data
));
526 void (*send_event
)(unsigned short id
, void *data
);
529 /* special simulator hooks */
530 #if defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8
531 void (*sim_lcd_ex_init
)(unsigned long (*getpixel
)(int, int));
532 void (*sim_lcd_ex_update_rect
)(int x
, int y
, int width
, int height
);
536 /* strings and memory */
537 int (*snprintf
)(char *buf
, size_t size
, const char *fmt
, ...)
538 ATTRIBUTE_PRINTF(3, 4);
539 int (*vsnprintf
)(char *buf
, size_t size
, const char *fmt
, va_list ap
);
540 char* (*strcpy
)(char *dst
, const char *src
);
541 size_t (*strlcpy
)(char *dst
, const char *src
, size_t length
);
542 size_t (*strlen
)(const char *str
);
543 char * (*strrchr
)(const char *s
, int c
);
544 int (*strcmp
)(const char *, const char *);
545 int (*strncmp
)(const char *, const char *, size_t);
546 int (*strcasecmp
)(const char *, const char *);
547 int (*strncasecmp
)(const char *s1
, const char *s2
, size_t n
);
548 void* (*memset
)(void *dst
, int c
, size_t length
);
549 void* (*memcpy
)(void *out
, const void *in
, size_t n
);
550 void* (*memmove
)(void *out
, const void *in
, size_t n
);
551 const unsigned char *_rbctype_
;
552 int (*atoi
)(const char *str
);
553 char *(*strchr
)(const char *s
, int c
);
554 char *(*strcat
)(char *s1
, const char *s2
);
555 size_t (*strlcat
)(char *dst
, const char *src
, size_t length
);
556 void *(*memchr
)(const void *s1
, int c
, size_t n
);
557 int (*memcmp
)(const void *s1
, const void *s2
, size_t n
);
558 char *(*strcasestr
) (const char* phaystack
, const char* pneedle
);
559 char* (*strtok_r
)(char *ptr
, const char *sep
, char **end
);
561 const unsigned char* (*utf8decode
)(const unsigned char *utf8
, unsigned short *ucs
);
562 unsigned char* (*iso_decode
)(const unsigned char *iso
, unsigned char *utf8
, int cp
, int count
);
563 unsigned char* (*utf16LEdecode
)(const unsigned char *utf16
, unsigned char *utf8
, int count
);
564 unsigned char* (*utf16BEdecode
)(const unsigned char *utf16
, unsigned char *utf8
, int count
);
565 unsigned char* (*utf8encode
)(unsigned long ucs
, unsigned char *utf8
);
566 unsigned long (*utf8length
)(const unsigned char *utf8
);
567 int (*utf8seek
)(const unsigned char* utf8
, int offset
);
570 void (*sound_set
)(int setting
, int value
);
571 int (*sound_default
)(int setting
);
572 int (*sound_min
)(int setting
);
573 int (*sound_max
)(int setting
);
574 const char * (*sound_unit
)(int setting
);
575 int (*sound_val2phys
)(int setting
, int value
);
577 void (*mp3_play_data
)(const unsigned char* start
, int size
,
578 void (*get_more
)(unsigned char** start
, size_t* size
));
579 void (*mp3_play_pause
)(bool play
);
580 void (*mp3_play_stop
)(void);
581 bool (*mp3_is_playing
)(void);
582 #if CONFIG_CODEC != SWCODEC
583 void (*bitswap
)(unsigned char *data
, int length
);
585 #endif /* !SIMULATOR */
586 #if CONFIG_CODEC == SWCODEC
587 const unsigned long *audio_master_sampr_list
;
588 const unsigned long *hw_freq_sampr
;
589 void (*pcm_apply_settings
)(void);
590 void (*pcm_play_data
)(pcm_more_callback_type get_more
,
591 unsigned char* start
, size_t size
);
592 void (*pcm_play_stop
)(void);
593 void (*pcm_set_frequency
)(unsigned int frequency
);
594 bool (*pcm_is_playing
)(void);
595 bool (*pcm_is_paused
)(void);
596 void (*pcm_play_pause
)(bool play
);
597 size_t (*pcm_get_bytes_waiting
)(void);
598 void (*pcm_calculate_peaks
)(int *left
, int *right
);
599 const void* (*pcm_get_peak_buffer
)(int *count
);
600 void (*pcm_play_lock
)(void);
601 void (*pcm_play_unlock
)(void);
602 void (*pcmbuf_beep
)(unsigned int frequency
,
605 #ifdef HAVE_RECORDING
606 const unsigned long *rec_freq_sampr
;
607 void (*pcm_init_recording
)(void);
608 void (*pcm_close_recording
)(void);
609 void (*pcm_record_data
)(pcm_more_callback_type2 more_ready
,
610 void *start
, size_t size
);
611 void (*pcm_record_more
)(void *start
, size_t size
);
612 void (*pcm_stop_recording
)(void);
613 void (*pcm_calculate_rec_peaks
)(int *left
, int *right
);
614 void (*audio_set_recording_gain
)(int left
, int right
, int type
);
615 #endif /* HAVE_RECORDING */
616 #if INPUT_SRC_CAPS != 0
617 void (*audio_set_output_source
)(int monitor
);
618 void (*audio_set_input_source
)(int source
, unsigned flags
);
620 void (*dsp_set_crossfeed
)(bool enable
);
621 void (*dsp_set_eq
)(bool enable
);
622 void (*dsp_dither_enable
)(bool enable
);
623 intptr_t (*dsp_configure
)(struct dsp_config
*dsp
, int setting
,
625 int (*dsp_process
)(struct dsp_config
*dsp
, char *dest
,
626 const char *src
[], int count
);
627 int (*dsp_input_count
)(struct dsp_config
*dsp
, int count
);
628 int (*dsp_output_count
)(struct dsp_config
*dsp
, int count
);
629 #endif /* CONFIG_CODEC == SWCODC */
631 /* playback control */
632 int (*playlist_amount
)(void);
633 int (*playlist_resume
)(void);
634 void (*playlist_start
)(int start_index
, int offset
);
635 int (*playlist_add
)(const char *filename
);
636 void (*playlist_sync
)(struct playlist_info
* playlist
);
637 int (*playlist_remove_all_tracks
)(struct playlist_info
*playlist
);
638 int (*playlist_create
)(const char *dir
, const char *file
);
639 int (*playlist_insert_track
)(struct playlist_info
* playlist
,
640 const char *filename
, int position
, bool queue
, bool sync
);
641 int (*playlist_insert_directory
)(struct playlist_info
* playlist
,
642 const char *dirname
, int position
, bool queue
,
644 int (*playlist_shuffle
)(int random_seed
, int start_index
);
645 void (*audio_play
)(long offset
);
646 void (*audio_stop
)(void);
647 void (*audio_pause
)(void);
648 void (*audio_resume
)(void);
649 void (*audio_next
)(void);
650 void (*audio_prev
)(void);
651 void (*audio_ff_rewind
)(long newtime
);
652 struct mp3entry
* (*audio_next_track
)(void);
653 int (*audio_status
)(void);
654 struct mp3entry
* (*audio_current_track
)(void);
655 void (*audio_flush_and_reload_tracks
)(void);
656 int (*audio_get_file_pos
)(void);
657 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
658 unsigned long (*mpeg_get_last_header
)(void);
660 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) || \
661 (CONFIG_CODEC == SWCODEC)
662 void (*sound_set_pitch
)(int32_t pitch
);
665 /* MAS communication */
666 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
667 int (*mas_readmem
)(int bank
, int addr
, unsigned long* dest
, int len
);
668 int (*mas_writemem
)(int bank
, int addr
, const unsigned long* src
, int len
);
669 int (*mas_readreg
)(int reg
);
670 int (*mas_writereg
)(int reg
, unsigned int val
);
671 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
672 int (*mas_codec_writereg
)(int reg
, unsigned int val
);
673 int (*mas_codec_readreg
)(int reg
);
674 void (*i2c_begin
)(void);
675 void (*i2c_end
)(void);
676 int (*i2c_write
)(int address
, const unsigned char* buf
, int count
);
681 int (*do_menu
)(const struct menu_item_ex
*menu
, int *start_selected
,
682 struct viewport parent
[NB_SCREENS
], bool hide_theme
);
685 struct gui_syncstatusbar
*statusbars
;
686 void (*gui_syncstatusbar_draw
)(struct gui_syncstatusbar
* bars
, bool force_redraw
);
689 const struct settings_list
* (*get_settings_list
)(int*count
);
690 const struct settings_list
* (*find_setting
)(const void* variable
, int *id
);
691 bool (*option_screen
)(const struct settings_list
*setting
,
692 struct viewport parent
[NB_SCREENS
],
693 bool use_temp_var
, unsigned char* option_title
);
694 bool (*set_option
)(const char* string
, const void* variable
,
695 enum optiontype type
, const struct opt_items
* options
,
696 int numoptions
, void (*function
)(int));
697 bool (*set_bool_options
)(const char* string
, const bool* variable
,
698 const char* yes_str
, int yes_voice
,
699 const char* no_str
, int no_voice
,
700 void (*function
)(bool));
701 bool (*set_int
)(const unsigned char* string
, const char* unit
, int voice_unit
,
702 const int* variable
, void (*function
)(int), int step
,
704 const char* (*formatter
)(char*, size_t, int, const char*) );
705 bool (*set_bool
)(const char* string
, const bool* variable
);
707 #ifdef HAVE_LCD_COLOR
708 bool (*set_color
)(struct screen
*display
, char *title
,
709 unsigned *color
, unsigned banned_color
);
711 /* action handling */
712 int (*get_custom_action
)(int context
,int timeout
,
713 const struct button_mapping
* (*get_context_map
)(int));
714 int (*get_action
)(int context
, int timeout
);
715 #ifdef HAVE_TOUCHSCREEN
716 int (*action_get_touchscreen_press
)(short *x
, short *y
);
718 bool (*action_userabort
)(int timeout
);
721 int (*battery_level
)(void);
722 bool (*battery_level_safe
)(void);
723 int (*battery_time
)(void);
725 unsigned int (*battery_voltage
)(void);
728 bool (*charger_inserted
)(void);
729 # if CONFIG_CHARGING >= CHARGING_MONITOR
730 bool (*charging_state
)(void);
733 #ifdef HAVE_USB_POWER
734 bool (*usb_powered
)(void);
738 #if !defined(SIMULATOR) || defined(__MINGW32__) || defined(__CYGWIN__)
741 void (*srand
)(unsigned int seed
);
743 void (*qsort
)(void *base
, size_t nmemb
, size_t size
,
744 int(*compar
)(const void *, const void *));
745 int (*kbd_input
)(char* buffer
, int buflen
);
746 struct tm
* (*get_time
)(void);
747 int (*set_time
)(const struct tm
*tm
);
749 time_t (*mktime
)(struct tm
*t
);
751 void* (*plugin_get_buffer
)(size_t *buffer_size
);
752 void* (*plugin_get_audio_buffer
)(size_t *buffer_size
);
753 void (*plugin_tsr
)(bool (*exit_callback
)(bool reenter
));
754 char* (*plugin_get_current_filename
)(void);
755 #ifdef PLUGIN_USE_IRAM
756 void (*plugin_iram_init
)(char *iramstart
, char *iramcopy
, size_t iram_size
,
757 char *iedata
, size_t iedata_size
);
759 #if defined(DEBUG) || defined(SIMULATOR)
760 void (*debugf
)(const char *fmt
, ...) ATTRIBUTE_PRINTF(1, 2);
762 #ifdef ROCKBOX_HAS_LOGF
763 void (*logf
)(const char *fmt
, ...) ATTRIBUTE_PRINTF(1, 2);
765 struct user_settings
* global_settings
;
766 struct system_status
*global_status
;
767 void (*talk_disable
)(bool disable
);
768 #if CONFIG_CODEC == SWCODEC
769 void (*codec_thread_do_callback
)(void (*fn
)(void),
770 unsigned int *audio_thread_id
);
771 int (*codec_load_file
)(const char* codec
, struct codec_api
*api
);
772 const char *(*get_codec_filename
)(int cod_spec
);
774 bool (*get_metadata
)(struct mp3entry
* id3
, int fd
, const char* trackname
);
775 bool (*mp3info
)(struct mp3entry
*entry
, const char *filename
);
776 int (*count_mp3_frames
)(int fd
, int startpos
, int filesize
,
777 void (*progressfunc
)(int));
778 int (*create_xing_header
)(int fd
, long startpos
, long filesize
,
779 unsigned char *buf
, unsigned long num_frames
,
780 unsigned long rec_time
, unsigned long header_template
,
781 void (*progressfunc
)(int), bool generate_toc
);
782 unsigned long (*find_next_frame
)(int fd
, long *offset
,
783 long max_offset
, unsigned long last_header
);
785 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
786 unsigned short (*peak_meter_scale_value
)(unsigned short val
,
788 void (*peak_meter_set_use_dbfs
)(bool use
);
789 bool (*peak_meter_get_use_dbfs
)(void);
791 #ifdef HAVE_LCD_BITMAP
792 int (*read_bmp_file
)(const char* filename
, struct bitmap
*bm
, int maxsize
,
793 int format
, const struct custom_format
*cformat
);
794 int (*read_bmp_fd
)(int fd
, struct bitmap
*bm
, int maxsize
,
795 int format
, const struct custom_format
*cformat
);
797 int (*read_jpeg_file
)(const char* filename
, struct bitmap
*bm
, int maxsize
,
798 int format
, const struct custom_format
*cformat
);
799 int (*read_jpeg_fd
)(int fd
, struct bitmap
*bm
, int maxsize
,
800 int format
, const struct custom_format
*cformat
);
802 void (*screen_dump_set_hook
)(void (*hook
)(int fh
));
804 int (*show_logo
)(void);
805 struct tree_context
* (*tree_get_context
)(void);
806 void (*set_current_file
)(char* path
);
807 void (*set_dirfilter
)(int l_dirfilter
);
809 #ifdef HAVE_WHEEL_POSITION
810 int (*wheel_status
)(void);
811 void (*wheel_send_events
)(bool send
);
814 #ifdef IRIVER_H100_SERIES
815 /* Routines for the iriver_flash -plugin. */
816 bool (*detect_original_firmware
)(void);
817 bool (*detect_flashed_ramimage
)(void);
818 bool (*detect_flashed_romimage
)(void);
821 void (*led
)(bool on
);
823 #if (CONFIG_CODEC == SWCODEC)
825 int (*bufopen
)(const char *file
, size_t offset
, enum data_type type
,
827 int (*bufalloc
)(const void *src
, size_t size
, enum data_type type
);
828 bool (*bufclose
)(int handle_id
);
829 int (*bufseek
)(int handle_id
, size_t newpos
);
830 int (*bufadvance
)(int handle_id
, off_t offset
);
831 ssize_t (*bufread
)(int handle_id
, size_t size
, void *dest
);
832 ssize_t (*bufgetdata
)(int handle_id
, size_t size
, void **data
);
833 ssize_t (*bufgettail
)(int handle_id
, size_t size
, void **data
);
834 ssize_t (*bufcuttail
)(int handle_id
, size_t size
);
836 ssize_t (*buf_get_offset
)(int handle_id
, void *ptr
);
837 ssize_t (*buf_handle_offset
)(int handle_id
);
838 void (*buf_request_buffer_handle
)(int handle_id
);
839 void (*buf_set_base_handle
)(int handle_id
);
840 size_t (*buf_used
)(void);
844 bool (*tagcache_search
)(struct tagcache_search
*tcs
, int tag
);
845 void (*tagcache_search_set_uniqbuf
)(struct tagcache_search
*tcs
,
846 void *buffer
, long length
);
847 bool (*tagcache_search_add_filter
)(struct tagcache_search
*tcs
,
849 bool (*tagcache_get_next
)(struct tagcache_search
*tcs
);
850 bool (*tagcache_retrieve
)(struct tagcache_search
*tcs
, int idxid
,
851 int tag
, char *buf
, long size
);
852 void (*tagcache_search_finish
)(struct tagcache_search
*tcs
);
853 long (*tagcache_get_numeric
)(const struct tagcache_search
*tcs
, int tag
);
854 #ifdef HAVE_TC_RAMCACHE
855 bool (*tagcache_fill_tags
)(struct mp3entry
*id3
, const char *filename
);
860 bool (*search_albumart_files
)(const struct mp3entry
*id3
, const char *size_string
,
861 char *buf
, int buflen
);
864 #ifdef HAVE_SEMAPHORE_OBJECTS
865 void (*semaphore_init
)(struct semaphore
*s
, int max
, int start
);
866 void (*semaphore_wait
)(struct semaphore
*s
);
867 void (*semaphore_release
)(struct semaphore
*s
);
870 const char *appsversion
;
871 /* new stuff at the end, sort into place next time
872 the API gets incompatible */
874 #ifdef HAVE_LCD_BITMAP
875 bool (*is_diacritic
)(const unsigned short char_code
, bool *is_rtl
);
880 struct plugin_header
{
882 unsigned short target_id
;
883 unsigned short api_version
;
884 unsigned char *load_addr
;
885 unsigned char *end_addr
;
886 enum plugin_status(*entry_point
)(const void*);
887 const struct plugin_api
**api
;
892 extern unsigned char plugin_start_addr
[];
893 extern unsigned char plugin_end_addr
[];
894 #define PLUGIN_HEADER \
895 const struct plugin_api *rb DATA_ATTR; \
896 const struct plugin_header __header \
897 __attribute__ ((section (".header")))= { \
898 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
899 plugin_start_addr, plugin_end_addr, plugin_start, &rb };
900 #else /* SIMULATOR */
901 #define PLUGIN_HEADER \
902 const struct plugin_api *rb DATA_ATTR; \
903 const struct plugin_header __header \
904 __attribute__((visibility("default"))) = { \
905 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
906 NULL, NULL, plugin_start, &rb };
907 #endif /* SIMULATOR */
909 #ifdef PLUGIN_USE_IRAM
910 /* Declare IRAM variables */
911 #define PLUGIN_IRAM_DECLARE \
912 extern char iramcopy[]; \
913 extern char iramstart[]; \
914 extern char iramend[]; \
915 extern char iedata[]; \
917 /* Initialize IRAM */
918 #define PLUGIN_IRAM_INIT(api) \
919 (api)->plugin_iram_init(iramstart, iramcopy, iramend-iramstart, \
920 iedata, iend-iedata);
922 #define PLUGIN_IRAM_DECLARE
923 #define PLUGIN_IRAM_INIT(api)
924 #endif /* PLUGIN_USE_IRAM */
927 int plugin_load(const char* plugin
, const void* parameter
);
928 void* plugin_get_audio_buffer(size_t *buffer_size
);
929 #ifdef PLUGIN_USE_IRAM
930 void plugin_iram_init(char *iramstart
, char *iramcopy
, size_t iram_size
,
931 char *iedata
, size_t iedata_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__ */