xref: /aosp_15_r20/external/libldac/src/setpcm_ldac.c (revision aef9bcd9217ad2365ebc8e70efaf94b64e04df14)
1*aef9bcd9SKiyoung Kim /*
2*aef9bcd9SKiyoung Kim  * Copyright (C) 2003 - 2016 Sony Corporation
3*aef9bcd9SKiyoung Kim  *
4*aef9bcd9SKiyoung Kim  * Licensed under the Apache License, Version 2.0 (the "License");
5*aef9bcd9SKiyoung Kim  * you may not use this file except in compliance with the License.
6*aef9bcd9SKiyoung Kim  * You may obtain a copy of the License at
7*aef9bcd9SKiyoung Kim  *
8*aef9bcd9SKiyoung Kim  *      http://www.apache.org/licenses/LICENSE-2.0
9*aef9bcd9SKiyoung Kim  *
10*aef9bcd9SKiyoung Kim  * Unless required by applicable law or agreed to in writing, software
11*aef9bcd9SKiyoung Kim  * distributed under the License is distributed on an "AS IS" BASIS,
12*aef9bcd9SKiyoung Kim  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*aef9bcd9SKiyoung Kim  * See the License for the specific language governing permissions and
14*aef9bcd9SKiyoung Kim  * limitations under the License.
15*aef9bcd9SKiyoung Kim  */
16*aef9bcd9SKiyoung Kim 
17*aef9bcd9SKiyoung Kim #include "ldac.h"
18*aef9bcd9SKiyoung Kim 
19*aef9bcd9SKiyoung Kim /***************************************************************************************************
20*aef9bcd9SKiyoung Kim     Subfunction: Convert from 16bit Signed Integer PCM
21*aef9bcd9SKiyoung Kim ***************************************************************************************************/
byte_data_to_scalar_s16_ldac(char * p_in,SCALAR * p_out,int nsmpl)22*aef9bcd9SKiyoung Kim __inline static void byte_data_to_scalar_s16_ldac(
23*aef9bcd9SKiyoung Kim char *p_in,
24*aef9bcd9SKiyoung Kim SCALAR *p_out,
25*aef9bcd9SKiyoung Kim int nsmpl)
26*aef9bcd9SKiyoung Kim {
27*aef9bcd9SKiyoung Kim     int i;
28*aef9bcd9SKiyoung Kim     short *p_s;
29*aef9bcd9SKiyoung Kim 
30*aef9bcd9SKiyoung Kim     p_s = (short *)p_in;
31*aef9bcd9SKiyoung Kim     for (i = 0; i < nsmpl; i++) {
32*aef9bcd9SKiyoung Kim         *p_out++ = (SCALAR)*p_s++;
33*aef9bcd9SKiyoung Kim     }
34*aef9bcd9SKiyoung Kim 
35*aef9bcd9SKiyoung Kim     return;
36*aef9bcd9SKiyoung Kim }
37*aef9bcd9SKiyoung Kim 
38*aef9bcd9SKiyoung Kim /***************************************************************************************************
39*aef9bcd9SKiyoung Kim     Subfunction: Convert from 24bit Signed Integer PCM
40*aef9bcd9SKiyoung Kim ***************************************************************************************************/
byte_data_to_scalar_s24_ldac(char * p_in,SCALAR * p_out,int nsmpl)41*aef9bcd9SKiyoung Kim __inline static void byte_data_to_scalar_s24_ldac(
42*aef9bcd9SKiyoung Kim char *p_in,
43*aef9bcd9SKiyoung Kim SCALAR *p_out,
44*aef9bcd9SKiyoung Kim int nsmpl)
45*aef9bcd9SKiyoung Kim {
46*aef9bcd9SKiyoung Kim     int i, val;
47*aef9bcd9SKiyoung Kim     char *p_c;
48*aef9bcd9SKiyoung Kim     SCALAR scale = _scalar(1.0) / _scalar(65536.0);
49*aef9bcd9SKiyoung Kim 
50*aef9bcd9SKiyoung Kim     p_c = (char *)p_in;
51*aef9bcd9SKiyoung Kim     for (i = 0; i < nsmpl; i++) {
52*aef9bcd9SKiyoung Kim #ifdef LDAC_HOST_ENDIAN_LITTLE
53*aef9bcd9SKiyoung Kim         val  = 0x000000ff & (*p_c++);
54*aef9bcd9SKiyoung Kim         val |= 0x0000ff00 & (*p_c++ << 8);
55*aef9bcd9SKiyoung Kim         val |= 0xffff0000 & (*p_c++ << 16);
56*aef9bcd9SKiyoung Kim #else /* LDAC_HOST_ENDIAN_LITTLE */
57*aef9bcd9SKiyoung Kim         val  = 0xffff0000 & (*p_c++ << 16);
58*aef9bcd9SKiyoung Kim         val |= 0x0000ff00 & (*p_c++ << 8);
59*aef9bcd9SKiyoung Kim         val |= 0x000000ff & (*p_c++);
60*aef9bcd9SKiyoung Kim #endif /* LDAC_HOST_ENDIAN_LITTLE */
61*aef9bcd9SKiyoung Kim         *p_out++ = scale * (SCALAR)(val << 8); /* Sign Extension */
62*aef9bcd9SKiyoung Kim     }
63*aef9bcd9SKiyoung Kim 
64*aef9bcd9SKiyoung Kim     return;
65*aef9bcd9SKiyoung Kim }
66*aef9bcd9SKiyoung Kim 
67*aef9bcd9SKiyoung Kim /***************************************************************************************************
68*aef9bcd9SKiyoung Kim     Subfunction: Convert from 32bit Signed Integer PCM
69*aef9bcd9SKiyoung Kim ***************************************************************************************************/
byte_data_to_scalar_s32_ldac(char * p_in,SCALAR * p_out,int nsmpl)70*aef9bcd9SKiyoung Kim __inline static void byte_data_to_scalar_s32_ldac(
71*aef9bcd9SKiyoung Kim char *p_in,
72*aef9bcd9SKiyoung Kim SCALAR *p_out,
73*aef9bcd9SKiyoung Kim int nsmpl)
74*aef9bcd9SKiyoung Kim {
75*aef9bcd9SKiyoung Kim     int i;
76*aef9bcd9SKiyoung Kim     int *p_l;
77*aef9bcd9SKiyoung Kim     SCALAR scale = _scalar(1.0) / _scalar(65536.0);
78*aef9bcd9SKiyoung Kim 
79*aef9bcd9SKiyoung Kim     p_l = (int *)p_in;
80*aef9bcd9SKiyoung Kim     for (i = 0; i < nsmpl; i++) {
81*aef9bcd9SKiyoung Kim         *p_out++ = scale * (SCALAR)*p_l++;
82*aef9bcd9SKiyoung Kim     }
83*aef9bcd9SKiyoung Kim 
84*aef9bcd9SKiyoung Kim     return;
85*aef9bcd9SKiyoung Kim }
86*aef9bcd9SKiyoung Kim 
87*aef9bcd9SKiyoung Kim /***************************************************************************************************
88*aef9bcd9SKiyoung Kim     Subfunction: Convert from 32bit Float PCM
89*aef9bcd9SKiyoung Kim ***************************************************************************************************/
byte_data_to_scalar_f32_ldac(char * p_in,SCALAR * p_out,int nsmpl)90*aef9bcd9SKiyoung Kim __inline static void byte_data_to_scalar_f32_ldac(
91*aef9bcd9SKiyoung Kim char *p_in,
92*aef9bcd9SKiyoung Kim SCALAR *p_out,
93*aef9bcd9SKiyoung Kim int nsmpl)
94*aef9bcd9SKiyoung Kim {
95*aef9bcd9SKiyoung Kim     int i;
96*aef9bcd9SKiyoung Kim     float *p_f;
97*aef9bcd9SKiyoung Kim     SCALAR scale = _scalar(32768.0);
98*aef9bcd9SKiyoung Kim 
99*aef9bcd9SKiyoung Kim     p_f = (float *)p_in;
100*aef9bcd9SKiyoung Kim     for (i = 0; i < nsmpl; i++) {
101*aef9bcd9SKiyoung Kim         *p_out++ = scale * (SCALAR)*p_f++;
102*aef9bcd9SKiyoung Kim     }
103*aef9bcd9SKiyoung Kim 
104*aef9bcd9SKiyoung Kim     return;
105*aef9bcd9SKiyoung Kim }
106*aef9bcd9SKiyoung Kim 
107*aef9bcd9SKiyoung Kim /***************************************************************************************************
108*aef9bcd9SKiyoung Kim     Set Input PCM
109*aef9bcd9SKiyoung Kim ***************************************************************************************************/
set_input_pcm_ldac(SFINFO * p_sfinfo,char * pp_pcm[],LDAC_SMPL_FMT_T format,int nlnn)110*aef9bcd9SKiyoung Kim DECLFUNC void set_input_pcm_ldac(
111*aef9bcd9SKiyoung Kim SFINFO *p_sfinfo,
112*aef9bcd9SKiyoung Kim char *pp_pcm[],
113*aef9bcd9SKiyoung Kim LDAC_SMPL_FMT_T format,
114*aef9bcd9SKiyoung Kim int nlnn)
115*aef9bcd9SKiyoung Kim {
116*aef9bcd9SKiyoung Kim     int ich, isp;
117*aef9bcd9SKiyoung Kim     int nchs = p_sfinfo->cfg.ch;
118*aef9bcd9SKiyoung Kim     int nsmpl = npow2_ldac(nlnn);
119*aef9bcd9SKiyoung Kim     SCALAR *p_time;
120*aef9bcd9SKiyoung Kim 
121*aef9bcd9SKiyoung Kim     if (format == LDAC_SMPL_FMT_S16) {
122*aef9bcd9SKiyoung Kim         for (ich = 0; ich < nchs; ich++) {
123*aef9bcd9SKiyoung Kim             p_time = p_sfinfo->ap_ac[ich]->p_acsub->a_time;
124*aef9bcd9SKiyoung Kim             for (isp = 0; isp < nsmpl; isp++) {
125*aef9bcd9SKiyoung Kim                 p_time[isp] = p_time[nsmpl+isp];
126*aef9bcd9SKiyoung Kim             }
127*aef9bcd9SKiyoung Kim             byte_data_to_scalar_s16_ldac(pp_pcm[ich], p_time+nsmpl, nsmpl);
128*aef9bcd9SKiyoung Kim         }
129*aef9bcd9SKiyoung Kim     }
130*aef9bcd9SKiyoung Kim     else if (format == LDAC_SMPL_FMT_S24) {
131*aef9bcd9SKiyoung Kim         for (ich = 0; ich < nchs; ich++) {
132*aef9bcd9SKiyoung Kim             p_time = p_sfinfo->ap_ac[ich]->p_acsub->a_time;
133*aef9bcd9SKiyoung Kim             for (isp = 0; isp < nsmpl; isp++) {
134*aef9bcd9SKiyoung Kim                 p_time[isp] = p_time[nsmpl+isp];
135*aef9bcd9SKiyoung Kim             }
136*aef9bcd9SKiyoung Kim             byte_data_to_scalar_s24_ldac(pp_pcm[ich], p_time+nsmpl, nsmpl);
137*aef9bcd9SKiyoung Kim         }
138*aef9bcd9SKiyoung Kim     }
139*aef9bcd9SKiyoung Kim     else if (format == LDAC_SMPL_FMT_S32) {
140*aef9bcd9SKiyoung Kim         for (ich = 0; ich < nchs; ich++) {
141*aef9bcd9SKiyoung Kim             p_time = p_sfinfo->ap_ac[ich]->p_acsub->a_time;
142*aef9bcd9SKiyoung Kim             for (isp = 0; isp < nsmpl; isp++) {
143*aef9bcd9SKiyoung Kim                 p_time[isp] = p_time[nsmpl+isp];
144*aef9bcd9SKiyoung Kim             }
145*aef9bcd9SKiyoung Kim             byte_data_to_scalar_s32_ldac(pp_pcm[ich], p_time+nsmpl, nsmpl);
146*aef9bcd9SKiyoung Kim         }
147*aef9bcd9SKiyoung Kim     }
148*aef9bcd9SKiyoung Kim     else if (format == LDAC_SMPL_FMT_F32) {
149*aef9bcd9SKiyoung Kim         for (ich = 0; ich < nchs; ich++) {
150*aef9bcd9SKiyoung Kim             p_time = p_sfinfo->ap_ac[ich]->p_acsub->a_time;
151*aef9bcd9SKiyoung Kim             for (isp = 0; isp < nsmpl; isp++) {
152*aef9bcd9SKiyoung Kim                 p_time[isp] = p_time[nsmpl+isp];
153*aef9bcd9SKiyoung Kim             }
154*aef9bcd9SKiyoung Kim             byte_data_to_scalar_f32_ldac(pp_pcm[ich], p_time+nsmpl, nsmpl);
155*aef9bcd9SKiyoung Kim         }
156*aef9bcd9SKiyoung Kim     }
157*aef9bcd9SKiyoung Kim 
158*aef9bcd9SKiyoung Kim     return;
159*aef9bcd9SKiyoung Kim }
160*aef9bcd9SKiyoung Kim 
161*aef9bcd9SKiyoung Kim 
162