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
35 #include <sys/types.h>
41 char* strncpy(char *, const char *, size_t);
42 void* plugin_get_buffer(size_t *buffer_size
);
60 #include "mp3_playback.h"
66 #if (CONFIG_CODEC == SWCODEC)
71 #include "recording.h"
75 #endif /* CONFIG_CODEC == SWCODEC */
79 #ifdef HAVE_LCD_BITMAP
80 #include "screendump.h"
81 #include "scrollbar.h"
82 #include "jpeg_load.h"
83 #include "../recorder/bmp.h"
85 #include "statusbar.h"
87 #include "rbunicode.h"
90 #include "color_picker.h"
91 #include "buffering.h"
94 #include "ata_idle_notify.h"
95 #include "settings_list.h"
96 #include "timefuncs.h"
102 #ifdef HAVE_REMOTE_LCD
103 #include "lcd-remote.h"
108 #ifdef USB_ENABLE_HID
109 #include "usbstack/usb_hid_usage_tables.h"
114 #if defined(DEBUG) || defined(SIMULATOR)
116 #define DEBUGF rb->debugf
118 #define LDEBUGF rb->debugf
124 #ifdef ROCKBOX_HAS_LOGF
126 #define LOGF rb->logf
133 #define PLUGIN_MAGIC 0x526F634B /* RocK */
135 /* increase this every time the api struct changes */
136 #define PLUGIN_API_VERSION 173
138 /* update this to latest version if a change to the api struct breaks
139 backwards compatibility (and please take the opportunity to sort in any
140 new function which are "waiting" at the end of the function table) */
141 #define PLUGIN_MIN_API_VERSION 173
143 /* plugin return codes */
146 PLUGIN_USB_CONNECTED
,
151 /* NOTE: To support backwards compatibility, only add new functions at
152 the end of the structure. Every time you add a new function,
153 remember to increase PLUGIN_API_VERSION. If you make changes to the
154 existing APIs then also update PLUGIN_MIN_API_VERSION to current
161 #ifdef HAVE_LCD_CONTRAST
162 void (*lcd_set_contrast
)(int x
);
164 void (*lcd_update
)(void);
165 void (*lcd_clear_display
)(void);
166 int (*lcd_getstringsize
)(const unsigned char *str
, int *w
, int *h
);
167 void (*lcd_putsxy
)(int x
, int y
, const unsigned char *string
);
168 void (*lcd_puts
)(int x
, int y
, const unsigned char *string
);
169 void (*lcd_puts_scroll
)(int x
, int y
, const unsigned char* string
);
170 void (*lcd_stop_scroll
)(void);
171 #ifdef HAVE_LCD_CHARCELLS
172 void (*lcd_define_pattern
)(unsigned long ucs
, const char *pattern
);
173 unsigned long (*lcd_get_locked_pattern
)(void);
174 void (*lcd_unlock_pattern
)(unsigned long ucs
);
175 void (*lcd_putc
)(int x
, int y
, unsigned long ucs
);
176 void (*lcd_put_cursor
)(int x
, int y
, unsigned long ucs
);
177 void (*lcd_remove_cursor
)(void);
178 void (*lcd_icon
)(int icon
, bool enable
);
179 void (*lcd_double_height
)(bool on
);
180 #else /* HAVE_LCD_BITMAP */
181 fb_data
* lcd_framebuffer
;
182 void (*lcd_update_rect
)(int x
, int y
, int width
, int height
);
183 void (*lcd_set_drawmode
)(int mode
);
184 int (*lcd_get_drawmode
)(void);
185 void (*lcd_setfont
)(int font
);
186 void (*lcd_drawpixel
)(int x
, int y
);
187 void (*lcd_drawline
)(int x1
, int y1
, int x2
, int y2
);
188 void (*lcd_hline
)(int x1
, int x2
, int y
);
189 void (*lcd_vline
)(int x
, int y1
, int y2
);
190 void (*lcd_drawrect
)(int x
, int y
, int width
, int height
);
191 void (*lcd_fillrect
)(int x
, int y
, int width
, int height
);
192 void (*lcd_mono_bitmap_part
)(const unsigned char *src
, int src_x
, int src_y
,
193 int stride
, int x
, int y
, int width
, int height
);
194 void (*lcd_mono_bitmap
)(const unsigned char *src
, int x
, int y
,
195 int width
, int height
);
197 void (*lcd_set_foreground
)(unsigned foreground
);
198 unsigned (*lcd_get_foreground
)(void);
199 void (*lcd_set_background
)(unsigned foreground
);
200 unsigned (*lcd_get_background
)(void);
201 void (*lcd_bitmap_part
)(const fb_data
*src
, int src_x
, int src_y
,
202 int stride
, int x
, int y
, int width
, int height
);
203 void (*lcd_bitmap
)(const fb_data
*src
, int x
, int y
, int width
,
205 fb_data
* (*lcd_get_backdrop
)(void);
206 void (*lcd_set_backdrop
)(fb_data
* backdrop
);
209 void (*lcd_bitmap_transparent_part
)(const fb_data
*src
,
210 int src_x
, int src_y
, int stride
,
211 int x
, int y
, int width
, int height
);
212 void (*lcd_bitmap_transparent
)(const fb_data
*src
, int x
, int y
,
213 int width
, int height
);
215 void (*lcd_blit_yuv
)(unsigned char * const src
[3],
216 int src_x
, int src_y
, int stride
,
217 int x
, int y
, int width
, int height
);
218 #if defined(TOSHIBA_GIGABEAT_F) || defined(SANSA_E200) || defined(SANSA_C200) \
219 || defined(IRIVER_H10) || defined(COWON_D2) || defined(PHILIPS_HDD1630) \
220 || defined(SANSA_FUZE) || defined(SANSA_E200V2) || defined(TOSHIBA_GIGABEAT_S)
221 void (*lcd_yuv_set_options
)(unsigned options
);
223 #endif /* MEMORYSIZE > 2 */
224 #elif (LCD_DEPTH < 4) && !defined(SIMULATOR)
225 void (*lcd_blit_mono
)(const unsigned char *data
, int x
, int by
, int width
,
226 int bheight
, int stride
);
227 void (*lcd_blit_grey_phase
)(unsigned char *values
, unsigned char *phases
,
228 int bx
, int by
, int bwidth
, int bheight
,
230 #endif /* LCD_DEPTH */
231 #if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256)
232 void (*lcd_blit_pal256
)(unsigned char *src
, int src_x
, int src_y
, int x
, int y
,
233 int width
, int height
);
234 void (*lcd_pal256_update_pal
)(fb_data
*palette
);
236 void (*lcd_puts_style
)(int x
, int y
, const unsigned char *str
, int style
);
237 void (*lcd_puts_scroll_style
)(int x
, int y
, const unsigned char* string
,
239 #ifdef HAVE_LCD_INVERT
240 void (*lcd_set_invert_display
)(bool yesno
);
241 #endif /* HAVE_LCD_INVERT */
242 #if defined(HAVE_LCD_MODES)
243 void (*lcd_set_mode
)(int mode
);
246 #if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP)
247 struct event_queue
*button_queue
;
249 unsigned short *(*bidi_l2v
)( const unsigned char *str
, int orientation
);
250 const unsigned char *(*font_get_bits
)( struct font
*pf
, unsigned short char_code
);
251 struct font
* (*font_load
)(const char *path
);
252 struct font
* (*font_get
)(int font
);
253 int (*font_getstringsize
)(const unsigned char *str
, int *w
, int *h
,
255 int (*font_get_width
)(struct font
* pf
, unsigned short char_code
);
256 void (*screen_clear_area
)(struct screen
* display
, int xstart
, int ystart
,
257 int width
, int height
);
258 void (*gui_scrollbar_draw
)(struct screen
* screen
, int x
, int y
,
259 int width
, int height
, int items
,
260 int min_shown
, int max_shown
,
262 #endif /* HAVE_LCD_BITMAP */
263 const char* (*get_codepage_name
)(int cp
);
266 /* The backlight_* functions must be present in the API regardless whether
267 * HAVE_BACKLIGHT is defined or not. The reason is that the stock Ondio has
268 * no backlight but can be modded to have backlight (it's prepared on the
269 * PCB). This makes backlight an all-target feature API wise, and keeps API
270 * compatible between stock and modded Ondio.
271 * For OLED targets like the Sansa Clip, the backlight_* functions control
272 * the display enable, which has essentially the same effect. */
273 void (*backlight_on
)(void);
274 void (*backlight_off
)(void);
275 void (*backlight_set_timeout
)(int index
);
276 #ifdef HAVE_BACKLIGHT_BRIGHTNESS
277 void (*backlight_set_brightness
)(int val
);
278 #endif /* HAVE_BACKLIGHT_BRIGHTNESS */
281 void (*backlight_set_timeout_plugged
)(int index
);
283 bool (*is_backlight_on
)(bool ignore_always_off
);
284 void (*splash
)(int ticks
, const char *str
);
285 void (*splashf
)(int ticks
, const char *fmt
, ...) ATTRIBUTE_PRINTF(2, 3);
287 #ifdef HAVE_REMOTE_LCD
289 void (*lcd_remote_set_contrast
)(int x
);
290 void (*lcd_remote_clear_display
)(void);
291 void (*lcd_remote_puts
)(int x
, int y
, const unsigned char *string
);
292 void (*lcd_remote_puts_scroll
)(int x
, int y
, const unsigned char* string
);
293 void (*lcd_remote_stop_scroll
)(void);
294 void (*lcd_remote_set_drawmode
)(int mode
);
295 int (*lcd_remote_get_drawmode
)(void);
296 void (*lcd_remote_setfont
)(int font
);
297 int (*lcd_remote_getstringsize
)(const unsigned char *str
, int *w
, int *h
);
298 void (*lcd_remote_drawpixel
)(int x
, int y
);
299 void (*lcd_remote_drawline
)(int x1
, int y1
, int x2
, int y2
);
300 void (*lcd_remote_hline
)(int x1
, int x2
, int y
);
301 void (*lcd_remote_vline
)(int x
, int y1
, int y2
);
302 void (*lcd_remote_drawrect
)(int x
, int y
, int nx
, int ny
);
303 void (*lcd_remote_fillrect
)(int x
, int y
, int nx
, int ny
);
304 void (*lcd_remote_mono_bitmap_part
)(const unsigned char *src
, int src_x
,
305 int src_y
, int stride
, int x
, int y
,
306 int width
, int height
);
307 void (*lcd_remote_mono_bitmap
)(const unsigned char *src
, int x
, int y
,
308 int width
, int height
);
309 void (*lcd_remote_putsxy
)(int x
, int y
, const unsigned char *string
);
310 void (*lcd_remote_puts_style
)(int x
, int y
, const unsigned char *str
, int style
);
311 void (*lcd_remote_puts_scroll_style
)(int x
, int y
, const unsigned char* string
,
313 fb_remote_data
* lcd_remote_framebuffer
;
314 void (*lcd_remote_update
)(void);
315 void (*lcd_remote_update_rect
)(int x
, int y
, int width
, int height
);
317 void (*remote_backlight_on
)(void);
318 void (*remote_backlight_off
)(void);
319 void (*remote_backlight_set_timeout
)(int index
);
321 void (*remote_backlight_set_timeout_plugged
)(int index
);
323 #endif /* HAVE_REMOTE_LCD */
324 struct screen
* screens
[NB_SCREENS
];
325 #if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)
326 void (*lcd_remote_set_foreground
)(unsigned foreground
);
327 unsigned (*lcd_remote_get_foreground
)(void);
328 void (*lcd_remote_set_background
)(unsigned background
);
329 unsigned (*lcd_remote_get_background
)(void);
330 void (*lcd_remote_bitmap_part
)(const fb_remote_data
*src
, int src_x
, int src_y
,
331 int stride
, int x
, int y
, int width
, int height
);
332 void (*lcd_remote_bitmap
)(const fb_remote_data
*src
, int x
, int y
, int width
,
335 void (*viewport_set_defaults
)(struct viewport
*vp
, enum screen_type screen
);
336 int (*viewportmanager_set_statusbar
)(int enable_status
);
338 void (*gui_synclist_init
)(struct gui_synclist
* lists
,
339 list_get_name callback_get_item_name
, void * data
,
340 bool scroll_all
,int selected_size
,
341 struct viewport parent
[NB_SCREENS
]);
342 void (*gui_synclist_set_nb_items
)(struct gui_synclist
* lists
, int nb_items
);
343 void (*gui_synclist_set_icon_callback
)(struct gui_synclist
* lists
, list_get_icon icon_callback
);
344 int (*gui_synclist_get_nb_items
)(struct gui_synclist
* lists
);
345 int (*gui_synclist_get_sel_pos
)(struct gui_synclist
* lists
);
346 void (*gui_synclist_draw
)(struct gui_synclist
* lists
);
347 void (*gui_synclist_select_item
)(struct gui_synclist
* lists
,
349 void (*gui_synclist_add_item
)(struct gui_synclist
* lists
);
350 void (*gui_synclist_del_item
)(struct gui_synclist
* lists
);
351 void (*gui_synclist_limit_scroll
)(struct gui_synclist
* lists
, bool scroll
);
352 bool (*gui_synclist_do_button
)(struct gui_synclist
* lists
,
353 int *action
, enum list_wrap wrap
);
354 void (*gui_synclist_set_title
)(struct gui_synclist
*lists
, char* title
,
355 enum themable_icons icon
);
356 enum yesno_res (*gui_syncyesno_run
)(const struct text_message
* main_message
,
357 const struct text_message
* yes_message
,
358 const struct text_message
* no_message
);
359 void (*simplelist_info_init
)(struct simplelist_info
*info
, char* title
,
360 int count
, void* data
);
361 bool (*simplelist_show_list
)(struct simplelist_info
*info
);
364 long (*button_get
)(bool block
);
365 long (*button_get_w_tmo
)(int ticks
);
366 int (*button_status
)(void);
367 #ifdef HAVE_BUTTON_DATA
368 intptr_t (*button_get_data
)(void);
369 int (*button_status_wdata
)(int *pdata
);
371 void (*button_clear_queue
)(void);
372 int (*button_queue_count
)(void);
373 #ifdef HAS_BUTTON_HOLD
374 bool (*button_hold
)(void);
376 #ifdef HAVE_TOUCHSCREEN
377 void (*touchscreen_set_mode
)(enum touchscreen_mode
);
379 #ifdef HAVE_BUTTON_LIGHT
380 void (*buttonlight_set_timeout
)(int value
);
381 void (*buttonlight_off
)(void);
382 void (*buttonlight_on
)(void);
383 #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS
384 void (*buttonlight_set_brightness
)(int val
);
385 #endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */
386 #endif /* HAVE_BUTTON_LIGHT */
389 int (*open
)(const char* pathname
, int flags
);
390 int (*close
)(int fd
);
391 ssize_t (*read
)(int fd
, void* buf
, size_t count
);
392 off_t (*lseek
)(int fd
, off_t offset
, int whence
);
393 int (*creat
)(const char *pathname
);
394 ssize_t (*write
)(int fd
, const void* buf
, size_t count
);
395 int (*remove
)(const char* pathname
);
396 int (*rename
)(const char* path
, const char* newname
);
397 int (*ftruncate
)(int fd
, off_t length
);
398 off_t (*filesize
)(int fd
);
399 int (*fdprintf
)(int fd
, const char *fmt
, ...) ATTRIBUTE_PRINTF(2, 3);
400 int (*read_line
)(int fd
, char* buffer
, int buffer_size
);
401 bool (*settings_parseline
)(char* line
, char** name
, char** value
);
402 void (*storage_sleep
)(void);
403 void (*storage_spin
)(void);
404 void (*storage_spindown
)(int seconds
);
405 #if USING_STORAGE_CALLBACK
406 void (*register_storage_idle_func
)(void (*function
)(void *data
));
407 void (*unregister_storage_idle_func
)(void (*function
)(void *data
), bool run
);
408 #endif /* USING_STORAGE_CALLBACK */
409 void (*reload_directory
)(void);
410 char *(*create_numbered_filename
)(char *buffer
, const char *path
,
411 const char *prefix
, const char *suffix
,
412 int numberlen
IF_CNFN_NUM_(, int *num
));
413 bool (*file_exists
)(const char *file
);
414 char* (*strip_extension
)(char* buffer
, int buffer_size
, const char *filename
);
418 DIR* (*opendir
)(const char* name
);
419 int (*closedir
)(DIR* dir
);
420 struct dirent
* (*readdir
)(DIR* dir
);
421 int (*mkdir
)(const char *name
);
422 int (*rmdir
)(const char *name
);
423 bool (*dir_exists
)(const char *path
);
427 void (*__div0
)(void);
429 void (*sleep
)(int ticks
);
431 volatile long* current_tick
;
432 long (*default_event_handler
)(long event
);
433 long (*default_event_handler_ex
)(long event
, void (*callback
)(void *), void *parameter
);
434 unsigned int (*create_thread
)(void (*function
)(void), void* stack
,
435 size_t stack_size
, unsigned flags
,
437 IF_PRIO(, int priority
)
438 IF_COP(, unsigned int core
));
439 void (*thread_exit
)(void);
440 void (*thread_wait
)(unsigned int thread_id
);
441 #if CONFIG_CODEC == SWCODEC
442 void (*thread_thaw
)(unsigned int thread_id
);
443 #ifdef HAVE_PRIORITY_SCHEDULING
444 int (*thread_set_priority
)(unsigned int thread_id
, int priority
);
446 void (*mutex_init
)(struct mutex
*m
);
447 void (*mutex_lock
)(struct mutex
*m
);
448 void (*mutex_unlock
)(struct mutex
*m
);
451 void (*reset_poweroff_timer
)(void);
453 int (*system_memory_guard
)(int newmode
);
455 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
456 #ifdef CPU_BOOST_LOGGING
457 void (*cpu_boost_
)(bool on_off
,char*location
,int line
);
459 void (*cpu_boost
)(bool on_off
);
461 #endif /* HAVE_ADJUSTABLE_CPU_FREQ */
462 #endif /* !SIMULATOR */
463 #ifdef HAVE_SCHEDULER_BOOSTCTRL
464 void (*trigger_cpu_boost
)(void);
465 void (*cancel_cpu_boost
)(void);
468 void (*cpucache_flush
)(void);
469 void (*cpucache_invalidate
)(void);
471 bool (*timer_register
)(int reg_prio
, void (*unregister_callback
)(void),
472 long cycles
, void (*timer_callback
)(void)
474 void (*timer_unregister
)(void);
475 bool (*timer_set_period
)(long count
);
477 void (*queue_init
)(struct event_queue
*q
, bool register_queue
);
478 void (*queue_delete
)(struct event_queue
*q
);
479 void (*queue_post
)(struct event_queue
*q
, long id
, intptr_t data
);
480 void (*queue_wait_w_tmo
)(struct event_queue
*q
, struct queue_event
*ev
,
482 #if CONFIG_CODEC == SWCODEC
483 void (*queue_enable_queue_send
)(struct event_queue
*q
,
484 struct queue_sender_list
*send
,
485 unsigned int thread_id
);
486 bool (*queue_empty
)(const struct event_queue
*q
);
487 void (*queue_wait
)(struct event_queue
*q
, struct queue_event
*ev
);
488 intptr_t (*queue_send
)(struct event_queue
*q
, long id
,
490 void (*queue_reply
)(struct event_queue
*q
, intptr_t retval
);
491 #endif /* CONFIG_CODEC == SWCODEC */
493 void (*usb_acknowledge
)(long id
);
494 #ifdef USB_ENABLE_HID
495 void (*usb_hid_send
)(usage_page_t usage_page
, int id
);
498 void (*profile_thread
)(void);
499 void (*profstop
)(void);
500 void (*profile_func_enter
)(void *this_fn
, void *call_site
);
501 void (*profile_func_exit
)(void *this_fn
, void *call_site
);
504 bool (*add_event
)(unsigned short id
, bool oneshot
, void (*handler
)(void *data
));
505 void (*remove_event
)(unsigned short id
, void (*handler
)(void *data
));
506 void (*send_event
)(unsigned short id
, void *data
);
509 /* special simulator hooks */
510 #if defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8
511 void (*sim_lcd_ex_init
)(unsigned long (*getpixel
)(int, int));
512 void (*sim_lcd_ex_update_rect
)(int x
, int y
, int width
, int height
);
516 /* strings and memory */
517 int (*snprintf
)(char *buf
, size_t size
, const char *fmt
, ...)
518 ATTRIBUTE_PRINTF(3, 4);
519 int (*vsnprintf
)(char *buf
, int size
, const char *fmt
, va_list ap
);
520 char* (*strcpy
)(char *dst
, const char *src
);
521 size_t (*strlcpy
)(char *dst
, const char *src
, size_t length
);
522 size_t (*strlen
)(const char *str
);
523 char * (*strrchr
)(const char *s
, int c
);
524 int (*strcmp
)(const char *, const char *);
525 int (*strncmp
)(const char *, const char *, size_t);
526 int (*strcasecmp
)(const char *, const char *);
527 int (*strncasecmp
)(const char *s1
, const char *s2
, size_t n
);
528 void* (*memset
)(void *dst
, int c
, size_t length
);
529 void* (*memcpy
)(void *out
, const void *in
, size_t n
);
530 void* (*memmove
)(void *out
, const void *in
, size_t n
);
531 const unsigned char *_rbctype_
;
532 int (*atoi
)(const char *str
);
533 char *(*strchr
)(const char *s
, int c
);
534 char *(*strcat
)(char *s1
, const char *s2
);
535 void *(*memchr
)(const void *s1
, int c
, size_t n
);
536 int (*memcmp
)(const void *s1
, const void *s2
, size_t n
);
537 char *(*strcasestr
) (const char* phaystack
, const char* pneedle
);
538 char* (*strtok_r
)(char *ptr
, const char *sep
, char **end
);
540 const unsigned char* (*utf8decode
)(const unsigned char *utf8
, unsigned short *ucs
);
541 unsigned char* (*iso_decode
)(const unsigned char *iso
, unsigned char *utf8
, int cp
, int count
);
542 unsigned char* (*utf16LEdecode
)(const unsigned char *utf16
, unsigned char *utf8
, int count
);
543 unsigned char* (*utf16BEdecode
)(const unsigned char *utf16
, unsigned char *utf8
, int count
);
544 unsigned char* (*utf8encode
)(unsigned long ucs
, unsigned char *utf8
);
545 unsigned long (*utf8length
)(const unsigned char *utf8
);
546 int (*utf8seek
)(const unsigned char* utf8
, int offset
);
549 void (*sound_set
)(int setting
, int value
);
550 int (*sound_default
)(int setting
);
551 int (*sound_min
)(int setting
);
552 int (*sound_max
)(int setting
);
553 const char * (*sound_unit
)(int setting
);
554 int (*sound_val2phys
)(int setting
, int value
);
556 void (*mp3_play_data
)(const unsigned char* start
, int size
, void (*get_more
)(unsigned char** start
, size_t* size
));
557 void (*mp3_play_pause
)(bool play
);
558 void (*mp3_play_stop
)(void);
559 bool (*mp3_is_playing
)(void);
560 #if CONFIG_CODEC != SWCODEC
561 void (*bitswap
)(unsigned char *data
, int length
);
563 #endif /* !SIMULATOR */
564 #if CONFIG_CODEC == SWCODEC
565 const unsigned long *audio_master_sampr_list
;
566 const unsigned long *hw_freq_sampr
;
567 void (*pcm_apply_settings
)(void);
568 void (*pcm_play_data
)(pcm_more_callback_type get_more
,
569 unsigned char* start
, size_t size
);
570 void (*pcm_play_stop
)(void);
571 void (*pcm_set_frequency
)(unsigned int frequency
);
572 bool (*pcm_is_playing
)(void);
573 bool (*pcm_is_paused
)(void);
574 void (*pcm_play_pause
)(bool play
);
575 size_t (*pcm_get_bytes_waiting
)(void);
576 void (*pcm_calculate_peaks
)(int *left
, int *right
);
577 void (*pcm_play_lock
)(void);
578 void (*pcm_play_unlock
)(void);
579 #ifdef HAVE_RECORDING
580 const unsigned long *rec_freq_sampr
;
581 void (*pcm_init_recording
)(void);
582 void (*pcm_close_recording
)(void);
583 void (*pcm_record_data
)(pcm_more_callback_type2 more_ready
,
584 void *start
, size_t size
);
585 void (*pcm_record_more
)(void *start
, size_t size
);
586 void (*pcm_stop_recording
)(void);
587 void (*pcm_calculate_rec_peaks
)(int *left
, int *right
);
588 void (*audio_set_recording_gain
)(int left
, int right
, int type
);
589 #endif /* HAVE_RECORDING */
590 #if INPUT_SRC_CAPS != 0
591 void (*audio_set_output_source
)(int monitor
);
592 void (*audio_set_input_source
)(int source
, unsigned flags
);
594 void (*dsp_set_crossfeed
)(bool enable
);
595 void (*dsp_set_eq
)(bool enable
);
596 void (*dsp_dither_enable
)(bool enable
);
597 intptr_t (*dsp_configure
)(struct dsp_config
*dsp
, int setting
,
599 int (*dsp_process
)(struct dsp_config
*dsp
, char *dest
,
600 const char *src
[], int count
);
601 int (*dsp_input_count
)(struct dsp_config
*dsp
, int count
);
602 int (*dsp_output_count
)(struct dsp_config
*dsp
, int count
);
603 #endif /* CONFIG_CODEC == SWCODC */
605 /* playback control */
606 int (*playlist_amount
)(void);
607 int (*playlist_resume
)(void);
608 void (*playlist_start
)(int start_index
, int offset
);
609 int (*playlist_add
)(const char *filename
);
610 void (*playlist_sync
)(struct playlist_info
* playlist
);
611 int (*playlist_remove_all_tracks
)(struct playlist_info
*playlist
);
612 int (*playlist_create
)(const char *dir
, const char *file
);
613 int (*playlist_insert_track
)(struct playlist_info
* playlist
,
614 const char *filename
, int position
, bool queue
, bool sync
);
615 int (*playlist_insert_directory
)(struct playlist_info
* playlist
,
616 const char *dirname
, int position
, bool queue
,
618 int (*playlist_shuffle
)(int random_seed
, int start_index
);
619 void (*audio_play
)(long offset
);
620 void (*audio_stop
)(void);
621 void (*audio_pause
)(void);
622 void (*audio_resume
)(void);
623 void (*audio_next
)(void);
624 void (*audio_prev
)(void);
625 void (*audio_ff_rewind
)(long newtime
);
626 struct mp3entry
* (*audio_next_track
)(void);
627 int (*audio_status
)(void);
628 struct mp3entry
* (*audio_current_track
)(void);
629 void (*audio_flush_and_reload_tracks
)(void);
630 int (*audio_get_file_pos
)(void);
631 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
632 unsigned long (*mpeg_get_last_header
)(void);
634 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) || \
635 (CONFIG_CODEC == SWCODEC)
636 void (*sound_set_pitch
)(int32_t pitch
);
639 /* MAS communication */
640 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
641 int (*mas_readmem
)(int bank
, int addr
, unsigned long* dest
, int len
);
642 int (*mas_writemem
)(int bank
, int addr
, const unsigned long* src
, int len
);
643 int (*mas_readreg
)(int reg
);
644 int (*mas_writereg
)(int reg
, unsigned int val
);
645 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
646 int (*mas_codec_writereg
)(int reg
, unsigned int val
);
647 int (*mas_codec_readreg
)(int reg
);
648 void (*i2c_begin
)(void);
649 void (*i2c_end
)(void);
650 int (*i2c_write
)(int address
, const unsigned char* buf
, int count
);
655 int (*do_menu
)(const struct menu_item_ex
*menu
, int *start_selected
,
656 struct viewport parent
[NB_SCREENS
], bool hide_bars
);
659 struct gui_syncstatusbar
*statusbars
;
660 void (*gui_syncstatusbar_draw
)(struct gui_syncstatusbar
* bars
, bool force_redraw
);
663 const struct settings_list
* (*get_settings_list
)(int*count
);
664 const struct settings_list
* (*find_setting
)(const void* variable
, int *id
);
665 bool (*option_screen
)(const struct settings_list
*setting
,
666 struct viewport parent
[NB_SCREENS
],
667 bool use_temp_var
, unsigned char* option_title
);
668 bool (*set_option
)(const char* string
, const void* variable
,
669 enum optiontype type
, const struct opt_items
* options
,
670 int numoptions
, void (*function
)(int));
671 bool (*set_bool_options
)(const char* string
, const bool* variable
,
672 const char* yes_str
, int yes_voice
,
673 const char* no_str
, int no_voice
,
674 void (*function
)(bool));
675 bool (*set_int
)(const unsigned char* string
, const char* unit
, int voice_unit
,
676 const int* variable
, void (*function
)(int), int step
,
678 const char* (*formatter
)(char*, size_t, int, const char*) );
679 bool (*set_bool
)(const char* string
, const bool* variable
);
681 #ifdef HAVE_LCD_COLOR
682 bool (*set_color
)(struct screen
*display
, char *title
, unsigned *color
,
683 unsigned banned_color
);
685 /* action handling */
686 int (*get_custom_action
)(int context
,int timeout
,
687 const struct button_mapping
* (*get_context_map
)(int));
688 int (*get_action
)(int context
, int timeout
);
689 #ifdef HAVE_TOUCHSCREEN
690 int (*action_get_touchscreen_press
)(short *x
, short *y
);
692 bool (*action_userabort
)(int timeout
);
695 int (*battery_level
)(void);
696 bool (*battery_level_safe
)(void);
697 int (*battery_time
)(void);
699 unsigned int (*battery_voltage
)(void);
702 bool (*charger_inserted
)(void);
703 # if CONFIG_CHARGING >= CHARGING_MONITOR
704 bool (*charging_state
)(void);
707 #ifdef HAVE_USB_POWER
708 bool (*usb_powered
)(void);
712 void (*srand
)(unsigned int seed
);
714 void (*qsort
)(void *base
, size_t nmemb
, size_t size
,
715 int(*compar
)(const void *, const void *));
716 int (*kbd_input
)(char* buffer
, int buflen
);
717 struct tm
* (*get_time
)(void);
718 int (*set_time
)(const struct tm
*tm
);
720 time_t (*mktime
)(struct tm
*t
);
722 void* (*plugin_get_buffer
)(size_t *buffer_size
);
723 void* (*plugin_get_audio_buffer
)(size_t *buffer_size
);
724 void (*plugin_tsr
)(bool (*exit_callback
)(bool reenter
));
725 char* (*plugin_get_current_filename
)(void);
726 #ifdef PLUGIN_USE_IRAM
727 void (*plugin_iram_init
)(char *iramstart
, char *iramcopy
, size_t iram_size
,
728 char *iedata
, size_t iedata_size
);
730 #if defined(DEBUG) || defined(SIMULATOR)
731 void (*debugf
)(const char *fmt
, ...) ATTRIBUTE_PRINTF(1, 2);
733 #ifdef ROCKBOX_HAS_LOGF
734 void (*logf
)(const char *fmt
, ...) ATTRIBUTE_PRINTF(1, 2);
736 struct user_settings
* global_settings
;
737 struct system_status
*global_status
;
738 void (*talk_disable
)(bool disable
);
739 #if CONFIG_CODEC == SWCODEC
740 void (*codec_thread_do_callback
)(void (*fn
)(void),
741 unsigned int *audio_thread_id
);
742 int (*codec_load_file
)(const char* codec
, struct codec_api
*api
);
743 const char *(*get_codec_filename
)(int cod_spec
);
745 bool (*get_metadata
)(struct mp3entry
* id3
, int fd
, const char* trackname
);
746 bool (*mp3info
)(struct mp3entry
*entry
, const char *filename
);
747 int (*count_mp3_frames
)(int fd
, int startpos
, int filesize
,
748 void (*progressfunc
)(int));
749 int (*create_xing_header
)(int fd
, long startpos
, long filesize
,
750 unsigned char *buf
, unsigned long num_frames
,
751 unsigned long rec_time
, unsigned long header_template
,
752 void (*progressfunc
)(int), bool generate_toc
);
753 unsigned long (*find_next_frame
)(int fd
, long *offset
,
754 long max_offset
, unsigned long last_header
);
756 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
757 unsigned short (*peak_meter_scale_value
)(unsigned short val
,
759 void (*peak_meter_set_use_dbfs
)(bool use
);
760 bool (*peak_meter_get_use_dbfs
)(void);
762 #ifdef HAVE_LCD_BITMAP
763 int (*read_bmp_file
)(const char* filename
, struct bitmap
*bm
, int maxsize
,
764 int format
, const struct custom_format
*cformat
);
765 int (*read_bmp_fd
)(int fd
, struct bitmap
*bm
, int maxsize
,
766 int format
, const struct custom_format
*cformat
);
768 int (*read_jpeg_file
)(const char* filename
, struct bitmap
*bm
, int maxsize
,
769 int format
, const struct custom_format
*cformat
);
770 int (*read_jpeg_fd
)(int fd
, struct bitmap
*bm
, int maxsize
,
771 int format
, const struct custom_format
*cformat
);
773 void (*screen_dump_set_hook
)(void (*hook
)(int fh
));
775 int (*show_logo
)(void);
776 struct tree_context
* (*tree_get_context
)(void);
777 void (*set_current_file
)(char* path
);
778 void (*set_dirfilter
)(int l_dirfilter
);
780 #ifdef HAVE_WHEEL_POSITION
781 int (*wheel_status
)(void);
782 void (*wheel_send_events
)(bool send
);
785 #ifdef IRIVER_H100_SERIES
786 /* Routines for the iriver_flash -plugin. */
787 bool (*detect_original_firmware
)(void);
788 bool (*detect_flashed_ramimage
)(void);
789 bool (*detect_flashed_romimage
)(void);
792 void (*led
)(bool on
);
794 #if (CONFIG_CODEC == SWCODEC)
796 int (*bufopen
)(const char *file
, size_t offset
, enum data_type type
,
798 int (*bufalloc
)(const void *src
, size_t size
, enum data_type type
);
799 bool (*bufclose
)(int handle_id
);
800 int (*bufseek
)(int handle_id
, size_t newpos
);
801 int (*bufadvance
)(int handle_id
, off_t offset
);
802 ssize_t (*bufread
)(int handle_id
, size_t size
, void *dest
);
803 ssize_t (*bufgetdata
)(int handle_id
, size_t size
, void **data
);
804 ssize_t (*bufgettail
)(int handle_id
, size_t size
, void **data
);
805 ssize_t (*bufcuttail
)(int handle_id
, size_t size
);
807 ssize_t (*buf_get_offset
)(int handle_id
, void *ptr
);
808 ssize_t (*buf_handle_offset
)(int handle_id
);
809 void (*buf_request_buffer_handle
)(int handle_id
);
810 void (*buf_set_base_handle
)(int handle_id
);
811 size_t (*buf_used
)(void);
815 bool (*tagcache_search
)(struct tagcache_search
*tcs
, int tag
);
816 void (*tagcache_search_set_uniqbuf
)(struct tagcache_search
*tcs
,
817 void *buffer
, long length
);
818 bool (*tagcache_search_add_filter
)(struct tagcache_search
*tcs
,
820 bool (*tagcache_get_next
)(struct tagcache_search
*tcs
);
821 bool (*tagcache_retrieve
)(struct tagcache_search
*tcs
, int idxid
,
822 int tag
, char *buf
, long size
);
823 void (*tagcache_search_finish
)(struct tagcache_search
*tcs
);
824 long (*tagcache_get_numeric
)(const struct tagcache_search
*tcs
, int tag
);
825 #ifdef HAVE_TC_RAMCACHE
826 bool (*tagcache_fill_tags
)(struct mp3entry
*id3
, const char *filename
);
831 bool (*search_albumart_files
)(const struct mp3entry
*id3
, const char *size_string
,
832 char *buf
, int buflen
);
835 #ifdef HAVE_SEMAPHORE_OBJECTS
836 void (*semaphore_init
)(struct semaphore
*s
, int max
, int start
);
837 void (*semaphore_wait
)(struct semaphore
*s
);
838 void (*semaphore_release
)(struct semaphore
*s
);
841 const char *appsversion
;
842 /* new stuff at the end, sort into place next time
843 the API gets incompatible */
847 struct plugin_header
{
849 unsigned short target_id
;
850 unsigned short api_version
;
851 unsigned char *load_addr
;
852 unsigned char *end_addr
;
853 enum plugin_status(*entry_point
)(const void*);
854 const struct plugin_api
**api
;
859 extern unsigned char plugin_start_addr
[];
860 extern unsigned char plugin_end_addr
[];
861 #define PLUGIN_HEADER \
862 const struct plugin_api *rb DATA_ATTR; \
863 const struct plugin_header __header \
864 __attribute__ ((section (".header")))= { \
865 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
866 plugin_start_addr, plugin_end_addr, plugin_start, &rb };
867 #else /* SIMULATOR */
868 #define PLUGIN_HEADER \
869 const struct plugin_api *rb DATA_ATTR; \
870 const struct plugin_header __header \
871 __attribute__((visibility("default"))) = { \
872 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
873 NULL, NULL, plugin_start, &rb };
874 #endif /* SIMULATOR */
876 #ifdef PLUGIN_USE_IRAM
877 /* Declare IRAM variables */
878 #define PLUGIN_IRAM_DECLARE \
879 extern char iramcopy[]; \
880 extern char iramstart[]; \
881 extern char iramend[]; \
882 extern char iedata[]; \
884 /* Initialize IRAM */
885 #define PLUGIN_IRAM_INIT(api) \
886 (api)->plugin_iram_init(iramstart, iramcopy, iramend-iramstart, \
887 iedata, iend-iedata);
889 #define PLUGIN_IRAM_DECLARE
890 #define PLUGIN_IRAM_INIT(api)
891 #endif /* PLUGIN_USE_IRAM */
894 int plugin_load(const char* plugin
, const void* parameter
);
895 void* plugin_get_audio_buffer(size_t *buffer_size
);
896 #ifdef PLUGIN_USE_IRAM
897 void plugin_iram_init(char *iramstart
, char *iramcopy
, size_t iram_size
,
898 char *iedata
, size_t iedata_size
);
902 callback returns true to allow the new plugin to load,
903 reenter means the currently running plugin is being reloaded */
904 void plugin_tsr(bool (*exit_callback
)(bool reenter
));
906 /* defined by the plugin */
907 extern const struct plugin_api
*rb
;
908 enum plugin_status
plugin_start(const void* parameter
)
911 #endif /* __PCTOOL__ */