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>
51 #include "mp3_playback.h"
57 #if (CONFIG_CODEC == SWCODEC)
63 #include "recording.h"
67 #endif /* CONFIG_CODEC == SWCODEC */
71 #ifdef HAVE_LCD_BITMAP
72 #include "scrollbar.h"
74 #include "statusbar.h"
76 #include "rbunicode.h"
79 #include "color_picker.h"
81 #ifdef HAVE_REMOTE_LCD
82 #include "lcd-remote.h"
87 #if defined(DEBUG) || defined(SIMULATOR)
89 #define DEBUGF rb->debugf
91 #define LDEBUGF rb->debugf
97 #ifdef ROCKBOX_HAS_LOGF
107 #define PREFIX(_x_) sim_ ## _x_
109 #define PREFIX(_x_) _x_
112 #define PLUGIN_MAGIC 0x526F634B /* RocK */
114 /* increase this every time the api struct changes */
115 #define PLUGIN_API_VERSION 73
117 /* update this to latest version if a change to the api struct breaks
118 backwards compatibility (and please take the opportunity to sort in any
119 new function which are "waiting" at the end of the function table) */
120 #define PLUGIN_MIN_API_VERSION 73
122 /* plugin return codes */
125 PLUGIN_USB_CONNECTED
,
129 /* NOTE: To support backwards compatibility, only add new functions at
130 the end of the structure. Every time you add a new function,
131 remember to increase PLUGIN_API_VERSION. If you make changes to the
132 existing APIs then also update PLUGIN_MIN_API_VERSION to current
138 void (*lcd_set_contrast
)(int x
);
139 void (*lcd_update
)(void);
140 void (*lcd_clear_display
)(void);
141 void (*lcd_setmargins
)(int x
, int y
);
142 int (*lcd_getstringsize
)(const unsigned char *str
, int *w
, int *h
);
143 void (*lcd_putsxy
)(int x
, int y
, const unsigned char *string
);
144 void (*lcd_puts
)(int x
, int y
, const unsigned char *string
);
145 void (*lcd_puts_scroll
)(int x
, int y
, const unsigned char* string
);
146 void (*lcd_stop_scroll
)(void);
147 #ifdef HAVE_LCD_CHARCELLS
148 void (*lcd_define_pattern
)(unsigned long ucs
, const char *pattern
);
149 unsigned long (*lcd_get_locked_pattern
)(void);
150 void (*lcd_unlock_pattern
)(unsigned long ucs
);
151 void (*lcd_putc
)(int x
, int y
, unsigned long ucs
);
152 void (*lcd_put_cursor
)(int x
, int y
, unsigned long ucs
);
153 void (*lcd_remove_cursor
)(void);
154 void (*lcd_icon
)(int icon
, bool enable
);
155 void (*lcd_double_height
)(bool on
);
157 void (*lcd_set_drawmode
)(int mode
);
158 int (*lcd_get_drawmode
)(void);
159 void (*lcd_setfont
)(int font
);
160 void (*lcd_drawpixel
)(int x
, int y
);
161 void (*lcd_drawline
)(int x1
, int y1
, int x2
, int y2
);
162 void (*lcd_hline
)(int x1
, int x2
, int y
);
163 void (*lcd_vline
)(int x
, int y1
, int y2
);
164 void (*lcd_drawrect
)(int x
, int y
, int width
, int height
);
165 void (*lcd_fillrect
)(int x
, int y
, int width
, int height
);
166 void (*lcd_mono_bitmap_part
)(const unsigned char *src
, int src_x
, int src_y
,
167 int stride
, int x
, int y
, int width
, int height
);
168 void (*lcd_mono_bitmap
)(const unsigned char *src
, int x
, int y
,
169 int width
, int height
);
171 void (*lcd_set_foreground
)(unsigned foreground
);
172 unsigned (*lcd_get_foreground
)(void);
173 void (*lcd_set_background
)(unsigned foreground
);
174 unsigned (*lcd_get_background
)(void);
175 void (*lcd_bitmap_part
)(const fb_data
*src
, int src_x
, int src_y
,
176 int stride
, int x
, int y
, int width
, int height
);
177 void (*lcd_bitmap
)(const fb_data
*src
, int x
, int y
, int width
,
179 fb_data
* (*lcd_get_backdrop
)(void);
180 void (*lcd_set_backdrop
)(fb_data
* backdrop
);
183 void (*lcd_bitmap_transparent_part
)(const fb_data
*src
,
184 int src_x
, int src_y
, int stride
,
185 int x
, int y
, int width
, int height
);
186 void (*lcd_bitmap_transparent
)(const fb_data
*src
, int x
, int y
,
187 int width
, int height
);
189 unsigned short *(*bidi_l2v
)( const unsigned char *str
, int orientation
);
190 const unsigned char *(*font_get_bits
)( struct font
*pf
, unsigned short char_code
);
191 struct font
* (*font_load
)(const char *path
);
192 void (*lcd_puts_style
)(int x
, int y
, const unsigned char *str
, int style
);
193 void (*lcd_puts_scroll_style
)(int x
, int y
, const unsigned char* string
,
195 fb_data
* lcd_framebuffer
;
196 void (*lcd_blit
) (const fb_data
* data
, int x
, int by
, int width
,
197 int bheight
, int stride
);
198 void (*lcd_update_rect
)(int x
, int y
, int width
, int height
);
199 void (*gui_scrollbar_draw
)(struct screen
* screen
, int x
, int y
,
200 int width
, int height
, int items
,
201 int min_shown
, int max_shown
,
203 struct font
* (*font_get
)(int font
);
204 int (*font_getstringsize
)(const unsigned char *str
, int *w
, int *h
,
206 int (*font_get_width
)(struct font
* pf
, unsigned short char_code
);
207 void (*screen_clear_area
)(struct screen
* display
, int xstart
, int ystart
,
208 int width
, int height
);
210 void (*backlight_on
)(void);
211 void (*backlight_off
)(void);
212 void (*backlight_set_timeout
)(int index
);
214 void (*backlight_set_timeout_plugged
)(int index
);
216 void (*splash
)(int ticks
, const char *fmt
, ...) ATTRIBUTE_PRINTF(2, 3);
218 #ifdef HAVE_REMOTE_LCD
220 void (*lcd_remote_set_contrast
)(int x
);
221 void (*lcd_remote_clear_display
)(void);
222 void (*lcd_remote_puts
)(int x
, int y
, const unsigned char *string
);
223 void (*lcd_remote_lcd_puts_scroll
)(int x
, int y
, const unsigned char* string
);
224 void (*lcd_remote_lcd_stop_scroll
)(void);
225 void (*lcd_remote_set_drawmode
)(int mode
);
226 int (*lcd_remote_get_drawmode
)(void);
227 void (*lcd_remote_setfont
)(int font
);
228 int (*lcd_remote_getstringsize
)(const unsigned char *str
, int *w
, int *h
);
229 void (*lcd_remote_drawpixel
)(int x
, int y
);
230 void (*lcd_remote_drawline
)(int x1
, int y1
, int x2
, int y2
);
231 void (*lcd_remote_hline
)(int x1
, int x2
, int y
);
232 void (*lcd_remote_vline
)(int x
, int y1
, int y2
);
233 void (*lcd_remote_drawrect
)(int x
, int y
, int nx
, int ny
);
234 void (*lcd_remote_fillrect
)(int x
, int y
, int nx
, int ny
);
235 void (*lcd_remote_mono_bitmap_part
)(const unsigned char *src
, int src_x
,
236 int src_y
, int stride
, int x
, int y
,
237 int width
, int height
);
238 void (*lcd_remote_mono_bitmap
)(const unsigned char *src
, int x
, int y
,
239 int width
, int height
);
240 void (*lcd_remote_putsxy
)(int x
, int y
, const unsigned char *string
);
241 void (*lcd_remote_puts_style
)(int x
, int y
, const unsigned char *str
, int style
);
242 void (*lcd_remote_puts_scroll_style
)(int x
, int y
, const unsigned char* string
,
244 fb_remote_data
* lcd_remote_framebuffer
;
245 void (*lcd_remote_update
)(void);
246 void (*lcd_remote_update_rect
)(int x
, int y
, int width
, int height
);
248 void (*remote_backlight_on
)(void);
249 void (*remote_backlight_off
)(void);
251 struct screen
* screens
[NB_SCREENS
];
252 #if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)
253 void (*lcd_remote_set_foreground
)(unsigned foreground
);
254 unsigned (*lcd_remote_get_foreground
)(void);
255 void (*lcd_remote_set_background
)(unsigned background
);
256 unsigned (*lcd_remote_get_background
)(void);
257 void (*lcd_remote_bitmap_part
)(const fb_remote_data
*src
, int src_x
, int src_y
,
258 int stride
, int x
, int y
, int width
, int height
);
259 void (*lcd_remote_bitmap
)(const fb_remote_data
*src
, int x
, int y
, int width
,
262 #if defined(HAVE_LCD_COLOR) && !defined(SIMULATOR)
263 void (*lcd_yuv_blit
)(unsigned char * const src
[3],
264 int src_x
, int src_y
, int stride
,
265 int x
, int y
, int width
, int height
);
269 void (*gui_synclist_init
)(struct gui_synclist
* lists
,
270 list_get_name callback_get_item_name
,void * data
,
271 bool scroll_all
,int selected_size
);
272 void (*gui_synclist_set_nb_items
)(struct gui_synclist
* lists
, int nb_items
);
273 void (*gui_synclist_set_icon_callback
)(struct gui_synclist
* lists
, list_get_icon icon_callback
);
274 int (*gui_synclist_get_nb_items
)(struct gui_synclist
* lists
);
275 int (*gui_synclist_get_sel_pos
)(struct gui_synclist
* lists
);
276 void (*gui_synclist_draw
)(struct gui_synclist
* lists
);
277 void (*gui_synclist_select_item
)(struct gui_synclist
* lists
,
279 void (*gui_synclist_add_item
)(struct gui_synclist
* lists
);
280 void (*gui_synclist_del_item
)(struct gui_synclist
* lists
);
281 void (*gui_synclist_limit_scroll
)(struct gui_synclist
* lists
, bool scroll
);
282 void (*gui_synclist_flash
)(struct gui_synclist
* lists
);
283 unsigned (*gui_synclist_do_button
)(struct gui_synclist
* lists
,
284 unsigned button
,enum list_wrap wrap
);
285 void (*gui_synclist_set_title
)(struct gui_synclist
*lists
, char* title
, int icon
);
288 long (*button_get
)(bool block
);
289 long (*button_get_w_tmo
)(int ticks
);
290 int (*button_status
)(void);
291 void (*button_clear_queue
)(void);
292 #ifdef HAS_BUTTON_HOLD
293 bool (*button_hold
)(void);
297 int (*PREFIX(open
))(const char* pathname
, int flags
);
298 int (*close
)(int fd
);
299 ssize_t (*PREFIX(read
))(int fd
, void* buf
, size_t count
);
300 off_t (*PREFIX(lseek
))(int fd
, off_t offset
, int whence
);
301 int (*PREFIX(creat
))(const char *pathname
);
302 ssize_t (*PREFIX(write
))(int fd
, const void* buf
, size_t count
);
303 int (*PREFIX(remove
))(const char* pathname
);
304 int (*PREFIX(rename
))(const char* path
, const char* newname
);
305 int (*PREFIX(ftruncate
))(int fd
, off_t length
);
306 off_t (*PREFIX(filesize
))(int fd
);
307 int (*fdprintf
)(int fd
, const char *fmt
, ...) ATTRIBUTE_PRINTF(2, 3);
308 int (*read_line
)(int fd
, char* buffer
, int buffer_size
);
309 bool (*settings_parseline
)(char* line
, char** name
, char** value
);
311 void (*ata_sleep
)(void);
312 bool (*ata_disk_is_active
)(void);
314 void (*ata_spindown
)(int seconds
);
315 void (*reload_directory
)(void);
316 char *(*create_numbered_filename
)(char *buffer
, const char *path
,
317 const char *prefix
, const char *suffix
,
318 int numberlen
IF_CNFN_NUM_(, int *num
));
321 DIR* (*opendir
)(const char* name
);
322 int (*closedir
)(DIR* dir
);
323 struct dirent
* (*readdir
)(DIR* dir
);
324 int (*mkdir
)(const char *name
);
325 int (*rmdir
)(const char *name
);
328 void (*PREFIX(sleep
))(int ticks
);
330 #ifdef HAVE_PRIORITY_SCHEDULING
331 void (*priority_yield
)(void);
333 volatile long* current_tick
;
334 long (*default_event_handler
)(long event
);
335 long (*default_event_handler_ex
)(long event
, void (*callback
)(void *), void *parameter
);
336 struct thread_entry
* threads
;
337 struct thread_entry
* (*create_thread
)(void (*function
)(void), void* stack
,
338 int stack_size
, const char *name
339 IF_PRIO(, int priority
)
340 IF_COP(, unsigned int core
, bool fallback
));
341 void (*remove_thread
)(struct thread_entry
*thread
);
342 void (*reset_poweroff_timer
)(void);
344 int (*system_memory_guard
)(int newmode
);
346 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
347 #ifdef CPU_BOOST_LOGGING
348 void (*cpu_boost_
)(bool on_off
,char*location
,int line
);
350 void (*cpu_boost
)(bool on_off
);
354 bool (*timer_register
)(int reg_prio
, void (*unregister_callback
)(void),
355 long cycles
, int int_prio
,
356 void (*timer_callback
)(void));
357 void (*timer_unregister
)(void);
358 bool (*timer_set_period
)(long count
);
360 void (*queue_init
)(struct event_queue
*q
, bool register_queue
);
361 void (*queue_delete
)(struct event_queue
*q
);
362 void (*queue_post
)(struct event_queue
*q
, long id
, intptr_t data
);
363 void (*queue_wait_w_tmo
)(struct event_queue
*q
, struct event
*ev
,
365 void (*usb_acknowledge
)(long id
);
367 void (*profile_thread
)(void);
368 void (*profstop
)(void);
369 void (*profile_func_enter
)(void *this_fn
, void *call_site
);
370 void (*profile_func_exit
)(void *this_fn
, void *call_site
);
374 /* special simulator hooks */
375 #if defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8
376 void (*sim_lcd_ex_init
)(int shades
, unsigned long (*getpixel
)(int, int));
377 void (*sim_lcd_ex_update_rect
)(int x
, int y
, int width
, int height
);
381 /* strings and memory */
382 int (*snprintf
)(char *buf
, size_t size
, const char *fmt
, ...)
383 ATTRIBUTE_PRINTF(3, 4);
384 int (*vsnprintf
)(char *buf
, int size
, const char *fmt
, va_list ap
);
385 char* (*strcpy
)(char *dst
, const char *src
);
386 char* (*strncpy
)(char *dst
, const char *src
, size_t length
);
387 size_t (*strlen
)(const char *str
);
388 char * (*strrchr
)(const char *s
, int c
);
389 int (*strcmp
)(const char *, const char *);
390 int (*strncmp
)(const char *, const char *, size_t);
391 int (*strcasecmp
)(const char *, const char *);
392 int (*strncasecmp
)(const char *s1
, const char *s2
, size_t n
);
393 void* (*memset
)(void *dst
, int c
, size_t length
);
394 void* (*memcpy
)(void *out
, const void *in
, size_t n
);
395 void* (*memmove
)(void *out
, const void *in
, size_t n
);
396 const unsigned char *_ctype_
;
397 int (*atoi
)(const char *str
);
398 char *(*strchr
)(const char *s
, int c
);
399 char *(*strcat
)(char *s1
, const char *s2
);
400 void *(*memchr
)(const void *s1
, int c
, size_t n
);
401 int (*memcmp
)(const void *s1
, const void *s2
, size_t n
);
402 char *(*strcasestr
) (const char* phaystack
, const char* pneedle
);
403 char* (*strtok_r
)(char *ptr
, const char *sep
, char **end
);
405 const unsigned char* (*utf8decode
)(const unsigned char *utf8
, unsigned short *ucs
);
406 unsigned char* (*iso_decode
)(const unsigned char *iso
, unsigned char *utf8
, int cp
, int count
);
407 unsigned char* (*utf16LEdecode
)(const unsigned char *utf16
, unsigned char *utf8
, int count
);
408 unsigned char* (*utf16BEdecode
)(const unsigned char *utf16
, unsigned char *utf8
, int count
);
409 unsigned char* (*utf8encode
)(unsigned long ucs
, unsigned char *utf8
);
410 unsigned long (*utf8length
)(const unsigned char *utf8
);
411 int (*utf8seek
)(const unsigned char* utf8
, int offset
);
414 #if CONFIG_CODEC == SWCODEC
415 int (*sound_default
)(int setting
);
417 void (*sound_set
)(int setting
, int value
);
418 int (*sound_min
)(int setting
);
419 int (*sound_max
)(int setting
);
421 void (*mp3_play_data
)(const unsigned char* start
, int size
, void (*get_more
)(unsigned char** start
, size_t* size
));
422 void (*mp3_play_pause
)(bool play
);
423 void (*mp3_play_stop
)(void);
424 bool (*mp3_is_playing
)(void);
425 #if CONFIG_CODEC != SWCODEC
426 void (*bitswap
)(unsigned char *data
, int length
);
428 #endif /* !SIMULATOR */
429 #if CONFIG_CODEC == SWCODEC
430 const unsigned long *audio_master_sampr_list
;
431 const unsigned long *hw_freq_sampr
;
432 void (*pcm_apply_settings
)(void);
433 void (*pcm_play_data
)(pcm_more_callback_type get_more
,
434 unsigned char* start
, size_t size
);
435 void (*pcm_play_stop
)(void);
436 void (*pcm_set_frequency
)(unsigned int frequency
);
437 bool (*pcm_is_playing
)(void);
438 bool (*pcm_is_paused
)(void);
439 void (*pcm_play_pause
)(bool play
);
440 size_t (*pcm_get_bytes_waiting
)(void);
441 void (*pcm_calculate_peaks
)(int *left
, int *right
);
442 #ifdef HAVE_RECORDING
443 const unsigned long *rec_freq_sampr
;
444 void (*pcm_init_recording
)(void);
445 void (*pcm_close_recording
)(void);
446 void (*pcm_record_data
)(pcm_more_callback_type2 more_ready
,
447 void *start
, size_t size
);
448 void (*pcm_record_more
)(void *start
, size_t size
);
449 void (*pcm_stop_recording
)(void);
450 void (*pcm_calculate_rec_peaks
)(int *left
, int *right
);
451 void (*audio_set_recording_gain
)(int left
, int right
, int type
);
452 #endif /* HAVE_RECORDING */
453 #if INPUT_SRC_CAPS != 0
454 void (*audio_set_output_source
)(int monitor
);
455 void (*audio_set_input_source
)(int source
, unsigned flags
);
457 #endif /* CONFIG_CODEC == SWCODC */
459 /* playback control */
460 int (*playlist_amount
)(void);
461 int (*playlist_resume
)(void);
462 int (*playlist_start
)(int start_index
, int offset
);
463 void (*PREFIX(audio_play
))(long offset
);
464 void (*audio_stop
)(void);
465 void (*audio_pause
)(void);
466 void (*audio_resume
)(void);
467 void (*audio_next
)(void);
468 void (*audio_prev
)(void);
469 void (*audio_ff_rewind
)(long newtime
);
470 struct mp3entry
* (*audio_next_track
)(void);
471 int (*audio_status
)(void);
472 bool (*audio_has_changed_track
)(void);
473 struct mp3entry
* (*audio_current_track
)(void);
474 void (*audio_flush_and_reload_tracks
)(void);
475 int (*audio_get_file_pos
)(void);
476 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
477 unsigned long (*mpeg_get_last_header
)(void);
479 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) || \
480 (CONFIG_CODEC == SWCODEC)
481 void (*sound_set_pitch
)(int pitch
);
484 /* MAS communication */
485 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
486 int (*mas_readmem
)(int bank
, int addr
, unsigned long* dest
, int len
);
487 int (*mas_writemem
)(int bank
, int addr
, const unsigned long* src
, int len
);
488 int (*mas_readreg
)(int reg
);
489 int (*mas_writereg
)(int reg
, unsigned int val
);
490 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
491 int (*mas_codec_writereg
)(int reg
, unsigned int val
);
492 int (*mas_codec_readreg
)(int reg
);
493 void (*i2c_begin
)(void);
494 void (*i2c_end
)(void);
495 int (*i2c_write
)(int address
, unsigned char* buf
, int count
);
500 int (*do_menu
)(const struct menu_item_ex
*menu
, int *start_selected
);
503 struct gui_syncstatusbar
*statusbars
;
504 void (*gui_syncstatusbar_draw
)(struct gui_syncstatusbar
* bars
, bool force_redraw
);
507 const struct settings_list
* (*find_setting
)(void* variable
, int *id
);
508 bool (*option_screen
)(struct settings_list
*setting
,
509 bool use_temp_var
, unsigned char* option_title
);
510 bool (*set_option
)(const char* string
, void* variable
,
511 enum optiontype type
, const struct opt_items
* options
,
512 int numoptions
, void (*function
)(int));
513 bool (*set_bool_options
)(const char* string
, bool* variable
,
514 const char* yes_str
, int yes_voice
,
515 const char* no_str
, int no_voice
,
516 void (*function
)(bool));
517 bool (*set_int
)(const unsigned char* string
, const char* unit
, int voice_unit
,
518 int* variable
, void (*function
)(int), int step
, int min
,
519 int max
, void (*formatter
)(char*, size_t, int, const char*) );
520 bool (*set_bool
)(const char* string
, bool* variable
);
522 #ifdef HAVE_LCD_COLOR
523 bool (*set_color
)(struct screen
*display
, char *title
, unsigned *color
,
524 unsigned banned_color
);
526 /* action handling */
527 int (*get_custom_action
)(int context
,int timeout
,
528 const struct button_mapping
* (*get_context_map
)(int));
529 int (*get_action
)(int context
, int timeout
);
530 bool (*action_userabort
)(int timeout
);
533 int (*battery_level
)(void);
534 bool (*battery_level_safe
)(void);
535 int (*battery_time
)(void);
537 unsigned int (*battery_voltage
)(void);
540 bool (*charger_inserted
)(void);
541 # if CONFIG_CHARGING == CHARGING_MONITOR
542 bool (*charging_state
)(void);
545 #ifdef HAVE_USB_POWER
546 bool (*usb_powered
)(void);
550 void (*srand
)(unsigned int seed
);
552 void (*qsort
)(void *base
, size_t nmemb
, size_t size
,
553 int(*compar
)(const void *, const void *));
554 int (*kbd_input
)(char* buffer
, int buflen
);
555 struct tm
* (*get_time
)(void);
556 int (*set_time
)(const struct tm
*tm
);
558 time_t (*mktime
)(struct tm
*t
);
560 void* (*plugin_get_buffer
)(size_t *buffer_size
);
561 void* (*plugin_get_audio_buffer
)(size_t *buffer_size
);
562 void (*plugin_tsr
)(bool (*exit_callback
)(bool reenter
));
563 char* (*plugin_get_current_filename
)(void);
565 void (*plugin_iram_init
)(char *iramstart
, char *iramcopy
, size_t iram_size
,
566 char *iedata
, size_t iedata_size
);
568 #if defined(DEBUG) || defined(SIMULATOR)
569 void (*debugf
)(const char *fmt
, ...) ATTRIBUTE_PRINTF(1, 2);
571 #ifdef ROCKBOX_HAS_LOGF
572 void (*logf
)(const char *fmt
, ...) ATTRIBUTE_PRINTF(1, 2);
574 struct user_settings
* global_settings
;
575 struct system_status
*global_status
;
576 bool (*mp3info
)(struct mp3entry
*entry
, const char *filename
, bool v1first
);
577 int (*count_mp3_frames
)(int fd
, int startpos
, int filesize
,
578 void (*progressfunc
)(int));
579 int (*create_xing_header
)(int fd
, long startpos
, long filesize
,
580 unsigned char *buf
, unsigned long num_frames
,
581 unsigned long rec_time
, unsigned long header_template
,
582 void (*progressfunc
)(int), bool generate_toc
);
583 unsigned long (*find_next_frame
)(int fd
, long *offset
,
584 long max_offset
, unsigned long last_header
);
586 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
587 unsigned short (*peak_meter_scale_value
)(unsigned short val
,
589 void (*peak_meter_set_use_dbfs
)(bool use
);
590 bool (*peak_meter_get_use_dbfs
)(void);
592 #ifdef HAVE_LCD_BITMAP
593 int (*read_bmp_file
)(char* filename
, struct bitmap
*bm
, int maxsize
,
595 void (*screen_dump_set_hook
)(void (*hook
)(int fh
));
597 int (*show_logo
)(void);
598 struct tree_context
* (*tree_get_context
)(void);
599 void (*set_current_file
)(char* path
);
600 void (*set_dirfilter
)(int l_dirfilter
);
602 #ifdef HAVE_WHEEL_POSITION
603 int (*wheel_status
)(void);
604 void (*wheel_send_events
)(bool send
);
607 #ifdef IRIVER_H100_SERIES
608 /* Routines for the iriver_flash -plugin. */
609 bool (*detect_original_firmware
)(void);
610 bool (*detect_flashed_ramimage
)(void);
611 bool (*detect_flashed_romimage
)(void);
613 /* new stuff at the end, sort into place next time
614 the API gets incompatible */
616 #if (CONFIG_CODEC == SWCODEC)
617 void (*spinlock_init
)(struct mutex
*m
);
618 void (*spinlock_lock
)(struct mutex
*m
);
619 void (*spinlock_unlock
)(struct mutex
*m
);
621 int (*codec_load_file
)(const char* codec
, struct codec_api
*api
);
622 const char *(*get_codec_filename
)(int cod_spec
);
623 bool (*get_metadata
)(struct mp3entry
* id3
, int fd
, const char* trackname
,
626 void (*led
)(bool on
);
630 struct plugin_header
{
632 unsigned short target_id
;
633 unsigned short api_version
;
634 unsigned char *load_addr
;
635 unsigned char *end_addr
;
636 enum plugin_status(*entry_point
)(struct plugin_api
*, void*);
641 extern unsigned char plugin_start_addr
[];
642 extern unsigned char plugin_end_addr
[];
643 #define PLUGIN_HEADER \
644 const struct plugin_header __header \
645 __attribute__ ((section (".header")))= { \
646 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
647 plugin_start_addr, plugin_end_addr, plugin_start };
648 #else /* SIMULATOR */
649 #define PLUGIN_HEADER \
650 const struct plugin_header __header = { \
651 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
652 NULL, NULL, plugin_start };
653 #endif /* SIMULATOR */
656 /* Declare IRAM variables */
657 #define PLUGIN_IRAM_DECLARE \
658 extern char iramcopy[]; \
659 extern char iramstart[]; \
660 extern char iramend[]; \
661 extern char iedata[]; \
663 /* Initialize IRAM */
664 #define PLUGIN_IRAM_INIT(api) \
665 (api)->plugin_iram_init(iramstart, iramcopy, iramend-iramstart, \
666 iedata, iend-iedata);
668 #define PLUGIN_IRAM_DECLARE
669 #define PLUGIN_IRAM_INIT(api)
670 #endif /* USE_IRAM */
673 int plugin_load(const char* plugin
, void* parameter
);
674 void* plugin_get_buffer(size_t *buffer_size
);
675 void* plugin_get_audio_buffer(size_t *buffer_size
);
677 void plugin_iram_init(char *iramstart
, char *iramcopy
, size_t iram_size
,
678 char *iedata
, size_t iedata_size
);
682 callback returns true to allow the new plugin to load,
683 reenter means the currently running plugin is being reloaded */
684 void plugin_tsr(bool (*exit_callback
)(bool reenter
));
686 /* defined by the plugin */
687 enum plugin_status
plugin_start(struct plugin_api
* rockbox
, void* parameter
)
690 /* Use this macro in plugins where gcc tries to optimize by calling
691 * these functions directly */
692 #define MEM_FUNCTION_WRAPPERS(api) \
693 void *memcpy(void *dest, const void *src, size_t n) \
695 return (api)->memcpy(dest, src, n); \
697 void *memset(void *dest, int c, size_t n) \
699 return (api)->memset(dest, c, n); \
701 void *memmove(void *dest, const void *src, size_t n) \
703 return (api)->memmove(dest, src, n); \
705 int memcmp(const void *s1, const void *s2, size_t n) \
707 return (api)->memcmp(s1, s2, n); \