xref: /aosp_15_r20/external/libldac/src/ldacBT_internal.h (revision aef9bcd9217ad2365ebc8e70efaf94b64e04df14)
1*aef9bcd9SKiyoung Kim /*
2*aef9bcd9SKiyoung Kim  * Copyright (C) 2013 - 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 #ifndef _LDACBT_INTERNAL_H_
18*aef9bcd9SKiyoung Kim #define _LDACBT_INTERNAL_H_
19*aef9bcd9SKiyoung Kim 
20*aef9bcd9SKiyoung Kim #include <stdlib.h>
21*aef9bcd9SKiyoung Kim #include <string.h>
22*aef9bcd9SKiyoung Kim #include <stdint.h>
23*aef9bcd9SKiyoung Kim #include <unistd.h>
24*aef9bcd9SKiyoung Kim #include "struct_ldac.h"
25*aef9bcd9SKiyoung Kim 
26*aef9bcd9SKiyoung Kim #ifdef    __cplusplus
27*aef9bcd9SKiyoung Kim extern "C" {
28*aef9bcd9SKiyoung Kim #endif
29*aef9bcd9SKiyoung Kim 
30*aef9bcd9SKiyoung Kim /* Function declaration */
31*aef9bcd9SKiyoung Kim #define DECLFUNC static
32*aef9bcd9SKiyoung Kim 
33*aef9bcd9SKiyoung Kim /* Limit for alter EQMID process */
34*aef9bcd9SKiyoung Kim #define LDACBT_LIMIT_ALTER_EQMID_PRIORITY LDACBT_EQMID_MQ
35*aef9bcd9SKiyoung Kim 
36*aef9bcd9SKiyoung Kim 
37*aef9bcd9SKiyoung Kim #include "ldaclib.h"
38*aef9bcd9SKiyoung Kim #include "ldacBT.h"
39*aef9bcd9SKiyoung Kim #include "ldacBT_ex.h"
40*aef9bcd9SKiyoung Kim 
41*aef9bcd9SKiyoung Kim /* macro value */
42*aef9bcd9SKiyoung Kim /* The size of LDAC transport header. Unit:Byte. */
43*aef9bcd9SKiyoung Kim #define LDACBT_FRMHDRBYTES LDAC_FRMHDRBYTES
44*aef9bcd9SKiyoung Kim /* The Maximum number of frames that can transrate in one packet.(LDAC A2DP spec) */
45*aef9bcd9SKiyoung Kim #define LDACBT_NFRM_TX_MAX 15
46*aef9bcd9SKiyoung Kim /* Lowest Common Multiple of (2,3,4)Bytes * 2ch * 256samples */
47*aef9bcd9SKiyoung Kim #define LDACBT_ENC_PCM_BUF_SZ 6144
48*aef9bcd9SKiyoung Kim /* The maximum pcm word length allowed. Unit:Byte */
49*aef9bcd9SKiyoung Kim #define LDACBT_PCM_WLEN_MAX 4
50*aef9bcd9SKiyoung Kim /* The size of LDACBT_TRANSPORT_FRM_BUF's buffer. Unit:Byte  */
51*aef9bcd9SKiyoung Kim #define LDACBT_ENC_STREAM_BUF_SZ 1024
52*aef9bcd9SKiyoung Kim /* The size of rtp header and so on. Unit:Byte */
53*aef9bcd9SKiyoung Kim /*  = sizeof(struct rtp_header) + sizeof(struct rtp_payload) + 1 (scms-t). */
54*aef9bcd9SKiyoung Kim #define LDACBT_TX_HEADER_SIZE 18
55*aef9bcd9SKiyoung Kim /* The MTU size required for LDAC A2DP streaming. */
56*aef9bcd9SKiyoung Kim #define LDACBT_MTU_REQUIRED  679
57*aef9bcd9SKiyoung Kim #define LDACBT_MTU_3DH5 (990+LDACBT_TX_HEADER_SIZE)
58*aef9bcd9SKiyoung Kim 
59*aef9bcd9SKiyoung Kim /* The state for alter operation */
60*aef9bcd9SKiyoung Kim #define LDACBT_ALTER_OP__NON 0
61*aef9bcd9SKiyoung Kim #define LDACBT_ALTER_OP__ACTIVE 1
62*aef9bcd9SKiyoung Kim #define LDACBT_ALTER_OP__STANDBY 2
63*aef9bcd9SKiyoung Kim #define LDACBT_ALTER_OP__FLASH 9
64*aef9bcd9SKiyoung Kim 
65*aef9bcd9SKiyoung Kim /* other */
66*aef9bcd9SKiyoung Kim #ifndef LDACBT_S_OK
67*aef9bcd9SKiyoung Kim #define LDACBT_S_OK (0)
68*aef9bcd9SKiyoung Kim #endif
69*aef9bcd9SKiyoung Kim #ifndef LDACBT_E_FAIL
70*aef9bcd9SKiyoung Kim #define LDACBT_E_FAIL (-1)
71*aef9bcd9SKiyoung Kim #endif
72*aef9bcd9SKiyoung Kim #ifndef FALSE
73*aef9bcd9SKiyoung Kim #define FALSE  0
74*aef9bcd9SKiyoung Kim #endif
75*aef9bcd9SKiyoung Kim #ifndef TRUE
76*aef9bcd9SKiyoung Kim #define TRUE   1
77*aef9bcd9SKiyoung Kim #endif
78*aef9bcd9SKiyoung Kim #ifndef UNSET
79*aef9bcd9SKiyoung Kim #define UNSET -1
80*aef9bcd9SKiyoung Kim #endif
81*aef9bcd9SKiyoung Kim #define LDACBT_GET_LDACLIB_ERROR_CODE   9999
82*aef9bcd9SKiyoung Kim 
83*aef9bcd9SKiyoung Kim /* The index for A2DP packets */
84*aef9bcd9SKiyoung Kim enum {
85*aef9bcd9SKiyoung Kim     ___DH1,    ___DH3,    ___DH5, /* basic rate */
86*aef9bcd9SKiyoung Kim     _2_DH1,    _2_DH3,    _2_DH5, /* EDR2M */
87*aef9bcd9SKiyoung Kim     _3_DH1,    _3_DH3,    _3_DH5, /* EDR3M */
88*aef9bcd9SKiyoung Kim };
89*aef9bcd9SKiyoung Kim 
90*aef9bcd9SKiyoung Kim /* The state for LDACBT handle processing mode. */
91*aef9bcd9SKiyoung Kim typedef enum {
92*aef9bcd9SKiyoung Kim     LDACBT_PROCMODE_UNSET = -1,
93*aef9bcd9SKiyoung Kim     LDACBT_PROCMODE_ENCODE = 1,
94*aef9bcd9SKiyoung Kim     LDACBT_PROCMODE_DECODE = 2,
95*aef9bcd9SKiyoung Kim } LDACBT_PROCMODE;
96*aef9bcd9SKiyoung Kim 
97*aef9bcd9SKiyoung Kim /* Structs */
98*aef9bcd9SKiyoung Kim /* The structure for the property of EQMID. */
99*aef9bcd9SKiyoung Kim typedef struct _st_ldacbt_eqmid_property
100*aef9bcd9SKiyoung Kim {
101*aef9bcd9SKiyoung Kim     int  eqmid;
102*aef9bcd9SKiyoung Kim     char strModeName[4];
103*aef9bcd9SKiyoung Kim     int  id_for_2DH5;
104*aef9bcd9SKiyoung Kim } LDACBT_EQMID_PROPERTY, * P_LDACBT_EQMID_PROPERTY;
105*aef9bcd9SKiyoung Kim 
106*aef9bcd9SKiyoung Kim /* The structure for the configuration of LDAC. */
107*aef9bcd9SKiyoung Kim typedef struct _st_ldacbt_config
108*aef9bcd9SKiyoung Kim {
109*aef9bcd9SKiyoung Kim     int id;
110*aef9bcd9SKiyoung Kim     int nfrm_in_pkt; /* number of ldac frame in packet */
111*aef9bcd9SKiyoung Kim     int frmlen;      /* ldac frame length */
112*aef9bcd9SKiyoung Kim     int frmlen_1ch;  /* ldac frame length per channel */
113*aef9bcd9SKiyoung Kim } LDACBT_CONFIG, * P_LDACBT_CONFIG;
114*aef9bcd9SKiyoung Kim 
115*aef9bcd9SKiyoung Kim /* The structure for the pcm information. */
116*aef9bcd9SKiyoung Kim typedef struct _ldacbt_pcm_info {
117*aef9bcd9SKiyoung Kim     int sf; /* sampling frequency */
118*aef9bcd9SKiyoung Kim     int ch; /* number of channel */
119*aef9bcd9SKiyoung Kim     int wl;
120*aef9bcd9SKiyoung Kim     LDACBT_SMPL_FMT_T fmt; /* sample format */
121*aef9bcd9SKiyoung Kim } LDACBT_PCM_INFO;
122*aef9bcd9SKiyoung Kim 
123*aef9bcd9SKiyoung Kim /* The structure for the A2DP streaming. */
124*aef9bcd9SKiyoung Kim typedef struct _ldacbt_tx_info {
125*aef9bcd9SKiyoung Kim     int mtu;
126*aef9bcd9SKiyoung Kim     int tx_size;     /* size for ldac stream */
127*aef9bcd9SKiyoung Kim     int pkt_type;    /* packet type */
128*aef9bcd9SKiyoung Kim     int pkt_hdr_sz;  /* packet header size */
129*aef9bcd9SKiyoung Kim     int nfrm_in_pkt; /* number of ldac frame in packet */
130*aef9bcd9SKiyoung Kim } LDACBT_TX_INFO;
131*aef9bcd9SKiyoung Kim /* The structure for the ldac_transport_frame sequence. */
132*aef9bcd9SKiyoung Kim typedef struct _ldacbt_transport_frame_buf {
133*aef9bcd9SKiyoung Kim     unsigned char buf[LDACBT_ENC_STREAM_BUF_SZ];
134*aef9bcd9SKiyoung Kim     int used;
135*aef9bcd9SKiyoung Kim     int nfrm_in;
136*aef9bcd9SKiyoung Kim } LDACBT_TRANSPORT_FRM_BUF;
137*aef9bcd9SKiyoung Kim /* The structure of ring buffer for the input PCM. */
138*aef9bcd9SKiyoung Kim typedef struct _ldacbt_pcm_ring_buf {
139*aef9bcd9SKiyoung Kim     char buf[LDACBT_ENC_PCM_BUF_SZ];
140*aef9bcd9SKiyoung Kim     int wp;
141*aef9bcd9SKiyoung Kim     int rp;
142*aef9bcd9SKiyoung Kim     int nsmpl;
143*aef9bcd9SKiyoung Kim } LDACBT_PCM_RING_BUF;
144*aef9bcd9SKiyoung Kim 
145*aef9bcd9SKiyoung Kim /* The LDACBT handle. */
146*aef9bcd9SKiyoung Kim typedef struct _st_ldacbt_handle {
147*aef9bcd9SKiyoung Kim     HANDLE_LDAC hLDAC;
148*aef9bcd9SKiyoung Kim     LDACBT_PROCMODE proc_mode;
149*aef9bcd9SKiyoung Kim     int error_code;
150*aef9bcd9SKiyoung Kim     int error_code_api;
151*aef9bcd9SKiyoung Kim /* common */
152*aef9bcd9SKiyoung Kim     /* pcm */
153*aef9bcd9SKiyoung Kim     LDACBT_PCM_INFO    pcm;
154*aef9bcd9SKiyoung Kim     /* tx */
155*aef9bcd9SKiyoung Kim     LDACBT_TX_INFO     tx;
156*aef9bcd9SKiyoung Kim     /* ldaclib config */
157*aef9bcd9SKiyoung Kim     int frm_samples;  /* frame samples */
158*aef9bcd9SKiyoung Kim     int sfid;         /* sampling frequency index */
159*aef9bcd9SKiyoung Kim     int nshift;
160*aef9bcd9SKiyoung Kim     int flg_encode_flushed;
161*aef9bcd9SKiyoung Kim     int frm_status;
162*aef9bcd9SKiyoung Kim     int frmlen;    /* Frame Length */
163*aef9bcd9SKiyoung Kim     int frmlen_tx; /* Frame Length with transport header */
164*aef9bcd9SKiyoung Kim     int bitrate;
165*aef9bcd9SKiyoung Kim 
166*aef9bcd9SKiyoung Kim     int eqmid;     /* Encode Quality Mode Index */
167*aef9bcd9SKiyoung Kim     /* for alter frame length */
168*aef9bcd9SKiyoung Kim     int tgt_eqmid;      /* target Encode Quality Mode Index */
169*aef9bcd9SKiyoung Kim     int tgt_nfrm_in_pkt;/* target number of frame in packet */
170*aef9bcd9SKiyoung Kim     int tgt_frmlen;     /* target frame length */
171*aef9bcd9SKiyoung Kim     int stat_alter_op;  /* status of alter operation */
172*aef9bcd9SKiyoung Kim 
173*aef9bcd9SKiyoung Kim     int cm; /* Channel Mode */
174*aef9bcd9SKiyoung Kim     int cci; /* Channel Config Index */
175*aef9bcd9SKiyoung Kim     int transport;   /* Transport Stream ( with frame header) */
176*aef9bcd9SKiyoung Kim     /* buffer for "ldac_transport_frame" sequence */
177*aef9bcd9SKiyoung Kim     LDACBT_TRANSPORT_FRM_BUF ldac_trns_frm_buf;
178*aef9bcd9SKiyoung Kim     /* buffer for input pcm */
179*aef9bcd9SKiyoung Kim     LDACBT_PCM_RING_BUF pcmring;
180*aef9bcd9SKiyoung Kim 
181*aef9bcd9SKiyoung Kim /* work buffer for LDACLIB I/O */
182*aef9bcd9SKiyoung Kim     char **pp_pcm;
183*aef9bcd9SKiyoung Kim     char *ap_pcm[LDAC_PRCNCH];
184*aef9bcd9SKiyoung Kim     char a_pcm[LDAC_PRCNCH * LDACBT_MAX_LSU * LDACBT_PCM_WLEN_MAX];
185*aef9bcd9SKiyoung Kim } STRUCT_LDACBT_HANDLE;
186*aef9bcd9SKiyoung Kim 
187*aef9bcd9SKiyoung Kim 
188*aef9bcd9SKiyoung Kim 
189*aef9bcd9SKiyoung Kim /* subfunctions */
190*aef9bcd9SKiyoung Kim DECLFUNC void ldacBT_param_clear(HANDLE_LDAC_BT hLdacBT);
191*aef9bcd9SKiyoung Kim DECLFUNC int  ldacBT_check_ldaclib_error_code(HANDLE_LDAC_BT hLdacBT);
192*aef9bcd9SKiyoung Kim DECLFUNC int  ldacBT_assert_cm( int cm );
193*aef9bcd9SKiyoung Kim DECLFUNC int  ldacBT_assert_cci( int cci );
194*aef9bcd9SKiyoung Kim DECLFUNC int  ldacBT_assert_sample_format( LDACBT_SMPL_FMT_T fmt );
195*aef9bcd9SKiyoung Kim DECLFUNC int  ldacBT_assert_pcm_sampling_freq( int sf );
196*aef9bcd9SKiyoung Kim DECLFUNC int  ldacBT_assert_mtu( int mtu );
197*aef9bcd9SKiyoung Kim DECLFUNC int  ldacBT_assert_eqmid( int eqmid );
198*aef9bcd9SKiyoung Kim DECLFUNC void ldacBT_set_eqmid_core( HANDLE_LDAC_BT hLdacBT, int eqmid );
199*aef9bcd9SKiyoung Kim DECLFUNC void ldacBT_prepare_pcm_encode( void *pbuff, char **ap_pcm, int nsmpl, int nch,
200*aef9bcd9SKiyoung Kim                      LDACBT_SMPL_FMT_T fmt );
201*aef9bcd9SKiyoung Kim DECLFUNC int  ldacBT_frmlen_to_bitrate( int frmlen, int flgFrmHdr, int sf, int frame_samples );
202*aef9bcd9SKiyoung Kim DECLFUNC int  ldacBT_cm_to_cci( int cm );
203*aef9bcd9SKiyoung Kim DECLFUNC int  ldacBT_cci_to_cm( int cci );
204*aef9bcd9SKiyoung Kim DECLFUNC int  ldacBT_get_altered_eqmid ( HANDLE_LDAC_BT hLdacBT, int priority );
205*aef9bcd9SKiyoung Kim DECLFUNC int  ldacBT_get_eqmid_from_frmlen( int frmlen, int nch, int flgFrmHdr, int pktType );
206*aef9bcd9SKiyoung Kim DECLFUNC int  ldacBT_update_frmlen(HANDLE_LDAC_BT hLdacBT, int frmlen);
207*aef9bcd9SKiyoung Kim DECLFUNC P_LDACBT_EQMID_PROPERTY ldacBT_get_eqmid_conv_tbl ( int ldac_bt_mode );
208*aef9bcd9SKiyoung Kim DECLFUNC P_LDACBT_CONFIG ldacBT_get_config( int ldac_bt_mode, int pkt_type );
209*aef9bcd9SKiyoung Kim 
210*aef9bcd9SKiyoung Kim #ifdef    __cplusplus
211*aef9bcd9SKiyoung Kim }
212*aef9bcd9SKiyoung Kim #endif
213*aef9bcd9SKiyoung Kim #endif /* _LDACBT_INTERNAL_H_ */
214