153a5a1b3Sopenharmony_ci/*** 253a5a1b3Sopenharmony_ci This file is part of PulseAudio. 353a5a1b3Sopenharmony_ci 453a5a1b3Sopenharmony_ci Copyright 2004-2006 Lennart Poettering 553a5a1b3Sopenharmony_ci Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB 653a5a1b3Sopenharmony_ci 753a5a1b3Sopenharmony_ci PulseAudio is free software; you can redistribute it and/or modify 853a5a1b3Sopenharmony_ci it under the terms of the GNU Lesser General Public License as published 953a5a1b3Sopenharmony_ci by the Free Software Foundation; either version 2.1 of the License, 1053a5a1b3Sopenharmony_ci or (at your option) any later version. 1153a5a1b3Sopenharmony_ci 1253a5a1b3Sopenharmony_ci PulseAudio is distributed in the hope that it will be useful, but 1353a5a1b3Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 1453a5a1b3Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1553a5a1b3Sopenharmony_ci General Public License for more details. 1653a5a1b3Sopenharmony_ci 1753a5a1b3Sopenharmony_ci You should have received a copy of the GNU Lesser General Public License 1853a5a1b3Sopenharmony_ci along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. 1953a5a1b3Sopenharmony_ci***/ 2053a5a1b3Sopenharmony_ci 2153a5a1b3Sopenharmony_ci#ifdef HAVE_CONFIG_H 2253a5a1b3Sopenharmony_ci#include <config.h> 2353a5a1b3Sopenharmony_ci#endif 2453a5a1b3Sopenharmony_ci 2553a5a1b3Sopenharmony_ci#include <stdio.h> 2653a5a1b3Sopenharmony_ci#include <stdlib.h> 2753a5a1b3Sopenharmony_ci#include <math.h> 2853a5a1b3Sopenharmony_ci 2953a5a1b3Sopenharmony_ci#include <pulsecore/g711.h> 3053a5a1b3Sopenharmony_ci#include <pulsecore/macro.h> 3153a5a1b3Sopenharmony_ci#include <pulsecore/endianmacros.h> 3253a5a1b3Sopenharmony_ci 3353a5a1b3Sopenharmony_ci#include <pulsecore/sconv-s16le.h> 3453a5a1b3Sopenharmony_ci#include <pulsecore/sconv-s16be.h> 3553a5a1b3Sopenharmony_ci 3653a5a1b3Sopenharmony_ci#include "sconv.h" 3753a5a1b3Sopenharmony_ci 3853a5a1b3Sopenharmony_ci/* u8 */ 3953a5a1b3Sopenharmony_cistatic void u8_to_float32ne(unsigned n, const uint8_t *a, float *b) { 4053a5a1b3Sopenharmony_ci pa_assert(a); 4153a5a1b3Sopenharmony_ci pa_assert(b); 4253a5a1b3Sopenharmony_ci 4353a5a1b3Sopenharmony_ci for (; n > 0; n--, a++, b++) 4453a5a1b3Sopenharmony_ci *b = (*a * 1.0/128.0) - 1.0; 4553a5a1b3Sopenharmony_ci} 4653a5a1b3Sopenharmony_ci 4753a5a1b3Sopenharmony_cistatic void u8_from_float32ne(unsigned n, const float *a, uint8_t *b) { 4853a5a1b3Sopenharmony_ci pa_assert(a); 4953a5a1b3Sopenharmony_ci pa_assert(b); 5053a5a1b3Sopenharmony_ci 5153a5a1b3Sopenharmony_ci for (; n > 0; n--, a++, b++) { 5253a5a1b3Sopenharmony_ci float v; 5353a5a1b3Sopenharmony_ci v = (*a * 127.0) + 128.0; 5453a5a1b3Sopenharmony_ci v = PA_CLAMP_UNLIKELY (v, 0.0, 255.0); 5553a5a1b3Sopenharmony_ci *b = rint (v); 5653a5a1b3Sopenharmony_ci } 5753a5a1b3Sopenharmony_ci} 5853a5a1b3Sopenharmony_ci 5953a5a1b3Sopenharmony_cistatic void u8_to_s16ne(unsigned n, const uint8_t *a, int16_t *b) { 6053a5a1b3Sopenharmony_ci pa_assert(a); 6153a5a1b3Sopenharmony_ci pa_assert(b); 6253a5a1b3Sopenharmony_ci 6353a5a1b3Sopenharmony_ci for (; n > 0; n--, a++, b++) 6453a5a1b3Sopenharmony_ci *b = (((int16_t)*a) - 128) << 8; 6553a5a1b3Sopenharmony_ci} 6653a5a1b3Sopenharmony_ci 6753a5a1b3Sopenharmony_cistatic void u8_from_s16ne(unsigned n, const int16_t *a, uint8_t *b) { 6853a5a1b3Sopenharmony_ci 6953a5a1b3Sopenharmony_ci pa_assert(a); 7053a5a1b3Sopenharmony_ci pa_assert(b); 7153a5a1b3Sopenharmony_ci 7253a5a1b3Sopenharmony_ci for (; n > 0; n--, a++, b++) 7353a5a1b3Sopenharmony_ci *b = (uint8_t) ((uint16_t) *a >> 8) + (uint8_t) 0x80U; 7453a5a1b3Sopenharmony_ci} 7553a5a1b3Sopenharmony_ci 7653a5a1b3Sopenharmony_ci/* float32 */ 7753a5a1b3Sopenharmony_ci 7853a5a1b3Sopenharmony_cistatic void float32ne_to_float32ne(unsigned n, const float *a, float *b) { 7953a5a1b3Sopenharmony_ci pa_assert(a); 8053a5a1b3Sopenharmony_ci pa_assert(b); 8153a5a1b3Sopenharmony_ci 8253a5a1b3Sopenharmony_ci memcpy(b, a, (int) (sizeof(float) * n)); 8353a5a1b3Sopenharmony_ci} 8453a5a1b3Sopenharmony_ci 8553a5a1b3Sopenharmony_cistatic void float32re_to_float32ne(unsigned n, const float *a, float *b) { 8653a5a1b3Sopenharmony_ci pa_assert(a); 8753a5a1b3Sopenharmony_ci pa_assert(b); 8853a5a1b3Sopenharmony_ci 8953a5a1b3Sopenharmony_ci for (; n > 0; n--, a++, b++) 9053a5a1b3Sopenharmony_ci *((uint32_t *) b) = PA_UINT32_SWAP(*((uint32_t *) a)); 9153a5a1b3Sopenharmony_ci} 9253a5a1b3Sopenharmony_ci 9353a5a1b3Sopenharmony_ci/* s16 */ 9453a5a1b3Sopenharmony_ci 9553a5a1b3Sopenharmony_cistatic void s16ne_to_s16ne(unsigned n, const int16_t *a, int16_t *b) { 9653a5a1b3Sopenharmony_ci pa_assert(a); 9753a5a1b3Sopenharmony_ci pa_assert(b); 9853a5a1b3Sopenharmony_ci 9953a5a1b3Sopenharmony_ci memcpy(b, a, (int) (sizeof(int16_t) * n)); 10053a5a1b3Sopenharmony_ci} 10153a5a1b3Sopenharmony_ci 10253a5a1b3Sopenharmony_cistatic void s16re_to_s16ne(unsigned n, const int16_t *a, int16_t *b) { 10353a5a1b3Sopenharmony_ci pa_assert(a); 10453a5a1b3Sopenharmony_ci pa_assert(b); 10553a5a1b3Sopenharmony_ci 10653a5a1b3Sopenharmony_ci for (; n > 0; n--, a++, b++) 10753a5a1b3Sopenharmony_ci *b = PA_INT16_SWAP(*a); 10853a5a1b3Sopenharmony_ci} 10953a5a1b3Sopenharmony_ci 11053a5a1b3Sopenharmony_ci/* ulaw */ 11153a5a1b3Sopenharmony_ci 11253a5a1b3Sopenharmony_cistatic void ulaw_to_float32ne(unsigned n, const uint8_t *a, float *b) { 11353a5a1b3Sopenharmony_ci pa_assert(a); 11453a5a1b3Sopenharmony_ci pa_assert(b); 11553a5a1b3Sopenharmony_ci 11653a5a1b3Sopenharmony_ci for (; n > 0; n--) 11753a5a1b3Sopenharmony_ci *(b++) = (float) st_ulaw2linear16(*(a++)) / 0x8000; 11853a5a1b3Sopenharmony_ci} 11953a5a1b3Sopenharmony_ci 12053a5a1b3Sopenharmony_cistatic void ulaw_from_float32ne(unsigned n, const float *a, uint8_t *b) { 12153a5a1b3Sopenharmony_ci pa_assert(a); 12253a5a1b3Sopenharmony_ci pa_assert(b); 12353a5a1b3Sopenharmony_ci 12453a5a1b3Sopenharmony_ci for (; n > 0; n--) { 12553a5a1b3Sopenharmony_ci float v = *(a++); 12653a5a1b3Sopenharmony_ci v = PA_CLAMP_UNLIKELY(v, -1.0f, 1.0f); 12753a5a1b3Sopenharmony_ci v *= 0x1FFF; 12853a5a1b3Sopenharmony_ci *(b++) = st_14linear2ulaw((int16_t) lrintf(v)); 12953a5a1b3Sopenharmony_ci } 13053a5a1b3Sopenharmony_ci} 13153a5a1b3Sopenharmony_ci 13253a5a1b3Sopenharmony_cistatic void ulaw_to_s16ne(unsigned n, const uint8_t *a, int16_t *b) { 13353a5a1b3Sopenharmony_ci pa_assert(a); 13453a5a1b3Sopenharmony_ci pa_assert(b); 13553a5a1b3Sopenharmony_ci 13653a5a1b3Sopenharmony_ci for (; n > 0; n--, a++, b++) 13753a5a1b3Sopenharmony_ci *b = st_ulaw2linear16(*a); 13853a5a1b3Sopenharmony_ci} 13953a5a1b3Sopenharmony_ci 14053a5a1b3Sopenharmony_cistatic void ulaw_from_s16ne(unsigned n, const int16_t *a, uint8_t *b) { 14153a5a1b3Sopenharmony_ci pa_assert(a); 14253a5a1b3Sopenharmony_ci pa_assert(b); 14353a5a1b3Sopenharmony_ci 14453a5a1b3Sopenharmony_ci for (; n > 0; n--, a++, b++) 14553a5a1b3Sopenharmony_ci *b = st_14linear2ulaw(*a >> 2); 14653a5a1b3Sopenharmony_ci} 14753a5a1b3Sopenharmony_ci 14853a5a1b3Sopenharmony_ci/* alaw */ 14953a5a1b3Sopenharmony_ci 15053a5a1b3Sopenharmony_cistatic void alaw_to_float32ne(unsigned n, const uint8_t *a, float *b) { 15153a5a1b3Sopenharmony_ci pa_assert(a); 15253a5a1b3Sopenharmony_ci pa_assert(b); 15353a5a1b3Sopenharmony_ci 15453a5a1b3Sopenharmony_ci for (; n > 0; n--, a++, b++) 15553a5a1b3Sopenharmony_ci *b = (float) st_alaw2linear16(*a) / 0x8000; 15653a5a1b3Sopenharmony_ci} 15753a5a1b3Sopenharmony_ci 15853a5a1b3Sopenharmony_cistatic void alaw_from_float32ne(unsigned n, const float *a, uint8_t *b) { 15953a5a1b3Sopenharmony_ci pa_assert(a); 16053a5a1b3Sopenharmony_ci pa_assert(b); 16153a5a1b3Sopenharmony_ci 16253a5a1b3Sopenharmony_ci for (; n > 0; n--, a++, b++) { 16353a5a1b3Sopenharmony_ci float v = *a; 16453a5a1b3Sopenharmony_ci v = PA_CLAMP_UNLIKELY(v, -1.0f, 1.0f); 16553a5a1b3Sopenharmony_ci v *= 0xFFF; 16653a5a1b3Sopenharmony_ci *b = st_13linear2alaw((int16_t) lrintf(v)); 16753a5a1b3Sopenharmony_ci } 16853a5a1b3Sopenharmony_ci} 16953a5a1b3Sopenharmony_ci 17053a5a1b3Sopenharmony_cistatic void alaw_to_s16ne(unsigned n, const int8_t *a, int16_t *b) { 17153a5a1b3Sopenharmony_ci pa_assert(a); 17253a5a1b3Sopenharmony_ci pa_assert(b); 17353a5a1b3Sopenharmony_ci 17453a5a1b3Sopenharmony_ci for (; n > 0; n--, a++, b++) 17553a5a1b3Sopenharmony_ci *b = st_alaw2linear16((uint8_t) *a); 17653a5a1b3Sopenharmony_ci} 17753a5a1b3Sopenharmony_ci 17853a5a1b3Sopenharmony_cistatic void alaw_from_s16ne(unsigned n, const int16_t *a, uint8_t *b) { 17953a5a1b3Sopenharmony_ci pa_assert(a); 18053a5a1b3Sopenharmony_ci pa_assert(b); 18153a5a1b3Sopenharmony_ci 18253a5a1b3Sopenharmony_ci for (; n > 0; n--, a++, b++) 18353a5a1b3Sopenharmony_ci *b = st_13linear2alaw(*a >> 3); 18453a5a1b3Sopenharmony_ci} 18553a5a1b3Sopenharmony_ci 18653a5a1b3Sopenharmony_cistatic pa_convert_func_t to_float32ne_table[] = { 18753a5a1b3Sopenharmony_ci [PA_SAMPLE_U8] = (pa_convert_func_t) u8_to_float32ne, 18853a5a1b3Sopenharmony_ci [PA_SAMPLE_ALAW] = (pa_convert_func_t) alaw_to_float32ne, 18953a5a1b3Sopenharmony_ci [PA_SAMPLE_ULAW] = (pa_convert_func_t) ulaw_to_float32ne, 19053a5a1b3Sopenharmony_ci [PA_SAMPLE_S16LE] = (pa_convert_func_t) pa_sconv_s16le_to_float32ne, 19153a5a1b3Sopenharmony_ci [PA_SAMPLE_S16BE] = (pa_convert_func_t) pa_sconv_s16be_to_float32ne, 19253a5a1b3Sopenharmony_ci [PA_SAMPLE_S32LE] = (pa_convert_func_t) pa_sconv_s32le_to_float32ne, 19353a5a1b3Sopenharmony_ci [PA_SAMPLE_S32BE] = (pa_convert_func_t) pa_sconv_s32be_to_float32ne, 19453a5a1b3Sopenharmony_ci [PA_SAMPLE_S24LE] = (pa_convert_func_t) pa_sconv_s24le_to_float32ne, 19553a5a1b3Sopenharmony_ci [PA_SAMPLE_S24BE] = (pa_convert_func_t) pa_sconv_s24be_to_float32ne, 19653a5a1b3Sopenharmony_ci [PA_SAMPLE_S24_32LE] = (pa_convert_func_t) pa_sconv_s24_32le_to_float32ne, 19753a5a1b3Sopenharmony_ci [PA_SAMPLE_S24_32BE] = (pa_convert_func_t) pa_sconv_s24_32be_to_float32ne, 19853a5a1b3Sopenharmony_ci [PA_SAMPLE_FLOAT32NE] = (pa_convert_func_t) float32ne_to_float32ne, 19953a5a1b3Sopenharmony_ci [PA_SAMPLE_FLOAT32RE] = (pa_convert_func_t) float32re_to_float32ne, 20053a5a1b3Sopenharmony_ci}; 20153a5a1b3Sopenharmony_ci 20253a5a1b3Sopenharmony_cipa_convert_func_t pa_get_convert_to_float32ne_function(pa_sample_format_t f) { 20353a5a1b3Sopenharmony_ci pa_assert(pa_sample_format_valid(f)); 20453a5a1b3Sopenharmony_ci 20553a5a1b3Sopenharmony_ci return to_float32ne_table[f]; 20653a5a1b3Sopenharmony_ci} 20753a5a1b3Sopenharmony_ci 20853a5a1b3Sopenharmony_civoid pa_set_convert_to_float32ne_function(pa_sample_format_t f, pa_convert_func_t func) { 20953a5a1b3Sopenharmony_ci pa_assert(pa_sample_format_valid(f)); 21053a5a1b3Sopenharmony_ci 21153a5a1b3Sopenharmony_ci to_float32ne_table[f] = func; 21253a5a1b3Sopenharmony_ci} 21353a5a1b3Sopenharmony_ci 21453a5a1b3Sopenharmony_cistatic pa_convert_func_t from_float32ne_table[] = { 21553a5a1b3Sopenharmony_ci [PA_SAMPLE_U8] = (pa_convert_func_t) u8_from_float32ne, 21653a5a1b3Sopenharmony_ci [PA_SAMPLE_S16LE] = (pa_convert_func_t) pa_sconv_s16le_from_float32ne, 21753a5a1b3Sopenharmony_ci [PA_SAMPLE_S16BE] = (pa_convert_func_t) pa_sconv_s16be_from_float32ne, 21853a5a1b3Sopenharmony_ci [PA_SAMPLE_S32LE] = (pa_convert_func_t) pa_sconv_s32le_from_float32ne, 21953a5a1b3Sopenharmony_ci [PA_SAMPLE_S32BE] = (pa_convert_func_t) pa_sconv_s32be_from_float32ne, 22053a5a1b3Sopenharmony_ci [PA_SAMPLE_S24LE] = (pa_convert_func_t) pa_sconv_s24le_from_float32ne, 22153a5a1b3Sopenharmony_ci [PA_SAMPLE_S24BE] = (pa_convert_func_t) pa_sconv_s24be_from_float32ne, 22253a5a1b3Sopenharmony_ci [PA_SAMPLE_S24_32LE] = (pa_convert_func_t) pa_sconv_s24_32le_from_float32ne, 22353a5a1b3Sopenharmony_ci [PA_SAMPLE_S24_32BE] = (pa_convert_func_t) pa_sconv_s24_32be_from_float32ne, 22453a5a1b3Sopenharmony_ci [PA_SAMPLE_FLOAT32NE] = (pa_convert_func_t) float32ne_to_float32ne, 22553a5a1b3Sopenharmony_ci [PA_SAMPLE_FLOAT32RE] = (pa_convert_func_t) float32re_to_float32ne, 22653a5a1b3Sopenharmony_ci [PA_SAMPLE_ALAW] = (pa_convert_func_t) alaw_from_float32ne, 22753a5a1b3Sopenharmony_ci [PA_SAMPLE_ULAW] = (pa_convert_func_t) ulaw_from_float32ne 22853a5a1b3Sopenharmony_ci}; 22953a5a1b3Sopenharmony_ci 23053a5a1b3Sopenharmony_cipa_convert_func_t pa_get_convert_from_float32ne_function(pa_sample_format_t f) { 23153a5a1b3Sopenharmony_ci pa_assert(pa_sample_format_valid(f)); 23253a5a1b3Sopenharmony_ci 23353a5a1b3Sopenharmony_ci return from_float32ne_table[f]; 23453a5a1b3Sopenharmony_ci} 23553a5a1b3Sopenharmony_ci 23653a5a1b3Sopenharmony_civoid pa_set_convert_from_float32ne_function(pa_sample_format_t f, pa_convert_func_t func) { 23753a5a1b3Sopenharmony_ci pa_assert(pa_sample_format_valid(f)); 23853a5a1b3Sopenharmony_ci 23953a5a1b3Sopenharmony_ci from_float32ne_table[f] = func; 24053a5a1b3Sopenharmony_ci} 24153a5a1b3Sopenharmony_ci 24253a5a1b3Sopenharmony_cistatic pa_convert_func_t to_s16ne_table[] = { 24353a5a1b3Sopenharmony_ci [PA_SAMPLE_U8] = (pa_convert_func_t) u8_to_s16ne, 24453a5a1b3Sopenharmony_ci [PA_SAMPLE_S16NE] = (pa_convert_func_t) s16ne_to_s16ne, 24553a5a1b3Sopenharmony_ci [PA_SAMPLE_S16RE] = (pa_convert_func_t) s16re_to_s16ne, 24653a5a1b3Sopenharmony_ci [PA_SAMPLE_FLOAT32BE] = (pa_convert_func_t) pa_sconv_float32be_to_s16ne, 24753a5a1b3Sopenharmony_ci [PA_SAMPLE_FLOAT32LE] = (pa_convert_func_t) pa_sconv_float32le_to_s16ne, 24853a5a1b3Sopenharmony_ci [PA_SAMPLE_S32BE] = (pa_convert_func_t) pa_sconv_s32be_to_s16ne, 24953a5a1b3Sopenharmony_ci [PA_SAMPLE_S32LE] = (pa_convert_func_t) pa_sconv_s32le_to_s16ne, 25053a5a1b3Sopenharmony_ci [PA_SAMPLE_S24BE] = (pa_convert_func_t) pa_sconv_s24be_to_s16ne, 25153a5a1b3Sopenharmony_ci [PA_SAMPLE_S24LE] = (pa_convert_func_t) pa_sconv_s24le_to_s16ne, 25253a5a1b3Sopenharmony_ci [PA_SAMPLE_S24_32BE] = (pa_convert_func_t) pa_sconv_s24_32be_to_s16ne, 25353a5a1b3Sopenharmony_ci [PA_SAMPLE_S24_32LE] = (pa_convert_func_t) pa_sconv_s24_32le_to_s16ne, 25453a5a1b3Sopenharmony_ci [PA_SAMPLE_ALAW] = (pa_convert_func_t) alaw_to_s16ne, 25553a5a1b3Sopenharmony_ci [PA_SAMPLE_ULAW] = (pa_convert_func_t) ulaw_to_s16ne 25653a5a1b3Sopenharmony_ci}; 25753a5a1b3Sopenharmony_ci 25853a5a1b3Sopenharmony_cipa_convert_func_t pa_get_convert_to_s16ne_function(pa_sample_format_t f) { 25953a5a1b3Sopenharmony_ci pa_assert(pa_sample_format_valid(f)); 26053a5a1b3Sopenharmony_ci 26153a5a1b3Sopenharmony_ci return to_s16ne_table[f]; 26253a5a1b3Sopenharmony_ci} 26353a5a1b3Sopenharmony_ci 26453a5a1b3Sopenharmony_civoid pa_set_convert_to_s16ne_function(pa_sample_format_t f, pa_convert_func_t func) { 26553a5a1b3Sopenharmony_ci pa_assert(pa_sample_format_valid(f)); 26653a5a1b3Sopenharmony_ci 26753a5a1b3Sopenharmony_ci to_s16ne_table[f] = func; 26853a5a1b3Sopenharmony_ci} 26953a5a1b3Sopenharmony_ci 27053a5a1b3Sopenharmony_cistatic pa_convert_func_t from_s16ne_table[] = { 27153a5a1b3Sopenharmony_ci [PA_SAMPLE_U8] = (pa_convert_func_t) u8_from_s16ne, 27253a5a1b3Sopenharmony_ci [PA_SAMPLE_S16NE] = (pa_convert_func_t) s16ne_to_s16ne, 27353a5a1b3Sopenharmony_ci [PA_SAMPLE_S16RE] = (pa_convert_func_t) s16re_to_s16ne, 27453a5a1b3Sopenharmony_ci [PA_SAMPLE_FLOAT32BE] = (pa_convert_func_t) pa_sconv_float32be_from_s16ne, 27553a5a1b3Sopenharmony_ci [PA_SAMPLE_FLOAT32LE] = (pa_convert_func_t) pa_sconv_float32le_from_s16ne, 27653a5a1b3Sopenharmony_ci [PA_SAMPLE_S32BE] = (pa_convert_func_t) pa_sconv_s32be_from_s16ne, 27753a5a1b3Sopenharmony_ci [PA_SAMPLE_S32LE] = (pa_convert_func_t) pa_sconv_s32le_from_s16ne, 27853a5a1b3Sopenharmony_ci [PA_SAMPLE_S24BE] = (pa_convert_func_t) pa_sconv_s24be_from_s16ne, 27953a5a1b3Sopenharmony_ci [PA_SAMPLE_S24LE] = (pa_convert_func_t) pa_sconv_s24le_from_s16ne, 28053a5a1b3Sopenharmony_ci [PA_SAMPLE_S24_32BE] = (pa_convert_func_t) pa_sconv_s24_32be_from_s16ne, 28153a5a1b3Sopenharmony_ci [PA_SAMPLE_S24_32LE] = (pa_convert_func_t) pa_sconv_s24_32le_from_s16ne, 28253a5a1b3Sopenharmony_ci [PA_SAMPLE_ALAW] = (pa_convert_func_t) alaw_from_s16ne, 28353a5a1b3Sopenharmony_ci [PA_SAMPLE_ULAW] = (pa_convert_func_t) ulaw_from_s16ne, 28453a5a1b3Sopenharmony_ci}; 28553a5a1b3Sopenharmony_ci 28653a5a1b3Sopenharmony_cipa_convert_func_t pa_get_convert_from_s16ne_function(pa_sample_format_t f) { 28753a5a1b3Sopenharmony_ci pa_assert(pa_sample_format_valid(f)); 28853a5a1b3Sopenharmony_ci 28953a5a1b3Sopenharmony_ci return from_s16ne_table[f]; 29053a5a1b3Sopenharmony_ci} 29153a5a1b3Sopenharmony_ci 29253a5a1b3Sopenharmony_civoid pa_set_convert_from_s16ne_function(pa_sample_format_t f, pa_convert_func_t func) { 29353a5a1b3Sopenharmony_ci pa_assert(pa_sample_format_valid(f)); 29453a5a1b3Sopenharmony_ci 29553a5a1b3Sopenharmony_ci from_s16ne_table[f] = func; 29653a5a1b3Sopenharmony_ci} 297