/*
* Copyright (C) 2013 - 2016 Sony Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _LDACBT_INTERNAL_H_
#define _LDACBT_INTERNAL_H_
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>
#include "struct_ldac.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Function declaration */
#define DECLFUNC static
/* Limit for alter EQMID process */
#define LDACBT_LIMIT_ALTER_EQMID_PRIORITY LDACBT_EQMID_MQ
#include "ldaclib.h"
#include "ldacBT.h"
#include "ldacBT_ex.h"
/* macro value */
/* The size of LDAC transport header. Unit:Byte. */
#define LDACBT_FRMHDRBYTES LDAC_FRMHDRBYTES
/* The Maximum number of frames that can transrate in one packet.(LDAC A2DP spec) */
#define LDACBT_NFRM_TX_MAX 15
/* Lowest Common Multiple of (2,3,4)Bytes * 2ch * 256samples */
#define LDACBT_ENC_PCM_BUF_SZ 6144
/* The maximum pcm word length allowed. Unit:Byte */
#define LDACBT_PCM_WLEN_MAX 4
/* The size of LDACBT_TRANSPORT_FRM_BUF's buffer. Unit:Byte */
#define LDACBT_ENC_STREAM_BUF_SZ 1024
/* The size of rtp header and so on. Unit:Byte */
/* = sizeof(struct rtp_header) + sizeof(struct rtp_payload) + 1 (scms-t). */
#define LDACBT_TX_HEADER_SIZE 18
/* The MTU size required for LDAC A2DP streaming. */
#define LDACBT_MTU_REQUIRED 679
#define LDACBT_MTU_3DH5 (990+LDACBT_TX_HEADER_SIZE)
/* The state for alter operation */
#define LDACBT_ALTER_OP__NON 0
#define LDACBT_ALTER_OP__ACTIVE 1
#define LDACBT_ALTER_OP__STANDBY 2
#define LDACBT_ALTER_OP__FLASH 9
/* other */
#ifndef LDACBT_S_OK
#define LDACBT_S_OK (0)
#endif
#ifndef LDACBT_E_FAIL
#define LDACBT_E_FAIL (-1)
#endif
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef UNSET
#define UNSET -1
#endif
#define LDACBT_GET_LDACLIB_ERROR_CODE 9999
/* The index for A2DP packets */
enum {
___DH1, ___DH3, ___DH5, /* basic rate */
_2_DH1, _2_DH3, _2_DH5, /* EDR2M */
_3_DH1, _3_DH3, _3_DH5, /* EDR3M */
};
/* The state for LDACBT handle processing mode. */
typedef enum {
LDACBT_PROCMODE_UNSET = -1,
LDACBT_PROCMODE_ENCODE = 1,
LDACBT_PROCMODE_DECODE = 2,
} LDACBT_PROCMODE;
/* Structs */
/* The structure for the property of EQMID. */
typedef struct _st_ldacbt_eqmid_property
{
int eqmid;
char strModeName[4];
int id_for_2DH5;
} LDACBT_EQMID_PROPERTY, * P_LDACBT_EQMID_PROPERTY;
/* The structure for the configuration of LDAC. */
typedef struct _st_ldacbt_config
{
int id;
int nfrm_in_pkt; /* number of ldac frame in packet */
int frmlen; /* ldac frame length */
int frmlen_1ch; /* ldac frame length per channel */
} LDACBT_CONFIG, * P_LDACBT_CONFIG;
/* The structure for the pcm information. */
typedef struct _ldacbt_pcm_info {
int sf; /* sampling frequency */
int ch; /* number of channel */
int wl;
LDACBT_SMPL_FMT_T fmt; /* sample format */
} LDACBT_PCM_INFO;
/* The structure for the A2DP streaming. */
typedef struct _ldacbt_tx_info {
int mtu;
int tx_size; /* size for ldac stream */
int pkt_type; /* packet type */
int pkt_hdr_sz; /* packet header size */
int nfrm_in_pkt; /* number of ldac frame in packet */
} LDACBT_TX_INFO;
/* The structure for the ldac_transport_frame sequence. */
typedef struct _ldacbt_transport_frame_buf {
unsigned char buf[LDACBT_ENC_STREAM_BUF_SZ];
int used;
int nfrm_in;
} LDACBT_TRANSPORT_FRM_BUF;
/* The structure of ring buffer for the input PCM. */
typedef struct _ldacbt_pcm_ring_buf {
char buf[LDACBT_ENC_PCM_BUF_SZ];
int wp;
int rp;
int nsmpl;
} LDACBT_PCM_RING_BUF;
/* The LDACBT handle. */
typedef struct _st_ldacbt_handle {
HANDLE_LDAC hLDAC;
LDACBT_PROCMODE proc_mode;
int error_code;
int error_code_api;
/* common */
/* pcm */
LDACBT_PCM_INFO pcm;
/* tx */
LDACBT_TX_INFO tx;
/* ldaclib config */
int frm_samples; /* frame samples */
int sfid; /* sampling frequency index */
int nshift;
int flg_encode_flushed;
int frm_status;
int frmlen; /* Frame Length */
int frmlen_tx; /* Frame Length with transport header */
int bitrate;
int eqmid; /* Encode Quality Mode Index */
/* for alter frame length */
int tgt_eqmid; /* target Encode Quality Mode Index */
int tgt_nfrm_in_pkt;/* target number of frame in packet */
int tgt_frmlen; /* target frame length */
int stat_alter_op; /* status of alter operation */
int cm; /* Channel Mode */
int cci; /* Channel Config Index */
int transport; /* Transport Stream ( with frame header) */
/* buffer for "ldac_transport_frame" sequence */
LDACBT_TRANSPORT_FRM_BUF ldac_trns_frm_buf;
/* buffer for input pcm */
LDACBT_PCM_RING_BUF pcmring;
/* work buffer for LDACLIB I/O */
char **pp_pcm;
char *ap_pcm[LDAC_PRCNCH];
char a_pcm[LDAC_PRCNCH * LDACBT_MAX_LSU * LDACBT_PCM_WLEN_MAX];
} STRUCT_LDACBT_HANDLE;
/* subfunctions */
DECLFUNC void ldacBT_param_clear(HANDLE_LDAC_BT hLdacBT);
DECLFUNC int ldacBT_check_ldaclib_error_code(HANDLE_LDAC_BT hLdacBT);
DECLFUNC int ldacBT_assert_cm( int cm );
DECLFUNC int ldacBT_assert_cci( int cci );
DECLFUNC int ldacBT_assert_sample_format( LDACBT_SMPL_FMT_T fmt );
DECLFUNC int ldacBT_assert_pcm_sampling_freq( int sf );
DECLFUNC int ldacBT_assert_mtu( int mtu );
DECLFUNC int ldacBT_assert_eqmid( int eqmid );
DECLFUNC void ldacBT_set_eqmid_core( HANDLE_LDAC_BT hLdacBT, int eqmid );
DECLFUNC void ldacBT_prepare_pcm_encode( void *pbuff, char **ap_pcm, int nsmpl, int nch,
LDACBT_SMPL_FMT_T fmt );
DECLFUNC int ldacBT_frmlen_to_bitrate( int frmlen, int flgFrmHdr, int sf, int frame_samples );
DECLFUNC int ldacBT_cm_to_cci( int cm );
DECLFUNC int ldacBT_cci_to_cm( int cci );
DECLFUNC int ldacBT_get_altered_eqmid ( HANDLE_LDAC_BT hLdacBT, int priority );
DECLFUNC int ldacBT_get_eqmid_from_frmlen( int frmlen, int nch, int flgFrmHdr, int pktType );
DECLFUNC int ldacBT_update_frmlen(HANDLE_LDAC_BT hLdacBT, int frmlen);
DECLFUNC P_LDACBT_EQMID_PROPERTY ldacBT_get_eqmid_conv_tbl ( int ldac_bt_mode );
DECLFUNC P_LDACBT_CONFIG ldacBT_get_config( int ldac_bt_mode, int pkt_type );
#ifdef __cplusplus
}
#endif
#endif /* _LDACBT_INTERNAL_H_ */