153a5a1b3Sopenharmony_ci/*** 253a5a1b3Sopenharmony_ci This file is part of PulseAudio. 353a5a1b3Sopenharmony_ci 453a5a1b3Sopenharmony_ci Copyright 2004-2006 Lennart Poettering 553a5a1b3Sopenharmony_ci 653a5a1b3Sopenharmony_ci PulseAudio is free software; you can redistribute it and/or modify 753a5a1b3Sopenharmony_ci it under the terms of the GNU Lesser General Public License as published 853a5a1b3Sopenharmony_ci by the Free Software Foundation; either version 2.1 of the License, 953a5a1b3Sopenharmony_ci or (at your option) any later version. 1053a5a1b3Sopenharmony_ci 1153a5a1b3Sopenharmony_ci PulseAudio is distributed in the hope that it will be useful, but 1253a5a1b3Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 1353a5a1b3Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1453a5a1b3Sopenharmony_ci General Public License for more details. 1553a5a1b3Sopenharmony_ci 1653a5a1b3Sopenharmony_ci You should have received a copy of the GNU Lesser General Public License 1753a5a1b3Sopenharmony_ci along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. 1853a5a1b3Sopenharmony_ci***/ 1953a5a1b3Sopenharmony_ci 2053a5a1b3Sopenharmony_ci#ifdef HAVE_CONFIG_H 2153a5a1b3Sopenharmony_ci#include <config.h> 2253a5a1b3Sopenharmony_ci#endif 2353a5a1b3Sopenharmony_ci 2453a5a1b3Sopenharmony_ci/* Despite the name of this file we implement S32 and S24 handling here, too. */ 2553a5a1b3Sopenharmony_ci 2653a5a1b3Sopenharmony_ci#include <inttypes.h> 2753a5a1b3Sopenharmony_ci#include <stdio.h> 2853a5a1b3Sopenharmony_ci#include <math.h> 2953a5a1b3Sopenharmony_ci 3053a5a1b3Sopenharmony_ci#include <pulsecore/sconv.h> 3153a5a1b3Sopenharmony_ci#include <pulsecore/macro.h> 3253a5a1b3Sopenharmony_ci#include <pulsecore/endianmacros.h> 3353a5a1b3Sopenharmony_ci 3453a5a1b3Sopenharmony_ci#include "sconv-s16le.h" 3553a5a1b3Sopenharmony_ci 3653a5a1b3Sopenharmony_ci#ifndef INT16_FROM 3753a5a1b3Sopenharmony_ci#define INT16_FROM PA_INT16_FROM_LE 3853a5a1b3Sopenharmony_ci#endif 3953a5a1b3Sopenharmony_ci#ifndef UINT16_FROM 4053a5a1b3Sopenharmony_ci#define UINT16_FROM PA_UINT16_FROM_LE 4153a5a1b3Sopenharmony_ci#endif 4253a5a1b3Sopenharmony_ci 4353a5a1b3Sopenharmony_ci#ifndef INT16_TO 4453a5a1b3Sopenharmony_ci#define INT16_TO PA_INT16_TO_LE 4553a5a1b3Sopenharmony_ci#endif 4653a5a1b3Sopenharmony_ci#ifndef UINT16_TO 4753a5a1b3Sopenharmony_ci#define UINT16_TO PA_UINT16_TO_LE 4853a5a1b3Sopenharmony_ci#endif 4953a5a1b3Sopenharmony_ci 5053a5a1b3Sopenharmony_ci#ifndef INT32_FROM 5153a5a1b3Sopenharmony_ci#define INT32_FROM PA_INT32_FROM_LE 5253a5a1b3Sopenharmony_ci#endif 5353a5a1b3Sopenharmony_ci#ifndef UINT32_FROM 5453a5a1b3Sopenharmony_ci#define UINT32_FROM PA_UINT32_FROM_LE 5553a5a1b3Sopenharmony_ci#endif 5653a5a1b3Sopenharmony_ci 5753a5a1b3Sopenharmony_ci#ifndef INT32_TO 5853a5a1b3Sopenharmony_ci#define INT32_TO PA_INT32_TO_LE 5953a5a1b3Sopenharmony_ci#endif 6053a5a1b3Sopenharmony_ci#ifndef UINT32_TO 6153a5a1b3Sopenharmony_ci#define UINT32_TO PA_UINT32_TO_LE 6253a5a1b3Sopenharmony_ci#endif 6353a5a1b3Sopenharmony_ci 6453a5a1b3Sopenharmony_ci#ifndef READ24 6553a5a1b3Sopenharmony_ci#define READ24 PA_READ24LE 6653a5a1b3Sopenharmony_ci#endif 6753a5a1b3Sopenharmony_ci#ifndef WRITE24 6853a5a1b3Sopenharmony_ci#define WRITE24 PA_WRITE24LE 6953a5a1b3Sopenharmony_ci#endif 7053a5a1b3Sopenharmony_ci 7153a5a1b3Sopenharmony_ci#ifndef SWAP_WORDS 7253a5a1b3Sopenharmony_ci#ifdef WORDS_BIGENDIAN 7353a5a1b3Sopenharmony_ci#define SWAP_WORDS 1 7453a5a1b3Sopenharmony_ci#else 7553a5a1b3Sopenharmony_ci#define SWAP_WORDS 0 7653a5a1b3Sopenharmony_ci#endif 7753a5a1b3Sopenharmony_ci#endif 7853a5a1b3Sopenharmony_ci 7953a5a1b3Sopenharmony_civoid pa_sconv_s16le_to_float32ne(unsigned n, const int16_t *a, float *b) { 8053a5a1b3Sopenharmony_ci pa_assert(a); 8153a5a1b3Sopenharmony_ci pa_assert(b); 8253a5a1b3Sopenharmony_ci 8353a5a1b3Sopenharmony_ci#if SWAP_WORDS == 1 8453a5a1b3Sopenharmony_ci for (; n > 0; n--) { 8553a5a1b3Sopenharmony_ci int16_t s = *(a++); 8653a5a1b3Sopenharmony_ci *(b++) = INT16_FROM(s) * (1.0f / (1 << 15)); 8753a5a1b3Sopenharmony_ci } 8853a5a1b3Sopenharmony_ci#else 8953a5a1b3Sopenharmony_ci for (; n > 0; n--) 9053a5a1b3Sopenharmony_ci *(b++) = *(a++) * (1.0f / (1 << 15)); 9153a5a1b3Sopenharmony_ci#endif 9253a5a1b3Sopenharmony_ci} 9353a5a1b3Sopenharmony_ci 9453a5a1b3Sopenharmony_civoid pa_sconv_s32le_to_float32ne(unsigned n, const int32_t *a, float *b) { 9553a5a1b3Sopenharmony_ci pa_assert(a); 9653a5a1b3Sopenharmony_ci pa_assert(b); 9753a5a1b3Sopenharmony_ci 9853a5a1b3Sopenharmony_ci#if SWAP_WORDS == 1 9953a5a1b3Sopenharmony_ci for (; n > 0; n--) { 10053a5a1b3Sopenharmony_ci int32_t s = *(a++); 10153a5a1b3Sopenharmony_ci *(b++) = INT32_FROM(s) * (1.0f / (1U << 31)); 10253a5a1b3Sopenharmony_ci } 10353a5a1b3Sopenharmony_ci#else 10453a5a1b3Sopenharmony_ci for (; n > 0; n--) 10553a5a1b3Sopenharmony_ci *(b++) = *(a++) * (1.0f / (1U << 31)); 10653a5a1b3Sopenharmony_ci#endif 10753a5a1b3Sopenharmony_ci} 10853a5a1b3Sopenharmony_ci 10953a5a1b3Sopenharmony_civoid pa_sconv_s16le_from_float32ne(unsigned n, const float *a, int16_t *b) { 11053a5a1b3Sopenharmony_ci pa_assert(a); 11153a5a1b3Sopenharmony_ci pa_assert(b); 11253a5a1b3Sopenharmony_ci 11353a5a1b3Sopenharmony_ci#if SWAP_WORDS == 1 11453a5a1b3Sopenharmony_ci for (; n > 0; n--) { 11553a5a1b3Sopenharmony_ci int16_t s; 11653a5a1b3Sopenharmony_ci float v = *(a++) * (1 << 15); 11753a5a1b3Sopenharmony_ci 11853a5a1b3Sopenharmony_ci s = (int16_t) PA_CLAMP_UNLIKELY(lrintf(v), -0x8000, 0x7FFF); 11953a5a1b3Sopenharmony_ci *(b++) = INT16_TO(s); 12053a5a1b3Sopenharmony_ci } 12153a5a1b3Sopenharmony_ci#else 12253a5a1b3Sopenharmony_ci for (; n > 0; n--) { 12353a5a1b3Sopenharmony_ci float v = *(a++) * (1 << 15); 12453a5a1b3Sopenharmony_ci 12553a5a1b3Sopenharmony_ci *(b++) = (int16_t) PA_CLAMP_UNLIKELY(lrintf(v), -0x8000, 0x7FFF); 12653a5a1b3Sopenharmony_ci } 12753a5a1b3Sopenharmony_ci#endif 12853a5a1b3Sopenharmony_ci} 12953a5a1b3Sopenharmony_ci 13053a5a1b3Sopenharmony_civoid pa_sconv_s32le_from_float32ne(unsigned n, const float *a, int32_t *b) { 13153a5a1b3Sopenharmony_ci pa_assert(a); 13253a5a1b3Sopenharmony_ci pa_assert(b); 13353a5a1b3Sopenharmony_ci 13453a5a1b3Sopenharmony_ci#if SWAP_WORDS == 1 13553a5a1b3Sopenharmony_ci for (; n > 0; n--) { 13653a5a1b3Sopenharmony_ci int32_t s; 13753a5a1b3Sopenharmony_ci float v = *(a++) * (1U << 31); 13853a5a1b3Sopenharmony_ci 13953a5a1b3Sopenharmony_ci s = (int32_t) PA_CLAMP_UNLIKELY(llrintf(v), -0x80000000LL, 0x7FFFFFFFLL); 14053a5a1b3Sopenharmony_ci *(b++) = INT32_TO(s); 14153a5a1b3Sopenharmony_ci } 14253a5a1b3Sopenharmony_ci#else 14353a5a1b3Sopenharmony_ci for (; n > 0; n--) { 14453a5a1b3Sopenharmony_ci float v = *(a++) * (1U << 31); 14553a5a1b3Sopenharmony_ci 14653a5a1b3Sopenharmony_ci *(b++) = (int32_t) PA_CLAMP_UNLIKELY(llrintf(v), -0x80000000LL, 0x7FFFFFFFLL); 14753a5a1b3Sopenharmony_ci } 14853a5a1b3Sopenharmony_ci#endif 14953a5a1b3Sopenharmony_ci} 15053a5a1b3Sopenharmony_ci 15153a5a1b3Sopenharmony_civoid pa_sconv_s16le_to_float32re(unsigned n, const int16_t *a, float *b) { 15253a5a1b3Sopenharmony_ci pa_assert(a); 15353a5a1b3Sopenharmony_ci pa_assert(b); 15453a5a1b3Sopenharmony_ci 15553a5a1b3Sopenharmony_ci for (; n > 0; n--) { 15653a5a1b3Sopenharmony_ci int16_t s = *(a++); 15753a5a1b3Sopenharmony_ci float k = INT16_FROM(s) * (1.0f / (1 << 15)); 15853a5a1b3Sopenharmony_ci PA_WRITE_FLOAT32RE(b++, k); 15953a5a1b3Sopenharmony_ci } 16053a5a1b3Sopenharmony_ci} 16153a5a1b3Sopenharmony_ci 16253a5a1b3Sopenharmony_civoid pa_sconv_s32le_to_float32re(unsigned n, const int32_t *a, float *b) { 16353a5a1b3Sopenharmony_ci pa_assert(a); 16453a5a1b3Sopenharmony_ci pa_assert(b); 16553a5a1b3Sopenharmony_ci 16653a5a1b3Sopenharmony_ci for (; n > 0; n--) { 16753a5a1b3Sopenharmony_ci int32_t s = *(a++); 16853a5a1b3Sopenharmony_ci float k = INT32_FROM(s) * (1.0f / (1U << 31)); 16953a5a1b3Sopenharmony_ci PA_WRITE_FLOAT32RE(b++, k); 17053a5a1b3Sopenharmony_ci } 17153a5a1b3Sopenharmony_ci} 17253a5a1b3Sopenharmony_ci 17353a5a1b3Sopenharmony_civoid pa_sconv_s16le_from_float32re(unsigned n, const float *a, int16_t *b) { 17453a5a1b3Sopenharmony_ci pa_assert(a); 17553a5a1b3Sopenharmony_ci pa_assert(b); 17653a5a1b3Sopenharmony_ci 17753a5a1b3Sopenharmony_ci for (; n > 0; n--) { 17853a5a1b3Sopenharmony_ci int16_t s; 17953a5a1b3Sopenharmony_ci float v = PA_READ_FLOAT32RE(a++) * (1 << 15); 18053a5a1b3Sopenharmony_ci s = (int16_t) PA_CLAMP_UNLIKELY(lrintf(v), -0x8000, 0x7FFF); 18153a5a1b3Sopenharmony_ci *(b++) = INT16_TO(s); 18253a5a1b3Sopenharmony_ci } 18353a5a1b3Sopenharmony_ci} 18453a5a1b3Sopenharmony_ci 18553a5a1b3Sopenharmony_civoid pa_sconv_s32le_from_float32re(unsigned n, const float *a, int32_t *b) { 18653a5a1b3Sopenharmony_ci pa_assert(a); 18753a5a1b3Sopenharmony_ci pa_assert(b); 18853a5a1b3Sopenharmony_ci 18953a5a1b3Sopenharmony_ci for (; n > 0; n--) { 19053a5a1b3Sopenharmony_ci int32_t s; 19153a5a1b3Sopenharmony_ci float v = PA_READ_FLOAT32RE(a++) * (1U << 31); 19253a5a1b3Sopenharmony_ci s = (int32_t) PA_CLAMP_UNLIKELY(llrintf(v), -0x80000000LL, 0x7FFFFFFFLL); 19353a5a1b3Sopenharmony_ci *(b++) = INT32_TO(s); 19453a5a1b3Sopenharmony_ci } 19553a5a1b3Sopenharmony_ci} 19653a5a1b3Sopenharmony_ci 19753a5a1b3Sopenharmony_civoid pa_sconv_s32le_to_s16ne(unsigned n, const int32_t*a, int16_t *b) { 19853a5a1b3Sopenharmony_ci pa_assert(a); 19953a5a1b3Sopenharmony_ci pa_assert(b); 20053a5a1b3Sopenharmony_ci 20153a5a1b3Sopenharmony_ci for (; n > 0; n--) { 20253a5a1b3Sopenharmony_ci *b = (int16_t) (INT32_FROM(*a) >> 16); 20353a5a1b3Sopenharmony_ci a++; 20453a5a1b3Sopenharmony_ci b++; 20553a5a1b3Sopenharmony_ci } 20653a5a1b3Sopenharmony_ci} 20753a5a1b3Sopenharmony_ci 20853a5a1b3Sopenharmony_civoid pa_sconv_s32le_to_s16re(unsigned n, const int32_t*a, int16_t *b) { 20953a5a1b3Sopenharmony_ci pa_assert(a); 21053a5a1b3Sopenharmony_ci pa_assert(b); 21153a5a1b3Sopenharmony_ci 21253a5a1b3Sopenharmony_ci for (; n > 0; n--) { 21353a5a1b3Sopenharmony_ci int16_t s = (int16_t) (INT32_FROM(*a) >> 16); 21453a5a1b3Sopenharmony_ci *b = PA_INT16_SWAP(s); 21553a5a1b3Sopenharmony_ci a++; 21653a5a1b3Sopenharmony_ci b++; 21753a5a1b3Sopenharmony_ci } 21853a5a1b3Sopenharmony_ci} 21953a5a1b3Sopenharmony_ci 22053a5a1b3Sopenharmony_civoid pa_sconv_s32le_from_s16ne(unsigned n, const int16_t *a, int32_t *b) { 22153a5a1b3Sopenharmony_ci pa_assert(a); 22253a5a1b3Sopenharmony_ci pa_assert(b); 22353a5a1b3Sopenharmony_ci 22453a5a1b3Sopenharmony_ci for (; n > 0; n--) { 22553a5a1b3Sopenharmony_ci *b = INT32_TO(((int32_t) *a) << 16); 22653a5a1b3Sopenharmony_ci a++; 22753a5a1b3Sopenharmony_ci b++; 22853a5a1b3Sopenharmony_ci } 22953a5a1b3Sopenharmony_ci} 23053a5a1b3Sopenharmony_ci 23153a5a1b3Sopenharmony_civoid pa_sconv_s32le_from_s16re(unsigned n, const int16_t *a, int32_t *b) { 23253a5a1b3Sopenharmony_ci pa_assert(a); 23353a5a1b3Sopenharmony_ci pa_assert(b); 23453a5a1b3Sopenharmony_ci 23553a5a1b3Sopenharmony_ci for (; n > 0; n--) { 23653a5a1b3Sopenharmony_ci int32_t s = ((int32_t) PA_INT16_SWAP(*a)) << 16; 23753a5a1b3Sopenharmony_ci *b = INT32_TO(s); 23853a5a1b3Sopenharmony_ci a++; 23953a5a1b3Sopenharmony_ci b++; 24053a5a1b3Sopenharmony_ci } 24153a5a1b3Sopenharmony_ci} 24253a5a1b3Sopenharmony_ci 24353a5a1b3Sopenharmony_civoid pa_sconv_s24le_to_s16ne(unsigned n, const uint8_t *a, int16_t *b) { 24453a5a1b3Sopenharmony_ci pa_assert(a); 24553a5a1b3Sopenharmony_ci pa_assert(b); 24653a5a1b3Sopenharmony_ci 24753a5a1b3Sopenharmony_ci for (; n > 0; n--) { 24853a5a1b3Sopenharmony_ci *b = (int16_t) (READ24(a) >> 8); 24953a5a1b3Sopenharmony_ci a += 3; 25053a5a1b3Sopenharmony_ci b++; 25153a5a1b3Sopenharmony_ci } 25253a5a1b3Sopenharmony_ci} 25353a5a1b3Sopenharmony_ci 25453a5a1b3Sopenharmony_civoid pa_sconv_s24le_from_s16ne(unsigned n, const int16_t *a, uint8_t *b) { 25553a5a1b3Sopenharmony_ci pa_assert(a); 25653a5a1b3Sopenharmony_ci pa_assert(b); 25753a5a1b3Sopenharmony_ci 25853a5a1b3Sopenharmony_ci for (; n > 0; n--) { 25953a5a1b3Sopenharmony_ci WRITE24(b, ((uint32_t) *a) << 8); 26053a5a1b3Sopenharmony_ci a++; 26153a5a1b3Sopenharmony_ci b += 3; 26253a5a1b3Sopenharmony_ci } 26353a5a1b3Sopenharmony_ci} 26453a5a1b3Sopenharmony_ci 26553a5a1b3Sopenharmony_civoid pa_sconv_s24le_to_s16re(unsigned n, const uint8_t *a, int16_t *b) { 26653a5a1b3Sopenharmony_ci pa_assert(a); 26753a5a1b3Sopenharmony_ci pa_assert(b); 26853a5a1b3Sopenharmony_ci 26953a5a1b3Sopenharmony_ci for (; n > 0; n--) { 27053a5a1b3Sopenharmony_ci int16_t s = (int16_t) (READ24(a) >> 8); 27153a5a1b3Sopenharmony_ci *b = PA_INT16_SWAP(s); 27253a5a1b3Sopenharmony_ci a += 3; 27353a5a1b3Sopenharmony_ci b++; 27453a5a1b3Sopenharmony_ci } 27553a5a1b3Sopenharmony_ci} 27653a5a1b3Sopenharmony_ci 27753a5a1b3Sopenharmony_civoid pa_sconv_s24le_from_s16re(unsigned n, const int16_t *a, uint8_t *b) { 27853a5a1b3Sopenharmony_ci pa_assert(a); 27953a5a1b3Sopenharmony_ci pa_assert(b); 28053a5a1b3Sopenharmony_ci 28153a5a1b3Sopenharmony_ci for (; n > 0; n--) { 28253a5a1b3Sopenharmony_ci uint32_t s = ((uint32_t) PA_INT16_SWAP(*a)) << 8; 28353a5a1b3Sopenharmony_ci WRITE24(b, s); 28453a5a1b3Sopenharmony_ci a++; 28553a5a1b3Sopenharmony_ci b += 3; 28653a5a1b3Sopenharmony_ci } 28753a5a1b3Sopenharmony_ci} 28853a5a1b3Sopenharmony_ci 28953a5a1b3Sopenharmony_civoid pa_sconv_s24le_to_float32ne(unsigned n, const uint8_t *a, float *b) { 29053a5a1b3Sopenharmony_ci pa_assert(a); 29153a5a1b3Sopenharmony_ci pa_assert(b); 29253a5a1b3Sopenharmony_ci 29353a5a1b3Sopenharmony_ci for (; n > 0; n--) { 29453a5a1b3Sopenharmony_ci int32_t s = READ24(a) << 8; 29553a5a1b3Sopenharmony_ci *b = s * (1.0f / (1U << 31)); 29653a5a1b3Sopenharmony_ci a += 3; 29753a5a1b3Sopenharmony_ci b++; 29853a5a1b3Sopenharmony_ci } 29953a5a1b3Sopenharmony_ci} 30053a5a1b3Sopenharmony_ci 30153a5a1b3Sopenharmony_civoid pa_sconv_s24le_from_float32ne(unsigned n, const float *a, uint8_t *b) { 30253a5a1b3Sopenharmony_ci pa_assert(a); 30353a5a1b3Sopenharmony_ci pa_assert(b); 30453a5a1b3Sopenharmony_ci 30553a5a1b3Sopenharmony_ci for (; n > 0; n--) { 30653a5a1b3Sopenharmony_ci int32_t s; 30753a5a1b3Sopenharmony_ci float v = *a * (1U << 31); 30853a5a1b3Sopenharmony_ci s = (int32_t) PA_CLAMP_UNLIKELY(llrint(v), -0x80000000LL, 0x7FFFFFFFLL); 30953a5a1b3Sopenharmony_ci WRITE24(b, ((uint32_t) s) >> 8); 31053a5a1b3Sopenharmony_ci a++; 31153a5a1b3Sopenharmony_ci b += 3; 31253a5a1b3Sopenharmony_ci } 31353a5a1b3Sopenharmony_ci} 31453a5a1b3Sopenharmony_ci 31553a5a1b3Sopenharmony_civoid pa_sconv_s24le_to_float32re(unsigned n, const uint8_t *a, float *b) { 31653a5a1b3Sopenharmony_ci pa_assert(a); 31753a5a1b3Sopenharmony_ci pa_assert(b); 31853a5a1b3Sopenharmony_ci 31953a5a1b3Sopenharmony_ci for (; n > 0; n--) { 32053a5a1b3Sopenharmony_ci int32_t s = READ24(a) << 8; 32153a5a1b3Sopenharmony_ci float k = s * (1.0f / (1U << 31)); 32253a5a1b3Sopenharmony_ci PA_WRITE_FLOAT32RE(b, k); 32353a5a1b3Sopenharmony_ci a += 3; 32453a5a1b3Sopenharmony_ci b++; 32553a5a1b3Sopenharmony_ci } 32653a5a1b3Sopenharmony_ci} 32753a5a1b3Sopenharmony_ci 32853a5a1b3Sopenharmony_civoid pa_sconv_s24le_from_float32re(unsigned n, const float *a, uint8_t *b) { 32953a5a1b3Sopenharmony_ci pa_assert(a); 33053a5a1b3Sopenharmony_ci pa_assert(b); 33153a5a1b3Sopenharmony_ci 33253a5a1b3Sopenharmony_ci for (; n > 0; n--) { 33353a5a1b3Sopenharmony_ci int32_t s; 33453a5a1b3Sopenharmony_ci float v = PA_READ_FLOAT32RE(a) * (1U << 31); 33553a5a1b3Sopenharmony_ci s = (int32_t) PA_CLAMP_UNLIKELY(llrint(v), -0x80000000LL, 0x7FFFFFFFLL); 33653a5a1b3Sopenharmony_ci WRITE24(b, ((uint32_t) s) >> 8); 33753a5a1b3Sopenharmony_ci a++; 33853a5a1b3Sopenharmony_ci b+=3; 33953a5a1b3Sopenharmony_ci } 34053a5a1b3Sopenharmony_ci} 34153a5a1b3Sopenharmony_ci 34253a5a1b3Sopenharmony_civoid pa_sconv_s24_32le_to_s16ne(unsigned n, const uint32_t *a, int16_t *b) { 34353a5a1b3Sopenharmony_ci pa_assert(a); 34453a5a1b3Sopenharmony_ci pa_assert(b); 34553a5a1b3Sopenharmony_ci 34653a5a1b3Sopenharmony_ci for (; n > 0; n--) { 34753a5a1b3Sopenharmony_ci *b = (int16_t) (((int32_t) (UINT32_FROM(*a) << 8)) >> 16); 34853a5a1b3Sopenharmony_ci a++; 34953a5a1b3Sopenharmony_ci b++; 35053a5a1b3Sopenharmony_ci } 35153a5a1b3Sopenharmony_ci} 35253a5a1b3Sopenharmony_ci 35353a5a1b3Sopenharmony_civoid pa_sconv_s24_32le_to_s16re(unsigned n, const uint32_t *a, int16_t *b) { 35453a5a1b3Sopenharmony_ci pa_assert(a); 35553a5a1b3Sopenharmony_ci pa_assert(b); 35653a5a1b3Sopenharmony_ci 35753a5a1b3Sopenharmony_ci for (; n > 0; n--) { 35853a5a1b3Sopenharmony_ci int16_t s = (int16_t) ((int32_t) (UINT32_FROM(*a) << 8) >> 16); 35953a5a1b3Sopenharmony_ci *b = PA_INT16_SWAP(s); 36053a5a1b3Sopenharmony_ci a++; 36153a5a1b3Sopenharmony_ci b++; 36253a5a1b3Sopenharmony_ci } 36353a5a1b3Sopenharmony_ci} 36453a5a1b3Sopenharmony_ci 36553a5a1b3Sopenharmony_civoid pa_sconv_s24_32le_from_s16ne(unsigned n, const int16_t *a, uint32_t *b) { 36653a5a1b3Sopenharmony_ci pa_assert(a); 36753a5a1b3Sopenharmony_ci pa_assert(b); 36853a5a1b3Sopenharmony_ci 36953a5a1b3Sopenharmony_ci for (; n > 0; n--) { 37053a5a1b3Sopenharmony_ci *b = UINT32_TO(((uint32_t) ((int32_t) *a << 16)) >> 8); 37153a5a1b3Sopenharmony_ci a++; 37253a5a1b3Sopenharmony_ci b++; 37353a5a1b3Sopenharmony_ci } 37453a5a1b3Sopenharmony_ci} 37553a5a1b3Sopenharmony_ci 37653a5a1b3Sopenharmony_civoid pa_sconv_s24_32le_from_s16re(unsigned n, const int16_t *a, uint32_t *b) { 37753a5a1b3Sopenharmony_ci pa_assert(a); 37853a5a1b3Sopenharmony_ci pa_assert(b); 37953a5a1b3Sopenharmony_ci 38053a5a1b3Sopenharmony_ci for (; n > 0; n--) { 38153a5a1b3Sopenharmony_ci uint32_t s = ((uint32_t) ((int32_t) PA_INT16_SWAP(*a) << 16)) >> 8; 38253a5a1b3Sopenharmony_ci *b = UINT32_TO(s); 38353a5a1b3Sopenharmony_ci a++; 38453a5a1b3Sopenharmony_ci b++; 38553a5a1b3Sopenharmony_ci } 38653a5a1b3Sopenharmony_ci} 38753a5a1b3Sopenharmony_ci 38853a5a1b3Sopenharmony_civoid pa_sconv_s24_32le_to_float32ne(unsigned n, const uint32_t *a, float *b) { 38953a5a1b3Sopenharmony_ci pa_assert(a); 39053a5a1b3Sopenharmony_ci pa_assert(b); 39153a5a1b3Sopenharmony_ci 39253a5a1b3Sopenharmony_ci for (; n > 0; n--) { 39353a5a1b3Sopenharmony_ci int32_t s = (int32_t) (UINT32_FROM(*a) << 8); 39453a5a1b3Sopenharmony_ci *b = s * (1.0f / (1U << 31)); 39553a5a1b3Sopenharmony_ci a++; 39653a5a1b3Sopenharmony_ci b++; 39753a5a1b3Sopenharmony_ci } 39853a5a1b3Sopenharmony_ci} 39953a5a1b3Sopenharmony_ci 40053a5a1b3Sopenharmony_civoid pa_sconv_s24_32le_to_float32re(unsigned n, const uint32_t *a, float *b) { 40153a5a1b3Sopenharmony_ci pa_assert(a); 40253a5a1b3Sopenharmony_ci pa_assert(b); 40353a5a1b3Sopenharmony_ci 40453a5a1b3Sopenharmony_ci for (; n > 0; n--) { 40553a5a1b3Sopenharmony_ci int32_t s = (int32_t) (UINT32_FROM(*a) << 8); 40653a5a1b3Sopenharmony_ci float k = s * (1.0f / (1U << 31)); 40753a5a1b3Sopenharmony_ci PA_WRITE_FLOAT32RE(b, k); 40853a5a1b3Sopenharmony_ci a++; 40953a5a1b3Sopenharmony_ci b++; 41053a5a1b3Sopenharmony_ci } 41153a5a1b3Sopenharmony_ci} 41253a5a1b3Sopenharmony_ci 41353a5a1b3Sopenharmony_civoid pa_sconv_s24_32le_from_float32ne(unsigned n, const float *a, uint32_t *b) { 41453a5a1b3Sopenharmony_ci pa_assert(a); 41553a5a1b3Sopenharmony_ci pa_assert(b); 41653a5a1b3Sopenharmony_ci 41753a5a1b3Sopenharmony_ci for (; n > 0; n--) { 41853a5a1b3Sopenharmony_ci int32_t s; 41953a5a1b3Sopenharmony_ci float v = *a * (1U << 31); 42053a5a1b3Sopenharmony_ci s = (int32_t) PA_CLAMP_UNLIKELY(llrint(v), -0x80000000LL, 0x7FFFFFFFLL); 42153a5a1b3Sopenharmony_ci *b = UINT32_TO(((uint32_t) s) >> 8); 42253a5a1b3Sopenharmony_ci a++; 42353a5a1b3Sopenharmony_ci b++; 42453a5a1b3Sopenharmony_ci } 42553a5a1b3Sopenharmony_ci} 42653a5a1b3Sopenharmony_ci 42753a5a1b3Sopenharmony_civoid pa_sconv_s24_32le_from_float32re(unsigned n, const float *a, uint32_t *b) { 42853a5a1b3Sopenharmony_ci pa_assert(a); 42953a5a1b3Sopenharmony_ci pa_assert(b); 43053a5a1b3Sopenharmony_ci 43153a5a1b3Sopenharmony_ci for (; n > 0; n--) { 43253a5a1b3Sopenharmony_ci int32_t s; 43353a5a1b3Sopenharmony_ci float v = PA_READ_FLOAT32RE(a) * (1U << 31); 43453a5a1b3Sopenharmony_ci s = (int32_t) PA_CLAMP_UNLIKELY(llrint(v), -0x80000000LL, 0x7FFFFFFFLL); 43553a5a1b3Sopenharmony_ci *b = UINT32_TO(((uint32_t) s) >> 8); 43653a5a1b3Sopenharmony_ci a++; 43753a5a1b3Sopenharmony_ci b++; 43853a5a1b3Sopenharmony_ci } 43953a5a1b3Sopenharmony_ci} 440