tzh
2024-08-20 ca8393c352368485bcb8b277004fdb0c6cb572c6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
/*
 * 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_ */