1*aef9bcd9SKiyoung Kim /*
2*aef9bcd9SKiyoung Kim * Copyright (C) 2013 - 2017 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 "ldacBT_internal.h"
18*aef9bcd9SKiyoung Kim
19*aef9bcd9SKiyoung Kim
20*aef9bcd9SKiyoung Kim /* Get LDAC library version */
21*aef9bcd9SKiyoung Kim #define LDACBT_LIB_VER_MAJOR 2
22*aef9bcd9SKiyoung Kim #define LDACBT_LIB_VER_MINOR 0
23*aef9bcd9SKiyoung Kim #define LDACBT_LIB_VER_BRANCH 2
ldacBT_get_version(void)24*aef9bcd9SKiyoung Kim LDACBT_API int ldacBT_get_version( void )
25*aef9bcd9SKiyoung Kim {
26*aef9bcd9SKiyoung Kim return ((LDACBT_LIB_VER_MAJOR)<<16)|((LDACBT_LIB_VER_MINOR)<<8)|(LDACBT_LIB_VER_BRANCH);
27*aef9bcd9SKiyoung Kim }
28*aef9bcd9SKiyoung Kim
29*aef9bcd9SKiyoung Kim /* Get LDAC handle */
ldacBT_get_handle(void)30*aef9bcd9SKiyoung Kim LDACBT_API HANDLE_LDAC_BT ldacBT_get_handle( void )
31*aef9bcd9SKiyoung Kim {
32*aef9bcd9SKiyoung Kim HANDLE_LDAC_BT hLdacBT;
33*aef9bcd9SKiyoung Kim hLdacBT = (HANDLE_LDAC_BT)malloc( sizeof(STRUCT_LDACBT_HANDLE) );
34*aef9bcd9SKiyoung Kim if( hLdacBT == NULL ){ return NULL; }
35*aef9bcd9SKiyoung Kim
36*aef9bcd9SKiyoung Kim /* Get ldaclib Handler */
37*aef9bcd9SKiyoung Kim if( (hLdacBT->hLDAC = ldaclib_get_handle()) == NULL ){
38*aef9bcd9SKiyoung Kim ldacBT_free_handle( hLdacBT );
39*aef9bcd9SKiyoung Kim return NULL;
40*aef9bcd9SKiyoung Kim }
41*aef9bcd9SKiyoung Kim
42*aef9bcd9SKiyoung Kim ldacBT_param_clear( hLdacBT );
43*aef9bcd9SKiyoung Kim return hLdacBT;
44*aef9bcd9SKiyoung Kim }
45*aef9bcd9SKiyoung Kim
46*aef9bcd9SKiyoung Kim /* Free LDAC handle */
ldacBT_free_handle(HANDLE_LDAC_BT hLdacBT)47*aef9bcd9SKiyoung Kim LDACBT_API void ldacBT_free_handle( HANDLE_LDAC_BT hLdacBT )
48*aef9bcd9SKiyoung Kim {
49*aef9bcd9SKiyoung Kim if( hLdacBT == NULL ){ return; }
50*aef9bcd9SKiyoung Kim
51*aef9bcd9SKiyoung Kim if( hLdacBT->hLDAC != NULL ){
52*aef9bcd9SKiyoung Kim /* close ldaclib handle */
53*aef9bcd9SKiyoung Kim if( hLdacBT->proc_mode == LDACBT_PROCMODE_ENCODE ){
54*aef9bcd9SKiyoung Kim ldaclib_free_encode( hLdacBT->hLDAC );
55*aef9bcd9SKiyoung Kim }
56*aef9bcd9SKiyoung Kim /* free ldaclib handle */
57*aef9bcd9SKiyoung Kim ldaclib_free_handle( hLdacBT->hLDAC );
58*aef9bcd9SKiyoung Kim hLdacBT->hLDAC = NULL;
59*aef9bcd9SKiyoung Kim }
60*aef9bcd9SKiyoung Kim /* free ldacbt handle */
61*aef9bcd9SKiyoung Kim free( hLdacBT );
62*aef9bcd9SKiyoung Kim }
63*aef9bcd9SKiyoung Kim
64*aef9bcd9SKiyoung Kim /* Close LDAC handle */
ldacBT_close_handle(HANDLE_LDAC_BT hLdacBT)65*aef9bcd9SKiyoung Kim LDACBT_API void ldacBT_close_handle( HANDLE_LDAC_BT hLdacBT )
66*aef9bcd9SKiyoung Kim {
67*aef9bcd9SKiyoung Kim if( hLdacBT == NULL ){ return; }
68*aef9bcd9SKiyoung Kim
69*aef9bcd9SKiyoung Kim if( hLdacBT->hLDAC != NULL ){
70*aef9bcd9SKiyoung Kim /* close ldaclib handle */
71*aef9bcd9SKiyoung Kim if( hLdacBT->proc_mode == LDACBT_PROCMODE_ENCODE ){
72*aef9bcd9SKiyoung Kim ldaclib_free_encode( hLdacBT->hLDAC );
73*aef9bcd9SKiyoung Kim }
74*aef9bcd9SKiyoung Kim /* clear error code */
75*aef9bcd9SKiyoung Kim ldaclib_clear_error_code(hLdacBT->hLDAC);
76*aef9bcd9SKiyoung Kim ldaclib_clear_internal_error_code(hLdacBT->hLDAC);
77*aef9bcd9SKiyoung Kim }
78*aef9bcd9SKiyoung Kim /* clear ldacbt handle */
79*aef9bcd9SKiyoung Kim ldacBT_param_clear( hLdacBT );
80*aef9bcd9SKiyoung Kim }
81*aef9bcd9SKiyoung Kim
82*aef9bcd9SKiyoung Kim
83*aef9bcd9SKiyoung Kim /* Get ERROR CODE */
ldacBT_get_error_code(HANDLE_LDAC_BT hLdacBT)84*aef9bcd9SKiyoung Kim LDACBT_API int ldacBT_get_error_code( HANDLE_LDAC_BT hLdacBT )
85*aef9bcd9SKiyoung Kim {
86*aef9bcd9SKiyoung Kim int error_code;
87*aef9bcd9SKiyoung Kim if( hLdacBT == NULL ){return LDACBT_ERR_FATAL_HANDLE<<10;}
88*aef9bcd9SKiyoung Kim ldacBT_check_ldaclib_error_code( hLdacBT );
89*aef9bcd9SKiyoung Kim if( hLdacBT->error_code_api == LDACBT_GET_LDACLIB_ERROR_CODE ){
90*aef9bcd9SKiyoung Kim error_code = LDACBT_ERR_FATAL << 20 | hLdacBT->error_code;
91*aef9bcd9SKiyoung Kim }else if( hLdacBT->error_code_api != LDACBT_ERR_NONE ){
92*aef9bcd9SKiyoung Kim error_code = hLdacBT->error_code_api << 20 | hLdacBT->error_code;
93*aef9bcd9SKiyoung Kim }else{
94*aef9bcd9SKiyoung Kim error_code = hLdacBT->error_code_api << 20;
95*aef9bcd9SKiyoung Kim }
96*aef9bcd9SKiyoung Kim return error_code;
97*aef9bcd9SKiyoung Kim }
98*aef9bcd9SKiyoung Kim
99*aef9bcd9SKiyoung Kim
100*aef9bcd9SKiyoung Kim /* Get Configured Sampling frequency */
ldacBT_get_sampling_freq(HANDLE_LDAC_BT hLdacBT)101*aef9bcd9SKiyoung Kim LDACBT_API int ldacBT_get_sampling_freq( HANDLE_LDAC_BT hLdacBT )
102*aef9bcd9SKiyoung Kim {
103*aef9bcd9SKiyoung Kim if( hLdacBT == NULL ){
104*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
105*aef9bcd9SKiyoung Kim }
106*aef9bcd9SKiyoung Kim if( hLdacBT->proc_mode != LDACBT_PROCMODE_ENCODE )
107*aef9bcd9SKiyoung Kim {
108*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_ERR_HANDLE_NOT_INIT;
109*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
110*aef9bcd9SKiyoung Kim }
111*aef9bcd9SKiyoung Kim return hLdacBT->pcm.sf;
112*aef9bcd9SKiyoung Kim }
113*aef9bcd9SKiyoung Kim
114*aef9bcd9SKiyoung Kim /* Get bitrate */
ldacBT_get_bitrate(HANDLE_LDAC_BT hLdacBT)115*aef9bcd9SKiyoung Kim LDACBT_API int ldacBT_get_bitrate( HANDLE_LDAC_BT hLdacBT )
116*aef9bcd9SKiyoung Kim {
117*aef9bcd9SKiyoung Kim if( hLdacBT == NULL ){
118*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
119*aef9bcd9SKiyoung Kim }
120*aef9bcd9SKiyoung Kim if( hLdacBT->proc_mode != LDACBT_PROCMODE_ENCODE )
121*aef9bcd9SKiyoung Kim {
122*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_ERR_HANDLE_NOT_INIT;
123*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
124*aef9bcd9SKiyoung Kim }
125*aef9bcd9SKiyoung Kim return hLdacBT->bitrate;
126*aef9bcd9SKiyoung Kim }
127*aef9bcd9SKiyoung Kim
128*aef9bcd9SKiyoung Kim /* Init LDAC handle for ENCODE */
ldacBT_init_handle_encode(HANDLE_LDAC_BT hLdacBT,int mtu,int eqmid,int cm,LDACBT_SMPL_FMT_T fmt,int sf)129*aef9bcd9SKiyoung Kim LDACBT_API int ldacBT_init_handle_encode( HANDLE_LDAC_BT hLdacBT, int mtu, int eqmid,
130*aef9bcd9SKiyoung Kim int cm, LDACBT_SMPL_FMT_T fmt, int sf )
131*aef9bcd9SKiyoung Kim {
132*aef9bcd9SKiyoung Kim LDAC_RESULT result;
133*aef9bcd9SKiyoung Kim int sfid, frame_samples, cci;
134*aef9bcd9SKiyoung Kim int nbasebands, grad_mode, grad_qu_l, grad_qu_h, grad_ofst_l, grad_ofst_h, abc_flag;
135*aef9bcd9SKiyoung Kim P_LDACBT_CONFIG pCfg;
136*aef9bcd9SKiyoung Kim const int a_cci_nch[] = { 1, 2, 2 };
137*aef9bcd9SKiyoung Kim
138*aef9bcd9SKiyoung Kim /* check arguments */
139*aef9bcd9SKiyoung Kim if( hLdacBT == NULL ){ return LDACBT_E_FAIL; }
140*aef9bcd9SKiyoung Kim if( (hLdacBT->error_code_api = ldacBT_assert_mtu( mtu )) != LDACBT_ERR_NONE ){
141*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
142*aef9bcd9SKiyoung Kim }
143*aef9bcd9SKiyoung Kim if( (hLdacBT->error_code_api = ldacBT_assert_eqmid( eqmid )) != LDACBT_ERR_NONE ){
144*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
145*aef9bcd9SKiyoung Kim }
146*aef9bcd9SKiyoung Kim if( (hLdacBT->error_code_api = ldacBT_assert_cm( cm )) != LDACBT_ERR_NONE ){
147*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
148*aef9bcd9SKiyoung Kim }
149*aef9bcd9SKiyoung Kim if( (hLdacBT->error_code_api = ldacBT_assert_sample_format( fmt )) != LDACBT_ERR_NONE ){
150*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
151*aef9bcd9SKiyoung Kim }
152*aef9bcd9SKiyoung Kim if( (hLdacBT->error_code_api = ldacBT_assert_pcm_sampling_freq( sf )) != LDACBT_ERR_NONE ){
153*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
154*aef9bcd9SKiyoung Kim }
155*aef9bcd9SKiyoung Kim
156*aef9bcd9SKiyoung Kim ldacBT_close_handle( hLdacBT );
157*aef9bcd9SKiyoung Kim
158*aef9bcd9SKiyoung Kim /* initialize handle for encode processing */
159*aef9bcd9SKiyoung Kim hLdacBT->proc_mode = LDACBT_PROCMODE_ENCODE;
160*aef9bcd9SKiyoung Kim hLdacBT->flg_encode_flushed = FALSE;
161*aef9bcd9SKiyoung Kim
162*aef9bcd9SKiyoung Kim /* transport setting */
163*aef9bcd9SKiyoung Kim /* The ldac frame header is REQUIRED for A2DP streaming. */
164*aef9bcd9SKiyoung Kim hLdacBT->transport = TRUE;
165*aef9bcd9SKiyoung Kim hLdacBT->tx.mtu = mtu;
166*aef9bcd9SKiyoung Kim hLdacBT->tx.pkt_hdr_sz = LDACBT_TX_HEADER_SIZE;
167*aef9bcd9SKiyoung Kim hLdacBT->tx.tx_size = LDACBT_MTU_REQUIRED;
168*aef9bcd9SKiyoung Kim hLdacBT->tx.pkt_type = _2_DH5;
169*aef9bcd9SKiyoung Kim /* - BT TRANS HEADER etc */
170*aef9bcd9SKiyoung Kim hLdacBT->tx.tx_size -= hLdacBT->tx.pkt_hdr_sz;
171*aef9bcd9SKiyoung Kim if( hLdacBT->tx.tx_size > (hLdacBT->tx.mtu - hLdacBT->tx.pkt_hdr_sz) ){
172*aef9bcd9SKiyoung Kim /* never happen, mtu must be larger than LDACBT_MTU_REQUIRED(2DH5) */
173*aef9bcd9SKiyoung Kim hLdacBT->tx.tx_size = (hLdacBT->tx.mtu - hLdacBT->tx.pkt_hdr_sz);
174*aef9bcd9SKiyoung Kim }
175*aef9bcd9SKiyoung Kim
176*aef9bcd9SKiyoung Kim /* channel configration */
177*aef9bcd9SKiyoung Kim cci = ldacBT_cm_to_cci(cm);
178*aef9bcd9SKiyoung Kim hLdacBT->cm = cm;
179*aef9bcd9SKiyoung Kim hLdacBT->cci = cci;
180*aef9bcd9SKiyoung Kim /* input pcm configuration */
181*aef9bcd9SKiyoung Kim hLdacBT->pcm.ch = a_cci_nch[cci];
182*aef9bcd9SKiyoung Kim hLdacBT->pcm.sf = sf;
183*aef9bcd9SKiyoung Kim hLdacBT->pcm.fmt = fmt;
184*aef9bcd9SKiyoung Kim switch(hLdacBT->pcm.fmt){
185*aef9bcd9SKiyoung Kim case LDACBT_SMPL_FMT_S16:
186*aef9bcd9SKiyoung Kim hLdacBT->pcm.wl = 2;
187*aef9bcd9SKiyoung Kim break;
188*aef9bcd9SKiyoung Kim case LDACBT_SMPL_FMT_S24:
189*aef9bcd9SKiyoung Kim hLdacBT->pcm.wl = 3;
190*aef9bcd9SKiyoung Kim break;
191*aef9bcd9SKiyoung Kim case LDACBT_SMPL_FMT_S32:
192*aef9bcd9SKiyoung Kim case LDACBT_SMPL_FMT_F32:
193*aef9bcd9SKiyoung Kim hLdacBT->pcm.wl = 4;
194*aef9bcd9SKiyoung Kim break;
195*aef9bcd9SKiyoung Kim default:
196*aef9bcd9SKiyoung Kim // must be rejected by ldacBT_assert_sample_format()
197*aef9bcd9SKiyoung Kim hLdacBT->pcm.wl = 4;
198*aef9bcd9SKiyoung Kim break;
199*aef9bcd9SKiyoung Kim }
200*aef9bcd9SKiyoung Kim
201*aef9bcd9SKiyoung Kim /* initilize ldac encode */
202*aef9bcd9SKiyoung Kim /* Get sampling frequency index */
203*aef9bcd9SKiyoung Kim result = ldaclib_get_sampling_rate_index( hLdacBT->pcm.sf, &sfid );
204*aef9bcd9SKiyoung Kim if( LDAC_FAILED ( result ) ){
205*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_ERR_ILL_SAMPLING_FREQ;
206*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
207*aef9bcd9SKiyoung Kim }
208*aef9bcd9SKiyoung Kim hLdacBT->sfid = sfid;
209*aef9bcd9SKiyoung Kim
210*aef9bcd9SKiyoung Kim /* Get number of frame samples */
211*aef9bcd9SKiyoung Kim result = ldaclib_get_frame_samples(sfid, &frame_samples);
212*aef9bcd9SKiyoung Kim if (LDAC_FAILED(result)) {
213*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_ERR_ILL_SAMPLING_FREQ;
214*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
215*aef9bcd9SKiyoung Kim }
216*aef9bcd9SKiyoung Kim hLdacBT->frm_samples = frame_samples;
217*aef9bcd9SKiyoung Kim
218*aef9bcd9SKiyoung Kim
219*aef9bcd9SKiyoung Kim /* Set Parameters by Encode Quality Mode Index */
220*aef9bcd9SKiyoung Kim hLdacBT->eqmid = eqmid;
221*aef9bcd9SKiyoung Kim /* get frame_length of EQMID */
222*aef9bcd9SKiyoung Kim pCfg = ldacBT_get_config( hLdacBT->eqmid, hLdacBT->tx.pkt_type );
223*aef9bcd9SKiyoung Kim /* set frame_length */
224*aef9bcd9SKiyoung Kim hLdacBT->frmlen_tx = hLdacBT->pcm.ch * pCfg->frmlen_1ch;
225*aef9bcd9SKiyoung Kim hLdacBT->frmlen = hLdacBT->frmlen_tx;
226*aef9bcd9SKiyoung Kim if (hLdacBT->transport) {
227*aef9bcd9SKiyoung Kim /* Adjust frame_length for Transport Header Data */
228*aef9bcd9SKiyoung Kim hLdacBT->frmlen -= LDACBT_FRMHDRBYTES;
229*aef9bcd9SKiyoung Kim }
230*aef9bcd9SKiyoung Kim
231*aef9bcd9SKiyoung Kim /* Calculate how many LDAC frames fit into payload packet */
232*aef9bcd9SKiyoung Kim hLdacBT->tx.nfrm_in_pkt = hLdacBT->tx.tx_size / hLdacBT->frmlen_tx;
233*aef9bcd9SKiyoung Kim
234*aef9bcd9SKiyoung Kim
235*aef9bcd9SKiyoung Kim /* Get ldac encode setting */
236*aef9bcd9SKiyoung Kim result = ldaclib_get_encode_setting( pCfg->frmlen_1ch, sfid, &nbasebands, &grad_mode,
237*aef9bcd9SKiyoung Kim &grad_qu_l, &grad_qu_h, &grad_ofst_l, &grad_ofst_h, &abc_flag);
238*aef9bcd9SKiyoung Kim if (LDAC_FAILED(result)) {
239*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_ERR_ILL_PARAM;
240*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
241*aef9bcd9SKiyoung Kim }
242*aef9bcd9SKiyoung Kim
243*aef9bcd9SKiyoung Kim /* Set Configuration Information */
244*aef9bcd9SKiyoung Kim result = ldaclib_set_config_info( hLdacBT->hLDAC, hLdacBT->sfid, hLdacBT->cci,
245*aef9bcd9SKiyoung Kim hLdacBT->frmlen, hLdacBT->frm_status);
246*aef9bcd9SKiyoung Kim if (LDAC_FAILED(result)) {
247*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE;
248*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
249*aef9bcd9SKiyoung Kim }
250*aef9bcd9SKiyoung Kim else if (result != LDAC_S_OK) {
251*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE;
252*aef9bcd9SKiyoung Kim }
253*aef9bcd9SKiyoung Kim
254*aef9bcd9SKiyoung Kim /* Set Encoding Information */
255*aef9bcd9SKiyoung Kim result = ldaclib_set_encode_info(hLdacBT->hLDAC, nbasebands, grad_mode,
256*aef9bcd9SKiyoung Kim grad_qu_l, grad_qu_h, grad_ofst_l, grad_ofst_h, abc_flag);
257*aef9bcd9SKiyoung Kim if (LDAC_FAILED(result)) {
258*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE;
259*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
260*aef9bcd9SKiyoung Kim }
261*aef9bcd9SKiyoung Kim else if (result != LDAC_S_OK) {
262*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE;
263*aef9bcd9SKiyoung Kim }
264*aef9bcd9SKiyoung Kim
265*aef9bcd9SKiyoung Kim /* Initialize ldaclib for Encoding */
266*aef9bcd9SKiyoung Kim result = ldaclib_init_encode(hLdacBT->hLDAC);
267*aef9bcd9SKiyoung Kim if (LDAC_FAILED(result)) {
268*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE;
269*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
270*aef9bcd9SKiyoung Kim }
271*aef9bcd9SKiyoung Kim else if (result != LDAC_S_OK) {
272*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE;
273*aef9bcd9SKiyoung Kim }
274*aef9bcd9SKiyoung Kim
275*aef9bcd9SKiyoung Kim /* reset target eqmid as current setting */
276*aef9bcd9SKiyoung Kim hLdacBT->tgt_eqmid = hLdacBT->eqmid;
277*aef9bcd9SKiyoung Kim hLdacBT->tgt_nfrm_in_pkt = hLdacBT->tx.nfrm_in_pkt;
278*aef9bcd9SKiyoung Kim hLdacBT->tgt_frmlen = hLdacBT->frmlen;
279*aef9bcd9SKiyoung Kim hLdacBT->stat_alter_op = LDACBT_ALTER_OP__NON;
280*aef9bcd9SKiyoung Kim
281*aef9bcd9SKiyoung Kim /* get bitrate */
282*aef9bcd9SKiyoung Kim hLdacBT->bitrate = ldacBT_frmlen_to_bitrate( hLdacBT->frmlen, hLdacBT->transport,
283*aef9bcd9SKiyoung Kim hLdacBT->pcm.sf, hLdacBT->frm_samples );
284*aef9bcd9SKiyoung Kim
285*aef9bcd9SKiyoung Kim return (hLdacBT->error_code_api==LDACBT_ERR_NONE?LDACBT_S_OK:LDACBT_E_FAIL);
286*aef9bcd9SKiyoung Kim }
287*aef9bcd9SKiyoung Kim
288*aef9bcd9SKiyoung Kim /* Set Encode Quality Mode index */
ldacBT_set_eqmid(HANDLE_LDAC_BT hLdacBT,int eqmid)289*aef9bcd9SKiyoung Kim LDACBT_API int ldacBT_set_eqmid( HANDLE_LDAC_BT hLdacBT, int eqmid )
290*aef9bcd9SKiyoung Kim {
291*aef9bcd9SKiyoung Kim if( hLdacBT == NULL ){
292*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
293*aef9bcd9SKiyoung Kim }
294*aef9bcd9SKiyoung Kim if( hLdacBT->proc_mode != LDACBT_PROCMODE_ENCODE ){
295*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_ERR_HANDLE_NOT_INIT;
296*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
297*aef9bcd9SKiyoung Kim }
298*aef9bcd9SKiyoung Kim
299*aef9bcd9SKiyoung Kim if( (hLdacBT->error_code_api = ldacBT_assert_eqmid( eqmid )) != LDACBT_ERR_NONE ){
300*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL; /* fatal */
301*aef9bcd9SKiyoung Kim }
302*aef9bcd9SKiyoung Kim ldacBT_set_eqmid_core( hLdacBT, eqmid );
303*aef9bcd9SKiyoung Kim
304*aef9bcd9SKiyoung Kim return LDACBT_S_OK;
305*aef9bcd9SKiyoung Kim }
306*aef9bcd9SKiyoung Kim
307*aef9bcd9SKiyoung Kim /* Get Encode Quality Mode index */
ldacBT_get_eqmid(HANDLE_LDAC_BT hLdacBT)308*aef9bcd9SKiyoung Kim LDACBT_API int ldacBT_get_eqmid( HANDLE_LDAC_BT hLdacBT )
309*aef9bcd9SKiyoung Kim {
310*aef9bcd9SKiyoung Kim if( hLdacBT == NULL ){
311*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
312*aef9bcd9SKiyoung Kim }
313*aef9bcd9SKiyoung Kim if( hLdacBT->proc_mode != LDACBT_PROCMODE_ENCODE ){
314*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_ERR_HANDLE_NOT_INIT;
315*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
316*aef9bcd9SKiyoung Kim }
317*aef9bcd9SKiyoung Kim return hLdacBT->tgt_eqmid;
318*aef9bcd9SKiyoung Kim }
319*aef9bcd9SKiyoung Kim
320*aef9bcd9SKiyoung Kim /* Alter encode quality mode index */
ldacBT_alter_eqmid_priority(HANDLE_LDAC_BT hLdacBT,int priority)321*aef9bcd9SKiyoung Kim LDACBT_API int ldacBT_alter_eqmid_priority( HANDLE_LDAC_BT hLdacBT, int priority )
322*aef9bcd9SKiyoung Kim {
323*aef9bcd9SKiyoung Kim int target_eqmid;
324*aef9bcd9SKiyoung Kim if( hLdacBT == NULL ){ return LDACBT_E_FAIL; }
325*aef9bcd9SKiyoung Kim if( hLdacBT->proc_mode != LDACBT_PROCMODE_ENCODE ){
326*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_ERR_HANDLE_NOT_INIT;
327*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
328*aef9bcd9SKiyoung Kim }
329*aef9bcd9SKiyoung Kim if( (priority != LDACBT_EQMID_INC_QUALITY) &&
330*aef9bcd9SKiyoung Kim (priority != LDACBT_EQMID_INC_CONNECTION )
331*aef9bcd9SKiyoung Kim ){
332*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_ERR_ILL_PARAM;
333*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
334*aef9bcd9SKiyoung Kim }
335*aef9bcd9SKiyoung Kim
336*aef9bcd9SKiyoung Kim target_eqmid = ldacBT_get_altered_eqmid( hLdacBT, priority);
337*aef9bcd9SKiyoung Kim if( target_eqmid < 0 ){
338*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_ERR_ALTER_EQMID_LIMITED;
339*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
340*aef9bcd9SKiyoung Kim }
341*aef9bcd9SKiyoung Kim
342*aef9bcd9SKiyoung Kim ldacBT_set_eqmid_core( hLdacBT, target_eqmid );
343*aef9bcd9SKiyoung Kim return LDACBT_S_OK;
344*aef9bcd9SKiyoung Kim }
345*aef9bcd9SKiyoung Kim
346*aef9bcd9SKiyoung Kim /* LDAC encode proccess */
ldacBT_encode(HANDLE_LDAC_BT hLdacBT,void * p_pcm,int * pcm_used,unsigned char * p_stream,int * stream_sz,int * frame_num)347*aef9bcd9SKiyoung Kim LDACBT_API int ldacBT_encode( HANDLE_LDAC_BT hLdacBT, void *p_pcm, int *pcm_used,
348*aef9bcd9SKiyoung Kim unsigned char *p_stream, int *stream_sz, int *frame_num )
349*aef9bcd9SKiyoung Kim {
350*aef9bcd9SKiyoung Kim LDAC_RESULT result;
351*aef9bcd9SKiyoung Kim LDACBT_SMPL_FMT_T fmt;
352*aef9bcd9SKiyoung Kim LDACBT_TRANSPORT_FRM_BUF *ptfbuf;
353*aef9bcd9SKiyoung Kim LDACBT_PCM_RING_BUF *ppcmring;
354*aef9bcd9SKiyoung Kim P_LDACBT_CONFIG pCfg;
355*aef9bcd9SKiyoung Kim int frmlen, frmlen_wrote, frmlen_adj;
356*aef9bcd9SKiyoung Kim int frm_status, flg_Do_Encode;
357*aef9bcd9SKiyoung Kim int nFrmToPkt, ch, wl;
358*aef9bcd9SKiyoung Kim unsigned char *p_ldac_transport_frame;
359*aef9bcd9SKiyoung Kim unsigned char a_frm_header[LDACBT_FRMHDRBYTES + 2];
360*aef9bcd9SKiyoung Kim if( hLdacBT == NULL ){
361*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
362*aef9bcd9SKiyoung Kim }
363*aef9bcd9SKiyoung Kim if( hLdacBT->hLDAC == NULL ){
364*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
365*aef9bcd9SKiyoung Kim }
366*aef9bcd9SKiyoung Kim if( hLdacBT->proc_mode != LDACBT_PROCMODE_ENCODE ){
367*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_ERR_HANDLE_NOT_INIT;
368*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
369*aef9bcd9SKiyoung Kim }
370*aef9bcd9SKiyoung Kim /* Clear Error Codes */
371*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_ERR_NONE;
372*aef9bcd9SKiyoung Kim ldaclib_clear_error_code( hLdacBT->hLDAC );
373*aef9bcd9SKiyoung Kim ldaclib_clear_internal_error_code( hLdacBT->hLDAC );
374*aef9bcd9SKiyoung Kim
375*aef9bcd9SKiyoung Kim if( ( pcm_used == NULL) ||
376*aef9bcd9SKiyoung Kim ( p_stream == NULL ) ||
377*aef9bcd9SKiyoung Kim ( stream_sz == NULL ) ||
378*aef9bcd9SKiyoung Kim ( frame_num == NULL )
379*aef9bcd9SKiyoung Kim ){
380*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_ERR_ILL_PARAM;
381*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
382*aef9bcd9SKiyoung Kim }
383*aef9bcd9SKiyoung Kim /* reset parameters */
384*aef9bcd9SKiyoung Kim *pcm_used = 0;
385*aef9bcd9SKiyoung Kim *stream_sz = 0;
386*aef9bcd9SKiyoung Kim *frame_num = 0;
387*aef9bcd9SKiyoung Kim flg_Do_Encode = 0;
388*aef9bcd9SKiyoung Kim fmt = hLdacBT->pcm.fmt;
389*aef9bcd9SKiyoung Kim ch = hLdacBT->pcm.ch;
390*aef9bcd9SKiyoung Kim wl = hLdacBT->pcm.wl;
391*aef9bcd9SKiyoung Kim ptfbuf = &hLdacBT->ldac_trns_frm_buf;
392*aef9bcd9SKiyoung Kim ppcmring = &hLdacBT->pcmring;
393*aef9bcd9SKiyoung Kim
394*aef9bcd9SKiyoung Kim /* update input pcm data */
395*aef9bcd9SKiyoung Kim if( p_pcm != NULL ){
396*aef9bcd9SKiyoung Kim int nByteCpy, sz;
397*aef9bcd9SKiyoung Kim nByteCpy = LDACBT_ENC_LSU * wl * ch;
398*aef9bcd9SKiyoung Kim sz = ppcmring->nsmpl * wl * ch + nByteCpy;
399*aef9bcd9SKiyoung Kim if( sz < LDACBT_ENC_PCM_BUF_SZ ){
400*aef9bcd9SKiyoung Kim copy_data_ldac( p_pcm, ppcmring->buf + ppcmring->wp, nByteCpy );
401*aef9bcd9SKiyoung Kim ppcmring->wp += nByteCpy;
402*aef9bcd9SKiyoung Kim if( ppcmring->wp >= LDACBT_ENC_PCM_BUF_SZ ){
403*aef9bcd9SKiyoung Kim ppcmring->wp = 0;
404*aef9bcd9SKiyoung Kim }
405*aef9bcd9SKiyoung Kim ppcmring->nsmpl += LDACBT_ENC_LSU;
406*aef9bcd9SKiyoung Kim *pcm_used = nByteCpy;
407*aef9bcd9SKiyoung Kim }else{
408*aef9bcd9SKiyoung Kim /* Not enough space to copy.
409*aef9bcd9SKiyoung Kim * This will happen when the last encode process failed.
410*aef9bcd9SKiyoung Kim */
411*aef9bcd9SKiyoung Kim *pcm_used = 0;
412*aef9bcd9SKiyoung Kim }
413*aef9bcd9SKiyoung Kim
414*aef9bcd9SKiyoung Kim if( ppcmring->nsmpl >= hLdacBT->frm_samples )
415*aef9bcd9SKiyoung Kim {
416*aef9bcd9SKiyoung Kim flg_Do_Encode = 1;
417*aef9bcd9SKiyoung Kim }
418*aef9bcd9SKiyoung Kim }else{
419*aef9bcd9SKiyoung Kim if (hLdacBT->flg_encode_flushed != TRUE){
420*aef9bcd9SKiyoung Kim flg_Do_Encode = 1;
421*aef9bcd9SKiyoung Kim }
422*aef9bcd9SKiyoung Kim }
423*aef9bcd9SKiyoung Kim
424*aef9bcd9SKiyoung Kim if( !flg_Do_Encode ){
425*aef9bcd9SKiyoung Kim /* nothing to do */
426*aef9bcd9SKiyoung Kim return LDACBT_S_OK;
427*aef9bcd9SKiyoung Kim }
428*aef9bcd9SKiyoung Kim
429*aef9bcd9SKiyoung Kim /* update frame_length if needed */
430*aef9bcd9SKiyoung Kim if( (hLdacBT->tgt_eqmid != UNSET) && (hLdacBT->tgt_eqmid != hLdacBT->eqmid) ){
431*aef9bcd9SKiyoung Kim if( ptfbuf->nfrm_in == 0 ){
432*aef9bcd9SKiyoung Kim ldacBT_update_frmlen( hLdacBT, hLdacBT->tgt_frmlen );
433*aef9bcd9SKiyoung Kim hLdacBT->stat_alter_op = LDACBT_ALTER_OP__NON;
434*aef9bcd9SKiyoung Kim }
435*aef9bcd9SKiyoung Kim else if( hLdacBT->tgt_nfrm_in_pkt > hLdacBT->tx.nfrm_in_pkt ){
436*aef9bcd9SKiyoung Kim /* for better connectivity, apply ASAP */
437*aef9bcd9SKiyoung Kim if( !hLdacBT->stat_alter_op ){
438*aef9bcd9SKiyoung Kim nFrmToPkt = hLdacBT->tgt_nfrm_in_pkt - ptfbuf->nfrm_in;
439*aef9bcd9SKiyoung Kim if( nFrmToPkt > 0 ){
440*aef9bcd9SKiyoung Kim pCfg = ldacBT_get_config(LDACBT_EQMID_END, hLdacBT->tx.pkt_type);
441*aef9bcd9SKiyoung Kim if( pCfg != NULL ){
442*aef9bcd9SKiyoung Kim do{
443*aef9bcd9SKiyoung Kim frmlen_adj = (hLdacBT->tx.tx_size - ptfbuf->used) / nFrmToPkt;
444*aef9bcd9SKiyoung Kim if( frmlen_adj > hLdacBT->tgt_frmlen ) {
445*aef9bcd9SKiyoung Kim frmlen_adj = hLdacBT->tgt_frmlen;
446*aef9bcd9SKiyoung Kim }
447*aef9bcd9SKiyoung Kim frmlen_adj -= LDACBT_FRMHDRBYTES;
448*aef9bcd9SKiyoung Kim if( frmlen_adj >= pCfg->frmlen ){
449*aef9bcd9SKiyoung Kim if( ldacBT_update_frmlen( hLdacBT, frmlen_adj ) == LDACBT_S_OK ){
450*aef9bcd9SKiyoung Kim hLdacBT->stat_alter_op = LDACBT_ALTER_OP__ACTIVE;
451*aef9bcd9SKiyoung Kim break;
452*aef9bcd9SKiyoung Kim }
453*aef9bcd9SKiyoung Kim }
454*aef9bcd9SKiyoung Kim }while( --nFrmToPkt > 0 );
455*aef9bcd9SKiyoung Kim }
456*aef9bcd9SKiyoung Kim if( !hLdacBT->stat_alter_op ){
457*aef9bcd9SKiyoung Kim /* force to flash streams */
458*aef9bcd9SKiyoung Kim hLdacBT->stat_alter_op = LDACBT_ALTER_OP__FLASH;
459*aef9bcd9SKiyoung Kim }
460*aef9bcd9SKiyoung Kim }
461*aef9bcd9SKiyoung Kim }
462*aef9bcd9SKiyoung Kim }
463*aef9bcd9SKiyoung Kim else{
464*aef9bcd9SKiyoung Kim /* wait the condition ptfbuf->nfrm_in == 0 for apply new frame_length */
465*aef9bcd9SKiyoung Kim hLdacBT->stat_alter_op = LDACBT_ALTER_OP__STANDBY;
466*aef9bcd9SKiyoung Kim }
467*aef9bcd9SKiyoung Kim
468*aef9bcd9SKiyoung Kim }
469*aef9bcd9SKiyoung Kim else if( hLdacBT->tgt_frmlen != hLdacBT->frmlen ){
470*aef9bcd9SKiyoung Kim if( ptfbuf->nfrm_in == 0 ){
471*aef9bcd9SKiyoung Kim ldacBT_update_frmlen( hLdacBT, hLdacBT->tgt_frmlen );
472*aef9bcd9SKiyoung Kim hLdacBT->stat_alter_op = LDACBT_ALTER_OP__NON;
473*aef9bcd9SKiyoung Kim }else{
474*aef9bcd9SKiyoung Kim if( hLdacBT->tgt_nfrm_in_pkt == hLdacBT->tx.nfrm_in_pkt ){
475*aef9bcd9SKiyoung Kim ldacBT_update_frmlen( hLdacBT, hLdacBT->tgt_frmlen );
476*aef9bcd9SKiyoung Kim hLdacBT->stat_alter_op = LDACBT_ALTER_OP__NON;
477*aef9bcd9SKiyoung Kim }else{
478*aef9bcd9SKiyoung Kim if( hLdacBT->tgt_nfrm_in_pkt > hLdacBT->tx.nfrm_in_pkt ){
479*aef9bcd9SKiyoung Kim /* for better connectivity, apply ASAP */
480*aef9bcd9SKiyoung Kim if( !hLdacBT->stat_alter_op ){
481*aef9bcd9SKiyoung Kim nFrmToPkt = hLdacBT->tgt_nfrm_in_pkt - ptfbuf->nfrm_in;
482*aef9bcd9SKiyoung Kim if( nFrmToPkt > 0 ){
483*aef9bcd9SKiyoung Kim frmlen_adj = (hLdacBT->tx.tx_size - ptfbuf->used) / nFrmToPkt;
484*aef9bcd9SKiyoung Kim if( frmlen_adj > hLdacBT->tgt_frmlen ) {
485*aef9bcd9SKiyoung Kim frmlen_adj = hLdacBT->tgt_frmlen;
486*aef9bcd9SKiyoung Kim }
487*aef9bcd9SKiyoung Kim if( ldacBT_update_frmlen( hLdacBT, frmlen_adj ) == LDACBT_S_OK ){
488*aef9bcd9SKiyoung Kim hLdacBT->stat_alter_op = LDACBT_ALTER_OP__ACTIVE;
489*aef9bcd9SKiyoung Kim }
490*aef9bcd9SKiyoung Kim if( !hLdacBT->stat_alter_op ){
491*aef9bcd9SKiyoung Kim /* flash streams */
492*aef9bcd9SKiyoung Kim hLdacBT->stat_alter_op = LDACBT_ALTER_OP__FLASH;
493*aef9bcd9SKiyoung Kim }
494*aef9bcd9SKiyoung Kim }
495*aef9bcd9SKiyoung Kim }
496*aef9bcd9SKiyoung Kim }else{
497*aef9bcd9SKiyoung Kim /* wait the condition ptfbuf->nfrm_in == 0 for apply new frame_length */
498*aef9bcd9SKiyoung Kim hLdacBT->stat_alter_op = LDACBT_ALTER_OP__STANDBY;
499*aef9bcd9SKiyoung Kim }
500*aef9bcd9SKiyoung Kim }
501*aef9bcd9SKiyoung Kim }
502*aef9bcd9SKiyoung Kim }
503*aef9bcd9SKiyoung Kim
504*aef9bcd9SKiyoung Kim /* check write space for encoded data */
505*aef9bcd9SKiyoung Kim ldaclib_get_encode_frame_length( hLdacBT->hLDAC, &frmlen );
506*aef9bcd9SKiyoung Kim
507*aef9bcd9SKiyoung Kim if( (( ptfbuf->used + frmlen + LDACBT_FRMHDRBYTES) > hLdacBT->tx.tx_size) ||
508*aef9bcd9SKiyoung Kim (hLdacBT->stat_alter_op == LDACBT_ALTER_OP__FLASH) || /* need to flash streams? */
509*aef9bcd9SKiyoung Kim (( ptfbuf->used + frmlen + LDACBT_FRMHDRBYTES) >= LDACBT_ENC_STREAM_BUF_SZ )
510*aef9bcd9SKiyoung Kim )
511*aef9bcd9SKiyoung Kim {
512*aef9bcd9SKiyoung Kim copy_data_ldac( ptfbuf->buf, p_stream, ptfbuf->used );
513*aef9bcd9SKiyoung Kim *stream_sz = ptfbuf->used;
514*aef9bcd9SKiyoung Kim *frame_num = ptfbuf->nfrm_in;
515*aef9bcd9SKiyoung Kim clear_data_ldac( ptfbuf->buf, sizeof(char)*LDACBT_ENC_STREAM_BUF_SZ);
516*aef9bcd9SKiyoung Kim ptfbuf->used = 0;
517*aef9bcd9SKiyoung Kim ptfbuf->nfrm_in = 0;
518*aef9bcd9SKiyoung Kim if( hLdacBT->stat_alter_op != LDACBT_ALTER_OP__NON ){
519*aef9bcd9SKiyoung Kim /* update frame length */
520*aef9bcd9SKiyoung Kim ldacBT_update_frmlen( hLdacBT, hLdacBT->tgt_frmlen );
521*aef9bcd9SKiyoung Kim hLdacBT->stat_alter_op = LDACBT_ALTER_OP__NON;
522*aef9bcd9SKiyoung Kim }
523*aef9bcd9SKiyoung Kim }
524*aef9bcd9SKiyoung Kim p_ldac_transport_frame = ptfbuf->buf + ptfbuf->used;
525*aef9bcd9SKiyoung Kim
526*aef9bcd9SKiyoung Kim /* Encode Frame */
527*aef9bcd9SKiyoung Kim if( ppcmring->nsmpl > 0 ){
528*aef9bcd9SKiyoung Kim char *p_pcm_ring_r;
529*aef9bcd9SKiyoung Kim int nsmpl_to_clr;
530*aef9bcd9SKiyoung Kim nsmpl_to_clr = hLdacBT->frm_samples - ppcmring->nsmpl;
531*aef9bcd9SKiyoung Kim if( nsmpl_to_clr > 0 ){
532*aef9bcd9SKiyoung Kim int pos, nBytesToZero;
533*aef9bcd9SKiyoung Kim pos = ppcmring->rp + ppcmring->nsmpl * wl * ch;
534*aef9bcd9SKiyoung Kim nBytesToZero = nsmpl_to_clr * wl * ch;
535*aef9bcd9SKiyoung Kim while( nBytesToZero > 0 ){
536*aef9bcd9SKiyoung Kim int clearBytes;
537*aef9bcd9SKiyoung Kim clearBytes = nBytesToZero;
538*aef9bcd9SKiyoung Kim if ( pos + clearBytes >= LDACBT_ENC_PCM_BUF_SZ ){
539*aef9bcd9SKiyoung Kim clearBytes = (LDACBT_ENC_PCM_BUF_SZ - pos);
540*aef9bcd9SKiyoung Kim }
541*aef9bcd9SKiyoung Kim clear_data_ldac( ppcmring->buf + pos, clearBytes);
542*aef9bcd9SKiyoung Kim nBytesToZero -= clearBytes;
543*aef9bcd9SKiyoung Kim if( (pos += clearBytes) >= LDACBT_ENC_PCM_BUF_SZ ){
544*aef9bcd9SKiyoung Kim pos = 0;
545*aef9bcd9SKiyoung Kim }
546*aef9bcd9SKiyoung Kim }
547*aef9bcd9SKiyoung Kim }
548*aef9bcd9SKiyoung Kim p_pcm_ring_r = ppcmring->buf + ppcmring->rp;
549*aef9bcd9SKiyoung Kim ldacBT_prepare_pcm_encode( p_pcm_ring_r, hLdacBT->pp_pcm, hLdacBT->frm_samples, ch, fmt );
550*aef9bcd9SKiyoung Kim result = ldaclib_encode(hLdacBT->hLDAC, hLdacBT->pp_pcm, (LDAC_SMPL_FMT_T)fmt,
551*aef9bcd9SKiyoung Kim p_ldac_transport_frame+LDACBT_FRMHDRBYTES, &frmlen_wrote);
552*aef9bcd9SKiyoung Kim if( !LDAC_FAILED(result) ){
553*aef9bcd9SKiyoung Kim ppcmring->rp += hLdacBT->frm_samples * wl * ch;
554*aef9bcd9SKiyoung Kim ppcmring->nsmpl -= hLdacBT->frm_samples;
555*aef9bcd9SKiyoung Kim if( ppcmring->rp >= LDACBT_ENC_PCM_BUF_SZ ){ ppcmring->rp = 0; }
556*aef9bcd9SKiyoung Kim if( ppcmring->nsmpl < 0 ){ ppcmring->nsmpl = 0; }
557*aef9bcd9SKiyoung Kim }
558*aef9bcd9SKiyoung Kim }else{
559*aef9bcd9SKiyoung Kim result = ldaclib_flush_encode(hLdacBT->hLDAC, (LDAC_SMPL_FMT_T)fmt,
560*aef9bcd9SKiyoung Kim p_ldac_transport_frame+LDACBT_FRMHDRBYTES, &frmlen_wrote);
561*aef9bcd9SKiyoung Kim hLdacBT->flg_encode_flushed = TRUE;
562*aef9bcd9SKiyoung Kim }
563*aef9bcd9SKiyoung Kim
564*aef9bcd9SKiyoung Kim if( LDAC_FAILED(result) ){
565*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE;
566*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
567*aef9bcd9SKiyoung Kim }
568*aef9bcd9SKiyoung Kim else if( result != LDAC_S_OK ){
569*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE;
570*aef9bcd9SKiyoung Kim }
571*aef9bcd9SKiyoung Kim
572*aef9bcd9SKiyoung Kim if( frmlen_wrote > 0 ){
573*aef9bcd9SKiyoung Kim if( hLdacBT->transport == TRUE ){
574*aef9bcd9SKiyoung Kim /* Set Frame Header Data */
575*aef9bcd9SKiyoung Kim clear_data_ldac( a_frm_header, LDACBT_FRMHDRBYTES+2 );
576*aef9bcd9SKiyoung Kim /* Get Frame Header Information */
577*aef9bcd9SKiyoung Kim result = ldaclib_get_config_info(hLdacBT->hLDAC, &hLdacBT->sfid, &hLdacBT->cci,
578*aef9bcd9SKiyoung Kim &frmlen, &frm_status);
579*aef9bcd9SKiyoung Kim if( LDAC_FAILED(result) ){
580*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE;
581*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
582*aef9bcd9SKiyoung Kim }
583*aef9bcd9SKiyoung Kim else if (result != LDAC_S_OK) {
584*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE;
585*aef9bcd9SKiyoung Kim }
586*aef9bcd9SKiyoung Kim
587*aef9bcd9SKiyoung Kim /* Set Frame Header */
588*aef9bcd9SKiyoung Kim result = ldaclib_set_frame_header(hLdacBT->hLDAC, a_frm_header, hLdacBT->sfid,
589*aef9bcd9SKiyoung Kim hLdacBT->cci, frmlen, frm_status);
590*aef9bcd9SKiyoung Kim if( LDAC_FAILED(result) ){
591*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE;
592*aef9bcd9SKiyoung Kim return LDACBT_E_FAIL;
593*aef9bcd9SKiyoung Kim }
594*aef9bcd9SKiyoung Kim else if (result != LDAC_S_OK) {
595*aef9bcd9SKiyoung Kim hLdacBT->error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE;
596*aef9bcd9SKiyoung Kim }
597*aef9bcd9SKiyoung Kim copy_data_ldac( a_frm_header, p_ldac_transport_frame, LDACBT_FRMHDRBYTES );
598*aef9bcd9SKiyoung Kim frmlen_wrote += LDACBT_FRMHDRBYTES;
599*aef9bcd9SKiyoung Kim }
600*aef9bcd9SKiyoung Kim ptfbuf->used += frmlen_wrote;
601*aef9bcd9SKiyoung Kim ptfbuf->nfrm_in ++;
602*aef9bcd9SKiyoung Kim }
603*aef9bcd9SKiyoung Kim
604*aef9bcd9SKiyoung Kim /* check for next frame buffer status */
605*aef9bcd9SKiyoung Kim if( *stream_sz == 0 ){
606*aef9bcd9SKiyoung Kim if( (( ptfbuf->used + frmlen_wrote) > hLdacBT->tx.tx_size) ||
607*aef9bcd9SKiyoung Kim ( ptfbuf->nfrm_in >= LDACBT_NFRM_TX_MAX ) ||
608*aef9bcd9SKiyoung Kim (( ptfbuf->used + frmlen_wrote) >= LDACBT_ENC_STREAM_BUF_SZ ) ||
609*aef9bcd9SKiyoung Kim ( p_pcm == NULL ) /* flush encode */
610*aef9bcd9SKiyoung Kim )
611*aef9bcd9SKiyoung Kim {
612*aef9bcd9SKiyoung Kim copy_data_ldac( ptfbuf->buf, p_stream, ptfbuf->used );
613*aef9bcd9SKiyoung Kim *stream_sz = ptfbuf->used;
614*aef9bcd9SKiyoung Kim *frame_num = ptfbuf->nfrm_in;
615*aef9bcd9SKiyoung Kim clear_data_ldac( ptfbuf->buf, sizeof(char)*LDACBT_ENC_STREAM_BUF_SZ);
616*aef9bcd9SKiyoung Kim ptfbuf->used = 0;
617*aef9bcd9SKiyoung Kim ptfbuf->nfrm_in = 0;
618*aef9bcd9SKiyoung Kim if( hLdacBT->stat_alter_op != LDACBT_ALTER_OP__NON ){
619*aef9bcd9SKiyoung Kim ldacBT_update_frmlen( hLdacBT, hLdacBT->tgt_frmlen );
620*aef9bcd9SKiyoung Kim hLdacBT->stat_alter_op = LDACBT_ALTER_OP__NON;
621*aef9bcd9SKiyoung Kim }
622*aef9bcd9SKiyoung Kim }
623*aef9bcd9SKiyoung Kim }
624*aef9bcd9SKiyoung Kim
625*aef9bcd9SKiyoung Kim return LDACBT_S_OK;
626*aef9bcd9SKiyoung Kim }
627