Working ROLO for the Gigabeat F/X
[kugel-rb.git] / apps / codecs.h
blobc543226935bc625e587e072be8ac86d69075dd48
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2002 Björn Stenberg
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
19 #ifndef _CODECS_H_
20 #define _CODECS_H_
22 /* instruct simulator code to not redefine any symbols when compiling codecs.
23 (the CODEC macro is defined in apps/codecs/Makefile) */
24 #ifdef CODEC
25 #define NO_REDEFINES_PLEASE
26 #endif
28 #ifndef MEM
29 #define MEM 2
30 #endif
32 #include <stdbool.h>
33 #include <stdlib.h>
34 #include "config.h"
35 #include "kernel.h"
36 #include "system.h"
37 #include "id3.h"
38 #include "audio.h"
39 #ifdef RB_PROFILE
40 #include "profile.h"
41 #include "thread.h"
42 #endif
43 #if (CONFIG_CODEC == SWCODEC)
44 #if !defined(SIMULATOR) && defined(HAVE_RECORDING)
45 #include "pcm_record.h"
46 #endif
47 #include "dsp.h"
48 #endif
49 #include "settings.h"
51 #ifdef CODEC
52 #if defined(DEBUG) || defined(SIMULATOR)
53 #undef DEBUGF
54 #define DEBUGF ci->debugf
55 #undef LDEBUGF
56 #define LDEBUGF ci->debugf
57 #else
58 #define DEBUGF(...)
59 #define LDEBUGF(...)
60 #endif
62 #ifdef ROCKBOX_HAS_LOGF
63 #undef LOGF
64 #define LOGF ci->logf
65 #else
66 #define LOGF(...)
67 #endif
69 #endif
71 #ifdef SIMULATOR
72 #define PREFIX(_x_) sim_ ## _x_
73 #else
74 #define PREFIX(_x_) _x_
75 #endif
77 /* magic for normal codecs */
78 #define CODEC_MAGIC 0x52434F44 /* RCOD */
79 /* magic for encoder codecs */
80 #define CODEC_ENC_MAGIC 0x52454E43 /* RENC */
82 /* increase this every time the api struct changes */
83 #define CODEC_API_VERSION 24
85 /* update this to latest version if a change to the api struct breaks
86 backwards compatibility (and please take the opportunity to sort in any
87 new function which are "waiting" at the end of the function table) */
88 #define CODEC_MIN_API_VERSION 24
90 /* codec return codes */
91 enum codec_status {
92 CODEC_OK = 0,
93 CODEC_USB_CONNECTED,
94 CODEC_ERROR = -1,
97 /* NOTE: To support backwards compatibility, only add new functions at
98 the end of the structure. Every time you add a new function,
99 remember to increase CODEC_API_VERSION. If you make changes to the
100 existing APIs then also update CODEC_MIN_API_VERSION to current
101 version
103 struct codec_api {
105 off_t filesize; /* Total file length */
106 off_t curpos; /* Current buffer position */
108 /* For gapless mp3 */
109 struct mp3entry *id3; /* TAG metadata pointer */
110 bool *taginfo_ready; /* Is metadata read */
112 /* Codec should periodically check if stop_codec is set to true.
113 In case it is, codec must return immediately */
114 bool stop_codec;
115 /* Codec should periodically check if new_track is non zero.
116 When it is, the codec should request a new track. */
117 int new_track;
118 /* If seek_time != 0, codec should seek to that song position (in ms)
119 if codec supports seeking. */
120 long seek_time;
122 /* The dsp instance to be used for audio output */
123 struct dsp_config *dsp;
125 /* Returns buffer to malloc array. Only codeclib should need this. */
126 void* (*get_codec_memory)(size_t *size);
127 /* Insert PCM data into audio buffer for playback. Playback will start
128 automatically. */
129 bool (*pcmbuf_insert)(const void *ch1, const void *ch2, int count);
130 /* Set song position in WPS (value in ms). */
131 void (*set_elapsed)(unsigned int value);
133 /* Read next <size> amount bytes from file buffer to <ptr>.
134 Will return number of bytes read or 0 if end of file. */
135 size_t (*read_filebuf)(void *ptr, size_t size);
136 /* Request pointer to file buffer which can be used to read
137 <realsize> amount of data. <reqsize> tells the buffer system
138 how much data it should try to allocate. If <realsize> is 0,
139 end of file is reached. */
140 void* (*request_buffer)(size_t *realsize, size_t reqsize);
141 /* Advance file buffer position by <amount> amount of bytes. */
142 void (*advance_buffer)(size_t amount);
143 /* Advance file buffer to a pointer location inside file buffer. */
144 void (*advance_buffer_loc)(void *ptr);
145 /* Seek file buffer to position <newpos> beginning of file. */
146 bool (*seek_buffer)(size_t newpos);
147 /* Codec should call this function when it has done the seeking. */
148 void (*seek_complete)(void);
149 /* Request file change from file buffer. Returns true is next
150 track is available and changed. If return value is false,
151 codec should exit immediately with PLUGIN_OK status. */
152 bool (*request_next_track)(void);
153 /* Free the buffer area of the current codec after its loaded */
154 void (*discard_codec)(void);
156 void (*set_offset)(size_t value);
157 /* Configure different codec buffer parameters. */
158 void (*configure)(int setting, intptr_t value);
160 /* kernel/ system */
161 void (*PREFIX(sleep))(int ticks);
162 void (*yield)(void);
164 #if NUM_CORES > 1
165 struct thread_entry *
166 (*create_thread)(void (*function)(void), void* stack,
167 size_t stack_size, unsigned flags, const char *name
168 IF_PRIO(, int priority)
169 IF_COP(, unsigned int core));
171 void (*thread_thaw)(struct thread_entry *thread);
172 void (*thread_wait)(struct thread_entry *thread);
173 void (*semaphore_init)(struct semaphore *s, int max, int start);
174 void (*semaphore_wait)(struct semaphore *s);
175 void (*semaphore_release)(struct semaphore *s);
176 void (*event_init)(struct event *e, unsigned int flags);
177 void (*event_wait)(struct event *e, unsigned int for_state);
178 void (*event_set_state)(struct event *e, unsigned int state);
179 #endif /* NUM_CORES */
181 #ifdef CACHE_FUNCTIONS_AS_CALL
182 void (*flush_icache)(void);
183 void (*invalidate_icache)(void);
184 #endif
186 /* strings and memory */
187 char* (*strcpy)(char *dst, const char *src);
188 char* (*strncpy)(char *dst, const char *src, size_t length);
189 size_t (*strlen)(const char *str);
190 int (*strcmp)(const char *, const char *);
191 char *(*strcat)(char *s1, const char *s2);
192 void* (*memset)(void *dst, int c, size_t length);
193 void* (*memcpy)(void *out, const void *in, size_t n);
194 void* (*memmove)(void *out, const void *in, size_t n);
195 int (*memcmp)(const void *s1, const void *s2, size_t n);
196 void *(*memchr)(const void *s1, int c, size_t n);
198 #if defined(DEBUG) || defined(SIMULATOR)
199 void (*debugf)(const char *fmt, ...) ATTRIBUTE_PRINTF(1, 2);
200 #endif
201 #ifdef ROCKBOX_HAS_LOGF
202 void (*logf)(const char *fmt, ...) ATTRIBUTE_PRINTF(1, 2);
203 #endif
205 /* Tremor requires qsort */
206 void (*qsort)(void *base, size_t nmemb, size_t size,
207 int(*compar)(const void *, const void *));
209 /* The ADX codec accesses global_settings to test for REPEAT_ONE mode */
210 struct user_settings* global_settings;
212 #ifdef RB_PROFILE
213 void (*profile_thread)(void);
214 void (*profstop)(void);
215 void (*profile_func_enter)(void *this_fn, void *call_site);
216 void (*profile_func_exit)(void *this_fn, void *call_site);
217 #endif
219 #if defined(HAVE_RECORDING) && !defined(SIMULATOR)
220 volatile bool stop_encoder;
221 volatile int enc_codec_loaded; /* <0=error, 0=pending, >0=ok */
222 void (*enc_get_inputs)(struct enc_inputs *inputs);
223 void (*enc_set_parameters)(struct enc_parameters *params);
224 struct enc_chunk_hdr * (*enc_get_chunk)(void);
225 void (*enc_finish_chunk)(void);
226 unsigned char * (*enc_get_pcm_data)(size_t size);
227 size_t (*enc_unget_pcm_data)(size_t size);
229 /* file */
230 int (*PREFIX(open))(const char* pathname, int flags);
231 int (*close)(int fd);
232 ssize_t (*read)(int fd, void* buf, size_t count);
233 off_t (*PREFIX(lseek))(int fd, off_t offset, int whence);
234 ssize_t (*write)(int fd, const void* buf, size_t count);
235 int (*round_value_to_list32)(unsigned long value,
236 const unsigned long list[],
237 int count,
238 bool signd);
239 #endif
241 /* new stuff at the end, sort into place next time
242 the API gets incompatible */
246 /* codec header */
247 struct codec_header {
248 unsigned long magic; /* RCOD or RENC */
249 unsigned short target_id;
250 unsigned short api_version;
251 unsigned char *load_addr;
252 unsigned char *end_addr;
253 enum codec_status(*entry_point)(struct codec_api*);
256 #ifdef CODEC
257 #ifndef SIMULATOR
258 /* plugin_* is correct, codecs use the plugin linker script */
259 extern unsigned char plugin_start_addr[];
260 extern unsigned char plugin_end_addr[];
261 /* decoders */
262 #define CODEC_HEADER \
263 const struct codec_header __header \
264 __attribute__ ((section (".header")))= { \
265 CODEC_MAGIC, TARGET_ID, CODEC_API_VERSION, \
266 plugin_start_addr, plugin_end_addr, codec_start };
267 /* encoders */
268 #define CODEC_ENC_HEADER \
269 const struct codec_header __header \
270 __attribute__ ((section (".header")))= { \
271 CODEC_ENC_MAGIC, TARGET_ID, CODEC_API_VERSION, \
272 plugin_start_addr, plugin_end_addr, codec_start };
274 #else /* def SIMULATOR */
275 /* decoders */
276 #define CODEC_HEADER \
277 const struct codec_header __header \
278 __attribute__((visibility("default"))) = { \
279 CODEC_MAGIC, TARGET_ID, CODEC_API_VERSION, \
280 NULL, NULL, codec_start };
281 /* encoders */
282 #define CODEC_ENC_HEADER \
283 const struct codec_header __header = { \
284 CODEC_ENC_MAGIC, TARGET_ID, CODEC_API_VERSION, \
285 NULL, NULL, codec_start };
286 #endif /* SIMULATOR */
287 #endif /* CODEC */
289 /* create full codec path from root filenames in audio_formats[]
290 assumes buffer size is MAX_PATH */
291 void codec_get_full_path(char *path, const char *codec_root_fn);
293 /* defined by the codec loader (codec.c) */
294 int codec_load_buf(unsigned int hid, struct codec_api *api);
295 int codec_load_file(const char* codec, struct codec_api *api);
297 /* defined by the codec */
298 enum codec_status codec_start(struct codec_api* rockbox);
300 #ifndef CACHE_FUNCTION_WRAPPERS
302 #ifdef CACHE_FUNCTIONS_AS_CALL
303 #define CACHE_FUNCTION_WRAPPERS(api) \
304 void flush_icache(void) \
306 (api)->flush_icache(); \
308 void invalidate_icache(void) \
310 (api)->invalidate_icache(); \
312 #else
313 #define CACHE_FUNCTION_WRAPPERS(api)
314 #endif /* CACHE_FUNCTIONS_AS_CALL */
316 #endif /* CACHE_FUNCTION_WRAPPERS */
318 #endif