xref: /aosp_15_r20/external/libldac/src/ldaclib_api.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 "ldaclib.h"
18*aef9bcd9SKiyoung Kim #include "ldac.h"
19*aef9bcd9SKiyoung Kim 
20*aef9bcd9SKiyoung Kim #define LDACLIB_MAJOR_VERSION  01
21*aef9bcd9SKiyoung Kim #define LDACLIB_MINOR_VERSION  00
22*aef9bcd9SKiyoung Kim #define LDACLIB_BRANCH_VERSION 00
23*aef9bcd9SKiyoung Kim 
24*aef9bcd9SKiyoung Kim /***************************************************************************************************
25*aef9bcd9SKiyoung Kim     Local Assert Functions
26*aef9bcd9SKiyoung Kim ***************************************************************************************************/
ldaclib_assert_sampling_rate_index(int smplrate_id)27*aef9bcd9SKiyoung Kim static int ldaclib_assert_sampling_rate_index(
28*aef9bcd9SKiyoung Kim int smplrate_id)
29*aef9bcd9SKiyoung Kim {
30*aef9bcd9SKiyoung Kim     if ((LDAC_SMPLRATEID_0 <= smplrate_id) && (smplrate_id < LDAC_NSMPLRATEID)) {
31*aef9bcd9SKiyoung Kim         return LDAC_TRUE;
32*aef9bcd9SKiyoung Kim     }
33*aef9bcd9SKiyoung Kim     else {
34*aef9bcd9SKiyoung Kim         return LDAC_FALSE;
35*aef9bcd9SKiyoung Kim     }
36*aef9bcd9SKiyoung Kim }
37*aef9bcd9SKiyoung Kim 
ldaclib_assert_supported_sampling_rate_index(int smplrate_id)38*aef9bcd9SKiyoung Kim static int ldaclib_assert_supported_sampling_rate_index(
39*aef9bcd9SKiyoung Kim int smplrate_id)
40*aef9bcd9SKiyoung Kim {
41*aef9bcd9SKiyoung Kim     if ((LDAC_SMPLRATEID_0 <= smplrate_id) && (smplrate_id < LDAC_NSUPSMPLRATEID)) {
42*aef9bcd9SKiyoung Kim         return LDAC_TRUE;
43*aef9bcd9SKiyoung Kim     }
44*aef9bcd9SKiyoung Kim     else {
45*aef9bcd9SKiyoung Kim         return LDAC_FALSE;
46*aef9bcd9SKiyoung Kim     }
47*aef9bcd9SKiyoung Kim }
48*aef9bcd9SKiyoung Kim 
ldaclib_assert_channel_config_index(int chconfig_id)49*aef9bcd9SKiyoung Kim static int ldaclib_assert_channel_config_index(
50*aef9bcd9SKiyoung Kim int chconfig_id)
51*aef9bcd9SKiyoung Kim {
52*aef9bcd9SKiyoung Kim     if ((chconfig_id == LDAC_CHCONFIGID_MN)
53*aef9bcd9SKiyoung Kim             || (chconfig_id == LDAC_CHCONFIGID_DL) || (chconfig_id == LDAC_CHCONFIGID_ST)) {
54*aef9bcd9SKiyoung Kim         return LDAC_TRUE;
55*aef9bcd9SKiyoung Kim     }
56*aef9bcd9SKiyoung Kim     else {
57*aef9bcd9SKiyoung Kim         return LDAC_FALSE;
58*aef9bcd9SKiyoung Kim     }
59*aef9bcd9SKiyoung Kim }
60*aef9bcd9SKiyoung Kim 
ldaclib_assert_channel(int ch)61*aef9bcd9SKiyoung Kim static int ldaclib_assert_channel(
62*aef9bcd9SKiyoung Kim int ch)
63*aef9bcd9SKiyoung Kim {
64*aef9bcd9SKiyoung Kim     if ((ch == LDAC_CHANNEL_1CH) || (ch == LDAC_CHANNEL_2CH)) {
65*aef9bcd9SKiyoung Kim         return LDAC_TRUE;
66*aef9bcd9SKiyoung Kim     }
67*aef9bcd9SKiyoung Kim     else {
68*aef9bcd9SKiyoung Kim         return LDAC_FALSE;
69*aef9bcd9SKiyoung Kim     }
70*aef9bcd9SKiyoung Kim }
71*aef9bcd9SKiyoung Kim 
ldaclib_assert_frame_length(int frame_length)72*aef9bcd9SKiyoung Kim static int ldaclib_assert_frame_length(
73*aef9bcd9SKiyoung Kim int frame_length)
74*aef9bcd9SKiyoung Kim {
75*aef9bcd9SKiyoung Kim     if ((0 < frame_length) && (frame_length <= LDAC_MAXNBYTES)) {
76*aef9bcd9SKiyoung Kim         return LDAC_TRUE;
77*aef9bcd9SKiyoung Kim     }
78*aef9bcd9SKiyoung Kim     else {
79*aef9bcd9SKiyoung Kim         return LDAC_FALSE;
80*aef9bcd9SKiyoung Kim     }
81*aef9bcd9SKiyoung Kim }
82*aef9bcd9SKiyoung Kim 
ldaclib_assert_supported_frame_length(int frame_length,int chconfig_id)83*aef9bcd9SKiyoung Kim static int ldaclib_assert_supported_frame_length(
84*aef9bcd9SKiyoung Kim int frame_length,
85*aef9bcd9SKiyoung Kim int chconfig_id)
86*aef9bcd9SKiyoung Kim {
87*aef9bcd9SKiyoung Kim     if (chconfig_id == LDAC_CHCONFIGID_MN) {
88*aef9bcd9SKiyoung Kim         if ((LDAC_MINSUPNBYTES/2 <= frame_length) && (frame_length <= LDAC_MAXSUPNBYTES/2)) {
89*aef9bcd9SKiyoung Kim             return LDAC_TRUE;
90*aef9bcd9SKiyoung Kim         }
91*aef9bcd9SKiyoung Kim         else {
92*aef9bcd9SKiyoung Kim             return LDAC_FALSE;
93*aef9bcd9SKiyoung Kim         }
94*aef9bcd9SKiyoung Kim     }
95*aef9bcd9SKiyoung Kim     else if ((chconfig_id == LDAC_CHCONFIGID_DL) || (chconfig_id == LDAC_CHCONFIGID_ST)) {
96*aef9bcd9SKiyoung Kim         if ((LDAC_MINSUPNBYTES <= frame_length) && (frame_length <= LDAC_MAXSUPNBYTES)) {
97*aef9bcd9SKiyoung Kim             return LDAC_TRUE;
98*aef9bcd9SKiyoung Kim         }
99*aef9bcd9SKiyoung Kim         else {
100*aef9bcd9SKiyoung Kim             return LDAC_FALSE;
101*aef9bcd9SKiyoung Kim         }
102*aef9bcd9SKiyoung Kim     }
103*aef9bcd9SKiyoung Kim     else {
104*aef9bcd9SKiyoung Kim         return LDAC_FALSE;
105*aef9bcd9SKiyoung Kim     }
106*aef9bcd9SKiyoung Kim }
107*aef9bcd9SKiyoung Kim 
ldaclib_assert_frame_status(int frame_status)108*aef9bcd9SKiyoung Kim static int ldaclib_assert_frame_status(
109*aef9bcd9SKiyoung Kim int frame_status)
110*aef9bcd9SKiyoung Kim {
111*aef9bcd9SKiyoung Kim     if ((LDAC_FRMSTAT_LEV_0 <= frame_status) && (frame_status <= LDAC_FRMSTAT_LEV_3)) {
112*aef9bcd9SKiyoung Kim         return LDAC_TRUE;
113*aef9bcd9SKiyoung Kim     }
114*aef9bcd9SKiyoung Kim     else {
115*aef9bcd9SKiyoung Kim         return LDAC_FALSE;
116*aef9bcd9SKiyoung Kim     }
117*aef9bcd9SKiyoung Kim }
118*aef9bcd9SKiyoung Kim 
ldaclib_assert_nlnn_shift(int nlnn_shift)119*aef9bcd9SKiyoung Kim static int ldaclib_assert_nlnn_shift(
120*aef9bcd9SKiyoung Kim int nlnn_shift)
121*aef9bcd9SKiyoung Kim {
122*aef9bcd9SKiyoung Kim     if ((-2 <= nlnn_shift) && (nlnn_shift < LDAC_NSFTSTEP-2)) {
123*aef9bcd9SKiyoung Kim         return LDAC_TRUE;
124*aef9bcd9SKiyoung Kim     }
125*aef9bcd9SKiyoung Kim     else {
126*aef9bcd9SKiyoung Kim         return LDAC_FALSE;
127*aef9bcd9SKiyoung Kim     }
128*aef9bcd9SKiyoung Kim }
129*aef9bcd9SKiyoung Kim 
ldaclib_assert_sample_format(LDAC_SMPL_FMT_T sample_format)130*aef9bcd9SKiyoung Kim static int ldaclib_assert_sample_format(
131*aef9bcd9SKiyoung Kim LDAC_SMPL_FMT_T sample_format)
132*aef9bcd9SKiyoung Kim {
133*aef9bcd9SKiyoung Kim #ifndef _32BIT_FIXED_POINT
134*aef9bcd9SKiyoung Kim     if ((LDAC_SMPL_FMT_S16 <= sample_format) && (sample_format <= LDAC_SMPL_FMT_F32)) {
135*aef9bcd9SKiyoung Kim #else /* _32BIT_FIXED_POINT */
136*aef9bcd9SKiyoung Kim     if ((LDAC_SMPL_FMT_S16 <= sample_format) && (sample_format <= LDAC_SMPL_FMT_S32)) {
137*aef9bcd9SKiyoung Kim #endif /* _32BIT_FIXED_POINT */
138*aef9bcd9SKiyoung Kim         return LDAC_TRUE;
139*aef9bcd9SKiyoung Kim     }
140*aef9bcd9SKiyoung Kim     else {
141*aef9bcd9SKiyoung Kim         return LDAC_FALSE;
142*aef9bcd9SKiyoung Kim     }
143*aef9bcd9SKiyoung Kim }
144*aef9bcd9SKiyoung Kim 
145*aef9bcd9SKiyoung Kim 
146*aef9bcd9SKiyoung Kim /***************************************************************************************************
147*aef9bcd9SKiyoung Kim     Common API Functions
148*aef9bcd9SKiyoung Kim ***************************************************************************************************/
149*aef9bcd9SKiyoung Kim 
150*aef9bcd9SKiyoung Kim /***************************************************************************************************
151*aef9bcd9SKiyoung Kim     Get Library Version
152*aef9bcd9SKiyoung Kim ***************************************************************************************************/
153*aef9bcd9SKiyoung Kim DECLSPEC int ldaclib_get_version(void) {
154*aef9bcd9SKiyoung Kim     return (LDACLIB_MAJOR_VERSION<<16) | (LDACLIB_MINOR_VERSION<<8) | LDACLIB_BRANCH_VERSION;
155*aef9bcd9SKiyoung Kim }
156*aef9bcd9SKiyoung Kim 
157*aef9bcd9SKiyoung Kim DECLSPEC int ldaclib_get_major_version(void) {
158*aef9bcd9SKiyoung Kim     return LDACLIB_MAJOR_VERSION;
159*aef9bcd9SKiyoung Kim }
160*aef9bcd9SKiyoung Kim 
161*aef9bcd9SKiyoung Kim DECLSPEC int ldaclib_get_minor_version(void) {
162*aef9bcd9SKiyoung Kim     return LDACLIB_MINOR_VERSION;
163*aef9bcd9SKiyoung Kim }
164*aef9bcd9SKiyoung Kim 
165*aef9bcd9SKiyoung Kim DECLSPEC int ldaclib_get_branch_version(void) {
166*aef9bcd9SKiyoung Kim     return LDACLIB_BRANCH_VERSION;
167*aef9bcd9SKiyoung Kim }
168*aef9bcd9SKiyoung Kim 
169*aef9bcd9SKiyoung Kim /***************************************************************************************************
170*aef9bcd9SKiyoung Kim     Get Basic Parameters
171*aef9bcd9SKiyoung Kim ***************************************************************************************************/
172*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_get_sampling_rate_index(
173*aef9bcd9SKiyoung Kim int smplrate,
174*aef9bcd9SKiyoung Kim int *p_smplrate_id)
175*aef9bcd9SKiyoung Kim {
176*aef9bcd9SKiyoung Kim     if (smplrate == 44100) {
177*aef9bcd9SKiyoung Kim         *p_smplrate_id = LDAC_SMPLRATEID_0;
178*aef9bcd9SKiyoung Kim     }
179*aef9bcd9SKiyoung Kim     else if (smplrate == 48000) {
180*aef9bcd9SKiyoung Kim         *p_smplrate_id = LDAC_SMPLRATEID_1;
181*aef9bcd9SKiyoung Kim     }
182*aef9bcd9SKiyoung Kim     else if (smplrate == 88200) {
183*aef9bcd9SKiyoung Kim         *p_smplrate_id = LDAC_SMPLRATEID_2;
184*aef9bcd9SKiyoung Kim     }
185*aef9bcd9SKiyoung Kim     else if (smplrate == 96000) {
186*aef9bcd9SKiyoung Kim         *p_smplrate_id = LDAC_SMPLRATEID_3;
187*aef9bcd9SKiyoung Kim     }
188*aef9bcd9SKiyoung Kim     else {
189*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
190*aef9bcd9SKiyoung Kim     }
191*aef9bcd9SKiyoung Kim 
192*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
193*aef9bcd9SKiyoung Kim }
194*aef9bcd9SKiyoung Kim 
195*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_get_sampling_rate(
196*aef9bcd9SKiyoung Kim int smplrate_id,
197*aef9bcd9SKiyoung Kim int *p_smplrate)
198*aef9bcd9SKiyoung Kim {
199*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_sampling_rate_index(smplrate_id)) {
200*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
201*aef9bcd9SKiyoung Kim     }
202*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_supported_sampling_rate_index(smplrate_id)) {
203*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
204*aef9bcd9SKiyoung Kim     }
205*aef9bcd9SKiyoung Kim 
206*aef9bcd9SKiyoung Kim     *p_smplrate = ga_smplrate_ldac[smplrate_id];
207*aef9bcd9SKiyoung Kim 
208*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
209*aef9bcd9SKiyoung Kim }
210*aef9bcd9SKiyoung Kim 
211*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_get_frame_samples(
212*aef9bcd9SKiyoung Kim int smplrate_id,
213*aef9bcd9SKiyoung Kim int *p_framesmpls)
214*aef9bcd9SKiyoung Kim {
215*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_sampling_rate_index(smplrate_id)) {
216*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
217*aef9bcd9SKiyoung Kim     }
218*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_supported_sampling_rate_index(smplrate_id)) {
219*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
220*aef9bcd9SKiyoung Kim     }
221*aef9bcd9SKiyoung Kim 
222*aef9bcd9SKiyoung Kim     *p_framesmpls = ga_framesmpls_ldac[smplrate_id];
223*aef9bcd9SKiyoung Kim 
224*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
225*aef9bcd9SKiyoung Kim }
226*aef9bcd9SKiyoung Kim 
227*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_get_nlnn(
228*aef9bcd9SKiyoung Kim int smplrate_id,
229*aef9bcd9SKiyoung Kim int *p_nlnn)
230*aef9bcd9SKiyoung Kim {
231*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_sampling_rate_index(smplrate_id)) {
232*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
233*aef9bcd9SKiyoung Kim     }
234*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_supported_sampling_rate_index(smplrate_id)) {
235*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
236*aef9bcd9SKiyoung Kim     }
237*aef9bcd9SKiyoung Kim 
238*aef9bcd9SKiyoung Kim     *p_nlnn = ga_ln_framesmpls_ldac[smplrate_id];
239*aef9bcd9SKiyoung Kim 
240*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
241*aef9bcd9SKiyoung Kim }
242*aef9bcd9SKiyoung Kim 
243*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_get_channel(
244*aef9bcd9SKiyoung Kim int chconfig_id,
245*aef9bcd9SKiyoung Kim int *p_ch)
246*aef9bcd9SKiyoung Kim {
247*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_channel_config_index(chconfig_id)) {
248*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
249*aef9bcd9SKiyoung Kim     }
250*aef9bcd9SKiyoung Kim 
251*aef9bcd9SKiyoung Kim     *p_ch = ga_ch_ldac[chconfig_id];
252*aef9bcd9SKiyoung Kim 
253*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
254*aef9bcd9SKiyoung Kim }
255*aef9bcd9SKiyoung Kim 
256*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_get_channel_config_index(
257*aef9bcd9SKiyoung Kim int ch,
258*aef9bcd9SKiyoung Kim int *p_chconfig_id)
259*aef9bcd9SKiyoung Kim {
260*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_channel(ch)) {
261*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
262*aef9bcd9SKiyoung Kim     }
263*aef9bcd9SKiyoung Kim 
264*aef9bcd9SKiyoung Kim     *p_chconfig_id = ga_chconfig_id_ldac[ch];
265*aef9bcd9SKiyoung Kim 
266*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
267*aef9bcd9SKiyoung Kim }
268*aef9bcd9SKiyoung Kim 
269*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_check_nlnn_shift(
270*aef9bcd9SKiyoung Kim int smplrate_id,
271*aef9bcd9SKiyoung Kim int nlnn_shift)
272*aef9bcd9SKiyoung Kim {
273*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_sampling_rate_index(smplrate_id)) {
274*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
275*aef9bcd9SKiyoung Kim     }
276*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_supported_sampling_rate_index(smplrate_id)) {
277*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
278*aef9bcd9SKiyoung Kim     }
279*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_nlnn_shift(nlnn_shift)) {
280*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
281*aef9bcd9SKiyoung Kim     }
282*aef9bcd9SKiyoung Kim 
283*aef9bcd9SKiyoung Kim     if (gaa_nlnn_shift_ldac[smplrate_id][nlnn_shift+2] < 0) {
284*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
285*aef9bcd9SKiyoung Kim     }
286*aef9bcd9SKiyoung Kim 
287*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
288*aef9bcd9SKiyoung Kim }
289*aef9bcd9SKiyoung Kim 
290*aef9bcd9SKiyoung Kim /***************************************************************************************************
291*aef9bcd9SKiyoung Kim     Get Handle
292*aef9bcd9SKiyoung Kim ***************************************************************************************************/
293*aef9bcd9SKiyoung Kim DECLSPEC HANDLE_LDAC ldaclib_get_handle(
294*aef9bcd9SKiyoung Kim void)
295*aef9bcd9SKiyoung Kim {
296*aef9bcd9SKiyoung Kim     HANDLE_LDAC hData;
297*aef9bcd9SKiyoung Kim 
298*aef9bcd9SKiyoung Kim     hData = (HANDLE_LDAC)malloc(sizeof(HANDLE_LDAC_STRUCT));
299*aef9bcd9SKiyoung Kim     if (hData != (HANDLE_LDAC)NULL) {
300*aef9bcd9SKiyoung Kim         clear_data_ldac(hData, sizeof(HANDLE_LDAC_STRUCT));
301*aef9bcd9SKiyoung Kim         hData->sfinfo.p_mempos = (char *)NULL;
302*aef9bcd9SKiyoung Kim         hData->error_code = LDAC_ERR_NONE;
303*aef9bcd9SKiyoung Kim     }
304*aef9bcd9SKiyoung Kim 
305*aef9bcd9SKiyoung Kim     return hData;
306*aef9bcd9SKiyoung Kim }
307*aef9bcd9SKiyoung Kim 
308*aef9bcd9SKiyoung Kim /***************************************************************************************************
309*aef9bcd9SKiyoung Kim     Free Handle
310*aef9bcd9SKiyoung Kim ***************************************************************************************************/
311*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_free_handle(
312*aef9bcd9SKiyoung Kim HANDLE_LDAC hData)
313*aef9bcd9SKiyoung Kim {
314*aef9bcd9SKiyoung Kim     if (hData != (HANDLE_LDAC)NULL) {
315*aef9bcd9SKiyoung Kim         if (hData->sfinfo.p_mempos != (char *)NULL) {
316*aef9bcd9SKiyoung Kim             return LDAC_S_OK;
317*aef9bcd9SKiyoung Kim         }
318*aef9bcd9SKiyoung Kim 
319*aef9bcd9SKiyoung Kim         free(hData);
320*aef9bcd9SKiyoung Kim     }
321*aef9bcd9SKiyoung Kim 
322*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
323*aef9bcd9SKiyoung Kim }
324*aef9bcd9SKiyoung Kim 
325*aef9bcd9SKiyoung Kim /***************************************************************************************************
326*aef9bcd9SKiyoung Kim     Set Configuration Information
327*aef9bcd9SKiyoung Kim ***************************************************************************************************/
328*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_set_config_info(
329*aef9bcd9SKiyoung Kim HANDLE_LDAC hData,
330*aef9bcd9SKiyoung Kim int smplrate_id,
331*aef9bcd9SKiyoung Kim int chconfig_id,
332*aef9bcd9SKiyoung Kim int frame_length,
333*aef9bcd9SKiyoung Kim int frame_status)
334*aef9bcd9SKiyoung Kim {
335*aef9bcd9SKiyoung Kim     CFG *p_cfg = &hData->sfinfo.cfg;
336*aef9bcd9SKiyoung Kim 
337*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_sampling_rate_index(smplrate_id)) {
338*aef9bcd9SKiyoung Kim         hData->error_code = LDAC_ERR_ASSERT_SAMPLING_RATE;
339*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
340*aef9bcd9SKiyoung Kim     }
341*aef9bcd9SKiyoung Kim 
342*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_supported_sampling_rate_index(smplrate_id)) {
343*aef9bcd9SKiyoung Kim         hData->error_code = LDAC_ERR_ASSERT_SUP_SAMPLING_RATE;
344*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
345*aef9bcd9SKiyoung Kim     }
346*aef9bcd9SKiyoung Kim 
347*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_channel_config_index(chconfig_id)) {
348*aef9bcd9SKiyoung Kim         hData->error_code = LDAC_ERR_ASSERT_CHANNEL_CONFIG;
349*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
350*aef9bcd9SKiyoung Kim     }
351*aef9bcd9SKiyoung Kim 
352*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_frame_length(frame_length)) {
353*aef9bcd9SKiyoung Kim         hData->error_code = LDAC_ERR_ASSERT_FRAME_LENGTH;
354*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
355*aef9bcd9SKiyoung Kim     }
356*aef9bcd9SKiyoung Kim 
357*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_supported_frame_length(frame_length, chconfig_id)) {
358*aef9bcd9SKiyoung Kim         hData->error_code = LDAC_ERR_ASSERT_SUP_FRAME_LENGTH;
359*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
360*aef9bcd9SKiyoung Kim     }
361*aef9bcd9SKiyoung Kim 
362*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_frame_status(frame_status)) {
363*aef9bcd9SKiyoung Kim         hData->error_code = LDAC_ERR_ASSERT_FRAME_STATUS;
364*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
365*aef9bcd9SKiyoung Kim     }
366*aef9bcd9SKiyoung Kim 
367*aef9bcd9SKiyoung Kim     p_cfg->smplrate_id = smplrate_id;
368*aef9bcd9SKiyoung Kim     p_cfg->chconfig_id = chconfig_id;
369*aef9bcd9SKiyoung Kim     p_cfg->frame_length = frame_length;
370*aef9bcd9SKiyoung Kim     p_cfg->frame_status = frame_status;
371*aef9bcd9SKiyoung Kim 
372*aef9bcd9SKiyoung Kim     ldaclib_get_channel(chconfig_id, &p_cfg->ch);
373*aef9bcd9SKiyoung Kim 
374*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
375*aef9bcd9SKiyoung Kim }
376*aef9bcd9SKiyoung Kim 
377*aef9bcd9SKiyoung Kim /***************************************************************************************************
378*aef9bcd9SKiyoung Kim     Get Configuration Information
379*aef9bcd9SKiyoung Kim ***************************************************************************************************/
380*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_get_config_info(
381*aef9bcd9SKiyoung Kim HANDLE_LDAC hData,
382*aef9bcd9SKiyoung Kim int *p_smplrate_id,
383*aef9bcd9SKiyoung Kim int *p_chconfig_id,
384*aef9bcd9SKiyoung Kim int *p_frame_length,
385*aef9bcd9SKiyoung Kim int *p_frame_status)
386*aef9bcd9SKiyoung Kim {
387*aef9bcd9SKiyoung Kim     CFG *p_cfg = &hData->sfinfo.cfg;
388*aef9bcd9SKiyoung Kim 
389*aef9bcd9SKiyoung Kim     *p_smplrate_id = p_cfg->smplrate_id;
390*aef9bcd9SKiyoung Kim     *p_chconfig_id = p_cfg->chconfig_id;
391*aef9bcd9SKiyoung Kim     *p_frame_length = p_cfg->frame_length;
392*aef9bcd9SKiyoung Kim     *p_frame_status = p_cfg->frame_status;
393*aef9bcd9SKiyoung Kim 
394*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
395*aef9bcd9SKiyoung Kim }
396*aef9bcd9SKiyoung Kim 
397*aef9bcd9SKiyoung Kim 
398*aef9bcd9SKiyoung Kim /***************************************************************************************************
399*aef9bcd9SKiyoung Kim     Set Frame Header
400*aef9bcd9SKiyoung Kim ***************************************************************************************************/
401*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_set_frame_header(
402*aef9bcd9SKiyoung Kim HANDLE_LDAC hData,
403*aef9bcd9SKiyoung Kim unsigned char *p_stream,
404*aef9bcd9SKiyoung Kim int smplrate_id,
405*aef9bcd9SKiyoung Kim int chconfig_id,
406*aef9bcd9SKiyoung Kim int frame_length,
407*aef9bcd9SKiyoung Kim int frame_status)
408*aef9bcd9SKiyoung Kim {
409*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_sampling_rate_index(smplrate_id)) {
410*aef9bcd9SKiyoung Kim         hData->error_code = LDAC_ERR_ASSERT_SAMPLING_RATE;
411*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
412*aef9bcd9SKiyoung Kim     }
413*aef9bcd9SKiyoung Kim 
414*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_supported_sampling_rate_index(smplrate_id)) {
415*aef9bcd9SKiyoung Kim         hData->error_code = LDAC_ERR_ASSERT_SUP_SAMPLING_RATE;
416*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
417*aef9bcd9SKiyoung Kim     }
418*aef9bcd9SKiyoung Kim 
419*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_channel_config_index(chconfig_id)) {
420*aef9bcd9SKiyoung Kim         hData->error_code = LDAC_ERR_ASSERT_CHANNEL_CONFIG;
421*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
422*aef9bcd9SKiyoung Kim     }
423*aef9bcd9SKiyoung Kim 
424*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_frame_length(frame_length)) {
425*aef9bcd9SKiyoung Kim         hData->error_code = LDAC_ERR_ASSERT_FRAME_LENGTH;
426*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
427*aef9bcd9SKiyoung Kim     }
428*aef9bcd9SKiyoung Kim 
429*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_supported_frame_length(frame_length, chconfig_id)) {
430*aef9bcd9SKiyoung Kim         hData->error_code = LDAC_ERR_ASSERT_SUP_FRAME_LENGTH;
431*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
432*aef9bcd9SKiyoung Kim     }
433*aef9bcd9SKiyoung Kim 
434*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_frame_status(frame_status)) {
435*aef9bcd9SKiyoung Kim         hData->error_code = LDAC_ERR_ASSERT_FRAME_STATUS;
436*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
437*aef9bcd9SKiyoung Kim     }
438*aef9bcd9SKiyoung Kim 
439*aef9bcd9SKiyoung Kim     pack_frame_header_ldac(smplrate_id, chconfig_id, frame_length, frame_status,
440*aef9bcd9SKiyoung Kim             (STREAM *)p_stream);
441*aef9bcd9SKiyoung Kim 
442*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
443*aef9bcd9SKiyoung Kim }
444*aef9bcd9SKiyoung Kim 
445*aef9bcd9SKiyoung Kim 
446*aef9bcd9SKiyoung Kim /***************************************************************************************************
447*aef9bcd9SKiyoung Kim     Encoder API Functions
448*aef9bcd9SKiyoung Kim ***************************************************************************************************/
449*aef9bcd9SKiyoung Kim 
450*aef9bcd9SKiyoung Kim /***************************************************************************************************
451*aef9bcd9SKiyoung Kim     Get Encoder Setting
452*aef9bcd9SKiyoung Kim ***************************************************************************************************/
453*aef9bcd9SKiyoung Kim #define LDAC_ENC_NSETTING 15
454*aef9bcd9SKiyoung Kim #define LDAC_ENC_NPROPERTY 9
455*aef9bcd9SKiyoung Kim 
456*aef9bcd9SKiyoung Kim static const int saa_encode_setting_ldac[LDAC_ENC_NSETTING][LDAC_ENC_NPROPERTY] = {
457*aef9bcd9SKiyoung Kim     {0, 512,  17,   0,  28,  44,   8,  24,   0},
458*aef9bcd9SKiyoung Kim     {0, 256,  17,   0,  28,  44,   6,  22,   0},
459*aef9bcd9SKiyoung Kim #ifdef MODIFY_LDAC_ENC_SETTING_FOR_ABR_DEBUG  // See file "ldacBT_abr.h" for description
460*aef9bcd9SKiyoung Kim     {0, 164,  16,   0,  18,  32,   7,  23,   0},
461*aef9bcd9SKiyoung Kim     {0, 110,   8,   0,  16,  32,  10,  31,   0},
462*aef9bcd9SKiyoung Kim     {0,  82,   6,   0,  16,  32,  12,  31,   0},
463*aef9bcd9SKiyoung Kim     {0,  66,   4,   0,  14,  26,  12,  31,   0},
464*aef9bcd9SKiyoung Kim     {0,  54,   2,   0,  14,  26,  12,  31,   0},
465*aef9bcd9SKiyoung Kim     {0,  46,   2,   1,  10,  26,  12,  31,   0},
466*aef9bcd9SKiyoung Kim     {0,  40,   2,   2,  10,  26,  12,  31,   0},
467*aef9bcd9SKiyoung Kim     {0,  36,   2,   2,   8,  26,  12,  31,   0},
468*aef9bcd9SKiyoung Kim     {0,  32,   2,   2,   8,  26,  16,  31,   0},
469*aef9bcd9SKiyoung Kim     {0,  30,   2,   2,   4,  26,  16,  31,   0},
470*aef9bcd9SKiyoung Kim     {0,  26,   2,   3,   4,  26,  16,  31,   0},
471*aef9bcd9SKiyoung Kim     {0,  24,   2,   3,   4,  26,  16,  31,   0},
472*aef9bcd9SKiyoung Kim #else
473*aef9bcd9SKiyoung Kim     {0, 164,  16,   0,  18,  32,   7,  23,   0},
474*aef9bcd9SKiyoung Kim     {0, 110,  13,   0,  16,  32,  10,  31,   0},
475*aef9bcd9SKiyoung Kim     {0,  82,  12,   0,  16,  32,  12,  31,   0},
476*aef9bcd9SKiyoung Kim     {0,  66,  11,   0,  14,  26,  12,  31,   0},
477*aef9bcd9SKiyoung Kim     {0,  54,  10,   0,  14,  26,  12,  31,   0},
478*aef9bcd9SKiyoung Kim     {0,  46,   9,   1,  10,  26,  12,  31,   0},
479*aef9bcd9SKiyoung Kim     {0,  40,   8,   2,  10,  26,  12,  31,   0},
480*aef9bcd9SKiyoung Kim     {0,  36,   7,   2,   8,  26,  12,  31,   0},
481*aef9bcd9SKiyoung Kim     {0,  32,   6,   2,   8,  26,  16,  31,   0},
482*aef9bcd9SKiyoung Kim     {0,  30,   5,   2,   4,  26,  16,  31,   0},
483*aef9bcd9SKiyoung Kim     {0,  26,   4,   3,   4,  26,  16,  31,   0},
484*aef9bcd9SKiyoung Kim     {0,  24,   3,   3,   4,  26,  16,  31,   0},
485*aef9bcd9SKiyoung Kim #endif
486*aef9bcd9SKiyoung Kim     {0,  22,   2,   3,   4,  26,  16,  31,   0},
487*aef9bcd9SKiyoung Kim };
488*aef9bcd9SKiyoung Kim 
489*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_get_encode_setting(
490*aef9bcd9SKiyoung Kim int nbytes_ch,
491*aef9bcd9SKiyoung Kim int smplrate_id,
492*aef9bcd9SKiyoung Kim int *p_nbands,
493*aef9bcd9SKiyoung Kim int *p_grad_mode,
494*aef9bcd9SKiyoung Kim int *p_grad_qu_l,
495*aef9bcd9SKiyoung Kim int *p_grad_qu_h,
496*aef9bcd9SKiyoung Kim int *p_grad_os_l,
497*aef9bcd9SKiyoung Kim int *p_grad_os_h,
498*aef9bcd9SKiyoung Kim int *p_abc_status)
499*aef9bcd9SKiyoung Kim {
500*aef9bcd9SKiyoung Kim     int i, id;
501*aef9bcd9SKiyoung Kim 
502*aef9bcd9SKiyoung Kim     id = LDAC_ENC_NSETTING-1;
503*aef9bcd9SKiyoung Kim     for (i = LDAC_ENC_NSETTING-1; i >= 0; i--) {
504*aef9bcd9SKiyoung Kim         if (nbytes_ch >= saa_encode_setting_ldac[i][1]) {
505*aef9bcd9SKiyoung Kim             id = i;
506*aef9bcd9SKiyoung Kim         }
507*aef9bcd9SKiyoung Kim     }
508*aef9bcd9SKiyoung Kim 
509*aef9bcd9SKiyoung Kim     *p_nbands = min_ldac(saa_encode_setting_ldac[id][2], ga_max_nbands_ldac[smplrate_id]);
510*aef9bcd9SKiyoung Kim     *p_grad_mode = saa_encode_setting_ldac[id][3];
511*aef9bcd9SKiyoung Kim     *p_grad_qu_l = saa_encode_setting_ldac[id][4];
512*aef9bcd9SKiyoung Kim     *p_grad_qu_h = saa_encode_setting_ldac[id][5];
513*aef9bcd9SKiyoung Kim     *p_grad_os_l = saa_encode_setting_ldac[id][6];
514*aef9bcd9SKiyoung Kim     *p_grad_os_h = saa_encode_setting_ldac[id][7];
515*aef9bcd9SKiyoung Kim     *p_abc_status = saa_encode_setting_ldac[id][8];
516*aef9bcd9SKiyoung Kim 
517*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
518*aef9bcd9SKiyoung Kim }
519*aef9bcd9SKiyoung Kim 
520*aef9bcd9SKiyoung Kim /***************************************************************************************************
521*aef9bcd9SKiyoung Kim     Set Frame Length
522*aef9bcd9SKiyoung Kim ***************************************************************************************************/
523*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_set_encode_frame_length(
524*aef9bcd9SKiyoung Kim HANDLE_LDAC hData,
525*aef9bcd9SKiyoung Kim int frame_length)
526*aef9bcd9SKiyoung Kim {
527*aef9bcd9SKiyoung Kim     CFG *p_cfg = &hData->sfinfo.cfg;
528*aef9bcd9SKiyoung Kim 
529*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_frame_length(frame_length)) {
530*aef9bcd9SKiyoung Kim         hData->error_code = LDAC_ERR_ASSERT_FRAME_LENGTH;
531*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
532*aef9bcd9SKiyoung Kim     }
533*aef9bcd9SKiyoung Kim 
534*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_supported_frame_length(frame_length, p_cfg->chconfig_id)) {
535*aef9bcd9SKiyoung Kim         hData->error_code = LDAC_ERR_ASSERT_SUP_FRAME_LENGTH;
536*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
537*aef9bcd9SKiyoung Kim     }
538*aef9bcd9SKiyoung Kim 
539*aef9bcd9SKiyoung Kim     p_cfg->frame_length = frame_length;
540*aef9bcd9SKiyoung Kim 
541*aef9bcd9SKiyoung Kim     calc_initial_bits_ldac(&hData->sfinfo);
542*aef9bcd9SKiyoung Kim 
543*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
544*aef9bcd9SKiyoung Kim }
545*aef9bcd9SKiyoung Kim 
546*aef9bcd9SKiyoung Kim /***************************************************************************************************
547*aef9bcd9SKiyoung Kim     Get Frame Length
548*aef9bcd9SKiyoung Kim ***************************************************************************************************/
549*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_get_encode_frame_length(
550*aef9bcd9SKiyoung Kim HANDLE_LDAC hData,
551*aef9bcd9SKiyoung Kim int *p_frame_length)
552*aef9bcd9SKiyoung Kim {
553*aef9bcd9SKiyoung Kim     CFG *p_cfg = &hData->sfinfo.cfg;
554*aef9bcd9SKiyoung Kim 
555*aef9bcd9SKiyoung Kim     *p_frame_length = p_cfg->frame_length;
556*aef9bcd9SKiyoung Kim 
557*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
558*aef9bcd9SKiyoung Kim }
559*aef9bcd9SKiyoung Kim 
560*aef9bcd9SKiyoung Kim /***************************************************************************************************
561*aef9bcd9SKiyoung Kim     Set Information
562*aef9bcd9SKiyoung Kim ***************************************************************************************************/
563*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_set_encode_info(
564*aef9bcd9SKiyoung Kim HANDLE_LDAC hData,
565*aef9bcd9SKiyoung Kim int nbands,
566*aef9bcd9SKiyoung Kim int grad_mode,
567*aef9bcd9SKiyoung Kim int grad_qu_l,
568*aef9bcd9SKiyoung Kim int grad_qu_h,
569*aef9bcd9SKiyoung Kim int grad_os_l,
570*aef9bcd9SKiyoung Kim int grad_os_h,
571*aef9bcd9SKiyoung Kim int abc_status)
572*aef9bcd9SKiyoung Kim {
573*aef9bcd9SKiyoung Kim     if ((nbands < LDAC_BAND_OFFSET) ||
574*aef9bcd9SKiyoung Kim             (ga_max_nbands_ldac[hData->sfinfo.cfg.smplrate_id] < nbands)) {
575*aef9bcd9SKiyoung Kim         hData->error_code = LDAC_ERR_ENC_ILL_NBANDS;
576*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
577*aef9bcd9SKiyoung Kim     }
578*aef9bcd9SKiyoung Kim 
579*aef9bcd9SKiyoung Kim     if ((grad_mode < LDAC_MODE_0) || (LDAC_MODE_3 < grad_mode)) {
580*aef9bcd9SKiyoung Kim             hData->error_code = LDAC_ERR_ENC_ILL_GRADMODE;
581*aef9bcd9SKiyoung Kim             return LDAC_E_FAIL;
582*aef9bcd9SKiyoung Kim     }
583*aef9bcd9SKiyoung Kim 
584*aef9bcd9SKiyoung Kim     if (grad_mode == LDAC_MODE_0) {
585*aef9bcd9SKiyoung Kim         if ((grad_qu_l < 0) || (LDAC_MAXGRADQU <= grad_qu_l)) {
586*aef9bcd9SKiyoung Kim             hData->error_code = LDAC_ERR_ENC_ILL_GRADPAR_A;
587*aef9bcd9SKiyoung Kim             return LDAC_E_FAIL;
588*aef9bcd9SKiyoung Kim         }
589*aef9bcd9SKiyoung Kim 
590*aef9bcd9SKiyoung Kim         if ((grad_qu_h < 1) || (LDAC_MAXGRADQU+1 <= grad_qu_h) || (grad_qu_h < grad_qu_l)) {
591*aef9bcd9SKiyoung Kim             hData->error_code = LDAC_ERR_ENC_ILL_GRADPAR_B;
592*aef9bcd9SKiyoung Kim             return LDAC_E_FAIL;
593*aef9bcd9SKiyoung Kim         }
594*aef9bcd9SKiyoung Kim 
595*aef9bcd9SKiyoung Kim         if ((grad_os_h < 0) || (LDAC_NIDSF <= grad_os_h)) {
596*aef9bcd9SKiyoung Kim             hData->error_code = LDAC_ERR_ENC_ILL_GRADPAR_C;
597*aef9bcd9SKiyoung Kim             return LDAC_E_FAIL;
598*aef9bcd9SKiyoung Kim         }
599*aef9bcd9SKiyoung Kim     }
600*aef9bcd9SKiyoung Kim     else {
601*aef9bcd9SKiyoung Kim         if ((grad_qu_l < 0) || (LDAC_DEFGRADQUH < grad_qu_l)) {
602*aef9bcd9SKiyoung Kim             hData->error_code = LDAC_ERR_ENC_ILL_GRADPAR_A;
603*aef9bcd9SKiyoung Kim             return LDAC_E_FAIL;
604*aef9bcd9SKiyoung Kim         }
605*aef9bcd9SKiyoung Kim     }
606*aef9bcd9SKiyoung Kim 
607*aef9bcd9SKiyoung Kim     if ((grad_os_l < 0) || (LDAC_NIDSF <= grad_os_l)) {
608*aef9bcd9SKiyoung Kim         hData->error_code = LDAC_ERR_ENC_ILL_GRADPAR_D;
609*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
610*aef9bcd9SKiyoung Kim     }
611*aef9bcd9SKiyoung Kim 
612*aef9bcd9SKiyoung Kim     hData->nbands = nbands;
613*aef9bcd9SKiyoung Kim     hData->grad_mode = grad_mode;
614*aef9bcd9SKiyoung Kim     hData->grad_qu_l = grad_qu_l;
615*aef9bcd9SKiyoung Kim     hData->grad_os_l = grad_os_l;
616*aef9bcd9SKiyoung Kim     if (grad_mode == LDAC_MODE_0) {
617*aef9bcd9SKiyoung Kim         hData->grad_qu_h = grad_qu_h;
618*aef9bcd9SKiyoung Kim         hData->grad_os_h = grad_os_h;
619*aef9bcd9SKiyoung Kim     }
620*aef9bcd9SKiyoung Kim     else {
621*aef9bcd9SKiyoung Kim         hData->grad_qu_h = LDAC_DEFGRADQUH;
622*aef9bcd9SKiyoung Kim         hData->grad_os_h = LDAC_DEFGRADOSH;
623*aef9bcd9SKiyoung Kim     }
624*aef9bcd9SKiyoung Kim     hData->abc_status = abc_status;
625*aef9bcd9SKiyoung Kim 
626*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
627*aef9bcd9SKiyoung Kim }
628*aef9bcd9SKiyoung Kim 
629*aef9bcd9SKiyoung Kim /***************************************************************************************************
630*aef9bcd9SKiyoung Kim     Initialize
631*aef9bcd9SKiyoung Kim ***************************************************************************************************/
632*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_init_encode(
633*aef9bcd9SKiyoung Kim HANDLE_LDAC hData)
634*aef9bcd9SKiyoung Kim {
635*aef9bcd9SKiyoung Kim     SFINFO *p_sfinfo = &hData->sfinfo;
636*aef9bcd9SKiyoung Kim     LDAC_RESULT result;
637*aef9bcd9SKiyoung Kim 
638*aef9bcd9SKiyoung Kim 
639*aef9bcd9SKiyoung Kim     ldaclib_get_nlnn(p_sfinfo->cfg.smplrate_id, &hData->nlnn);
640*aef9bcd9SKiyoung Kim 
641*aef9bcd9SKiyoung Kim     set_mdct_table_ldac(hData->nlnn);
642*aef9bcd9SKiyoung Kim 
643*aef9bcd9SKiyoung Kim     result = init_encode_ldac(p_sfinfo);
644*aef9bcd9SKiyoung Kim     if (result != LDAC_S_OK) {
645*aef9bcd9SKiyoung Kim         hData->error_code = LDAC_ERR_ENC_INIT_ALLOC;
646*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
647*aef9bcd9SKiyoung Kim     }
648*aef9bcd9SKiyoung Kim 
649*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
650*aef9bcd9SKiyoung Kim }
651*aef9bcd9SKiyoung Kim 
652*aef9bcd9SKiyoung Kim /***************************************************************************************************
653*aef9bcd9SKiyoung Kim     Free
654*aef9bcd9SKiyoung Kim ***************************************************************************************************/
655*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_free_encode(
656*aef9bcd9SKiyoung Kim HANDLE_LDAC hData)
657*aef9bcd9SKiyoung Kim {
658*aef9bcd9SKiyoung Kim     if (hData->sfinfo.p_mempos == NULL) {
659*aef9bcd9SKiyoung Kim         free_encode_ldac(&hData->sfinfo);
660*aef9bcd9SKiyoung Kim     }
661*aef9bcd9SKiyoung Kim 
662*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
663*aef9bcd9SKiyoung Kim }
664*aef9bcd9SKiyoung Kim 
665*aef9bcd9SKiyoung Kim /***************************************************************************************************
666*aef9bcd9SKiyoung Kim     Encode
667*aef9bcd9SKiyoung Kim ***************************************************************************************************/
668*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_encode(
669*aef9bcd9SKiyoung Kim HANDLE_LDAC hData,
670*aef9bcd9SKiyoung Kim char *ap_pcm[],
671*aef9bcd9SKiyoung Kim LDAC_SMPL_FMT_T sample_format,
672*aef9bcd9SKiyoung Kim unsigned char *p_stream,
673*aef9bcd9SKiyoung Kim int *p_nbytes_used)
674*aef9bcd9SKiyoung Kim {
675*aef9bcd9SKiyoung Kim     SFINFO *p_sfinfo = &hData->sfinfo;
676*aef9bcd9SKiyoung Kim     int loc = 0;
677*aef9bcd9SKiyoung Kim     int error_code;
678*aef9bcd9SKiyoung Kim     int frame_length;
679*aef9bcd9SKiyoung Kim 
680*aef9bcd9SKiyoung Kim 
681*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_sample_format(sample_format)) {
682*aef9bcd9SKiyoung Kim         hData->error_code = LDAC_ERR_ILL_SMPL_FORMAT;
683*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
684*aef9bcd9SKiyoung Kim     }
685*aef9bcd9SKiyoung Kim 
686*aef9bcd9SKiyoung Kim     frame_length = p_sfinfo->cfg.frame_length;
687*aef9bcd9SKiyoung Kim     clear_data_ldac(p_stream, frame_length*sizeof(unsigned char));
688*aef9bcd9SKiyoung Kim 
689*aef9bcd9SKiyoung Kim     set_input_pcm_ldac(p_sfinfo, ap_pcm, sample_format, hData->nlnn);
690*aef9bcd9SKiyoung Kim 
691*aef9bcd9SKiyoung Kim     proc_mdct_ldac(p_sfinfo, hData->nlnn);
692*aef9bcd9SKiyoung Kim 
693*aef9bcd9SKiyoung Kim     p_sfinfo->cfg.frame_status = ana_frame_status_ldac(p_sfinfo, hData->nlnn);
694*aef9bcd9SKiyoung Kim 
695*aef9bcd9SKiyoung Kim     error_code = encode_ldac(p_sfinfo, hData->nbands, hData->grad_mode,
696*aef9bcd9SKiyoung Kim             hData->grad_qu_l, hData->grad_qu_h, hData->grad_os_l, hData->grad_os_h,
697*aef9bcd9SKiyoung Kim             hData->abc_status);
698*aef9bcd9SKiyoung Kim     if (LDAC_ERROR(error_code) && !LDAC_FATAL_ERROR(error_code)) {
699*aef9bcd9SKiyoung Kim         int error_code2;
700*aef9bcd9SKiyoung Kim         error_code2 = pack_null_data_frame_ldac(p_sfinfo, (STREAM *)p_stream, &loc, p_nbytes_used);
701*aef9bcd9SKiyoung Kim         if (LDAC_FATAL_ERROR(error_code2)) {
702*aef9bcd9SKiyoung Kim             clear_data_ldac(p_stream, frame_length*sizeof(unsigned char));
703*aef9bcd9SKiyoung Kim             hData->error_code = error_code2;
704*aef9bcd9SKiyoung Kim             return LDAC_E_FAIL;
705*aef9bcd9SKiyoung Kim         }
706*aef9bcd9SKiyoung Kim         hData->error_code = error_code;
707*aef9bcd9SKiyoung Kim         return LDAC_S_FALSE;
708*aef9bcd9SKiyoung Kim     }
709*aef9bcd9SKiyoung Kim 
710*aef9bcd9SKiyoung Kim     error_code = pack_raw_data_frame_ldac(p_sfinfo, (STREAM *)p_stream, &loc, p_nbytes_used);
711*aef9bcd9SKiyoung Kim     if (LDAC_FATAL_ERROR(error_code)) {
712*aef9bcd9SKiyoung Kim         int error_code2;
713*aef9bcd9SKiyoung Kim         loc = 0;
714*aef9bcd9SKiyoung Kim         clear_data_ldac(p_stream, frame_length*sizeof(unsigned char));
715*aef9bcd9SKiyoung Kim         error_code2 = pack_null_data_frame_ldac(p_sfinfo, (STREAM *)p_stream, &loc, p_nbytes_used);
716*aef9bcd9SKiyoung Kim         if (LDAC_FATAL_ERROR(error_code2)) {
717*aef9bcd9SKiyoung Kim             clear_data_ldac(p_stream, frame_length*sizeof(unsigned char));
718*aef9bcd9SKiyoung Kim             hData->error_code = error_code2;
719*aef9bcd9SKiyoung Kim             return LDAC_E_FAIL;
720*aef9bcd9SKiyoung Kim         }
721*aef9bcd9SKiyoung Kim         hData->error_code = error_code;
722*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
723*aef9bcd9SKiyoung Kim     }
724*aef9bcd9SKiyoung Kim 
725*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
726*aef9bcd9SKiyoung Kim }
727*aef9bcd9SKiyoung Kim 
728*aef9bcd9SKiyoung Kim /***************************************************************************************************
729*aef9bcd9SKiyoung Kim     Flush Encode
730*aef9bcd9SKiyoung Kim ***************************************************************************************************/
731*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_flush_encode(
732*aef9bcd9SKiyoung Kim HANDLE_LDAC hData,
733*aef9bcd9SKiyoung Kim LDAC_SMPL_FMT_T sample_format,
734*aef9bcd9SKiyoung Kim unsigned char *p_stream,
735*aef9bcd9SKiyoung Kim int *p_nbytes_used)
736*aef9bcd9SKiyoung Kim {
737*aef9bcd9SKiyoung Kim     LDAC_RESULT result;
738*aef9bcd9SKiyoung Kim     int ich;
739*aef9bcd9SKiyoung Kim     char *ap_buf[LDAC_PRCNCH];
740*aef9bcd9SKiyoung Kim     int a_buf[LDAC_MAXLSU*LDAC_PRCNCH];
741*aef9bcd9SKiyoung Kim 
742*aef9bcd9SKiyoung Kim     if (!ldaclib_assert_sample_format(sample_format)) {
743*aef9bcd9SKiyoung Kim         hData->error_code = LDAC_ERR_ILL_SMPL_FORMAT;
744*aef9bcd9SKiyoung Kim         return LDAC_E_FAIL;
745*aef9bcd9SKiyoung Kim     }
746*aef9bcd9SKiyoung Kim 
747*aef9bcd9SKiyoung Kim     clear_data_ldac(a_buf, (LDAC_MAXLSU*LDAC_PRCNCH)*sizeof(int));
748*aef9bcd9SKiyoung Kim 
749*aef9bcd9SKiyoung Kim     for (ich = 0; ich < LDAC_PRCNCH; ich++) {
750*aef9bcd9SKiyoung Kim         ap_buf[ich] = (char *)(a_buf + ich * LDAC_MAXLSU);
751*aef9bcd9SKiyoung Kim     }
752*aef9bcd9SKiyoung Kim 
753*aef9bcd9SKiyoung Kim     result = ldaclib_encode(hData, ap_buf, sample_format, p_stream, p_nbytes_used);
754*aef9bcd9SKiyoung Kim 
755*aef9bcd9SKiyoung Kim     return result;
756*aef9bcd9SKiyoung Kim }
757*aef9bcd9SKiyoung Kim 
758*aef9bcd9SKiyoung Kim 
759*aef9bcd9SKiyoung Kim 
760*aef9bcd9SKiyoung Kim 
761*aef9bcd9SKiyoung Kim /***************************************************************************************************
762*aef9bcd9SKiyoung Kim     Error Code Dispatch
763*aef9bcd9SKiyoung Kim ***************************************************************************************************/
764*aef9bcd9SKiyoung Kim 
765*aef9bcd9SKiyoung Kim /***************************************************************************************************
766*aef9bcd9SKiyoung Kim     Clear Error Code at Handle Level
767*aef9bcd9SKiyoung Kim ***************************************************************************************************/
768*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_clear_error_code(
769*aef9bcd9SKiyoung Kim HANDLE_LDAC hData)
770*aef9bcd9SKiyoung Kim {
771*aef9bcd9SKiyoung Kim     hData->error_code = LDAC_ERR_NONE;
772*aef9bcd9SKiyoung Kim 
773*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
774*aef9bcd9SKiyoung Kim }
775*aef9bcd9SKiyoung Kim 
776*aef9bcd9SKiyoung Kim /***************************************************************************************************
777*aef9bcd9SKiyoung Kim     Get Error Code at Handle Level
778*aef9bcd9SKiyoung Kim ***************************************************************************************************/
779*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_get_error_code(
780*aef9bcd9SKiyoung Kim HANDLE_LDAC hData,
781*aef9bcd9SKiyoung Kim int *p_error_code)
782*aef9bcd9SKiyoung Kim {
783*aef9bcd9SKiyoung Kim     *p_error_code = hData->error_code;
784*aef9bcd9SKiyoung Kim 
785*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
786*aef9bcd9SKiyoung Kim }
787*aef9bcd9SKiyoung Kim 
788*aef9bcd9SKiyoung Kim /***************************************************************************************************
789*aef9bcd9SKiyoung Kim     Clear Error Code at Internal Block Level
790*aef9bcd9SKiyoung Kim ***************************************************************************************************/
791*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_clear_internal_error_code(
792*aef9bcd9SKiyoung Kim HANDLE_LDAC hData)
793*aef9bcd9SKiyoung Kim {
794*aef9bcd9SKiyoung Kim     hData->sfinfo.error_code = LDAC_ERR_NONE;
795*aef9bcd9SKiyoung Kim 
796*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
797*aef9bcd9SKiyoung Kim }
798*aef9bcd9SKiyoung Kim 
799*aef9bcd9SKiyoung Kim /***************************************************************************************************
800*aef9bcd9SKiyoung Kim     Get Error Code at Internal Block Level
801*aef9bcd9SKiyoung Kim ***************************************************************************************************/
802*aef9bcd9SKiyoung Kim DECLSPEC LDAC_RESULT ldaclib_get_internal_error_code(
803*aef9bcd9SKiyoung Kim HANDLE_LDAC hData,
804*aef9bcd9SKiyoung Kim int *p_error_code)
805*aef9bcd9SKiyoung Kim {
806*aef9bcd9SKiyoung Kim     *p_error_code = hData->sfinfo.error_code;
807*aef9bcd9SKiyoung Kim 
808*aef9bcd9SKiyoung Kim     return LDAC_S_OK;
809*aef9bcd9SKiyoung Kim }
810*aef9bcd9SKiyoung Kim 
811