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"
92 #include "settings_list.h"
98 #ifdef HAVE_REMOTE_LCD
99 #include "lcd-remote.h"
106 #if defined(DEBUG) || defined(SIMULATOR)
108 #define DEBUGF rb->debugf
110 #define LDEBUGF rb->debugf
116 #ifdef ROCKBOX_HAS_LOGF
118 #define LOGF rb->logf
126 #define PREFIX(_x_) sim_ ## _x_
128 #define PREFIX(_x_) _x_
131 #define PLUGIN_MAGIC 0x526F634B /* RocK */
133 /* increase this every time the api struct changes */
134 #define PLUGIN_API_VERSION 129
136 /* update this to latest version if a change to the api struct breaks
137 backwards compatibility (and please take the opportunity to sort in any
138 new function which are "waiting" at the end of the function table) */
139 #define PLUGIN_MIN_API_VERSION 129
141 /* plugin return codes */
144 PLUGIN_USB_CONNECTED
,
148 /* NOTE: To support backwards compatibility, only add new functions at
149 the end of the structure. Every time you add a new function,
150 remember to increase PLUGIN_API_VERSION. If you make changes to the
151 existing APIs then also update PLUGIN_MIN_API_VERSION to current
157 void (*lcd_set_contrast
)(int x
);
158 void (*lcd_update
)(void);
159 void (*lcd_clear_display
)(void);
160 int (*lcd_getstringsize
)(const unsigned char *str
, int *w
, int *h
);
161 void (*lcd_putsxy
)(int x
, int y
, const unsigned char *string
);
162 void (*lcd_puts
)(int x
, int y
, const unsigned char *string
);
163 void (*lcd_puts_scroll
)(int x
, int y
, const unsigned char* string
);
164 void (*lcd_stop_scroll
)(void);
165 #ifdef HAVE_LCD_CHARCELLS
166 void (*lcd_define_pattern
)(unsigned long ucs
, const char *pattern
);
167 unsigned long (*lcd_get_locked_pattern
)(void);
168 void (*lcd_unlock_pattern
)(unsigned long ucs
);
169 void (*lcd_putc
)(int x
, int y
, unsigned long ucs
);
170 void (*lcd_put_cursor
)(int x
, int y
, unsigned long ucs
);
171 void (*lcd_remove_cursor
)(void);
172 void (*lcd_icon
)(int icon
, bool enable
);
173 void (*lcd_double_height
)(bool on
);
174 #else /* HAVE_LCD_BITMAP */
175 fb_data
* lcd_framebuffer
;
176 void (*lcd_update_rect
)(int x
, int y
, int width
, int height
);
177 void (*lcd_set_drawmode
)(int mode
);
178 int (*lcd_get_drawmode
)(void);
179 void (*lcd_setfont
)(int font
);
180 void (*lcd_drawpixel
)(int x
, int y
);
181 void (*lcd_drawline
)(int x1
, int y1
, int x2
, int y2
);
182 void (*lcd_hline
)(int x1
, int x2
, int y
);
183 void (*lcd_vline
)(int x
, int y1
, int y2
);
184 void (*lcd_drawrect
)(int x
, int y
, int width
, int height
);
185 void (*lcd_fillrect
)(int x
, int y
, int width
, int height
);
186 void (*lcd_mono_bitmap_part
)(const unsigned char *src
, int src_x
, int src_y
,
187 int stride
, int x
, int y
, int width
, int height
);
188 void (*lcd_mono_bitmap
)(const unsigned char *src
, int x
, int y
,
189 int width
, int height
);
191 void (*lcd_set_foreground
)(unsigned foreground
);
192 unsigned (*lcd_get_foreground
)(void);
193 void (*lcd_set_background
)(unsigned foreground
);
194 unsigned (*lcd_get_background
)(void);
195 void (*lcd_bitmap_part
)(const fb_data
*src
, int src_x
, int src_y
,
196 int stride
, int x
, int y
, int width
, int height
);
197 void (*lcd_bitmap
)(const fb_data
*src
, int x
, int y
, int width
,
199 fb_data
* (*lcd_get_backdrop
)(void);
200 void (*lcd_set_backdrop
)(fb_data
* backdrop
);
203 void (*lcd_bitmap_transparent_part
)(const fb_data
*src
,
204 int src_x
, int src_y
, int stride
,
205 int x
, int y
, int width
, int height
);
206 void (*lcd_bitmap_transparent
)(const fb_data
*src
, int x
, int y
,
207 int width
, int height
);
208 void (*lcd_blit_yuv
)(unsigned char * const src
[3],
209 int src_x
, int src_y
, int stride
,
210 int x
, int y
, int width
, int height
);
211 #if defined(TOSHIBA_GIGABEAT_F) || defined(SANSA_E200) || defined(SANSA_C200) \
212 || defined(IRIVER_H10) || defined(COWON_D2)
213 void (*lcd_yuv_set_options
)(unsigned options
);
215 #elif (LCD_DEPTH < 4) && !defined(SIMULATOR)
216 void (*lcd_blit_mono
)(const unsigned char *data
, int x
, int by
, int width
,
217 int bheight
, int stride
);
218 void (*lcd_blit_grey_phase
)(unsigned char *values
, unsigned char *phases
,
219 int bx
, int by
, int bwidth
, int bheight
,
221 #endif /* LCD_DEPTH */
222 void (*lcd_puts_style
)(int x
, int y
, const unsigned char *str
, int style
);
223 void (*lcd_puts_scroll_style
)(int x
, int y
, const unsigned char* string
,
225 #ifdef HAVE_LCD_INVERT
226 void (*lcd_set_invert_display
)(bool yesno
);
227 #endif /* HAVE_LCD_INVERT */
229 #if defined(HAVE_LCD_ENABLE) && defined(HAVE_LCD_COLOR)
230 void (*lcd_set_enable_hook
)(void (*enable_hook
)(void));
231 struct event_queue
*button_queue
;
233 unsigned short *(*bidi_l2v
)( const unsigned char *str
, int orientation
);
234 const unsigned char *(*font_get_bits
)( struct font
*pf
, unsigned short char_code
);
235 struct font
* (*font_load
)(const char *path
);
236 struct font
* (*font_get
)(int font
);
237 int (*font_getstringsize
)(const unsigned char *str
, int *w
, int *h
,
239 int (*font_get_width
)(struct font
* pf
, unsigned short char_code
);
240 void (*screen_clear_area
)(struct screen
* display
, int xstart
, int ystart
,
241 int width
, int height
);
242 void (*gui_scrollbar_draw
)(struct screen
* screen
, int x
, int y
,
243 int width
, int height
, int items
,
244 int min_shown
, int max_shown
,
246 #endif /* HAVE_LCD_BITMAP */
247 const char* (*get_codepage_name
)(int cp
);
250 /* The backlight_* functions must be present in the API regardless whether
251 * HAVE_BACKLIGHT is defined or not. The reason is that the stock Ondio has
252 * no backlight but can be modded to have backlight (it's prepared on the
253 * PCB). This makes backlight an all-target feature API wise, and keeps API
254 * compatible between stock and modded Ondio.
255 * For OLED targets like the Sansa Clip, the backlight_* functions control
256 * the display enable, which has essentially the same effect. */
257 void (*backlight_on
)(void);
258 void (*backlight_off
)(void);
259 void (*backlight_set_timeout
)(int index
);
260 #ifdef HAVE_BACKLIGHT_BRIGHTNESS
261 void (*backlight_set_brightness
)(int val
);
262 #endif /* HAVE_BACKLIGHT_BRIGHTNESS */
265 void (*backlight_set_timeout_plugged
)(int index
);
267 bool (*is_backlight_on
)(bool ignore_always_off
);
268 void (*splash
)(int ticks
, const char *str
);
269 void (*splashf
)(int ticks
, const char *fmt
, ...) ATTRIBUTE_PRINTF(2, 3);
271 #ifdef HAVE_REMOTE_LCD
273 void (*lcd_remote_set_contrast
)(int x
);
274 void (*lcd_remote_clear_display
)(void);
275 void (*lcd_remote_puts
)(int x
, int y
, const unsigned char *string
);
276 void (*lcd_remote_puts_scroll
)(int x
, int y
, const unsigned char* string
);
277 void (*lcd_remote_stop_scroll
)(void);
278 void (*lcd_remote_set_drawmode
)(int mode
);
279 int (*lcd_remote_get_drawmode
)(void);
280 void (*lcd_remote_setfont
)(int font
);
281 int (*lcd_remote_getstringsize
)(const unsigned char *str
, int *w
, int *h
);
282 void (*lcd_remote_drawpixel
)(int x
, int y
);
283 void (*lcd_remote_drawline
)(int x1
, int y1
, int x2
, int y2
);
284 void (*lcd_remote_hline
)(int x1
, int x2
, int y
);
285 void (*lcd_remote_vline
)(int x
, int y1
, int y2
);
286 void (*lcd_remote_drawrect
)(int x
, int y
, int nx
, int ny
);
287 void (*lcd_remote_fillrect
)(int x
, int y
, int nx
, int ny
);
288 void (*lcd_remote_mono_bitmap_part
)(const unsigned char *src
, int src_x
,
289 int src_y
, int stride
, int x
, int y
,
290 int width
, int height
);
291 void (*lcd_remote_mono_bitmap
)(const unsigned char *src
, int x
, int y
,
292 int width
, int height
);
293 void (*lcd_remote_putsxy
)(int x
, int y
, const unsigned char *string
);
294 void (*lcd_remote_puts_style
)(int x
, int y
, const unsigned char *str
, int style
);
295 void (*lcd_remote_puts_scroll_style
)(int x
, int y
, const unsigned char* string
,
297 fb_remote_data
* lcd_remote_framebuffer
;
298 void (*lcd_remote_update
)(void);
299 void (*lcd_remote_update_rect
)(int x
, int y
, int width
, int height
);
301 void (*remote_backlight_on
)(void);
302 void (*remote_backlight_off
)(void);
303 void (*remote_backlight_set_timeout
)(int index
);
305 void (*remote_backlight_set_timeout_plugged
)(int index
);
307 #endif /* HAVE_REMOTE_LCD */
308 struct screen
* screens
[NB_SCREENS
];
309 #if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)
310 void (*lcd_remote_set_foreground
)(unsigned foreground
);
311 unsigned (*lcd_remote_get_foreground
)(void);
312 void (*lcd_remote_set_background
)(unsigned background
);
313 unsigned (*lcd_remote_get_background
)(void);
314 void (*lcd_remote_bitmap_part
)(const fb_remote_data
*src
, int src_x
, int src_y
,
315 int stride
, int x
, int y
, int width
, int height
);
316 void (*lcd_remote_bitmap
)(const fb_remote_data
*src
, int x
, int y
, int width
,
319 void (*viewport_set_defaults
)(struct viewport
*vp
, enum screen_type screen
);
321 void (*gui_synclist_init
)(struct gui_synclist
* lists
,
322 list_get_name callback_get_item_name
, void * data
,
323 bool scroll_all
,int selected_size
,
324 struct viewport parent
[NB_SCREENS
]);
325 void (*gui_synclist_set_nb_items
)(struct gui_synclist
* lists
, int nb_items
);
326 void (*gui_synclist_set_icon_callback
)(struct gui_synclist
* lists
, list_get_icon icon_callback
);
327 int (*gui_synclist_get_nb_items
)(struct gui_synclist
* lists
);
328 int (*gui_synclist_get_sel_pos
)(struct gui_synclist
* lists
);
329 void (*gui_synclist_draw
)(struct gui_synclist
* lists
);
330 void (*gui_synclist_select_item
)(struct gui_synclist
* lists
,
332 void (*gui_synclist_add_item
)(struct gui_synclist
* lists
);
333 void (*gui_synclist_del_item
)(struct gui_synclist
* lists
);
334 void (*gui_synclist_limit_scroll
)(struct gui_synclist
* lists
, bool scroll
);
335 bool (*gui_synclist_do_button
)(struct gui_synclist
* lists
,
336 unsigned *action
, enum list_wrap wrap
);
337 void (*gui_synclist_set_title
)(struct gui_synclist
*lists
, char* title
, int icon
);
338 enum yesno_res (*gui_syncyesno_run
)(const struct text_message
* main_message
,
339 const struct text_message
* yes_message
,
340 const struct text_message
* no_message
);
341 void (*simplelist_info_init
)(struct simplelist_info
*info
, char* title
,
342 int count
, void* data
);
343 bool (*simplelist_show_list
)(struct simplelist_info
*info
);
346 long (*button_get
)(bool block
);
347 long (*button_get_w_tmo
)(int ticks
);
348 int (*button_status
)(void);
349 #ifdef HAVE_BUTTON_DATA
350 intptr_t (*button_get_data
)(void);
352 void (*button_clear_queue
)(void);
353 int (*button_queue_count
)(void);
354 #ifdef HAS_BUTTON_HOLD
355 bool (*button_hold
)(void);
357 #ifdef HAVE_TOUCHSCREEN
358 void (*touchscreen_set_mode
)(enum touchscreen_mode
);
360 #ifdef HAVE_BUTTON_LIGHT
361 void (*buttonlight_set_timeout
)(int value
);
362 void (*buttonlight_off
)(void);
363 void (*buttonlight_on
)(void);
364 #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS
365 void (*buttonlight_set_brightness
)(int val
);
366 #endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */
367 #endif /* HAVE_BUTTON_LIGHT */
370 int (*PREFIX(open
))(const char* pathname
, int flags
);
371 int (*PREFIX(close
))(int fd
);
372 ssize_t (*PREFIX(read
))(int fd
, void* buf
, size_t count
);
373 off_t (*PREFIX(lseek
))(int fd
, off_t offset
, int whence
);
374 int (*PREFIX(creat
))(const char *pathname
);
375 ssize_t (*PREFIX(write
))(int fd
, const void* buf
, size_t count
);
376 int (*PREFIX(remove
))(const char* pathname
);
377 int (*PREFIX(rename
))(const char* path
, const char* newname
);
378 int (*PREFIX(ftruncate
))(int fd
, off_t length
);
379 off_t (*PREFIX(filesize
))(int fd
);
380 int (*fdprintf
)(int fd
, const char *fmt
, ...) ATTRIBUTE_PRINTF(2, 3);
381 int (*read_line
)(int fd
, char* buffer
, int buffer_size
);
382 bool (*settings_parseline
)(char* line
, char** name
, char** value
);
383 void (*storage_sleep
)(void);
384 void (*storage_spin
)(void);
385 void (*storage_spindown
)(int seconds
);
386 #if USING_STORAGE_CALLBACK
387 void (*register_storage_idle_func
)(storage_idle_notify function
);
388 void (*unregister_storage_idle_func
)(storage_idle_notify function
, bool run
);
389 #endif /* USING_STORAGE_CALLBACK */
390 void (*reload_directory
)(void);
391 char *(*create_numbered_filename
)(char *buffer
, const char *path
,
392 const char *prefix
, const char *suffix
,
393 int numberlen
IF_CNFN_NUM_(, int *num
));
394 bool (*file_exists
)(const char *file
);
398 DIR* (*opendir
)(const char* name
);
399 int (*closedir
)(DIR* dir
);
400 struct dirent
* (*readdir
)(DIR* dir
);
401 int (*mkdir
)(const char *name
);
402 int (*rmdir
)(const char *name
);
403 bool (*dir_exists
)(const char *path
);
406 void (*PREFIX(sleep
))(int ticks
);
408 volatile long* current_tick
;
409 long (*default_event_handler
)(long event
);
410 long (*default_event_handler_ex
)(long event
, void (*callback
)(void *), void *parameter
);
411 struct thread_entry
* threads
;
412 unsigned int (*create_thread
)(void (*function
)(void), void* stack
,
413 size_t stack_size
, unsigned flags
,
415 IF_PRIO(, int priority
)
416 IF_COP(, unsigned int core
));
417 void (*thread_exit
)(void);
418 void (*thread_wait
)(unsigned int thread_id
);
419 #if CONFIG_CODEC == SWCODEC
420 void (*mutex_init
)(struct mutex
*m
);
421 void (*mutex_lock
)(struct mutex
*m
);
422 void (*mutex_unlock
)(struct mutex
*m
);
423 size_t (*align_buffer
)(void **start
, size_t size
, size_t align
);
426 void (*reset_poweroff_timer
)(void);
428 int (*system_memory_guard
)(int newmode
);
430 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
431 #ifdef CPU_BOOST_LOGGING
432 void (*cpu_boost_
)(bool on_off
,char*location
,int line
);
434 void (*cpu_boost
)(bool on_off
);
436 #endif /* HAVE_ADJUSTABLE_CPU_FREQ */
437 #endif /* !SIMULATOR */
438 #ifdef HAVE_SCHEDULER_BOOSTCTRL
439 void (*trigger_cpu_boost
)(void);
440 void (*cancel_cpu_boost
)(void);
442 #ifdef CACHE_FUNCTIONS_AS_CALL
443 void (*flush_icache
)(void);
444 void (*invalidate_icache
)(void);
446 bool (*timer_register
)(int reg_prio
, void (*unregister_callback
)(void),
447 long cycles
, int int_prio
,
448 void (*timer_callback
)(void) IF_COP(, int core
));
449 void (*timer_unregister
)(void);
450 bool (*timer_set_period
)(long count
);
452 void (*queue_init
)(struct event_queue
*q
, bool register_queue
);
453 void (*queue_delete
)(struct event_queue
*q
);
454 void (*queue_post
)(struct event_queue
*q
, long id
, intptr_t data
);
455 void (*queue_wait_w_tmo
)(struct event_queue
*q
, struct queue_event
*ev
,
457 #if CONFIG_CODEC == SWCODEC
458 void (*queue_enable_queue_send
)(struct event_queue
*q
,
459 struct queue_sender_list
*send
,
460 unsigned int thread_id
);
461 bool (*queue_empty
)(const struct event_queue
*q
);
462 void (*queue_wait
)(struct event_queue
*q
, struct queue_event
*ev
);
463 intptr_t (*queue_send
)(struct event_queue
*q
, long id
,
465 void (*queue_reply
)(struct event_queue
*q
, intptr_t retval
);
466 #endif /* CONFIG_CODEC == SWCODEC */
468 void (*usb_acknowledge
)(long id
);
470 void (*profile_thread
)(void);
471 void (*profstop
)(void);
472 void (*profile_func_enter
)(void *this_fn
, void *call_site
);
473 void (*profile_func_exit
)(void *this_fn
, void *call_site
);
477 /* special simulator hooks */
478 #if defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8
479 void (*sim_lcd_ex_init
)(int shades
, unsigned long (*getpixel
)(int, int));
480 void (*sim_lcd_ex_update_rect
)(int x
, int y
, int width
, int height
);
484 /* strings and memory */
485 int (*snprintf
)(char *buf
, size_t size
, const char *fmt
, ...)
486 ATTRIBUTE_PRINTF(3, 4);
487 int (*vsnprintf
)(char *buf
, int size
, const char *fmt
, va_list ap
);
488 char* (*strcpy
)(char *dst
, const char *src
);
489 char* (*strncpy
)(char *dst
, const char *src
, size_t length
);
490 size_t (*strlen
)(const char *str
);
491 char * (*strrchr
)(const char *s
, int c
);
492 int (*strcmp
)(const char *, const char *);
493 int (*strncmp
)(const char *, const char *, size_t);
494 int (*strcasecmp
)(const char *, const char *);
495 int (*strncasecmp
)(const char *s1
, const char *s2
, size_t n
);
496 void* (*memset
)(void *dst
, int c
, size_t length
);
497 void* (*memcpy
)(void *out
, const void *in
, size_t n
);
498 void* (*memmove
)(void *out
, const void *in
, size_t n
);
499 const unsigned char *_ctype_
;
500 int (*atoi
)(const char *str
);
501 char *(*strchr
)(const char *s
, int c
);
502 char *(*strcat
)(char *s1
, const char *s2
);
503 void *(*memchr
)(const void *s1
, int c
, size_t n
);
504 int (*memcmp
)(const void *s1
, const void *s2
, size_t n
);
505 char *(*strcasestr
) (const char* phaystack
, const char* pneedle
);
506 char* (*strtok_r
)(char *ptr
, const char *sep
, char **end
);
508 const unsigned char* (*utf8decode
)(const unsigned char *utf8
, unsigned short *ucs
);
509 unsigned char* (*iso_decode
)(const unsigned char *iso
, unsigned char *utf8
, int cp
, int count
);
510 unsigned char* (*utf16LEdecode
)(const unsigned char *utf16
, unsigned char *utf8
, int count
);
511 unsigned char* (*utf16BEdecode
)(const unsigned char *utf16
, unsigned char *utf8
, int count
);
512 unsigned char* (*utf8encode
)(unsigned long ucs
, unsigned char *utf8
);
513 unsigned long (*utf8length
)(const unsigned char *utf8
);
514 int (*utf8seek
)(const unsigned char* utf8
, int offset
);
517 void (*sound_set
)(int setting
, int value
);
518 int (*sound_default
)(int setting
);
519 int (*sound_min
)(int setting
);
520 int (*sound_max
)(int setting
);
521 const char * (*sound_unit
)(int setting
);
522 int (*sound_val2phys
)(int setting
, int value
);
524 void (*mp3_play_data
)(const unsigned char* start
, int size
, void (*get_more
)(unsigned char** start
, size_t* size
));
525 void (*mp3_play_pause
)(bool play
);
526 void (*mp3_play_stop
)(void);
527 bool (*mp3_is_playing
)(void);
528 #if CONFIG_CODEC != SWCODEC
529 void (*bitswap
)(unsigned char *data
, int length
);
531 #endif /* !SIMULATOR */
532 #if CONFIG_CODEC == SWCODEC
533 const unsigned long *audio_master_sampr_list
;
534 const unsigned long *hw_freq_sampr
;
535 void (*pcm_apply_settings
)(void);
536 void (*pcm_play_data
)(pcm_more_callback_type get_more
,
537 unsigned char* start
, size_t size
);
538 void (*pcm_play_stop
)(void);
539 void (*pcm_set_frequency
)(unsigned int frequency
);
540 bool (*pcm_is_playing
)(void);
541 bool (*pcm_is_paused
)(void);
542 void (*pcm_play_pause
)(bool play
);
543 size_t (*pcm_get_bytes_waiting
)(void);
544 void (*pcm_calculate_peaks
)(int *left
, int *right
);
545 void (*pcm_play_lock
)(void);
546 void (*pcm_play_unlock
)(void);
547 #ifdef HAVE_RECORDING
548 const unsigned long *rec_freq_sampr
;
549 void (*pcm_init_recording
)(void);
550 void (*pcm_close_recording
)(void);
551 void (*pcm_record_data
)(pcm_more_callback_type2 more_ready
,
552 void *start
, size_t size
);
553 void (*pcm_record_more
)(void *start
, size_t size
);
554 void (*pcm_stop_recording
)(void);
555 void (*pcm_calculate_rec_peaks
)(int *left
, int *right
);
556 void (*audio_set_recording_gain
)(int left
, int right
, int type
);
557 #endif /* HAVE_RECORDING */
558 #if INPUT_SRC_CAPS != 0
559 void (*audio_set_output_source
)(int monitor
);
560 void (*audio_set_input_source
)(int source
, unsigned flags
);
562 void (*dsp_set_crossfeed
)(bool enable
);
563 void (*dsp_set_eq
)(bool enable
);
564 void (*dsp_dither_enable
)(bool enable
);
565 intptr_t (*dsp_configure
)(struct dsp_config
*dsp
, int setting
,
567 int (*dsp_process
)(struct dsp_config
*dsp
, char *dest
,
568 const char *src
[], int count
);
569 #endif /* CONFIG_CODEC == SWCODC */
571 /* playback control */
572 int (*playlist_amount
)(void);
573 int (*playlist_resume
)(void);
574 int (*playlist_start
)(int start_index
, int offset
);
575 void (*PREFIX(audio_play
))(long offset
);
576 void (*audio_stop
)(void);
577 void (*audio_pause
)(void);
578 void (*audio_resume
)(void);
579 void (*audio_next
)(void);
580 void (*audio_prev
)(void);
581 void (*audio_ff_rewind
)(long newtime
);
582 struct mp3entry
* (*audio_next_track
)(void);
583 int (*audio_status
)(void);
584 bool (*audio_has_changed_track
)(void);
585 struct mp3entry
* (*audio_current_track
)(void);
586 void (*audio_flush_and_reload_tracks
)(void);
587 int (*audio_get_file_pos
)(void);
588 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
589 unsigned long (*mpeg_get_last_header
)(void);
591 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) || \
592 (CONFIG_CODEC == SWCODEC)
593 void (*sound_set_pitch
)(int pitch
);
596 /* MAS communication */
597 #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
598 int (*mas_readmem
)(int bank
, int addr
, unsigned long* dest
, int len
);
599 int (*mas_writemem
)(int bank
, int addr
, const unsigned long* src
, int len
);
600 int (*mas_readreg
)(int reg
);
601 int (*mas_writereg
)(int reg
, unsigned int val
);
602 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
603 int (*mas_codec_writereg
)(int reg
, unsigned int val
);
604 int (*mas_codec_readreg
)(int reg
);
605 void (*i2c_begin
)(void);
606 void (*i2c_end
)(void);
607 int (*i2c_write
)(int address
, const unsigned char* buf
, int count
);
612 int (*do_menu
)(const struct menu_item_ex
*menu
, int *start_selected
,
613 struct viewport parent
[NB_SCREENS
], bool hide_bars
);
616 struct gui_syncstatusbar
*statusbars
;
617 void (*gui_syncstatusbar_draw
)(struct gui_syncstatusbar
* bars
, bool force_redraw
);
620 const struct settings_list
* (*get_settings_list
)(int*count
);
621 const struct settings_list
* (*find_setting
)(const void* variable
, int *id
);
622 bool (*option_screen
)(const struct settings_list
*setting
,
623 struct viewport parent
[NB_SCREENS
],
624 bool use_temp_var
, unsigned char* option_title
);
625 bool (*set_option
)(const char* string
, const void* variable
,
626 enum optiontype type
, const struct opt_items
* options
,
627 int numoptions
, void (*function
)(int));
628 bool (*set_bool_options
)(const char* string
, const bool* variable
,
629 const char* yes_str
, int yes_voice
,
630 const char* no_str
, int no_voice
,
631 void (*function
)(bool));
632 bool (*set_int
)(const unsigned char* string
, const char* unit
, int voice_unit
,
633 const int* variable
, void (*function
)(int), int step
,
635 void (*formatter
)(char*, size_t, int, const char*) );
636 bool (*set_bool
)(const char* string
, const bool* variable
);
638 #ifdef HAVE_LCD_COLOR
639 bool (*set_color
)(struct screen
*display
, char *title
, unsigned *color
,
640 unsigned banned_color
);
642 /* action handling */
643 int (*get_custom_action
)(int context
,int timeout
,
644 const struct button_mapping
* (*get_context_map
)(int));
645 int (*get_action
)(int context
, int timeout
);
646 bool (*action_userabort
)(int timeout
);
649 int (*battery_level
)(void);
650 bool (*battery_level_safe
)(void);
651 int (*battery_time
)(void);
653 unsigned int (*battery_voltage
)(void);
656 bool (*charger_inserted
)(void);
657 # if CONFIG_CHARGING == CHARGING_MONITOR
658 bool (*charging_state
)(void);
661 #ifdef HAVE_USB_POWER
662 bool (*usb_powered
)(void);
666 void (*srand
)(unsigned int seed
);
668 void (*qsort
)(void *base
, size_t nmemb
, size_t size
,
669 int(*compar
)(const void *, const void *));
670 int (*kbd_input
)(char* buffer
, int buflen
);
671 struct tm
* (*get_time
)(void);
672 int (*set_time
)(const struct tm
*tm
);
674 time_t (*mktime
)(struct tm
*t
);
676 void* (*plugin_get_buffer
)(size_t *buffer_size
);
677 void* (*plugin_get_audio_buffer
)(size_t *buffer_size
);
678 void (*plugin_tsr
)(bool (*exit_callback
)(bool reenter
));
679 char* (*plugin_get_current_filename
)(void);
680 #ifdef PLUGIN_USE_IRAM
681 void (*plugin_iram_init
)(char *iramstart
, char *iramcopy
, size_t iram_size
,
682 char *iedata
, size_t iedata_size
);
684 #if defined(DEBUG) || defined(SIMULATOR)
685 void (*debugf
)(const char *fmt
, ...) ATTRIBUTE_PRINTF(1, 2);
687 #ifdef ROCKBOX_HAS_LOGF
688 void (*logf
)(const char *fmt
, ...) ATTRIBUTE_PRINTF(1, 2);
690 struct user_settings
* global_settings
;
691 struct system_status
*global_status
;
692 void (*talk_disable
)(bool disable
);
693 #if CONFIG_CODEC == SWCODEC
694 int (*codec_load_file
)(const char* codec
, struct codec_api
*api
);
695 const char *(*get_codec_filename
)(int cod_spec
);
696 bool (*get_metadata
)(struct mp3entry
* id3
, int fd
, const char* trackname
);
698 bool (*mp3info
)(struct mp3entry
*entry
, const char *filename
);
699 int (*count_mp3_frames
)(int fd
, int startpos
, int filesize
,
700 void (*progressfunc
)(int));
701 int (*create_xing_header
)(int fd
, long startpos
, long filesize
,
702 unsigned char *buf
, unsigned long num_frames
,
703 unsigned long rec_time
, unsigned long header_template
,
704 void (*progressfunc
)(int), bool generate_toc
);
705 unsigned long (*find_next_frame
)(int fd
, long *offset
,
706 long max_offset
, unsigned long last_header
);
708 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
709 unsigned short (*peak_meter_scale_value
)(unsigned short val
,
711 void (*peak_meter_set_use_dbfs
)(bool use
);
712 bool (*peak_meter_get_use_dbfs
)(void);
714 #ifdef HAVE_LCD_BITMAP
715 int (*read_bmp_file
)(const char* filename
, struct bitmap
*bm
, int maxsize
,
717 void (*screen_dump_set_hook
)(void (*hook
)(int fh
));
719 int (*show_logo
)(void);
720 struct tree_context
* (*tree_get_context
)(void);
721 void (*set_current_file
)(char* path
);
722 void (*set_dirfilter
)(int l_dirfilter
);
724 #ifdef HAVE_WHEEL_POSITION
725 int (*wheel_status
)(void);
726 void (*wheel_send_events
)(bool send
);
729 #ifdef IRIVER_H100_SERIES
730 /* Routines for the iriver_flash -plugin. */
731 bool (*detect_original_firmware
)(void);
732 bool (*detect_flashed_ramimage
)(void);
733 bool (*detect_flashed_romimage
)(void);
736 void (*led
)(bool on
);
738 #if (CONFIG_CODEC == SWCODEC)
740 int (*bufopen
)(const char *file
, size_t offset
, enum data_type type
);
741 int (*bufalloc
)(const void *src
, size_t size
, enum data_type type
);
742 bool (*bufclose
)(int handle_id
);
743 int (*bufseek
)(int handle_id
, size_t newpos
);
744 int (*bufadvance
)(int handle_id
, off_t offset
);
745 ssize_t (*bufread
)(int handle_id
, size_t size
, void *dest
);
746 ssize_t (*bufgetdata
)(int handle_id
, size_t size
, void **data
);
747 ssize_t (*bufgettail
)(int handle_id
, size_t size
, void **data
);
748 ssize_t (*bufcuttail
)(int handle_id
, size_t size
);
750 ssize_t (*buf_get_offset
)(int handle_id
, void *ptr
);
751 ssize_t (*buf_handle_offset
)(int handle_id
);
752 void (*buf_request_buffer_handle
)(int handle_id
);
753 void (*buf_set_base_handle
)(int handle_id
);
754 size_t (*buf_used
)(void);
758 bool (*tagcache_search
)(struct tagcache_search
*tcs
, int tag
);
759 void (*tagcache_search_set_uniqbuf
)(struct tagcache_search
*tcs
,
760 void *buffer
, long length
);
761 bool (*tagcache_search_add_filter
)(struct tagcache_search
*tcs
,
763 bool (*tagcache_get_next
)(struct tagcache_search
*tcs
);
764 bool (*tagcache_retrieve
)(struct tagcache_search
*tcs
, int idxid
,
765 int tag
, char *buf
, long size
);
766 void (*tagcache_search_finish
)(struct tagcache_search
*tcs
);
767 long (*tagcache_get_numeric
)(const struct tagcache_search
*tcs
, int tag
);
771 bool (*find_albumart
)(const struct mp3entry
*id3
, char *buf
, int buflen
);
772 bool (*search_albumart_files
)(const struct mp3entry
*id3
, const char *size_string
,
773 char *buf
, int buflen
);
776 void (*thread_thaw
)(unsigned int thread_id
);
778 #ifdef HAVE_SEMAPHORE_OBJECTS
779 void (*semaphore_init
)(struct semaphore
*s
, int max
, int start
);
780 void (*semaphore_wait
)(struct semaphore
*s
);
781 void (*semaphore_release
)(struct semaphore
*s
);
784 const char *appsversion
;
785 /* new stuff at the end, sort into place next time
786 the API gets incompatible */
790 struct plugin_header
{
792 unsigned short target_id
;
793 unsigned short api_version
;
794 unsigned char *load_addr
;
795 unsigned char *end_addr
;
796 enum plugin_status(*entry_point
)(const struct plugin_api
*, const void*);
801 extern unsigned char plugin_start_addr
[];
802 extern unsigned char plugin_end_addr
[];
803 #define PLUGIN_HEADER \
804 const struct plugin_header __header \
805 __attribute__ ((section (".header")))= { \
806 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
807 plugin_start_addr, plugin_end_addr, plugin_start };
808 #else /* SIMULATOR */
809 #define PLUGIN_HEADER \
810 const struct plugin_header __header \
811 __attribute__((visibility("default"))) = { \
812 PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \
813 NULL, NULL, plugin_start };
814 #endif /* SIMULATOR */
816 #ifdef PLUGIN_USE_IRAM
817 /* Declare IRAM variables */
818 #define PLUGIN_IRAM_DECLARE \
819 extern char iramcopy[]; \
820 extern char iramstart[]; \
821 extern char iramend[]; \
822 extern char iedata[]; \
824 /* Initialize IRAM */
825 #define PLUGIN_IRAM_INIT(api) \
826 (api)->plugin_iram_init(iramstart, iramcopy, iramend-iramstart, \
827 iedata, iend-iedata);
829 #define PLUGIN_IRAM_DECLARE
830 #define PLUGIN_IRAM_INIT(api)
831 #endif /* PLUGIN_USE_IRAM */
834 int plugin_load(const char* plugin
, const void* parameter
);
835 void* plugin_get_audio_buffer(size_t *buffer_size
);
836 #ifdef PLUGIN_USE_IRAM
837 void plugin_iram_init(char *iramstart
, char *iramcopy
, size_t iram_size
,
838 char *iedata
, size_t iedata_size
);
842 callback returns true to allow the new plugin to load,
843 reenter means the currently running plugin is being reloaded */
844 void plugin_tsr(bool (*exit_callback
)(bool reenter
));
846 /* defined by the plugin */
847 enum plugin_status
plugin_start(const struct plugin_api
* rockbox
, const void* parameter
)
850 /* Use this macro in plugins where gcc tries to optimize by calling
851 * these functions directly */
852 #define MEM_FUNCTION_WRAPPERS(api) \
853 void *memcpy(void *dest, const void *src, size_t n) \
855 return (api)->memcpy(dest, src, n); \
857 void *memset(void *dest, int c, size_t n) \
859 return (api)->memset(dest, c, n); \
861 void *memmove(void *dest, const void *src, size_t n) \
863 return (api)->memmove(dest, src, n); \
865 int memcmp(const void *s1, const void *s2, size_t n) \
867 return (api)->memcmp(s1, s2, n); \
870 #ifndef CACHE_FUNCTION_WRAPPERS
872 #ifdef CACHE_FUNCTIONS_AS_CALL
873 #define CACHE_FUNCTION_WRAPPERS(api) \
874 void flush_icache(void) \
876 (api)->flush_icache(); \
878 void invalidate_icache(void) \
880 (api)->invalidate_icache(); \
883 #define CACHE_FUNCTION_WRAPPERS(api)
884 #endif /* CACHE_FUNCTIONS_AS_CALL */
886 #endif /* CACHE_FUNCTION_WRAPPERS */
888 #ifndef ALIGN_BUFFER_WRAPPER
889 #define ALIGN_BUFFER_WRAPPER(api) \
890 size_t align_buffer(void **start, size_t size, size_t align) \
892 return (api)->align_buffer(start, size, align); \
894 #endif /* ALIGN_BUFFER_WRAPPER */
896 #endif /* __PCTOOL__ */