1 /*
2  * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 /**
17  * @file picoos.h
18  *
19  * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
20  * All rights reserved.
21  *
22  * History:
23  * - 2009-04-20 -- initial version
24  *
25  */
26 /**
27  * @addtogroup picoos
28 
29  * <b> Operating system generalization module </b>\n
30  *
31 */
32 
33 #ifndef PICOOS_H_
34 #define PICOOS_H_
35 
36 #include "picodefs.h"
37 #include "picopal.h"
38 
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42 #if 0
43 }
44 #endif
45 
46 
47 /* some "switch"  used in picopal and in picocep ... */
48 #define PICOOS_DIV_USE_INV PICOPAL_DIV_USE_INV
49 
50 /* *************************************************/
51 /* types                                           */
52 /* *************************************************/
53 
54 typedef picopal_uint8   picoos_uint8;
55 typedef picopal_uint16  picoos_uint16;
56 typedef picopal_uint32  picoos_uint32;
57 
58 typedef picopal_int8    picoos_int8;
59 typedef picopal_int16   picoos_int16;
60 typedef picopal_int32   picoos_int32;
61 
62 typedef picopal_double  picoos_double;
63 typedef picopal_single  picoos_single;
64 
65 typedef picopal_char    picoos_char;
66 typedef picopal_uchar   picoos_uchar;
67 
68 typedef picopal_uint8   picoos_bool;
69 
70 typedef picopal_objsize_t picoos_objsize_t;
71 typedef picopal_ptrdiff_t picoos_ptrdiff_t;
72 
73 /* *************************************************/
74 /* functions                                       */
75 /* *************************************************/
76 
77 
78 picoos_int32 picoos_atoi(const picoos_char *);
79 picoos_int8 picoos_strcmp(const picoos_char *, const picoos_char *);
80 picoos_int8 picoos_strncmp(const picoos_char *a, const picoos_char *b, picoos_objsize_t siz);
81 picoos_uint32 picoos_strlen(const picoos_char *);
82 picoos_char * picoos_strchr(const picoos_char *, picoos_char);
83 picoos_char *picoos_strstr(const picoos_char *s, const picoos_char *substr);
84 picoos_int16 picoos_slprintf(picoos_char * b, picoos_uint32 bsize, const picoos_char *f, ...);
85 picoos_char * picoos_strcpy(picoos_char *, const picoos_char *);
86 picoos_char * picoos_strcat(picoos_char *, const picoos_char *);
87 
88 /* copies 'length' bytes from 'src' to 'dest'. (regions may be overlapping) no error checks! */
89 void * picoos_mem_copy(const void * src, void * dst,  picoos_objsize_t length);
90 
91 /* safe versions */
92 picoos_objsize_t picoos_strlcpy(picoos_char *dst, const picoos_char *src, picoos_objsize_t siz);
93 void * picoos_mem_set(void * dest, picoos_uint8 byte_val, picoos_objsize_t length);
94 
95 picoos_double picoos_cos(const picoos_double cos_arg);
96 picoos_double picoos_sin(const picoos_double sin_arg);
97 picoos_double picoos_fabs(const picoos_double fabs_arg);
98 
99 picoos_double picoos_quick_exp(const picoos_double y);
100 
101 
102 void picoos_get_sep_part_str (picoos_char string[], picoos_int32 stringlen, picoos_int32 * ind, picoos_char sepCh, picoos_char part[], picoos_int32 maxsize, picoos_uint8 * done);
103 pico_status_t picoos_string_to_uint32 (picoos_char str[], picoos_uint32 * res);
104 pico_status_t picoos_string_to_int32 (picoos_char str[], picoos_int32 * res);
105 
106 /* *****************************************************************/
107 /* "Common"                                                        */
108 /* *****************************************************************/
109 /* picoos_common is a collection of basic functionalities that must be globally accesible from every "big" function.
110  * It includes pointers to the MemoryManasger, ExceptionManager and a list of open files. */
111 
112 typedef struct memory_manager * picoos_MemoryManager;
113 typedef struct picoos_exception_manager * picoos_ExceptionManager;
114 typedef struct picoos_file * picoos_File;
115 
116 
117 /**  object   : Common
118  *   shortcut : common
119  *
120  */
121 typedef struct picoos_common * picoos_Common;
122 
123 /* the picoos_common structure itself is exported so no access functions are needed. Handle with care! (might be changed later) */
124 typedef struct picoos_common {
125     picoos_ExceptionManager em;
126     picoos_MemoryManager mm;
127     picoos_File fileList;
128 } picoos_common_t;
129 
130 picoos_Common picoos_newCommon(picoos_MemoryManager mm);
131 
132 void picoos_disposeCommon(picoos_MemoryManager mm, picoos_Common * this);
133 
134 
135 /* *****************************************************************/
136 /* Memory Management                                               */
137 /* *****************************************************************/
138 
139 typedef picoos_char * byte_ptr_t;
140 
141 #define PICOOS_ALIGN_SIZE 8
142 
143 
144 
145 void * picoos_raw_malloc(byte_ptr_t raw_mem,
146         picoos_objsize_t raw_mem_size, picoos_objsize_t alloc_size,
147         byte_ptr_t * rest_mem, picoos_objsize_t * rest_mem_size);
148 
149 /**
150  * Creates a new memory manager object for the specified raw memory
151  * block. 'enableProtMem' enables or disables memory protection
152  * functionality; if disabled, picoos_protectMem() has no effect.
153  */
154 picoos_MemoryManager picoos_newMemoryManager(
155         void *raw_memory,
156         picoos_objsize_t size,
157         picoos_bool enableMemProt);
158 
159 
160 
161 void picoos_disposeMemoryManager(picoos_MemoryManager * mm);
162 
163 
164 void * picoos_allocate(picoos_MemoryManager this, picoos_objsize_t byteSize);
165 void picoos_deallocate(picoos_MemoryManager this, void * * adr);
166 
167 /* the following memory manager routines are for testing and
168    debugging purposes */
169 
170 /**
171  * Same as picoos_allocate, but write access to the memory block may be
172  * prohibited by a subsequent call to picoos_protectMem().
173  */
174 void *picoos_allocProtMem(picoos_MemoryManager mm, picoos_objsize_t byteSize);
175 
176 /**
177  * Releases a memory block previously allocated by picoos_allocProtMem().
178  */
179 void picoos_deallocProtMem(picoos_MemoryManager mm, void **addr);
180 
181 /**
182  * Enables or disables write protection of a memory block previously
183  * allocated by picoos_allocProtMem(). If write protection is enabled,
184  * any subsequent write access will cause a segmentation fault.
185  */
186 void picoos_protectMem(
187         picoos_MemoryManager mm,
188         void *addr,
189         picoos_objsize_t len,
190         picoos_bool enable);
191 
192 void picoos_getMemUsage(
193         picoos_MemoryManager this,
194         picoos_bool resetIncremental,
195         picoos_int32 *usedBytes,
196         picoos_int32 *incrUsedBytes,
197         picoos_int32 *maxUsedBytes);
198 
199 void picoos_showMemUsage(
200         picoos_MemoryManager this,
201         picoos_bool incremental,
202         picoos_bool resetIncremental);
203 
204 /* *****************************************************************/
205 /* Exception Management                                                */
206 /* *****************************************************************/
207 /**  object   : ExceptionManager
208  *   shortcut : em
209  *
210  */
211 
212 
213 #define PICOOS_MAX_EXC_MSG_LEN 512
214 #define PICOOS_MAX_WARN_MSG_LEN 64
215 #define PICOOS_MAX_NUM_WARNINGS 8
216 
217 void picoos_setErrorMsg(picoos_char * dst, picoos_objsize_t siz,
218         picoos_int16 code, picoos_char * base, const picoos_char *fmt, ...);
219 
220 
221 picoos_ExceptionManager picoos_newExceptionManager(picoos_MemoryManager mm);
222 
223 void picoos_disposeExceptionManager(picoos_MemoryManager mm,
224         picoos_ExceptionManager * this);
225 
226 
227 void picoos_emReset(picoos_ExceptionManager this);
228 
229 /* For convenience, this function returns the resulting exception code of 'this'
230  * (as would be returned by emGetExceptionCode).
231  * The return value therefore is NOT the status of raising
232  * the error! */
233 pico_status_t picoos_emRaiseException(picoos_ExceptionManager this,
234         pico_status_t exceptionCode, picoos_char * baseMessage, picoos_char * fmt, ...);
235 
236 pico_status_t picoos_emGetExceptionCode(picoos_ExceptionManager this);
237 
238 void picoos_emGetExceptionMessage(picoos_ExceptionManager this, picoos_char * msg, picoos_uint16 maxsize);
239 
240 void picoos_emRaiseWarning(picoos_ExceptionManager this,
241         pico_status_t warningCode, picoos_char * baseMessage, picoos_char * fmt, ...);
242 
243 picoos_uint8 picoos_emGetNumOfWarnings(picoos_ExceptionManager this);
244 
245 pico_status_t picoos_emGetWarningCode(picoos_ExceptionManager this, picoos_uint8 warnNum);
246 
247 void picoos_emGetWarningMessage(picoos_ExceptionManager this, picoos_uint8 warnNum, picoos_char * msg, picoos_uint16 maxsize);
248 
249 
250 
251 
252 /* *****************************************************************/
253 /* File Access                                                     */
254 /* *****************************************************************/
255 
256 #define picoos_MaxFileNameLen 512
257 #define picoos_MaxKeyLen 512
258 #define picoos_MaxPathLen 512
259 #define picoos_MaxPathListLen 2048
260 
261 typedef picoos_char picoos_Key[picoos_MaxKeyLen];
262 typedef picoos_char picoos_FileName[picoos_MaxFileNameLen];
263 typedef picoos_char picoos_Path[picoos_MaxPathLen];
264 typedef picoos_char picoos_PathList[picoos_MaxPathListLen];
265 
266 
267 /* ***** Sequential binary file access ******/
268 
269 /* Remark: 'ReadByte', 'ReadBytes' and 'ReadVar' may be mixed;
270  'WriteByte', 'WriteBytes' and 'WriteVar' may be mixed. */
271 
272 /* Open existing binary file for read access. */
273 picoos_uint8 picoos_OpenBinary(picoos_Common g, picoos_File * f, picoos_char name[]);
274 
275 
276 /* Read next byte from file 'f'. */
277 picoos_uint8  picoos_ReadByte(picoos_File f, picoos_uint8 * by);
278 
279 /* Read next 'len' bytes from 'f' into 'bytes'; 'len' returns the
280  number of bytes actually read (may be smaller than requested
281  length if 'bytes' is too small to hold all bytes or at end of file).
282  Remark: 'bytes' is compabtible with any variable of any size. */
283 picoos_uint8  picoos_ReadBytes(picoos_File f, picoos_uint8 bytes[],
284         picoos_uint32 * len);
285 
286 
287 /* Create new binary file.
288  If 'key' is not empty, the file is encrypted with 'key'. */
289 picoos_uint8 picoos_CreateBinary(picoos_Common g, picoos_File * f, picoos_char name[]);
290 
291 picoos_uint8  picoos_WriteByte(picoos_File f, picoos_char by);
292 
293 /* Writes 'len' bytes from 'bytes' onto file 'f'; 'len' returns
294  the number of bytes actually written. */
295 picoos_uint8  picoos_WriteBytes(picoos_File f, const picoos_char bytes[],
296         picoos_int32 * len);
297 
298 
299 /* Close previously opened binary file. */
300 picoos_uint8 picoos_CloseBinary(picoos_Common g, picoos_File * f);
301 
302 
303 
304 
305 
306 
307 pico_status_t picoos_read_le_int16 (picoos_File file, picoos_int16 * val);
308 pico_status_t picoos_read_le_uint16 (picoos_File file, picoos_uint16 * val);
309 pico_status_t picoos_read_le_uint32 (picoos_File file, picoos_uint32 * val);
310 
311 
312 pico_status_t picoos_read_pi_uint16 (picoos_File file, picoos_uint16 * val);
313 pico_status_t picoos_read_pi_uint32 (picoos_File file, picoos_uint32 * val);
314 
315 pico_status_t picoos_write_le_uint16 (picoos_File file, picoos_uint16 val);
316 pico_status_t picoos_write_le_uint32 (picoos_File file, picoos_uint32 val);
317 
318 /*
319 pico_status_t picoos_write_pi_uint32 (picoos_File file, const picoos_uint32 val);
320 
321 pico_status_t picoos_write_pi_uint16 (picoos_File file, const picoos_uint16 val);
322 */
323 
324 
325 /* **************************************************************************************/
326 /* *** general file routines *****/
327 
328 /* Returns whether end of file was encountered in previous
329  read operation. */
330 picoos_bool picoos_Eof(picoos_File f);
331 
332 /*  sets the file pointer to
333  'pos' bytes from beginning (first byte = byte 0). This
334  routine should only be used for binary files. */
335 picoos_bool  picoos_SetPos(picoos_File f, picoos_int32 pos);
336 
337 /* Get position from file 'f'. */
338 picoos_bool picoos_GetPos(picoos_File f, picoos_uint32 * pos);
339 
340 /* Returns the length of the file in bytes. */
341 picoos_bool picoos_FileLength(picoos_File f, picoos_uint32 * len);
342 
343 /* Return full name of file 'f'. */
344 picoos_bool picoos_Name(picoos_File f, picoos_char name[], picoos_uint32 maxsize);
345 
346 /* Returns whether file 'name' exists or not. */
347 picoos_bool picoos_FileExists(picoos_Common g, picoos_char name[] /*, picoos_char ckey[] */);
348 
349 /* Delete a file. */
350 picoos_bool  picoos_Delete(picoos_char name[]);
351 
352 /* Rename a file. */
353 picoos_bool  picoos_Rename(picoos_char oldName[], picoos_char newName[]);
354 
355 
356 /* *****************************************************************/
357 /* Sampled Data Files                                                    */
358 /* *****************************************************************/
359 
360 #define SAMPLE_FREQ_16KHZ (picoos_uint32) 16000
361 
362 typedef enum {
363     FILE_TYPE_WAV,
364     FILE_TYPE_AU,
365     FILE_TYPE_RAW,
366     FILE_TYPE_OTHER
367 } wave_file_type_t;
368 
369 typedef enum {
370     FORMAT_TAG_LIN = 1, /**< linear 16-bit encoding */
371     FORMAT_TAG_ALAW = 6, /**< a-law encoding, 8 bit */
372     FORMAT_TAG_ULAW = 7 /**< u-law encoding, 8 bit */
373     /* there are many more */
374 } wave_format_tag_t;
375 
376 
377 typedef enum {
378     /* values corresponding RIFF wFormatTag */
379     PICOOS_ENC_LIN = FORMAT_TAG_LIN,  /**< linear 16-bit encoding; standard */
380     PICOOS_ENC_ALAW = FORMAT_TAG_ALAW, /**< a-law encoding, 8 bit */
381     PICOOS_ENC_ULAW = FORMAT_TAG_ULAW, /**< u-law encoding, 8 bit */
382     /* values outside RIFF wFormatTag values (above 4100) */
383     PICOOS_ENC_OTHER = 5000  /**< other; (treated as raw) */
384     }  picoos_encoding_t;
385 
386 typedef struct picoos_sd_file * picoos_SDFile;
387 
388 /* SDFile input functions */
389 
390 /* orig. comment from SDInOut.def
391              Opens sampled data file 'fileName' for input and returns
392              the encoding 'enc' of the file, sampling rate 'sf',
393              nr of samples 'nrSamples', and a handle to the opened file
394              in 'sdFile'.
395 
396              If 'fileName' is empty, the input is taken from the direct
397              acoustic input using the sampling rate specified by
398              "SetRawDefaults". In this case, 'encoding' returns 'EncLin',
399              and 'nrSamples' returns 0.
400 
401              The file format is taken from the file name extension:
402                 ".wav"           --> wav file
403                 ".au"            --> au file
404                 other extensions --> headerless files
405 
406              For wav and au files, the sampling rate and encoding are taken
407              from the file header and returned in 'sf' and 'enc'. For
408              headerless files, 'sf' and 'enc' are taken from the
409              most recently set default values (procedure SetRawDefaults).
410 
411              'done' returns whether the sampled data file was successfully
412              opened. */
413 extern picoos_bool picoos_sdfOpenIn (picoos_Common g, picoos_SDFile * sdFile, picoos_char fileName[], picoos_uint32 * sf, picoos_encoding_t * enc, picoos_uint32 * nrSamples);
414 
415 
416 extern picoos_bool picoos_sdfGetSamples (picoos_SDFile sdFile, picoos_uint32 start, picoos_uint32 * nrSamples, picoos_int16 samples[]);
417 
418 
419 extern picoos_bool picoos_sdfCloseIn (picoos_Common g, picoos_SDFile * sdFile);
420 
421 
422 /* SDFile output functions*/
423 
424 extern picoos_bool picoos_sdfOpenOut (picoos_Common g, picoos_SDFile * sdFile, picoos_char fileName[], int sf, picoos_encoding_t enc);
425 
426 
427 extern picoos_bool picoos_sdfPutSamples (picoos_SDFile sdFile, picoos_uint32 nrSamples, picoos_int16 samples[]);
428 
429 /*
430 extern picoos_bool picoos_AbortOutput (picoos_SDFile sdFile);
431 
432 
433 extern picoos_bool picoos_ResumeOutput (picoos_SDFile sdFile);
434 
435 
436 extern picoos_bool picoos_FlushOutput (picoos_SDFile sdFile);
437 */
438 
439 extern picoos_bool picoos_sdfCloseOut (picoos_Common g, picoos_SDFile * sdFile);
440 
441 
442 /* *****************************************************************/
443 /* File Headers                                                    */
444 /* *****************************************************************/
445 
446 #define PICOOS_MAX_FIELD_STRING_LEN 32 /* including terminating char */
447 
448 #define PICOOS_MAX_NUM_HEADER_FIELDS 10
449 #define PICOOS_NUM_BASIC_HEADER_FIELDS 5
450 
451 #define PICOOS_HEADER_NAME 0
452 #define PICOOS_HEADER_VERSION 1
453 #define PICOOS_HEADER_DATE 2
454 #define PICOOS_HEADER_TIME 3
455 #define PICOOS_HEADER_CONTENT_TYPE 4
456 
457 #define PICOOS_MAX_HEADER_STRING_LEN (PICOOS_MAX_NUM_HEADER_FIELDS * (2 * PICOOS_MAX_FIELD_STRING_LEN))
458 
459 typedef picoos_char picoos_field_string_t[PICOOS_MAX_FIELD_STRING_LEN];
460 
461 typedef picoos_char picoos_header_string_t[PICOOS_MAX_HEADER_STRING_LEN];
462 
463 typedef enum {PICOOS_FIELD_IGNORE, PICOOS_FIELD_EQUAL, PICOOS_FIELD_COMPAT} picoos_compare_op_t;
464 
465 /* private */
466 typedef struct picoos_file_header_field {
467     picoos_field_string_t key;
468     picoos_field_string_t value;
469     picoos_compare_op_t op;
470 } picoos_file_header_field_t;
471 
472 /* public */
473 typedef struct picoos_file_header * picoos_FileHeader;
474 typedef struct picoos_file_header {
475     picoos_uint8 numFields;
476     picoos_file_header_field_t  field[PICOOS_MAX_NUM_HEADER_FIELDS];
477 } picoos_file_header_t;
478 
479 
480 pico_status_t picoos_clearHeader(picoos_FileHeader header);
481 
482 pico_status_t picoos_setHeaderField(picoos_FileHeader header, picoos_uint8 index, picoos_char * key, picoos_char * value, picoos_compare_op_t op);
483 
484 /* caller has to make sure allocated space at key and value are large enough to hold a picoos_field_string */
485 pico_status_t picoos_getHeaderField(picoos_FileHeader header, picoos_uint8 index, picoos_field_string_t key, picoos_field_string_t value, picoos_compare_op_t * op);
486 
487 /* caller has to make sure allocated space at str is large enough to hold the header in question */
488 /*
489 pico_status_t picoos_hdrToString(picoos_FileHeader header, picoos_header_string_t str);
490 */
491 
492 pico_status_t picoos_hdrParseHeader(picoos_FileHeader header, picoos_header_string_t str);
493 
494 pico_status_t picoos_getSVOXHeaderString(picoos_char * str, picoos_uint8 * len, picoos_uint32 maxlen);
495 
496 pico_status_t picoos_readPicoHeader(picoos_File f, picoos_uint32 * headerlen);
497 
498 
499 
500 /* *****************************************************************/
501 /* String search and compare operations                            */
502 /* *****************************************************************/
503 
504 
505 picoos_uint8 picoos_has_extension(const picoos_char *str, const picoos_char *suf);
506 
507 /* *****************************************************************/
508 /* String/Number Manipulations  (might be moved to picopal)          */
509 /* *****************************************************************/
510 
511 pico_status_t picoos_string_to_int32(picoos_char str[],
512         picoos_int32 * res);
513 
514 pico_status_t picoos_string_to_uint32(picoos_char str[],
515         picoos_uint32 * res);
516 
517 /* 'stringlen' is the part of input string to be considered, possibly not containing NULLC (e.g. result of strlen).
518  *  'maxsize' is the maximal size of 'part' including a byte for the terminating NULLC! */
519 void picoos_get_sep_part_str(picoos_char string[],
520         picoos_int32 stringlen, picoos_int32 * ind, picoos_char sepCh,
521         picoos_char part[], picoos_int32 maxsize, picoos_uint8 * done);
522 
523 /* searches for the first contiguous string of printable characters (> ' ') inside fromStr, possibly skipping
524  * chars <= ' ') and returns it in toStr.
525  * fromStr is assumed to be NULLC terminated and toStr is forced to be NULLC terminated within maxsize.
526  * The search is started at *pos inside fromStr and at return, *pos is the position within fromStr after the
527  * found string, or the position after the end of fromStr, if no string was found.
528  * the function returns TRUE if a string was found and fitted toStr, or FALSE otherwise. */
529 picoos_uint8 picoos_get_str (picoos_char * fromStr, picoos_uint32 * pos, picoos_char * toStr, picoos_objsize_t maxsize);
530 
531 
532 pico_status_t picoos_read_mem_pi_uint16 (picoos_uint8 * data, picoos_uint32 * pos, picoos_uint16 * val);
533 
534 pico_status_t picoos_read_mem_pi_uint32 (picoos_uint8 * data, picoos_uint32 * pos, picoos_uint32 * val);
535 
536 pico_status_t picoos_write_mem_pi_uint16 (picoos_uint8 * data, picoos_uint32 * pos, picoos_uint16 val);
537 
538 
539 /* *****************************************************************/
540 /* timer function          */
541 /* *****************************************************************/
542 
543 void picoos_get_timer(picopal_uint32 * sec, picopal_uint32 * usec);
544 
545 #ifdef __cplusplus
546 }
547 #endif
548 
549 
550 #endif /*PICOOS_H_*/
551