1 /* 2 ** Copyright (c) 2002-2016, Erik de Castro Lopo <erikd@mega-nerd.com> 3 ** All rights reserved. 4 ** 5 ** This code is released under 2-clause BSD license. Please see the 6 ** file at : https://github.com/erikd/libsamplerate/blob/master/COPYING 7 */ 8 9 #ifndef COMMON_H_INCLUDED 10 #define COMMON_H_INCLUDED 11 12 #ifdef HAVE_STDINT_H 13 #include <stdint.h> 14 #elif (SIZEOF_INT == 4) 15 typedef int int32_t ; 16 #elif (SIZEOF_LONG == 4) 17 typedef long int32_t ; 18 #endif 19 20 #define SRC_MAX_RATIO 256 21 #define SRC_MAX_RATIO_STR "256" 22 23 #define SRC_MIN_RATIO_DIFF (1e-20) 24 25 #define MAX(a,b) (((a) > (b)) ? (a) : (b)) 26 #define MIN(a,b) (((a) < (b)) ? (a) : (b)) 27 28 #define ARRAY_LEN(x) ((int) (sizeof (x) / sizeof ((x) [0]))) 29 #define OFFSETOF(type,member) ((int) (&((type*) 0)->member)) 30 31 #define MAKE_MAGIC(a,b,c,d,e,f) ((a) + ((b) << 4) + ((c) << 8) + ((d) << 12) + ((e) << 16) + ((f) << 20)) 32 33 /* 34 ** Inspiration : http://sourcefrog.net/weblog/software/languages/C/unused.html 35 */ 36 #ifdef UNUSED 37 #elif defined (__GNUC__) 38 # define UNUSED(x) UNUSED_ ## x __attribute__ ((unused)) 39 #elif defined (__LCLINT__) 40 # define UNUSED(x) /*@unused@*/ x 41 #else 42 # define UNUSED(x) x 43 #endif 44 45 #ifdef __GNUC__ 46 # define WARN_UNUSED __attribute__ ((warn_unused_result)) 47 #else 48 # define WARN_UNUSED 49 #endif 50 51 52 #include "samplerate.h" 53 54 enum 55 { SRC_FALSE = 0, 56 SRC_TRUE = 1, 57 58 SRC_MODE_PROCESS = 555, 59 SRC_MODE_CALLBACK = 556 60 } ; 61 62 enum 63 { SRC_ERR_NO_ERROR = 0, 64 65 SRC_ERR_MALLOC_FAILED, 66 SRC_ERR_BAD_STATE, 67 SRC_ERR_BAD_DATA, 68 SRC_ERR_BAD_DATA_PTR, 69 SRC_ERR_NO_PRIVATE, 70 SRC_ERR_BAD_SRC_RATIO, 71 SRC_ERR_BAD_PROC_PTR, 72 SRC_ERR_SHIFT_BITS, 73 SRC_ERR_FILTER_LEN, 74 SRC_ERR_BAD_CONVERTER, 75 SRC_ERR_BAD_CHANNEL_COUNT, 76 SRC_ERR_SINC_BAD_BUFFER_LEN, 77 SRC_ERR_SIZE_INCOMPATIBILITY, 78 SRC_ERR_BAD_PRIV_PTR, 79 SRC_ERR_BAD_SINC_STATE, 80 SRC_ERR_DATA_OVERLAP, 81 SRC_ERR_BAD_CALLBACK, 82 SRC_ERR_BAD_MODE, 83 SRC_ERR_NULL_CALLBACK, 84 SRC_ERR_NO_VARIABLE_RATIO, 85 SRC_ERR_SINC_PREPARE_DATA_BAD_LEN, 86 SRC_ERR_BAD_INTERNAL_STATE, 87 88 /* This must be the last error number. */ 89 SRC_ERR_MAX_ERROR 90 } ; 91 92 typedef struct SRC_PRIVATE_tag 93 { double last_ratio, last_position ; 94 95 int error ; 96 int channels ; 97 98 /* SRC_MODE_PROCESS or SRC_MODE_CALLBACK */ 99 int mode ; 100 101 /* Pointer to data to converter specific data. */ 102 void *private_data ; 103 104 /* Varispeed process function. */ 105 int (*vari_process) (struct SRC_PRIVATE_tag *psrc, SRC_DATA *data) ; 106 107 /* Constant speed process function. */ 108 int (*const_process) (struct SRC_PRIVATE_tag *psrc, SRC_DATA *data) ; 109 110 /* State reset. */ 111 void (*reset) (struct SRC_PRIVATE_tag *psrc) ; 112 113 /* Data specific to SRC_MODE_CALLBACK. */ 114 src_callback_t callback_func ; 115 void *user_callback_data ; 116 long saved_frames ; 117 const float *saved_data ; 118 } SRC_PRIVATE ; 119 120 /* In src_sinc.c */ 121 const char* sinc_get_name (int src_enum) ; 122 const char* sinc_get_description (int src_enum) ; 123 124 int sinc_set_converter (SRC_PRIVATE *psrc, int src_enum) ; 125 126 /* In src_linear.c */ 127 const char* linear_get_name (int src_enum) ; 128 const char* linear_get_description (int src_enum) ; 129 130 int linear_set_converter (SRC_PRIVATE *psrc, int src_enum) ; 131 132 /* In src_zoh.c */ 133 const char* zoh_get_name (int src_enum) ; 134 const char* zoh_get_description (int src_enum) ; 135 136 int zoh_set_converter (SRC_PRIVATE *psrc, int src_enum) ; 137 138 /*---------------------------------------------------------- 139 ** Common static inline functions. 140 */ 141 142 static inline double 143 fmod_one (double x) 144 { double res ; 145 146 res = x - lrint (x) ; 147 if (res < 0.0) 148 return res + 1.0 ; 149 150 return res ; 151 } /* fmod_one */ 152 153 static inline int 154 is_bad_src_ratio (double ratio) 155 { return (ratio < (1.0 / SRC_MAX_RATIO) || ratio > (1.0 * SRC_MAX_RATIO)) ; 156 } /* is_bad_src_ratio */ 157 158 159 #endif /* COMMON_H_INCLUDED */ 160 161