1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2002 Björn Stenberg
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
22 /* instruct simulator code to not redefine any symbols when compiling plugins.
23 (the PLUGIN macro is defined in apps/plugins/Makefile) */
25 #define NO_REDEFINES_PLEASE
33 #include <sys/types.h>
52 #include "mp3_playback.h"
58 #if (CONFIG_CODEC == SWCODEC)
64 #include "recording.h"
68 #endif /* CONFIG_CODEC == SWCODEC */
72 #ifdef HAVE_LCD_BITMAP
73 #include "scrollbar.h"
75 #include "statusbar.h"
77 #include "rbunicode.h"
80 #include "color_picker.h"
81 #include "buffering.h"
88 #ifdef HAVE_REMOTE_LCD
89 #include "lcd-remote.h"
94 #if defined(DEBUG) || defined(SIMULATOR)
96 #define DEBUGF rb->debugf
98 #define LDEBUGF rb->debugf
104 #ifdef ROCKBOX_HAS_LOGF
106 #define LOGF rb->logf
114 #define PREFIX(_x_) sim_ ## _x_
116 #define PREFIX(_x_) _x_
119 #define PLUGIN_MAGIC 0x526F634B /* RocK */
121 /* increase this every time the api struct changes */
122 #define PLUGIN_API_VERSION 99
124 /* update this to latest version if a change to the api struct breaks
125 backwards compatibility (and please take the opportunity to sort in any
126 new function which are "waiting" at the end of the function table) */
127 #define PLUGIN_MIN_API_VERSION 98
129 /* plugin return codes */
132 PLUGIN_USB_CONNECTED
,
136 /* NOTE: To support backwards compatibility, only add new functions at
137 the end of the structure. Every time you add a new function,
138 remember to increase PLUGIN_API_VERSION. If you make changes to the
139 existing APIs then also update PLUGIN_MIN_API_VERSION to current
145 void (*lcd_set_contrast
)(int x
);
146 void (*lcd_update
)(void);
147 void (*lcd_clear_display
)(void);
148 void (*lcd_setmargins
)(int x
, int y
);
149 int (*lcd_getstringsize
)(const unsigned char *str
, int *w
, int *h
);
150 void (*lcd_putsxy
)(int x
, int y
, const unsigned char *string
);
151 void (*lcd_puts
)(int x
, int y
, const unsigned char *string
);
152 void (*lcd_puts_scroll
)(int x
, int y
, const unsigned char* string
);
153 void (*lcd_stop_scroll
)(void);
154 #ifdef HAVE_LCD_CHARCELLS
155 void (*lcd_define_pattern
)(unsigned long ucs
, const char *pattern
);
156 unsigned long (*lcd_get_locked_pattern
)(void);
157 void (*lcd_unlock_pattern
)(unsigned long ucs
);
158 void (*lcd_putc
)(int x
, int y
, unsigned long ucs
);
159 void (*lcd_put_cursor
)(int x
, int y
, unsigned long ucs
);
160 void (*lcd_remove_cursor
)(void);
161 void (*lcd_icon
)(int icon
, bool enable
);
162 void (*lcd_double_height
)(bool on
);
164 void (*lcd_set_drawmode
)(int mode
);
165 int (*lcd_get_drawmode
)(void);
166 void (*lcd_setfont
)(int font
);
167 void (*lcd_drawpixel
)(int x
, int y
);
168 void (*lcd_drawline
)(int x1
, int y1
, int x2
, int y2
);
169 void (*lcd_hline
)(int x1
, int x2
, int y
);
170 void (*lcd_vline
)(int x
, int y1
, int y2
);
171 void (*lcd_drawrect
)(int x
, int y
, int width
, int height
);
172 void (*lcd_fillrect
)(int x
, int y
, int width
, int height
);
173 void (*lcd_mono_bitmap_part
)(const unsigned char *src
, int src_x
, int src_y
,
174 int stride
, int x
, int y
, int width
, int height
);
175 void (*lcd_mono_bitmap
)(const unsigned char *src
, int x
, int y
,
176 int width
, int height
);
178 void (*lcd_set_foreground
)(unsigned foreground
);
179 unsigned (*lcd_get_foreground
)(void);
180 void (*lcd_set_background
)(unsigned foreground
);
181 unsigned (*lcd_get_background
)(void);
182 void (*lcd_bitmap_part
)(const fb_data
*src
, int src_x
, int src_y
,
183 int stride
, int x
, int y
, int width
, int height
);
184 void (*lcd_bitmap
)(const fb_data
*src
, int x
, int y
, int width
,
186 fb_data
* (*lcd_get_backdrop
)(void);
187 void (*lcd_set_backdrop
)(fb_data
* backdrop
);
190 void (*lcd_bitmap_transparent_part
)(const fb_data
*src
,
191 int src_x
, int src_y
, int stride
,
192 int x
, int y
, int width
, int height
);
193 void (*lcd_bitmap_transparent
)(const fb_data
*src
, int x
, int y
,
194 int width
, int height
);
196 unsigned short *(*bidi_l2v
)( const unsigned char *str
, int orientation
);
197 const unsigned char *(*font_get_bits
)( struct font
*pf
, unsigned short char_code
);
198 struct font
* (*font_load
)(const char *path
);
199 void (*lcd_puts_style
)(int x
, int y
, const unsigned char *str
, int style
);
200 void (*lcd_puts_scroll_style
)(int x
, int y
, const unsigned char* string
,
202 fb_data
* lcd_framebuffer
;
203 void (*lcd_blit
) (const fb_data
* data
, int x
, int by
, int width
,
204 int bheight
, int stride
);
205 void (*lcd_update_rect
)(int x
, int y
, int width
, int height
);
206 void (*gui_scrollbar_draw
)(struct screen
* screen
, int x
, int y
,
207 int width
, int height
, int items
,
208 int min_shown
, int max_shown
,
210 struct font
* (*font_get
)(int font
);
211 int (*font_getstringsize
)(const unsigned char *str
, int *w
, int *h
,
213 int (*font_get_width
)(struct font
* pf
, unsigned short char_code
);
214 void (*screen_clear_area
)(struct screen
* display
, int xstart
, int ystart
,
215 int width
, int height
);
217 void (*backlight_on
)(void);
218 void (*backlight_off
)(void);
219 void (*backlight_set_timeout
)(int index
);
221 void (*backlight_set_timeout_plugged
)(int index
);
223 void (*splash
)(int ticks
, const char *fmt
, ...) ATTRIBUTE_PRINTF(2, 3);
225 #ifdef HAVE_REMOTE_LCD
227 void (*lcd_remote_set_contrast
)(int x
);
228 void (*lcd_remote_clear_display
)(void);
229 void (*lcd_remote_setmargins
)(int x
, int y
);
230 void (*lcd_remote_puts
)(int x
, int y
, const unsigned char *string
);
231 void (*lcd_remote_puts_scroll
)(int x
, int y
, const unsigned char* string
);
232 void (*lcd_remote_stop_scroll
)(void);
233 void (*lcd_remote_set_drawmode
)(int mode
);
234 int (*lcd_remote_get_drawmode
)(void);
235 void (*lcd_remote_setfont
)(int font
);
236 int (*lcd_remote_getstringsize
)(const unsigned char *str
, int *w
, int *h
);
237 void (*lcd_remote_drawpixel
)(int x
, int y
);
238 void (*lcd_remote_drawline
)(int x1
, int y1
, int x2
, int y2
);
239 void (*lcd_remote_hline
)(int x1
, int x2
, int y
);
240 void (*lcd_remote_vline
)(int x
, int y1
, int y2
);
241 void (*lcd_remote_drawrect
)(int x
, int y
, int nx
, int ny
);
242 void (*lcd_remote_fillrect
)(int x
, int y
, int nx
, int ny
);
243 void (*lcd_remote_mono_bitmap_part
)(const unsigned char *src
, int src_x
,
244 int src_y
, int stride
, int x
, int y
,
245 int width
, int height
);
246 void (*lcd_remote_mono_bitmap
)(const unsigned char *src
, int x
, int y
,
247 int width
, int height
);
248 void (*lcd_remote_putsxy
)(int x
, int y
, const unsigned char *string
);
249 void (*lcd_remote_puts_style
)(int x
, int y
, const unsigned char *str
, int style
);
250 void (*lcd_remote_puts_scroll_style
)(int x
, int y
, const unsigned char* string
,
252 fb_remote_data
* lcd_remote_framebuffer
;
253 void (*lcd_remote_update
)(void);
254 void (*lcd_remote_update_rect
)(int x
, int y
, int width
, int height
);
256 void (*remote_backlight_on
)(void);
257 void (*remote_backlight_off
)(void);
259 struct screen
* screens
[NB_SCREENS
];
260 #if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)
261 void (*lcd_remote_set_foreground
)(unsigned foreground
);
262 unsigned (*lcd_remote_get_foreground
)(void);
263 void (*lcd_remote_set_background
)(unsigned background
);
264 unsigned (*lcd_remote_get_background
)(void);
265 void (*lcd_remote_bitmap_part
)(const fb_remote_data
*src
, int src_x
, int src_y
,
266 int stride
, int x
, int y
, int width
, int height
);
267 void (*lcd_remote_bitmap
)(const fb_remote_data
*src
, int x
, int y
, int width
,
270 #if defined(HAVE_LCD_BITMAP) && (LCD_DEPTH < 4) && !defined(SIMULATOR)
271 void (*lcd_grey_phase_blit
)(unsigned char *values
, unsigned char *phases
,
272 int bx
, int by
, int bwidth
, int bheight
,
275 #if defined(HAVE_LCD_COLOR)
276 void (*lcd_yuv_blit
)(unsigned char * const src
[3],
277 int src_x
, int src_y
, int stride
,
278 int x
, int y
, int width
, int height
);
281 #if defined(TOSHIBA_GIGABEAT_F) || defined(SANSA_E200) || defined(SANSA_C200) \
282 || defined (IRIVER_H10)
283 void (*lcd_yuv_set_options
)(unsigned options
);
287 void (*gui_synclist_init
)(struct gui_synclist
* lists
,
288 list_get_name callback_get_item_name
,void * data
,
289 bool scroll_all
,int selected_size
);
290 void (*gui_synclist_set_nb_items
)(struct gui_synclist
* lists
, int nb_items
);
291 void (*gui_synclist_set_icon_callback
)(struct gui_synclist
* lists
, list_get_icon icon_callback
);
292 int (*gui_synclist_get_nb_items
)(struct gui_synclist
* lists
);
293 int (*gui_synclist_get_sel_pos
)(struct gui_synclist
* lists
);
294 void (*gui_synclist_draw
)(struct gui_synclist
* lists
);
295 void (*gui_synclist_select_item
)(struct gui_synclist
* lists
,
297 void (*gui_synclist_add_item
)(struct gui_synclist
* lists
);
298 void (*gui_synclist_del_item
)(struct gui_synclist
* lists
);
299 void (*gui_synclist_limit_scroll
)(struct gui_synclist
* lists
, bool scroll
);
300 bool (*gui_synclist_do_button
)(struct gui_synclist
* lists
,
301 unsigned *action
, enum list_wrap wrap
);
302 void (*gui_synclist_set_title
)(struct gui_synclist
*lists
, char* title
, int icon
);
305 long (*button_get
)(bool block
);
306 long (*button_get_w_tmo
)(int ticks
);
307 int (*button_status
)(void);
308 void (*button_clear_queue
)(void);
309 int (*button_queue_count
)(void);
310 #ifdef HAS_BUTTON_HOLD
311 bool (*button_hold
)(void);
315 int (*PREFIX(open
))(const char* pathname
, int flags
);
316 int (*PREFIX(close
))(int fd
);
317 ssize_t (*PREFIX(read
))(int fd
, void* buf
, size_t count
);
318 off_t (*PREFIX(lseek
))(int fd
, off_t offset
, int whence
);
319 int (*PREFIX(creat
))(const char *pathname
);
320 ssize_t (*PREFIX(write
))(int fd
, const void* buf
, size_t count
);
321 int (*PREFIX(remove
))(const char* pathname
);
322 int (*PREFIX(rename
))(const char* path
, const char* newname
);
323 int (*PREFIX(ftruncate
))(int fd
, off_t length
);
324 off_t (*PREFIX(filesize
))(int fd
);
325 int (*fdprintf
)(int fd
, const char *fmt
, ...) ATTRIBUTE_PRINTF(2, 3);
326 int (*read_line
)(int fd
, char* buffer
, int buffer_size
);
327 bool (*settings_parseline
)(char* line
, char** name
, char** value
);
329 void (*ata_sleep
)(void);
330 bool (*ata_disk_is_active
)(void);
332 void (*ata_spindown
)(int seconds
);
333 void (*reload_directory
)(void);
334 char *(*create_numbered_filename
)(char *buffer
, const char *path
,
335 const char *prefix
, const char *suffix
,
336 int numberlen
IF_CNFN_NUM_(, int *num
));
339 DIR* (*opendir
)(const char* name
);
340 int (*closedir
)(DIR* dir
);
341 struct dirent
* (*readdir
)(DIR* dir
);
342 int (*mkdir
)(const char *name
);
343 int (*rmdir
)(const char *name
);
346 void (*PREFIX(sleep
))(int ticks
);
348 #ifdef HAVE_PRIORITY_SCHEDULING
349 void (*priority_yield
)(void);
351 volatile long* current_tick
;
352 long (*default_event_handler
)(long event
);
353 long (*default_event_handler_ex
)(long event
, void (*callback
)(void *), void *parameter
);
354 struct thread_entry
* threads
;
355 struct thread_entry
* (*create_thread
)(void (*function
)(void), void* stack
,
356 int stack_size
, unsigned flags
,
358 IF_PRIO(, int priority
)
359 IF_COP(, unsigned int core
));
360 void (*remove_thread
)(struct thread_entry
*thread
);
361 void (*reset_poweroff_timer
)(void);
363 int (*system_memory_guard
)(int newmode
);
365 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
366 #ifdef CPU_BOOST_LOGGING
367 void (*cpu_boost_
)(bool on_off
,char*location
,int line
);
369 void (*cpu_boost
)(bool on_off
);
373 bool (*timer_register
)(int reg_prio
, void (*unregister_callback
)(void),
374 long cycles
, int int_prio
,
375 void (*timer_callback
)(void));
376 void (*timer_unregister
)(void);
377 bool (*timer_set_period
)(long count
);
379 void (*queue_init
)(struct event_queue
*q
, bool register_queue
);
380 void (*queue_delete
)(struct event_queue
*q
);
381 void (*queue_post
)(struct event_queue
*q
, long id
, intptr_t data
);
382 void (*queue_wait_w_tmo
)(struct event_queue
*q
, struct queue_event
*ev
,
384 void (*usb_acknowledge
)(long id
);
386 void (*profile_thread
)(void);
387 void (*profstop
)(void);
388 void (*profile_func_enter
)(void *this_fn
, void *call_site
);
389 void (*profile_func_exit
)(void *this_fn
, void *call_site
);
393 /* special simulator hooks */
394 #if defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8
395 void (*sim_lcd_ex_init
)(int shades
, unsigned long (*getpixel
)(int, int));
396 void (*sim_lcd_ex_update_rect
)(int x
, int y
, int width
, int height
);
400 /* strings and memory */
401 int (*snprintf
)(char *buf
, size_t size
, const char *fmt
, ...)
402 ATTRIBUTE_PRINTF(3, 4);
403 int (*vsnprintf
)(char *buf
, int size
, const char *fmt
, va_list ap
);
404 char* (*strcpy
)(char *dst
, const char *src
);
405 char* (*strncpy
)(char *dst
, const char *src
, size_t length
);
406 size_t (*strlen
)(const char *str
);
407 char * (*strrchr
)(const char *s
, int c
);
408 int (*strcmp
)(const char *, const char *);
409 int (*strncmp
)(const char *, const char *, size_t);
410 int (*strcasecmp
)(const char *, const char *);
411 int (*strncasecmp
)(const char *s1
, const char *s2
, size_t n
);
412 void* (*memset
)(void *dst
, int c
, size_t length
);
413 void* (*memcpy
)(void *out
, const void *in
, size_t n
);
414 void* (*memmove
)(void *out
, const void *in
, size_t n
);
415 const unsigned char *_ctype_
;
416 int (*atoi
)(const char *str
);
417 char *(*strchr
)(const char *s
, int c
);
418 char *(*strcat
)(char *s1
, const char *s2
);
419 void *(*memchr
)(const void *s1
, int c
, size_t n
);
420 int (*memcmp
)(const void *s1
, const void *s2
, size_t n
);
421 char *(*strcasestr
) (const char* phaystack
, const char* pneedle
);
422 char* (*strtok_r
)(char *ptr
, const char *sep
, char **end
);
424 const unsigned char* (*utf8decode
)(const unsigned char *utf8
, unsigned short *ucs
);
425 unsigned char* (*iso_decode
)(const unsigned char *iso
, unsigned char *utf8
, int cp
, int count
);
426 unsigned char* (*utf16LEdecode
)(const unsigned char *utf16
, unsigned char *utf8
, int count
);
427 unsigned char* (*utf16BEdecode
)(const unsigned char *utf16
, unsigned char *utf8
, int count
);
428 unsigned char* (*utf8encode
)(unsigned long ucs
, unsigned char *utf8
);
429 unsigned long (*utf8length
)(const unsigned char *utf8
);
430 int (*utf8seek
)(const unsigned char* utf8
, int offset
);
433 #if CONFIG_CODEC == SWCODEC
434 int (*sound_default
)(int setting
);
436 void (*sound_set
)(int setting
, int value
);
437 int (*sound_min
)(int setting
);
438 int (*sound_max
)(int setting
);
440 void (*mp3_play_data
)(const unsigned char* start
, int size
, void (*get_more
)(unsigned char** start
, size_t* size
));
441 void (*mp3_play_pause
)(bool play
);
442 void (*mp3_play_stop
)(void);
443 bool (*mp3_is_playing
)(void);
444 #if CONFIG_CODEC != SWCODEC
445 void (*bitswap
)(unsigned char *data
, int length
);
447 #endif /* !SIMULATOR */
448 #if CONFIG_CODEC == SWCODEC
449 const unsigned long *audio_master_sampr_list
;
450 const unsigned long *hw_freq_sampr
;
451 void (*pcm_apply_settings
)(void);
452 void (*pcm_play_data
)(pcm_more_callback_type get_more
,
453 unsigned char* start
, size_t size
);
454 void (*pcm_play_stop
)(void);
455 void (*pcm_set_frequency
)(unsigned int frequency
);
456 bool (*pcm_is_playing
)(void);
457 bool (*pcm_is_paused
)(void);
458 void (*pcm_play_pause
)(bool play
);
459 size_t (*pcm_get_bytes_waiting
)(void);
460 void (*pcm_calculate_peaks
)(int *left
, int *right
);
461 #ifdef HAVE_RECORDING
462 const unsigned long *rec_freq_sampr
;
463 void (*pcm_init_recording
)(void);
464 void (*pcm_close_recording
)(void);
465 void (*pcm_record_data
)(pcm_more_callback_type2 more_ready
,
466 void *start
, size_t size
);
467 void (*pcm_record_more
)(void *start
, size_t size
);
468 void (*pcm_stop_recording
)(void);
469 void (*pcm_calculate_rec_peaks
)(int *left
, int *right
);
470 void (*audio_set_recording_gain
)(int left
, int right
, int type
);
471 #endif /* HAVE_RECORDING */
472 #if INPUT_SRC_CAPS != 0
473 void (*audio_set_output_source
)(int monitor
);
474 void (*audio_set_input_source
)(int source
, unsigned flags
);
476 #endif /* CONFIG_CODEC == SWCODC */
478 /* playback control */
479 int (*playlist_amount
)(void);
480 int (*playlist_resume
)(void);
481 int (*playlist_start
)(int start_index
, int offset
);
482 void (*PREFIX(audio_play
))(long offset
);
483 void (*audio_stop
)(void);
484 void (*audio_pause
)(void);
485 void (*audio_resume
)(void);
486 void (*audio_next
)(void);
487 void (*audio_prev
)(void);
488 void (*audio_ff_rewind
)(long newtime
);
489 struct mp3entry
* (*audio_next_track
)(void);
490 int (*audio_status
)(void);
491 bool (*audio_has_changed_track
)(void);
492 struct mp3entry
* (*audio_current_track
)(void);
493 void (*audio_flush_and_reload_tracks
)(void);
494 int (*audio_get_file_pos
)(void);
495 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
496 unsigned long (*mpeg_get_last_header
)(void);
498 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) || \
499 (CONFIG_CODEC == SWCODEC)
500 void (*sound_set_pitch
)(int pitch
);
503 /* MAS communication */
504 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
505 int (*mas_readmem
)(int bank
, int addr
, unsigned long* dest
, int len
);
506 int (*mas_writemem
)(int bank
, int addr
, const unsigned long* src
, int len
);
507 int (*mas_readreg
)(int reg
);
508 int (*mas_writereg
)(int reg
, unsigned int val
);
509 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
510 int (*mas_codec_writereg
)(int reg
, unsigned int val
);
511 int (*mas_codec_readreg
)(int reg
);
512 void (*i2c_begin
)(void);
513 void (*i2c_end
)(void);
514 int (*i2c_write
)(int address
, unsigned char* buf
, int count
);
519 int (*do_menu
)(const struct menu_item_ex
*menu
, int *start_selected
);
522 struct gui_syncstatusbar
*statusbars
;
523 void (*gui_syncstatusbar_draw
)(struct gui_syncstatusbar
* bars
, bool force_redraw
);
526 const struct settings_list
* (*find_setting
)(void* variable
, int *id
);
527 bool (*option_screen
)(struct settings_list
*setting
,
528 bool use_temp_var
, unsigned char* option_title
);
529 bool (*set_option
)(const char* string
, void* variable
,
530 enum optiontype type
, const struct opt_items
* options
,
531 int numoptions
, void (*function
)(int));
532 bool (*set_bool_options
)(const char* string
, bool* variable
,
533 const char* yes_str
, int yes_voice
,
534 const char* no_str
, int no_voice
,
535 void (*function
)(bool));
536 bool (*set_int
)(const unsigned char* string
, const char* unit
, int voice_unit
,
537 int* variable
, void (*function
)(int), int step
, int min
,
538 int max
, void (*formatter
)(char*, size_t, int, const char*) );
539 bool (*set_bool
)(const char* string
, bool* variable
);
541 #ifdef HAVE_LCD_COLOR
542 bool (*set_color
)(struct screen
*display
, char *title
, unsigned *color
,
543 unsigned banned_color
);
545 /* action handling */
546 int (*get_custom_action
)(int context
,int timeout
,
547 const struct button_mapping
* (*get_context_map
)(int));
548 int (*get_action
)(int context
, int timeout
);
549 bool (*action_userabort
)(int timeout
);
552 int (*battery_level
)(void);
553 bool (*battery_level_safe
)(void);
554 int (*battery_time
)(void);
556 unsigned int (*battery_voltage
)(void);
559 bool (*charger_inserted
)(void);
560 # if CONFIG_CHARGING == CHARGING_MONITOR
561 bool (*charging_state
)(void);
564 #ifdef HAVE_USB_POWER
565 bool (*usb_powered
)(void);
569 void (*srand
)(unsigned int seed
);
571 void (*qsort
)(void *base
, size_t nmemb
, size_t size
,
572 int(*compar
)(const void *, const void *));
573 int (*kbd_input
)(char* buffer
, int buflen
);
574 struct tm
* (*get_time
)(void);
575 int (*set_time
)(const struct tm
*tm
);
577 time_t (*mktime
)(struct tm
*t
);
579 void* (*plugin_get_buffer
)(size_t *buffer_size
);
580 void* (*plugin_get_audio_buffer
)(size_t *buffer_size
);
581 void (*plugin_tsr
)(bool (*exit_callback
)(bool reenter
));
582 char* (*plugin_get_current_filename
)(void);
583 #ifdef PLUGIN_USE_IRAM
584 void (*plugin_iram_init
)(char *iramstart
, char *iramcopy
, size_t iram_size
,
585 char *iedata
, size_t iedata_size
);
587 #if defined(DEBUG) || defined(SIMULATOR)
588 void (*debugf
)(const char *fmt
, ...) ATTRIBUTE_PRINTF(1, 2);
590 #ifdef ROCKBOX_HAS_LOGF
591 void (*logf
)(const char *fmt
, ...) ATTRIBUTE_PRINTF(1, 2);
593 struct user_settings
* global_settings
;
594 struct system_status
*global_status
;
595 void (*talk_disable
)(bool disable
);
596 #if CONFIG_CODEC == SWCODEC
597 int (*codec_load_file
)(const char* codec
, struct codec_api
*api
);
598 const char *(*get_codec_filename
)(int cod_spec
);
599 bool (*get_metadata
)(struct mp3entry
* id3
, int fd
, const char* trackname
);
601 bool (*mp3info
)(struct mp3entry
*entry
, const char *filename
);
602 int (*count_mp3_frames
)(int fd
, int startpos
, int filesize
,
603 void (*progressfunc
)(int));
604 int (*create_xing_header
)(int fd
, long startpos
, long filesize
,
605 unsigned char *buf
, unsigned long num_frames
,
606 unsigned long rec_time
, unsigned long header_template
,
607 void (*progressfunc
)(int), bool generate_toc
);
608 unsigned long (*find_next_frame
)(int fd
, long *offset
,
609 long max_offset
, unsigned long last_header
);
611 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
612 unsigned short (*peak_meter_scale_value
)(unsigned short val
,
614 void (*peak_meter_set_use_dbfs
)(bool use
);
615 bool (*peak_meter_get_use_dbfs
)(void);
617 #ifdef HAVE_LCD_BITMAP
618 int (*read_bmp_file
)(const char* filename
, struct bitmap
*bm
, int maxsize
,
620 void (*screen_dump_set_hook
)(void (*hook
)(int fh
));
622 int (*show_logo
)(void);
623 struct tree_context
* (*tree_get_context
)(void);
624 void (*set_current_file
)(char* path
);
625 void (*set_dirfilter
)(int l_dirfilter
);
627 #ifdef HAVE_WHEEL_POSITION
628 int (*wheel_status
)(void);
629 void (*wheel_send_events
)(bool send
);
632 #ifdef IRIVER_H100_SERIES
633 /* Routines for the iriver_flash -plugin. */
634 bool (*detect_original_firmware
)(void);
635 bool (*detect_flashed_ramimage
)(void);
636 bool (*detect_flashed_romimage
)(void);
639 void (*led
)(bool on
);
641 #ifdef CACHE_FUNCTIONS_AS_CALL
642 void (*flush_icache
)(void);
643 void (*invalidate_icache
)(void);
646 /* new stuff at the end, sort into place next time
647 the API gets incompatible */
649 #if (CONFIG_CODEC == SWCODEC)
650 void (*mutex_init
)(struct mutex
*m
);
651 void (*mutex_lock
)(struct mutex
*m
);
652 void (*mutex_unlock
)(struct mutex
*m
);
655 void (*thread_wait
)(struct thread_entry
*thread
);
657 #if (CONFIG_CODEC == SWCODEC)
658 size_t (*align_buffer
)(void **start
, size_t size
, size_t align
);
661 bool (*file_exists
)(const char *file
);
662 bool (*dir_exists
)(const char *path
);
664 #ifdef HAVE_REMOTE_LCD
665 void (*remote_backlight_set_timeout
)(int index
);
667 void (*remote_backlight_set_timeout_plugged
)(int index
);
669 #endif /* HAVE_REMOTE_LCD */
671 #if (CONFIG_CODEC == SWCODEC)
672 int (*bufopen
)(const char *file
, size_t offset
, enum data_type type
);
673 int (*bufalloc
)(const void *src
, size_t size
, enum data_type type
);
674 bool (*bufclose
)(int handle_id
);
675 int (*bufseek
)(int handle_id
, size_t newpos
);
676 int (*bufadvance
)(int handle_id
, off_t offset
);
677 ssize_t (*bufread
)(int handle_id
, size_t size
, void *dest
);
678 ssize_t (*bufgetdata
)(int handle_id
, size_t size
, void **data
);
679 ssize_t (*bufgettail
)(int handle_id
, size_t size
, void **data
);
680 ssize_t (*bufcuttail
)(int handle_id
, size_t size
);
682 ssize_t (*buf_get_offset
)(int handle_id
, void *ptr
);
683 ssize_t (*buf_handle_offset
)(int handle_id
);
684 void (*buf_request_buffer_handle
)(int handle_id
);
685 void (*buf_set_base_handle
)(int handle_id
);
686 size_t (*buf_used
)(void);
690 bool (*tagcache_search
)(struct tagcache_search
*tcs
, int tag
);
691 void (*tagcache_search_set_uniqbuf
)(struct tagcache_search
*tcs
,
692 void *buffer
, long length
);
693 bool (*tagcache_search_add_filter
)(struct tagcache_search
*tcs
,
695 bool (*tagcache_get_next
)(struct tagcache_search
*tcs
);
696 bool (*tagcache_retrieve
)(struct tagcache_search
*tcs
, int idxid
,
697 int tag
, char *buf
, long size
);
698 void (*tagcache_search_finish
)(struct tagcache_search
*tcs
);
702 bool (*find_albumart
)(const struct mp3entry
*id3
, char *buf
, int buflen
);
703 bool (*search_albumart_files
)(const struct mp3entry
*id3
, const char *size_string
,
704 char *buf
, int buflen
);
707 #if CONFIG_CODEC == SWCODEC
708 void (*pcm_play_lock
)(void);
709 void (*pcm_play_unlock
)(void);
710 void (*queue_enable_queue_send
)(struct event_queue
*q
,
711 struct queue_sender_list
*send
);
712 bool (*queue_empty
)(const struct event_queue
*q
);
713 void (*queue_wait
)(struct event_queue
*q
, struct queue_event
*ev
);
714 intptr_t (*queue_send
)(struct event_queue
*q
, long id
,
716 void (*queue_reply
)(struct event_queue
*q
, intptr_t retval
);
717 #ifndef HAVE_FLASH_STORAGE
718 void (*ata_spin
)(void);
720 #ifdef HAVE_SCHEDULER_BOOSTCTRL
721 void (*trigger_cpu_boost
)(void);
722 void (*cancel_cpu_boost
)(void);
724 const char * (*sound_unit
)(int setting
);
725 int (*sound_val2phys
)(int setting
, int value
);
726 void (*dsp_set_crossfeed
)(bool enable
);
727 void (*dsp_set_eq
)(bool enable
);
728 void (*dsp_dither_enable
)(bool enable
);
729 intptr_t (*dsp_configure
)(struct dsp_config
*dsp
, int setting
,
731 int (*dsp_process
)(struct dsp_config
*dsp
, char *dest
,
732 const char *src
[], int count
);
733 #endif /* CONFIG_CODEC == SWCODEC */
737 struct plugin_header
{
739 unsigned short target_id
;
740 unsigned short api_version
;
741 unsigned char *load_addr
;
742 unsigned char *end_addr
;
743 enum plugin_status(*entry_point
)(struct plugin_api
*, void*);
748 extern unsigned char plugin_start_addr
[];
749 extern unsigned char plugin_end_addr
[];
750 #define PLUGIN_HEADER \
751 const struct plugin_header __header \
752 __attribute__ ((section (".header")))= { \
753 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
754 plugin_start_addr, plugin_end_addr, plugin_start };
755 #else /* SIMULATOR */
756 #define PLUGIN_HEADER \
757 const struct plugin_header __header \
758 __attribute__((visibility("default"))) = { \
759 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
760 NULL, NULL, plugin_start };
761 #endif /* SIMULATOR */
763 #ifdef PLUGIN_USE_IRAM
764 /* Declare IRAM variables */
765 #define PLUGIN_IRAM_DECLARE \
766 extern char iramcopy[]; \
767 extern char iramstart[]; \
768 extern char iramend[]; \
769 extern char iedata[]; \
771 /* Initialize IRAM */
772 #define PLUGIN_IRAM_INIT(api) \
773 (api)->plugin_iram_init(iramstart, iramcopy, iramend-iramstart, \
774 iedata, iend-iedata);
776 #define PLUGIN_IRAM_DECLARE
777 #define PLUGIN_IRAM_INIT(api)
778 #endif /* PLUGIN_USE_IRAM */
781 int plugin_load(const char* plugin
, void* parameter
);
782 void* plugin_get_buffer(size_t *buffer_size
);
783 void* plugin_get_audio_buffer(size_t *buffer_size
);
784 #ifdef PLUGIN_USE_IRAM
785 void plugin_iram_init(char *iramstart
, char *iramcopy
, size_t iram_size
,
786 char *iedata
, size_t iedata_size
);
790 callback returns true to allow the new plugin to load,
791 reenter means the currently running plugin is being reloaded */
792 void plugin_tsr(bool (*exit_callback
)(bool reenter
));
794 /* defined by the plugin */
795 enum plugin_status
plugin_start(struct plugin_api
* rockbox
, void* parameter
)
798 /* Use this macro in plugins where gcc tries to optimize by calling
799 * these functions directly */
800 #define MEM_FUNCTION_WRAPPERS(api) \
801 void *memcpy(void *dest, const void *src, size_t n) \
803 return (api)->memcpy(dest, src, n); \
805 void *memset(void *dest, int c, size_t n) \
807 return (api)->memset(dest, c, n); \
809 void *memmove(void *dest, const void *src, size_t n) \
811 return (api)->memmove(dest, src, n); \
813 int memcmp(const void *s1, const void *s2, size_t n) \
815 return (api)->memcmp(s1, s2, n); \
818 #ifndef CACHE_FUNCTION_WRAPPERS
820 #ifdef CACHE_FUNCTIONS_AS_CALL
821 #define CACHE_FUNCTION_WRAPPERS(api) \
822 void flush_icache(void) \
824 (api)->flush_icache(); \
826 void invalidate_icache(void) \
828 (api)->invalidate_icache(); \
831 #define CACHE_FUNCTION_WRAPPERS(api)
832 #endif /* CACHE_FUNCTIONS_AS_CALL */
834 #endif /* CACHE_FUNCTION_WRAPPERS */
836 #ifndef ALIGN_BUFFER_WRAPPER
837 #define ALIGN_BUFFER_WRAPPER(api) \
838 size_t align_buffer(void **start, size_t size, size_t align) \
840 return (api)->align_buffer(start, size, align); \
842 #endif /* ALIGN_BUFFER_WRAPPER */