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