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 void* plugin_get_buffer(size_t *buffer_size
);
59 #include "mp3_playback.h"
65 #if (CONFIG_CODEC == SWCODEC)
71 #include "recording.h"
75 #endif /* CONFIG_CODEC == SWCODEC */
79 #ifdef HAVE_LCD_BITMAP
80 #include "scrollbar.h"
82 #include "statusbar.h"
84 #include "rbunicode.h"
87 #include "color_picker.h"
88 #include "buffering.h"
91 #include "ata_idle_notify.h"
97 #ifdef HAVE_REMOTE_LCD
98 #include "lcd-remote.h"
105 #if defined(DEBUG) || defined(SIMULATOR)
107 #define DEBUGF rb->debugf
109 #define LDEBUGF rb->debugf
115 #ifdef ROCKBOX_HAS_LOGF
117 #define LOGF rb->logf
125 #define PREFIX(_x_) sim_ ## _x_
127 #define PREFIX(_x_) _x_
130 #define PLUGIN_MAGIC 0x526F634B /* RocK */
132 /* increase this every time the api struct changes */
133 #define PLUGIN_API_VERSION 125
135 /* update this to latest version if a change to the api struct breaks
136 backwards compatibility (and please take the opportunity to sort in any
137 new function which are "waiting" at the end of the function table) */
138 #define PLUGIN_MIN_API_VERSION 125
140 /* plugin return codes */
143 PLUGIN_USB_CONNECTED
,
147 /* NOTE: To support backwards compatibility, only add new functions at
148 the end of the structure. Every time you add a new function,
149 remember to increase PLUGIN_API_VERSION. If you make changes to the
150 existing APIs then also update PLUGIN_MIN_API_VERSION to current
156 void (*lcd_set_contrast
)(int x
);
157 void (*lcd_update
)(void);
158 void (*lcd_clear_display
)(void);
159 int (*lcd_getstringsize
)(const unsigned char *str
, int *w
, int *h
);
160 void (*lcd_putsxy
)(int x
, int y
, const unsigned char *string
);
161 void (*lcd_puts
)(int x
, int y
, const unsigned char *string
);
162 void (*lcd_puts_scroll
)(int x
, int y
, const unsigned char* string
);
163 void (*lcd_stop_scroll
)(void);
164 #ifdef HAVE_LCD_CHARCELLS
165 void (*lcd_define_pattern
)(unsigned long ucs
, const char *pattern
);
166 unsigned long (*lcd_get_locked_pattern
)(void);
167 void (*lcd_unlock_pattern
)(unsigned long ucs
);
168 void (*lcd_putc
)(int x
, int y
, unsigned long ucs
);
169 void (*lcd_put_cursor
)(int x
, int y
, unsigned long ucs
);
170 void (*lcd_remove_cursor
)(void);
171 void (*lcd_icon
)(int icon
, bool enable
);
172 void (*lcd_double_height
)(bool on
);
173 #else /* HAVE_LCD_BITMAP */
174 fb_data
* lcd_framebuffer
;
175 void (*lcd_update_rect
)(int x
, int y
, int width
, int height
);
176 void (*lcd_set_drawmode
)(int mode
);
177 int (*lcd_get_drawmode
)(void);
178 void (*lcd_setfont
)(int font
);
179 void (*lcd_drawpixel
)(int x
, int y
);
180 void (*lcd_drawline
)(int x1
, int y1
, int x2
, int y2
);
181 void (*lcd_hline
)(int x1
, int x2
, int y
);
182 void (*lcd_vline
)(int x
, int y1
, int y2
);
183 void (*lcd_drawrect
)(int x
, int y
, int width
, int height
);
184 void (*lcd_fillrect
)(int x
, int y
, int width
, int height
);
185 void (*lcd_mono_bitmap_part
)(const unsigned char *src
, int src_x
, int src_y
,
186 int stride
, int x
, int y
, int width
, int height
);
187 void (*lcd_mono_bitmap
)(const unsigned char *src
, int x
, int y
,
188 int width
, int height
);
190 void (*lcd_set_foreground
)(unsigned foreground
);
191 unsigned (*lcd_get_foreground
)(void);
192 void (*lcd_set_background
)(unsigned foreground
);
193 unsigned (*lcd_get_background
)(void);
194 void (*lcd_bitmap_part
)(const fb_data
*src
, int src_x
, int src_y
,
195 int stride
, int x
, int y
, int width
, int height
);
196 void (*lcd_bitmap
)(const fb_data
*src
, int x
, int y
, int width
,
198 fb_data
* (*lcd_get_backdrop
)(void);
199 void (*lcd_set_backdrop
)(fb_data
* backdrop
);
202 void (*lcd_bitmap_transparent_part
)(const fb_data
*src
,
203 int src_x
, int src_y
, int stride
,
204 int x
, int y
, int width
, int height
);
205 void (*lcd_bitmap_transparent
)(const fb_data
*src
, int x
, int y
,
206 int width
, int height
);
207 void (*lcd_blit_yuv
)(unsigned char * const src
[3],
208 int src_x
, int src_y
, int stride
,
209 int x
, int y
, int width
, int height
);
210 #if defined(TOSHIBA_GIGABEAT_F) || defined(SANSA_E200) || defined(SANSA_C200) \
211 || defined(IRIVER_H10) || defined(COWON_D2)
212 void (*lcd_yuv_set_options
)(unsigned options
);
214 #elif (LCD_DEPTH < 4) && !defined(SIMULATOR)
215 void (*lcd_blit_mono
)(const unsigned char *data
, int x
, int by
, int width
,
216 int bheight
, int stride
);
217 void (*lcd_blit_grey_phase
)(unsigned char *values
, unsigned char *phases
,
218 int bx
, int by
, int bwidth
, int bheight
,
220 #endif /* LCD_DEPTH */
221 void (*lcd_puts_style
)(int x
, int y
, const unsigned char *str
, int style
);
222 void (*lcd_puts_scroll_style
)(int x
, int y
, const unsigned char* string
,
224 #ifdef HAVE_LCD_INVERT
225 void (*lcd_set_invert_display
)(bool yesno
);
226 #endif /* HAVE_LCD_INVERT */
228 #ifdef HAVE_LCD_ENABLE
229 void (*lcd_set_enable_hook
)(void (*enable_hook
)(void));
230 struct event_queue
*button_queue
;
232 unsigned short *(*bidi_l2v
)( const unsigned char *str
, int orientation
);
233 const unsigned char *(*font_get_bits
)( struct font
*pf
, unsigned short char_code
);
234 struct font
* (*font_load
)(const char *path
);
235 struct font
* (*font_get
)(int font
);
236 int (*font_getstringsize
)(const unsigned char *str
, int *w
, int *h
,
238 int (*font_get_width
)(struct font
* pf
, unsigned short char_code
);
239 void (*screen_clear_area
)(struct screen
* display
, int xstart
, int ystart
,
240 int width
, int height
);
241 void (*gui_scrollbar_draw
)(struct screen
* screen
, int x
, int y
,
242 int width
, int height
, int items
,
243 int min_shown
, int max_shown
,
245 #endif /* HAVE_LCD_BITMAP */
248 void (*backlight_on
)(void);
249 void (*backlight_off
)(void);
250 void (*backlight_set_timeout
)(int index
);
251 #ifdef HAVE_BACKLIGHT_BRIGHTNESS
252 void (*backlight_set_brightness
)(int val
);
253 #endif /* HAVE_BACKLIGHT_BRIGHTNESS */
256 void (*backlight_set_timeout_plugged
)(int index
);
258 bool (*is_backlight_on
)(bool ignore_always_off
);
259 void (*splash
)(int ticks
, const char *str
);
260 void (*splashf
)(int ticks
, const char *fmt
, ...) ATTRIBUTE_PRINTF(2, 3);
262 #ifdef HAVE_REMOTE_LCD
264 void (*lcd_remote_set_contrast
)(int x
);
265 void (*lcd_remote_clear_display
)(void);
266 void (*lcd_remote_puts
)(int x
, int y
, const unsigned char *string
);
267 void (*lcd_remote_puts_scroll
)(int x
, int y
, const unsigned char* string
);
268 void (*lcd_remote_stop_scroll
)(void);
269 void (*lcd_remote_set_drawmode
)(int mode
);
270 int (*lcd_remote_get_drawmode
)(void);
271 void (*lcd_remote_setfont
)(int font
);
272 int (*lcd_remote_getstringsize
)(const unsigned char *str
, int *w
, int *h
);
273 void (*lcd_remote_drawpixel
)(int x
, int y
);
274 void (*lcd_remote_drawline
)(int x1
, int y1
, int x2
, int y2
);
275 void (*lcd_remote_hline
)(int x1
, int x2
, int y
);
276 void (*lcd_remote_vline
)(int x
, int y1
, int y2
);
277 void (*lcd_remote_drawrect
)(int x
, int y
, int nx
, int ny
);
278 void (*lcd_remote_fillrect
)(int x
, int y
, int nx
, int ny
);
279 void (*lcd_remote_mono_bitmap_part
)(const unsigned char *src
, int src_x
,
280 int src_y
, int stride
, int x
, int y
,
281 int width
, int height
);
282 void (*lcd_remote_mono_bitmap
)(const unsigned char *src
, int x
, int y
,
283 int width
, int height
);
284 void (*lcd_remote_putsxy
)(int x
, int y
, const unsigned char *string
);
285 void (*lcd_remote_puts_style
)(int x
, int y
, const unsigned char *str
, int style
);
286 void (*lcd_remote_puts_scroll_style
)(int x
, int y
, const unsigned char* string
,
288 fb_remote_data
* lcd_remote_framebuffer
;
289 void (*lcd_remote_update
)(void);
290 void (*lcd_remote_update_rect
)(int x
, int y
, int width
, int height
);
292 void (*remote_backlight_on
)(void);
293 void (*remote_backlight_off
)(void);
294 void (*remote_backlight_set_timeout
)(int index
);
296 void (*remote_backlight_set_timeout_plugged
)(int index
);
298 #endif /* HAVE_REMOTE_LCD */
299 struct screen
* screens
[NB_SCREENS
];
300 #if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)
301 void (*lcd_remote_set_foreground
)(unsigned foreground
);
302 unsigned (*lcd_remote_get_foreground
)(void);
303 void (*lcd_remote_set_background
)(unsigned background
);
304 unsigned (*lcd_remote_get_background
)(void);
305 void (*lcd_remote_bitmap_part
)(const fb_remote_data
*src
, int src_x
, int src_y
,
306 int stride
, int x
, int y
, int width
, int height
);
307 void (*lcd_remote_bitmap
)(const fb_remote_data
*src
, int x
, int y
, int width
,
310 void (*viewport_set_defaults
)(struct viewport
*vp
, enum screen_type screen
);
312 void (*gui_synclist_init
)(struct gui_synclist
* lists
,
313 list_get_name callback_get_item_name
, void * data
,
314 bool scroll_all
,int selected_size
,
315 struct viewport parent
[NB_SCREENS
]);
316 void (*gui_synclist_set_nb_items
)(struct gui_synclist
* lists
, int nb_items
);
317 void (*gui_synclist_set_icon_callback
)(struct gui_synclist
* lists
, list_get_icon icon_callback
);
318 int (*gui_synclist_get_nb_items
)(struct gui_synclist
* lists
);
319 int (*gui_synclist_get_sel_pos
)(struct gui_synclist
* lists
);
320 void (*gui_synclist_draw
)(struct gui_synclist
* lists
);
321 void (*gui_synclist_select_item
)(struct gui_synclist
* lists
,
323 void (*gui_synclist_add_item
)(struct gui_synclist
* lists
);
324 void (*gui_synclist_del_item
)(struct gui_synclist
* lists
);
325 void (*gui_synclist_limit_scroll
)(struct gui_synclist
* lists
, bool scroll
);
326 bool (*gui_synclist_do_button
)(struct gui_synclist
* lists
,
327 unsigned *action
, enum list_wrap wrap
);
328 void (*gui_synclist_set_title
)(struct gui_synclist
*lists
, char* title
, int icon
);
329 enum yesno_res (*gui_syncyesno_run
)(const struct text_message
* main_message
,
330 const struct text_message
* yes_message
,
331 const struct text_message
* no_message
);
332 void (*simplelist_info_init
)(struct simplelist_info
*info
, char* title
,
333 int count
, void* data
);
334 bool (*simplelist_show_list
)(struct simplelist_info
*info
);
337 long (*button_get
)(bool block
);
338 long (*button_get_w_tmo
)(int ticks
);
339 int (*button_status
)(void);
340 #ifdef HAVE_BUTTON_DATA
341 intptr_t (*button_get_data
)(void);
343 void (*button_clear_queue
)(void);
344 int (*button_queue_count
)(void);
345 #ifdef HAS_BUTTON_HOLD
346 bool (*button_hold
)(void);
348 #ifdef HAVE_TOUCHSCREEN
349 void (*touchscreen_set_mode
)(enum touchscreen_mode
);
351 #ifdef HAVE_BUTTON_LIGHT
352 void (*buttonlight_set_timeout
)(int value
);
353 void (*buttonlight_off
)(void);
354 void (*buttonlight_on
)(void);
355 #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS
356 void (*buttonlight_set_brightness
)(int val
);
357 #endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */
358 #endif /* HAVE_BUTTON_LIGHT */
361 int (*PREFIX(open
))(const char* pathname
, int flags
);
362 int (*PREFIX(close
))(int fd
);
363 ssize_t (*PREFIX(read
))(int fd
, void* buf
, size_t count
);
364 off_t (*PREFIX(lseek
))(int fd
, off_t offset
, int whence
);
365 int (*PREFIX(creat
))(const char *pathname
);
366 ssize_t (*PREFIX(write
))(int fd
, const void* buf
, size_t count
);
367 int (*PREFIX(remove
))(const char* pathname
);
368 int (*PREFIX(rename
))(const char* path
, const char* newname
);
369 int (*PREFIX(ftruncate
))(int fd
, off_t length
);
370 off_t (*PREFIX(filesize
))(int fd
);
371 int (*fdprintf
)(int fd
, const char *fmt
, ...) ATTRIBUTE_PRINTF(2, 3);
372 int (*read_line
)(int fd
, char* buffer
, int buffer_size
);
373 bool (*settings_parseline
)(char* line
, char** name
, char** value
);
374 void (*ata_sleep
)(void);
375 void (*ata_spin
)(void);
376 void (*ata_spindown
)(int seconds
);
377 #if USING_ATA_CALLBACK
378 void (*register_ata_idle_func
)(ata_idle_notify function
);
379 void (*unregister_ata_idle_func
)(ata_idle_notify function
, bool run
);
380 #endif /* USING_ATA_CALLBACK */
381 void (*reload_directory
)(void);
382 char *(*create_numbered_filename
)(char *buffer
, const char *path
,
383 const char *prefix
, const char *suffix
,
384 int numberlen
IF_CNFN_NUM_(, int *num
));
385 bool (*file_exists
)(const char *file
);
389 DIR* (*opendir
)(const char* name
);
390 int (*closedir
)(DIR* dir
);
391 struct dirent
* (*readdir
)(DIR* dir
);
392 int (*mkdir
)(const char *name
);
393 int (*rmdir
)(const char *name
);
394 bool (*dir_exists
)(const char *path
);
397 void (*PREFIX(sleep
))(int ticks
);
399 volatile long* current_tick
;
400 long (*default_event_handler
)(long event
);
401 long (*default_event_handler_ex
)(long event
, void (*callback
)(void *), void *parameter
);
402 struct thread_entry
* threads
;
403 struct thread_entry
* (*create_thread
)(void (*function
)(void), void* stack
,
404 size_t stack_size
, unsigned flags
,
406 IF_PRIO(, int priority
)
407 IF_COP(, unsigned int core
));
408 void (*thread_exit
)(void);
409 void (*thread_wait
)(struct thread_entry
*thread
);
410 #if CONFIG_CODEC == SWCODEC
411 void (*mutex_init
)(struct mutex
*m
);
412 void (*mutex_lock
)(struct mutex
*m
);
413 void (*mutex_unlock
)(struct mutex
*m
);
414 size_t (*align_buffer
)(void **start
, size_t size
, size_t align
);
417 void (*reset_poweroff_timer
)(void);
419 int (*system_memory_guard
)(int newmode
);
421 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
422 #ifdef CPU_BOOST_LOGGING
423 void (*cpu_boost_
)(bool on_off
,char*location
,int line
);
425 void (*cpu_boost
)(bool on_off
);
427 #endif /* HAVE_ADJUSTABLE_CPU_FREQ */
428 #endif /* !SIMULATOR */
429 #ifdef HAVE_SCHEDULER_BOOSTCTRL
430 void (*trigger_cpu_boost
)(void);
431 void (*cancel_cpu_boost
)(void);
433 #ifdef CACHE_FUNCTIONS_AS_CALL
434 void (*flush_icache
)(void);
435 void (*invalidate_icache
)(void);
437 bool (*timer_register
)(int reg_prio
, void (*unregister_callback
)(void),
438 long cycles
, int int_prio
,
439 void (*timer_callback
)(void) IF_COP(, int core
));
440 void (*timer_unregister
)(void);
441 bool (*timer_set_period
)(long count
);
443 void (*queue_init
)(struct event_queue
*q
, bool register_queue
);
444 void (*queue_delete
)(struct event_queue
*q
);
445 void (*queue_post
)(struct event_queue
*q
, long id
, intptr_t data
);
446 void (*queue_wait_w_tmo
)(struct event_queue
*q
, struct queue_event
*ev
,
448 #if CONFIG_CODEC == SWCODEC
449 void (*queue_enable_queue_send
)(struct event_queue
*q
,
450 struct queue_sender_list
*send
,
451 struct thread_entry
*owner
);
452 bool (*queue_empty
)(const struct event_queue
*q
);
453 void (*queue_wait
)(struct event_queue
*q
, struct queue_event
*ev
);
454 intptr_t (*queue_send
)(struct event_queue
*q
, long id
,
456 void (*queue_reply
)(struct event_queue
*q
, intptr_t retval
);
457 #endif /* CONFIG_CODEC == SWCODEC */
459 void (*usb_acknowledge
)(long id
);
461 void (*profile_thread
)(void);
462 void (*profstop
)(void);
463 void (*profile_func_enter
)(void *this_fn
, void *call_site
);
464 void (*profile_func_exit
)(void *this_fn
, void *call_site
);
468 /* special simulator hooks */
469 #if defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8
470 void (*sim_lcd_ex_init
)(int shades
, unsigned long (*getpixel
)(int, int));
471 void (*sim_lcd_ex_update_rect
)(int x
, int y
, int width
, int height
);
475 /* strings and memory */
476 int (*snprintf
)(char *buf
, size_t size
, const char *fmt
, ...)
477 ATTRIBUTE_PRINTF(3, 4);
478 int (*vsnprintf
)(char *buf
, int size
, const char *fmt
, va_list ap
);
479 char* (*strcpy
)(char *dst
, const char *src
);
480 char* (*strncpy
)(char *dst
, const char *src
, size_t length
);
481 size_t (*strlen
)(const char *str
);
482 char * (*strrchr
)(const char *s
, int c
);
483 int (*strcmp
)(const char *, const char *);
484 int (*strncmp
)(const char *, const char *, size_t);
485 int (*strcasecmp
)(const char *, const char *);
486 int (*strncasecmp
)(const char *s1
, const char *s2
, size_t n
);
487 void* (*memset
)(void *dst
, int c
, size_t length
);
488 void* (*memcpy
)(void *out
, const void *in
, size_t n
);
489 void* (*memmove
)(void *out
, const void *in
, size_t n
);
490 const unsigned char *_ctype_
;
491 int (*atoi
)(const char *str
);
492 char *(*strchr
)(const char *s
, int c
);
493 char *(*strcat
)(char *s1
, const char *s2
);
494 void *(*memchr
)(const void *s1
, int c
, size_t n
);
495 int (*memcmp
)(const void *s1
, const void *s2
, size_t n
);
496 char *(*strcasestr
) (const char* phaystack
, const char* pneedle
);
497 char* (*strtok_r
)(char *ptr
, const char *sep
, char **end
);
499 const unsigned char* (*utf8decode
)(const unsigned char *utf8
, unsigned short *ucs
);
500 unsigned char* (*iso_decode
)(const unsigned char *iso
, unsigned char *utf8
, int cp
, int count
);
501 unsigned char* (*utf16LEdecode
)(const unsigned char *utf16
, unsigned char *utf8
, int count
);
502 unsigned char* (*utf16BEdecode
)(const unsigned char *utf16
, unsigned char *utf8
, int count
);
503 unsigned char* (*utf8encode
)(unsigned long ucs
, unsigned char *utf8
);
504 unsigned long (*utf8length
)(const unsigned char *utf8
);
505 int (*utf8seek
)(const unsigned char* utf8
, int offset
);
508 void (*sound_set
)(int setting
, int value
);
509 int (*sound_default
)(int setting
);
510 int (*sound_min
)(int setting
);
511 int (*sound_max
)(int setting
);
512 const char * (*sound_unit
)(int setting
);
513 int (*sound_val2phys
)(int setting
, int value
);
515 void (*mp3_play_data
)(const unsigned char* start
, int size
, void (*get_more
)(unsigned char** start
, size_t* size
));
516 void (*mp3_play_pause
)(bool play
);
517 void (*mp3_play_stop
)(void);
518 bool (*mp3_is_playing
)(void);
519 #if CONFIG_CODEC != SWCODEC
520 void (*bitswap
)(unsigned char *data
, int length
);
522 #endif /* !SIMULATOR */
523 #if CONFIG_CODEC == SWCODEC
524 const unsigned long *audio_master_sampr_list
;
525 const unsigned long *hw_freq_sampr
;
526 void (*pcm_apply_settings
)(void);
527 void (*pcm_play_data
)(pcm_more_callback_type get_more
,
528 unsigned char* start
, size_t size
);
529 void (*pcm_play_stop
)(void);
530 void (*pcm_set_frequency
)(unsigned int frequency
);
531 bool (*pcm_is_playing
)(void);
532 bool (*pcm_is_paused
)(void);
533 void (*pcm_play_pause
)(bool play
);
534 size_t (*pcm_get_bytes_waiting
)(void);
535 void (*pcm_calculate_peaks
)(int *left
, int *right
);
536 void (*pcm_play_lock
)(void);
537 void (*pcm_play_unlock
)(void);
538 #ifdef HAVE_RECORDING
539 const unsigned long *rec_freq_sampr
;
540 void (*pcm_init_recording
)(void);
541 void (*pcm_close_recording
)(void);
542 void (*pcm_record_data
)(pcm_more_callback_type2 more_ready
,
543 void *start
, size_t size
);
544 void (*pcm_record_more
)(void *start
, size_t size
);
545 void (*pcm_stop_recording
)(void);
546 void (*pcm_calculate_rec_peaks
)(int *left
, int *right
);
547 void (*audio_set_recording_gain
)(int left
, int right
, int type
);
548 #endif /* HAVE_RECORDING */
549 #if INPUT_SRC_CAPS != 0
550 void (*audio_set_output_source
)(int monitor
);
551 void (*audio_set_input_source
)(int source
, unsigned flags
);
553 void (*dsp_set_crossfeed
)(bool enable
);
554 void (*dsp_set_eq
)(bool enable
);
555 void (*dsp_dither_enable
)(bool enable
);
556 intptr_t (*dsp_configure
)(struct dsp_config
*dsp
, int setting
,
558 int (*dsp_process
)(struct dsp_config
*dsp
, char *dest
,
559 const char *src
[], int count
);
560 #endif /* CONFIG_CODEC == SWCODC */
562 /* playback control */
563 int (*playlist_amount
)(void);
564 int (*playlist_resume
)(void);
565 int (*playlist_start
)(int start_index
, int offset
);
566 void (*PREFIX(audio_play
))(long offset
);
567 void (*audio_stop
)(void);
568 void (*audio_pause
)(void);
569 void (*audio_resume
)(void);
570 void (*audio_next
)(void);
571 void (*audio_prev
)(void);
572 void (*audio_ff_rewind
)(long newtime
);
573 struct mp3entry
* (*audio_next_track
)(void);
574 int (*audio_status
)(void);
575 bool (*audio_has_changed_track
)(void);
576 struct mp3entry
* (*audio_current_track
)(void);
577 void (*audio_flush_and_reload_tracks
)(void);
578 int (*audio_get_file_pos
)(void);
579 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
580 unsigned long (*mpeg_get_last_header
)(void);
582 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) || \
583 (CONFIG_CODEC == SWCODEC)
584 void (*sound_set_pitch
)(int pitch
);
587 /* MAS communication */
588 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
589 int (*mas_readmem
)(int bank
, int addr
, unsigned long* dest
, int len
);
590 int (*mas_writemem
)(int bank
, int addr
, const unsigned long* src
, int len
);
591 int (*mas_readreg
)(int reg
);
592 int (*mas_writereg
)(int reg
, unsigned int val
);
593 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
594 int (*mas_codec_writereg
)(int reg
, unsigned int val
);
595 int (*mas_codec_readreg
)(int reg
);
596 void (*i2c_begin
)(void);
597 void (*i2c_end
)(void);
598 int (*i2c_write
)(int address
, const unsigned char* buf
, int count
);
603 int (*do_menu
)(const struct menu_item_ex
*menu
, int *start_selected
,
604 struct viewport parent
[NB_SCREENS
], bool hide_bars
);
607 struct gui_syncstatusbar
*statusbars
;
608 void (*gui_syncstatusbar_draw
)(struct gui_syncstatusbar
* bars
, bool force_redraw
);
611 const struct settings_list
* (*find_setting
)(const void* variable
, int *id
);
612 bool (*option_screen
)(const struct settings_list
*setting
,
613 struct viewport parent
[NB_SCREENS
],
614 bool use_temp_var
, unsigned char* option_title
);
615 bool (*set_option
)(const char* string
, const void* variable
,
616 enum optiontype type
, const struct opt_items
* options
,
617 int numoptions
, void (*function
)(int));
618 bool (*set_bool_options
)(const char* string
, const bool* variable
,
619 const char* yes_str
, int yes_voice
,
620 const char* no_str
, int no_voice
,
621 void (*function
)(bool));
622 bool (*set_int
)(const unsigned char* string
, const char* unit
, int voice_unit
,
623 const int* variable
, void (*function
)(int), int step
,
625 void (*formatter
)(char*, size_t, int, const char*) );
626 bool (*set_bool
)(const char* string
, const bool* variable
);
628 #ifdef HAVE_LCD_COLOR
629 bool (*set_color
)(struct screen
*display
, char *title
, unsigned *color
,
630 unsigned banned_color
);
632 /* action handling */
633 int (*get_custom_action
)(int context
,int timeout
,
634 const struct button_mapping
* (*get_context_map
)(int));
635 int (*get_action
)(int context
, int timeout
);
636 bool (*action_userabort
)(int timeout
);
639 int (*battery_level
)(void);
640 bool (*battery_level_safe
)(void);
641 int (*battery_time
)(void);
643 unsigned int (*battery_voltage
)(void);
646 bool (*charger_inserted
)(void);
647 # if CONFIG_CHARGING == CHARGING_MONITOR
648 bool (*charging_state
)(void);
651 #ifdef HAVE_USB_POWER
652 bool (*usb_powered
)(void);
656 void (*srand
)(unsigned int seed
);
658 void (*qsort
)(void *base
, size_t nmemb
, size_t size
,
659 int(*compar
)(const void *, const void *));
660 int (*kbd_input
)(char* buffer
, int buflen
);
661 struct tm
* (*get_time
)(void);
662 int (*set_time
)(const struct tm
*tm
);
664 time_t (*mktime
)(struct tm
*t
);
666 void* (*plugin_get_buffer
)(size_t *buffer_size
);
667 void* (*plugin_get_audio_buffer
)(size_t *buffer_size
);
668 void (*plugin_tsr
)(bool (*exit_callback
)(bool reenter
));
669 char* (*plugin_get_current_filename
)(void);
670 #ifdef PLUGIN_USE_IRAM
671 void (*plugin_iram_init
)(char *iramstart
, char *iramcopy
, size_t iram_size
,
672 char *iedata
, size_t iedata_size
);
674 #if defined(DEBUG) || defined(SIMULATOR)
675 void (*debugf
)(const char *fmt
, ...) ATTRIBUTE_PRINTF(1, 2);
677 #ifdef ROCKBOX_HAS_LOGF
678 void (*logf
)(const char *fmt
, ...) ATTRIBUTE_PRINTF(1, 2);
680 struct user_settings
* global_settings
;
681 struct system_status
*global_status
;
682 void (*talk_disable
)(bool disable
);
683 #if CONFIG_CODEC == SWCODEC
684 int (*codec_load_file
)(const char* codec
, struct codec_api
*api
);
685 const char *(*get_codec_filename
)(int cod_spec
);
686 bool (*get_metadata
)(struct mp3entry
* id3
, int fd
, const char* trackname
);
688 bool (*mp3info
)(struct mp3entry
*entry
, const char *filename
);
689 int (*count_mp3_frames
)(int fd
, int startpos
, int filesize
,
690 void (*progressfunc
)(int));
691 int (*create_xing_header
)(int fd
, long startpos
, long filesize
,
692 unsigned char *buf
, unsigned long num_frames
,
693 unsigned long rec_time
, unsigned long header_template
,
694 void (*progressfunc
)(int), bool generate_toc
);
695 unsigned long (*find_next_frame
)(int fd
, long *offset
,
696 long max_offset
, unsigned long last_header
);
698 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
699 unsigned short (*peak_meter_scale_value
)(unsigned short val
,
701 void (*peak_meter_set_use_dbfs
)(bool use
);
702 bool (*peak_meter_get_use_dbfs
)(void);
704 #ifdef HAVE_LCD_BITMAP
705 int (*read_bmp_file
)(const char* filename
, struct bitmap
*bm
, int maxsize
,
707 void (*screen_dump_set_hook
)(void (*hook
)(int fh
));
709 int (*show_logo
)(void);
710 struct tree_context
* (*tree_get_context
)(void);
711 void (*set_current_file
)(char* path
);
712 void (*set_dirfilter
)(int l_dirfilter
);
714 #ifdef HAVE_WHEEL_POSITION
715 int (*wheel_status
)(void);
716 void (*wheel_send_events
)(bool send
);
719 #ifdef IRIVER_H100_SERIES
720 /* Routines for the iriver_flash -plugin. */
721 bool (*detect_original_firmware
)(void);
722 bool (*detect_flashed_ramimage
)(void);
723 bool (*detect_flashed_romimage
)(void);
726 void (*led
)(bool on
);
728 #if (CONFIG_CODEC == SWCODEC)
730 int (*bufopen
)(const char *file
, size_t offset
, enum data_type type
);
731 int (*bufalloc
)(const void *src
, size_t size
, enum data_type type
);
732 bool (*bufclose
)(int handle_id
);
733 int (*bufseek
)(int handle_id
, size_t newpos
);
734 int (*bufadvance
)(int handle_id
, off_t offset
);
735 ssize_t (*bufread
)(int handle_id
, size_t size
, void *dest
);
736 ssize_t (*bufgetdata
)(int handle_id
, size_t size
, void **data
);
737 ssize_t (*bufgettail
)(int handle_id
, size_t size
, void **data
);
738 ssize_t (*bufcuttail
)(int handle_id
, size_t size
);
740 ssize_t (*buf_get_offset
)(int handle_id
, void *ptr
);
741 ssize_t (*buf_handle_offset
)(int handle_id
);
742 void (*buf_request_buffer_handle
)(int handle_id
);
743 void (*buf_set_base_handle
)(int handle_id
);
744 size_t (*buf_used
)(void);
748 bool (*tagcache_search
)(struct tagcache_search
*tcs
, int tag
);
749 void (*tagcache_search_set_uniqbuf
)(struct tagcache_search
*tcs
,
750 void *buffer
, long length
);
751 bool (*tagcache_search_add_filter
)(struct tagcache_search
*tcs
,
753 bool (*tagcache_get_next
)(struct tagcache_search
*tcs
);
754 bool (*tagcache_retrieve
)(struct tagcache_search
*tcs
, int idxid
,
755 int tag
, char *buf
, long size
);
756 void (*tagcache_search_finish
)(struct tagcache_search
*tcs
);
757 long (*tagcache_get_numeric
)(const struct tagcache_search
*tcs
, int tag
);
761 bool (*find_albumart
)(const struct mp3entry
*id3
, char *buf
, int buflen
);
762 bool (*search_albumart_files
)(const struct mp3entry
*id3
, const char *size_string
,
763 char *buf
, int buflen
);
766 void (*thread_thaw
)(struct thread_entry
*thread
);
768 #ifdef HAVE_SEMAPHORE_OBJECTS
769 void (*semaphore_init
)(struct semaphore
*s
, int max
, int start
);
770 void (*semaphore_wait
)(struct semaphore
*s
);
771 void (*semaphore_release
)(struct semaphore
*s
);
774 const char *appsversion
;
775 /* new stuff at the end, sort into place next time
776 the API gets incompatible */
781 struct plugin_header
{
783 unsigned short target_id
;
784 unsigned short api_version
;
785 unsigned char *load_addr
;
786 unsigned char *end_addr
;
787 enum plugin_status(*entry_point
)(const struct plugin_api
*, const void*);
792 extern unsigned char plugin_start_addr
[];
793 extern unsigned char plugin_end_addr
[];
794 #define PLUGIN_HEADER \
795 const struct plugin_header __header \
796 __attribute__ ((section (".header")))= { \
797 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
798 plugin_start_addr, plugin_end_addr, plugin_start };
799 #else /* SIMULATOR */
800 #define PLUGIN_HEADER \
801 const struct plugin_header __header \
802 __attribute__((visibility("default"))) = { \
803 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
804 NULL, NULL, plugin_start };
805 #endif /* SIMULATOR */
807 #ifdef PLUGIN_USE_IRAM
808 /* Declare IRAM variables */
809 #define PLUGIN_IRAM_DECLARE \
810 extern char iramcopy[]; \
811 extern char iramstart[]; \
812 extern char iramend[]; \
813 extern char iedata[]; \
815 /* Initialize IRAM */
816 #define PLUGIN_IRAM_INIT(api) \
817 (api)->plugin_iram_init(iramstart, iramcopy, iramend-iramstart, \
818 iedata, iend-iedata);
820 #define PLUGIN_IRAM_DECLARE
821 #define PLUGIN_IRAM_INIT(api)
822 #endif /* PLUGIN_USE_IRAM */
825 int plugin_load(const char* plugin
, const void* parameter
);
826 void* plugin_get_audio_buffer(size_t *buffer_size
);
827 #ifdef PLUGIN_USE_IRAM
828 void plugin_iram_init(char *iramstart
, char *iramcopy
, size_t iram_size
,
829 char *iedata
, size_t iedata_size
);
833 callback returns true to allow the new plugin to load,
834 reenter means the currently running plugin is being reloaded */
835 void plugin_tsr(bool (*exit_callback
)(bool reenter
));
837 /* defined by the plugin */
838 enum plugin_status
plugin_start(const struct plugin_api
* rockbox
, const void* parameter
)
841 /* Use this macro in plugins where gcc tries to optimize by calling
842 * these functions directly */
843 #define MEM_FUNCTION_WRAPPERS(api) \
844 void *memcpy(void *dest, const void *src, size_t n) \
846 return (api)->memcpy(dest, src, n); \
848 void *memset(void *dest, int c, size_t n) \
850 return (api)->memset(dest, c, n); \
852 void *memmove(void *dest, const void *src, size_t n) \
854 return (api)->memmove(dest, src, n); \
856 int memcmp(const void *s1, const void *s2, size_t n) \
858 return (api)->memcmp(s1, s2, n); \
861 #ifndef CACHE_FUNCTION_WRAPPERS
863 #ifdef CACHE_FUNCTIONS_AS_CALL
864 #define CACHE_FUNCTION_WRAPPERS(api) \
865 void flush_icache(void) \
867 (api)->flush_icache(); \
869 void invalidate_icache(void) \
871 (api)->invalidate_icache(); \
874 #define CACHE_FUNCTION_WRAPPERS(api)
875 #endif /* CACHE_FUNCTIONS_AS_CALL */
877 #endif /* CACHE_FUNCTION_WRAPPERS */
879 #ifndef ALIGN_BUFFER_WRAPPER
880 #define ALIGN_BUFFER_WRAPPER(api) \
881 size_t align_buffer(void **start, size_t size, size_t align) \
883 return (api)->align_buffer(start, size, align); \
885 #endif /* ALIGN_BUFFER_WRAPPER */
887 #endif /* __PCTOOL__ */