#include #include #include "endianmacros.h" #include "sconv.h" #ifndef INT16_FROM #define INT16_FROM INT16_FROM_LE #endif #ifndef INT16_TO #define INT16_TO INT16_TO_LE #endif void pa_sconv_s16le_to_float32(unsigned n, const void *a, unsigned an, float *b) { const int16_t *ca = a; assert(n && a && an && b); for (; n > 0; n--) { unsigned i; float sum = 0; for (i = 0; i < an; i++) { int16_t s = *(ca++); sum += ((float) INT16_FROM(s))/0x7FFF; } if (sum > 1) sum = 1; if (sum < -1) sum = -1; *(b++) = sum; } } void pa_sconv_s16le_from_float32(unsigned n, const float *a, void *b, unsigned bn) { int16_t *cb = b; assert(n && a && b && bn); for (; n > 0; n--) { unsigned i; int16_t s; float v = *(a++); if (v > 1) v = 1; if (v < -1) v = -1; s = (int16_t) (v * 0x7FFF); s = INT16_TO(s); for (i = 0; i < bn; i++) *(cb++) = s; } }