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