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