xref: /aosp_15_r20/external/libldac/inc/ldacBT.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_H_
18*aef9bcd9SKiyoung Kim #define _LDACBT_H_
19*aef9bcd9SKiyoung Kim #ifdef __cplusplus
20*aef9bcd9SKiyoung Kim extern "C" {
21*aef9bcd9SKiyoung Kim #endif
22*aef9bcd9SKiyoung Kim #ifndef LDACBT_API
23*aef9bcd9SKiyoung Kim #define LDACBT_API
24*aef9bcd9SKiyoung Kim #endif /* LDACBT_API  */
25*aef9bcd9SKiyoung Kim 
26*aef9bcd9SKiyoung Kim /* This file contains the definitions, declarations and macros for an implimentation of
27*aef9bcd9SKiyoung Kim  * LDAC encode processing.
28*aef9bcd9SKiyoung Kim  *
29*aef9bcd9SKiyoung Kim  * The basic flow of the encode processing is as follows:
30*aef9bcd9SKiyoung Kim  * - The program creates an handle of an LDAC api using ldacBT_get_handle().
31*aef9bcd9SKiyoung Kim  * - The program initialize the handle for encode using ldacBT_init_handle_encode().
32*aef9bcd9SKiyoung Kim  * - The program calls ldacBT_encode() to encode data.
33*aef9bcd9SKiyoung Kim  * - If the program demands to control the Encode Quality Mode Index, then one of the following
34*aef9bcd9SKiyoung Kim  *   should be called:
35*aef9bcd9SKiyoung Kim  *     - ldacBT_set_eqmid()
36*aef9bcd9SKiyoung Kim  *     - ldacBT_alter_eqmid()
37*aef9bcd9SKiyoung Kim  * - The program finishes the encoding with passing NULL to input pcm buffer for ldacBT_encode(),
38*aef9bcd9SKiyoung Kim  *   which enables the encoder to encode remaining data in its input buffers.
39*aef9bcd9SKiyoung Kim  * - The handle may be closed using ldacBT_close_handle() then used again, or released with
40*aef9bcd9SKiyoung Kim  *   ldacBT_free_handle().
41*aef9bcd9SKiyoung Kim  * - The rest of the set functions should be called only if it is needed by the client.
42*aef9bcd9SKiyoung Kim  *
43*aef9bcd9SKiyoung Kim  *
44*aef9bcd9SKiyoung Kim  * Note for an implimentation
45*aef9bcd9SKiyoung Kim  * - Error processing
46*aef9bcd9SKiyoung Kim  *     When continuous processing for next frame is performed after error detection, following
47*aef9bcd9SKiyoung Kim  *     processing must be carried out using C function provided in the library.
48*aef9bcd9SKiyoung Kim  *      - Release of internal variables in encode processing using ldacBT_close_handle().
49*aef9bcd9SKiyoung Kim  *      - Allocation and initialization of internal variables in encode processing using
50*aef9bcd9SKiyoung Kim  *        ldacBT_init_handle_encode().
51*aef9bcd9SKiyoung Kim  *     Note that the encoded output for a few frames will not be present just after error recovery.
52*aef9bcd9SKiyoung Kim  *
53*aef9bcd9SKiyoung Kim  * - Resuming of the encode processing from an interruption
54*aef9bcd9SKiyoung Kim  *     In case of resuming of the encode processing from interruption (such as changing
55*aef9bcd9SKiyoung Kim  *     configuration, seeking and playback), initialization of internal variables in encode
56*aef9bcd9SKiyoung Kim  *     processing must be carried out as error processing described above.
57*aef9bcd9SKiyoung Kim  *     Note that the encoded output for a few frames will not be present just after initialization
58*aef9bcd9SKiyoung Kim  *     as above.
59*aef9bcd9SKiyoung Kim  *
60*aef9bcd9SKiyoung Kim  *
61*aef9bcd9SKiyoung Kim  * Glossary
62*aef9bcd9SKiyoung Kim  *  channel_config_index (cci)
63*aef9bcd9SKiyoung Kim  *    The channel setting information for ldaclib.
64*aef9bcd9SKiyoung Kim  *    See ldacBT_cm_to_cci() to get value from channel_mode.
65*aef9bcd9SKiyoung Kim  *
66*aef9bcd9SKiyoung Kim  *  channel_mode (cm)
67*aef9bcd9SKiyoung Kim  *    The channel setting information for LDAC specification of Bluetooth A2DP.
68*aef9bcd9SKiyoung Kim  *    See ldacBT_cci_to_cm() to get value from channel_config_index.
69*aef9bcd9SKiyoung Kim  *
70*aef9bcd9SKiyoung Kim  *  ldac_transport_frame
71*aef9bcd9SKiyoung Kim  *    See LDAC specification of bluetooth A2DP.
72*aef9bcd9SKiyoung Kim  *
73*aef9bcd9SKiyoung Kim  *  Maximum Transmission Unit (MTU)
74*aef9bcd9SKiyoung Kim  *    The minimum MTU that a L2CAP implementation for LDAC shall support is 679 bytes, because LDAC
75*aef9bcd9SKiyoung Kim  *    is optimized with 2-DH5 packet as its target.
76*aef9bcd9SKiyoung Kim  *
77*aef9bcd9SKiyoung Kim  *  frame
78*aef9bcd9SKiyoung Kim  *    An audio signal sequence representing a certain number of PCM audio signals.
79*aef9bcd9SKiyoung Kim  *    Encoding and decoding are processed frame by frame in LDAC. Number of samples in a frame is
80*aef9bcd9SKiyoung Kim  *    determined by sampling frequency as described below.
81*aef9bcd9SKiyoung Kim  *
82*aef9bcd9SKiyoung Kim  *  Sampling frequency and frame sample.
83*aef9bcd9SKiyoung Kim  *    Supported sampling frequencies are 44.1, 48, 88.2 and 96 kHz.
84*aef9bcd9SKiyoung Kim  *    The relationship between sampling frequency and frame sample in LDAC are shown below.
85*aef9bcd9SKiyoung Kim  *       --------------------------------------------------------
86*aef9bcd9SKiyoung Kim  *      | sampling frequency       [kHz] | 44.1 | 48 | 88.2 | 96 |
87*aef9bcd9SKiyoung Kim  *      | frame sample [samples/channel] |     128   |     256   |
88*aef9bcd9SKiyoung Kim  *       --------------------------------------------------------
89*aef9bcd9SKiyoung Kim  *    Though the frame size varies in LDAC core as described in the table, the number of samples in
90*aef9bcd9SKiyoung Kim  *    input PCM signal for encoding is fixed to 128 sample/channel, and it is not affected by
91*aef9bcd9SKiyoung Kim  *    sampling frequency.
92*aef9bcd9SKiyoung Kim  */
93*aef9bcd9SKiyoung Kim #define LDACBT_ENC_LSU 128
94*aef9bcd9SKiyoung Kim #define LDACBT_MAX_LSU 512
95*aef9bcd9SKiyoung Kim 
96*aef9bcd9SKiyoung Kim /* channel_config_index.
97*aef9bcd9SKiyoung Kim  * Supported value are below.
98*aef9bcd9SKiyoung Kim  */
99*aef9bcd9SKiyoung Kim #define LDAC_CCI_MONO         0 /* MONO */
100*aef9bcd9SKiyoung Kim #define LDAC_CCI_DUAL_CHANNEL 1 /* DUAL CHANNEL */
101*aef9bcd9SKiyoung Kim #define LDAC_CCI_STEREO       2 /* STEREO */
102*aef9bcd9SKiyoung Kim 
103*aef9bcd9SKiyoung Kim /* PCM format.
104*aef9bcd9SKiyoung Kim  * Supported PCM format are shown below.
105*aef9bcd9SKiyoung Kim  *   - LDACBT_SMPL_FMT_S16 : signed 16bits little endian.
106*aef9bcd9SKiyoung Kim  *   - LDACBT_SMPL_FMT_S24 : signed 24bits little endian.
107*aef9bcd9SKiyoung Kim  *   - LDACBT_SMPL_FMT_S32 : signed 32bits little endian.
108*aef9bcd9SKiyoung Kim  *   - LDACBT_SMPL_FMT_F32 : single-precision floating point.
109*aef9bcd9SKiyoung Kim  * The data sequency must be interleaved format by 1 sample.
110*aef9bcd9SKiyoung Kim  * Ex) 2 channel audio, the data sequences are aligned as below.
111*aef9bcd9SKiyoung Kim  *       seq : |L[0]|R[0]|L[1]|R[1]|...
112*aef9bcd9SKiyoung Kim  */
113*aef9bcd9SKiyoung Kim typedef enum {
114*aef9bcd9SKiyoung Kim     LDACBT_SMPL_FMT_S16 = 0x2,
115*aef9bcd9SKiyoung Kim     LDACBT_SMPL_FMT_S24 = 0x3,
116*aef9bcd9SKiyoung Kim     LDACBT_SMPL_FMT_S32 = 0x4,
117*aef9bcd9SKiyoung Kim     LDACBT_SMPL_FMT_F32 = 0x5,
118*aef9bcd9SKiyoung Kim } LDACBT_SMPL_FMT_T;
119*aef9bcd9SKiyoung Kim 
120*aef9bcd9SKiyoung Kim /* Encode Quality Mode Index. (EQMID)
121*aef9bcd9SKiyoung Kim  *  The configuration of encoding in LDAC will be coordinated by "Encode Quality Mode Index"
122*aef9bcd9SKiyoung Kim  *  parameter. Configurable values are shown below.
123*aef9bcd9SKiyoung Kim  *   - LDACBT_EQMID_HQ : Encode setting for High Quality.
124*aef9bcd9SKiyoung Kim  *   - LDACBT_EQMID_SQ : Encode setting for Standard Quality.
125*aef9bcd9SKiyoung Kim  *   - LDACBT_EQMID_MQ : Encode setting for Mobile use Quality.
126*aef9bcd9SKiyoung Kim  *   - LDACBT_EQMID_ABR: Reserved EQMID for ABR. The value shall be 0x7F.
127*aef9bcd9SKiyoung Kim  */
128*aef9bcd9SKiyoung Kim enum {
129*aef9bcd9SKiyoung Kim     LDACBT_EQMID_HQ = 0,
130*aef9bcd9SKiyoung Kim     LDACBT_EQMID_SQ,
131*aef9bcd9SKiyoung Kim     LDACBT_EQMID_MQ,
132*aef9bcd9SKiyoung Kim     LDACBT_EQMID_NUM,     /* terminator */
133*aef9bcd9SKiyoung Kim     LDACBT_EQMID_ABR = 0x7F,
134*aef9bcd9SKiyoung Kim };
135*aef9bcd9SKiyoung Kim 
136*aef9bcd9SKiyoung Kim /* Bit rates
137*aef9bcd9SKiyoung Kim  *  Bit rates in each EQMID are depend on sampling frequency.
138*aef9bcd9SKiyoung Kim  *  In this API specification, these relations are shown below.
139*aef9bcd9SKiyoung Kim  *     ___________________________________________
140*aef9bcd9SKiyoung Kim  *    |                 | Sampling Frequency[kHz] |
141*aef9bcd9SKiyoung Kim  *    |      EQMID      | 44.1, 88.2 |   48, 96   |
142*aef9bcd9SKiyoung Kim  *    +-----------------+------------+------------+
143*aef9bcd9SKiyoung Kim  *    | LDACBT_EQMID_HQ |   909kbps  |   990kbps  |
144*aef9bcd9SKiyoung Kim  *    | LDACBT_EQMID_SQ |   606kbps  |   660kbps  |
145*aef9bcd9SKiyoung Kim  *    | LDACBT_EQMID_MQ |   303kbps  |   330kbps  |
146*aef9bcd9SKiyoung Kim  *     -------------------------------------------
147*aef9bcd9SKiyoung Kim  */
148*aef9bcd9SKiyoung Kim 
149*aef9bcd9SKiyoung Kim /* Maximum size of the "ldac_transport_frame" sequence at transportation. */
150*aef9bcd9SKiyoung Kim #define LDACBT_MAX_NBYTES 1024 /* byte */
151*aef9bcd9SKiyoung Kim 
152*aef9bcd9SKiyoung Kim /* Maximum number of channel for LDAC */
153*aef9bcd9SKiyoung Kim #define LDAC_PRCNCH 2
154*aef9bcd9SKiyoung Kim 
155*aef9bcd9SKiyoung Kim /* LDAC handle type */
156*aef9bcd9SKiyoung Kim typedef struct _st_ldacbt_handle * HANDLE_LDAC_BT;
157*aef9bcd9SKiyoung Kim 
158*aef9bcd9SKiyoung Kim /* Allocation of LDAC handle.
159*aef9bcd9SKiyoung Kim  *  Format
160*aef9bcd9SKiyoung Kim  *      HANDLE_LDAC_BT ldacBT_get_handle( void );
161*aef9bcd9SKiyoung Kim  *  Arguments
162*aef9bcd9SKiyoung Kim  *      None.
163*aef9bcd9SKiyoung Kim  *  Return value
164*aef9bcd9SKiyoung Kim  *      HANDLE_LDAC_BT for success, NULL for failure.
165*aef9bcd9SKiyoung Kim  */
166*aef9bcd9SKiyoung Kim LDACBT_API HANDLE_LDAC_BT ldacBT_get_handle( void );
167*aef9bcd9SKiyoung Kim 
168*aef9bcd9SKiyoung Kim /* Release of LDAC handle.
169*aef9bcd9SKiyoung Kim  *  Format
170*aef9bcd9SKiyoung Kim  *      void ldacBT_free_handle( HANDLE_LDAC_BT hLdacBt );
171*aef9bcd9SKiyoung Kim  *  Arguments
172*aef9bcd9SKiyoung Kim  *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
173*aef9bcd9SKiyoung Kim  *  Return value
174*aef9bcd9SKiyoung Kim  *      None.
175*aef9bcd9SKiyoung Kim  */
176*aef9bcd9SKiyoung Kim LDACBT_API void ldacBT_free_handle( HANDLE_LDAC_BT hLdacBt );
177*aef9bcd9SKiyoung Kim 
178*aef9bcd9SKiyoung Kim /* Closing of initialized LDAC handle.
179*aef9bcd9SKiyoung Kim  * Closed handle can be initialized and used again.
180*aef9bcd9SKiyoung Kim  *  Format
181*aef9bcd9SKiyoung Kim  *      void ldacBT_close_handle( HANDLE_LDAC_BT hLdacBt );
182*aef9bcd9SKiyoung Kim  *  Arguments
183*aef9bcd9SKiyoung Kim  *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
184*aef9bcd9SKiyoung Kim  *  Return value
185*aef9bcd9SKiyoung Kim  *      None.
186*aef9bcd9SKiyoung Kim  */
187*aef9bcd9SKiyoung Kim LDACBT_API void ldacBT_close_handle( HANDLE_LDAC_BT hLdacBt );
188*aef9bcd9SKiyoung Kim 
189*aef9bcd9SKiyoung Kim /* Acquisition of the library version.
190*aef9bcd9SKiyoung Kim  *  Format
191*aef9bcd9SKiyoung Kim  *      int  ldacBT_get_version( void );
192*aef9bcd9SKiyoung Kim  *  Arguments
193*aef9bcd9SKiyoung Kim  *      None.
194*aef9bcd9SKiyoung Kim  *  Return value
195*aef9bcd9SKiyoung Kim  *      int : version number.
196*aef9bcd9SKiyoung Kim  *              23-16 bit : major version
197*aef9bcd9SKiyoung Kim  *              15- 8 bit : minor version
198*aef9bcd9SKiyoung Kim  *               7- 0 bit : branch version
199*aef9bcd9SKiyoung Kim  *              Ex) 0x00010203 -> version 1.02.03
200*aef9bcd9SKiyoung Kim  */
201*aef9bcd9SKiyoung Kim LDACBT_API int  ldacBT_get_version( void );
202*aef9bcd9SKiyoung Kim 
203*aef9bcd9SKiyoung Kim /* Acquisition of the sampling frequency in current configuration.
204*aef9bcd9SKiyoung Kim  * The LDAC handle must be initialized by API function ldacBT_init_handle_encode() prior to
205*aef9bcd9SKiyoung Kim  * calling this function.
206*aef9bcd9SKiyoung Kim  *  Format
207*aef9bcd9SKiyoung Kim  *      int  ldacBT_get_sampling_freq( HANDLE_LDAC_BT hLdacBt );
208*aef9bcd9SKiyoung Kim  *  Arguments
209*aef9bcd9SKiyoung Kim  *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
210*aef9bcd9SKiyoung Kim  *  Return value
211*aef9bcd9SKiyoung Kim  *      int : sampling frequency in current configuration. -1 for failure.
212*aef9bcd9SKiyoung Kim  */
213*aef9bcd9SKiyoung Kim LDACBT_API int  ldacBT_get_sampling_freq( HANDLE_LDAC_BT hLdacBt );
214*aef9bcd9SKiyoung Kim 
215*aef9bcd9SKiyoung Kim /* Acquisition of the Bit-rate.
216*aef9bcd9SKiyoung Kim  * The LDAC handle must be initialized by API function ldacBT_init_handle_encode() prior to
217*aef9bcd9SKiyoung Kim  * calling this function.
218*aef9bcd9SKiyoung Kim  *  Format
219*aef9bcd9SKiyoung Kim  *      int  ldacBT_get_bitrate( HANDLE_LDAC_BT hLdacBt );
220*aef9bcd9SKiyoung Kim  *  Arguments
221*aef9bcd9SKiyoung Kim  *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
222*aef9bcd9SKiyoung Kim  *  Return value
223*aef9bcd9SKiyoung Kim  *      int : Bit-rate for previously processed ldac_transport_frame for success. -1 for failure.
224*aef9bcd9SKiyoung Kim  */
225*aef9bcd9SKiyoung Kim LDACBT_API int  ldacBT_get_bitrate( HANDLE_LDAC_BT hLdacBt );
226*aef9bcd9SKiyoung Kim 
227*aef9bcd9SKiyoung Kim /* Initialization of a LDAC handle for encode processing.
228*aef9bcd9SKiyoung Kim  * The LDAC handle must be allocated by API function ldacBT_get_handle() prior to calling this API.
229*aef9bcd9SKiyoung Kim  * "mtu" value should be configured to MTU size of AVDTP Transport Channel, which is determined by
230*aef9bcd9SKiyoung Kim  * SRC and SNK devices in Bluetooth transmission.
231*aef9bcd9SKiyoung Kim  * "eqmid" is configured to desired value of "Encode Quality Mode Index".
232*aef9bcd9SKiyoung Kim  * "cm" is configured to channel_mode in LDAC, which is determined by SRC and SNK devices in
233*aef9bcd9SKiyoung Kim  * Bluetooth transmission.
234*aef9bcd9SKiyoung Kim  * "fmt" is configured to input pcm audio format.
235*aef9bcd9SKiyoung Kim  * When the configuration of "mtu", "cm", or "sf" changed, the re-initialization is required.
236*aef9bcd9SKiyoung Kim  *
237*aef9bcd9SKiyoung Kim  *  Format
238*aef9bcd9SKiyoung Kim  *      int  ldacBT_init_handle_encode( HANDLE_LDAC_BT hLdacBt, int mtu, int eqmid, int cm,
239*aef9bcd9SKiyoung Kim  *                                      LDACBT_SMPL_FMT_T fmt, int sf );
240*aef9bcd9SKiyoung Kim  *  Arguments
241*aef9bcd9SKiyoung Kim  *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
242*aef9bcd9SKiyoung Kim  *      mtu        int               MTU value. Unit:Byte.
243*aef9bcd9SKiyoung Kim  *      eqmid      int               Encode Quality Mode Index.
244*aef9bcd9SKiyoung Kim  *      cm         int               Information of the channel_mode.
245*aef9bcd9SKiyoung Kim  *      fmt        LDACBT_SMPL_FMT_T Audio format type of input pcm.
246*aef9bcd9SKiyoung Kim  *      sf         int               Sampling frequency of input pcm.
247*aef9bcd9SKiyoung Kim  *  Return value
248*aef9bcd9SKiyoung Kim  *      int : 0 for success, -1 for failure.
249*aef9bcd9SKiyoung Kim  */
250*aef9bcd9SKiyoung Kim LDACBT_API int  ldacBT_init_handle_encode( HANDLE_LDAC_BT hLdacBt, int mtu, int eqmid, int cm,
251*aef9bcd9SKiyoung Kim                                            LDACBT_SMPL_FMT_T fmt, int sf );
252*aef9bcd9SKiyoung Kim 
253*aef9bcd9SKiyoung Kim /* Configuration of Encode Quality Mode Index.
254*aef9bcd9SKiyoung Kim  * The LDAC handle must be initialized by API function ldacBT_init_handle_encode() prior to
255*aef9bcd9SKiyoung Kim  * calling this function.
256*aef9bcd9SKiyoung Kim  * The API function can be called at any time, after the completion of initializing.
257*aef9bcd9SKiyoung Kim  *  Format
258*aef9bcd9SKiyoung Kim  *      int  ldacBT_set_eqmid( HANDLE_LDAC_BT hLdacBt, int eqmid );
259*aef9bcd9SKiyoung Kim  *  Arguments
260*aef9bcd9SKiyoung Kim  *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
261*aef9bcd9SKiyoung Kim  *      eqmid      int               Encode Quality Mode Index.
262*aef9bcd9SKiyoung Kim  *  Return value
263*aef9bcd9SKiyoung Kim  *      int : 0 for success, -1 for failure.
264*aef9bcd9SKiyoung Kim  */
265*aef9bcd9SKiyoung Kim LDACBT_API int  ldacBT_set_eqmid( HANDLE_LDAC_BT hLdacBt, int eqmid );
266*aef9bcd9SKiyoung Kim 
267*aef9bcd9SKiyoung Kim /* Acquisition of prescribed Encode Quality Mode Index in current configuration.
268*aef9bcd9SKiyoung Kim  * The LDAC handle must be initialized by API function ldacBT_init_handle_encode() prior to
269*aef9bcd9SKiyoung Kim  * calling this function.
270*aef9bcd9SKiyoung Kim  *  Format
271*aef9bcd9SKiyoung Kim  *      int  ldacBT_get_eqmid( HANDLE_LDAC_BT hLdacBt );
272*aef9bcd9SKiyoung Kim  *  Arguments
273*aef9bcd9SKiyoung Kim  *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
274*aef9bcd9SKiyoung Kim  *  Return value
275*aef9bcd9SKiyoung Kim  *      int : Encode Quality Mode Index for success, -1 for failure.
276*aef9bcd9SKiyoung Kim  */
277*aef9bcd9SKiyoung Kim LDACBT_API int  ldacBT_get_eqmid( HANDLE_LDAC_BT hLdacBt );
278*aef9bcd9SKiyoung Kim 
279*aef9bcd9SKiyoung Kim /* Changing of configuration for Encode Quality Mode Index by one step.
280*aef9bcd9SKiyoung Kim  * The LDAC handle must be initialized by API function ldacBT_init_handle_encode() prior to
281*aef9bcd9SKiyoung Kim  * calling this function.
282*aef9bcd9SKiyoung Kim  * Configuralbe values for "priority" are shown below.
283*aef9bcd9SKiyoung Kim  *   - LDACBT_EQMID_INC_QUALITY    : Adjustment for EQMID by one step for the direction of
284*aef9bcd9SKiyoung Kim  *                                   getting close to LDACBT_EQMID_HQ.
285*aef9bcd9SKiyoung Kim  *   - LDACBT_EQMID_INC_CONNECTION : Adjustment for EQMID by one step for the direction of
286*aef9bcd9SKiyoung Kim  *                                   getting away from LDACBT_EQMID_HQ.
287*aef9bcd9SKiyoung Kim  * For restoring prescribed value for "Encode Quality Mode Index", it must be configured again by
288*aef9bcd9SKiyoung Kim  * API function ldacBT_init_handle_encode() or ldacBT_set_qmode().
289*aef9bcd9SKiyoung Kim  * A transition to the state other than "Encode Quality Mode Index" mention before may be occurred
290*aef9bcd9SKiyoung Kim  * caused by an adjustment using this API function.
291*aef9bcd9SKiyoung Kim  * The API function can be called at any time, after the completion of initializing.
292*aef9bcd9SKiyoung Kim  *  Format
293*aef9bcd9SKiyoung Kim  *      int  ldacBT_alter_eqmid_priority( HANDLE_LDAC_BT hLdacBt, int priority );
294*aef9bcd9SKiyoung Kim  *  Arguments
295*aef9bcd9SKiyoung Kim  *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
296*aef9bcd9SKiyoung Kim  *      priority   int               The direction of changing EQMID.
297*aef9bcd9SKiyoung Kim  *  Return value
298*aef9bcd9SKiyoung Kim  *      int : 0 for success, -1 for failure.
299*aef9bcd9SKiyoung Kim  */
300*aef9bcd9SKiyoung Kim #define LDACBT_EQMID_INC_QUALITY     1
301*aef9bcd9SKiyoung Kim #define LDACBT_EQMID_INC_CONNECTION -1
302*aef9bcd9SKiyoung Kim LDACBT_API int  ldacBT_alter_eqmid_priority( HANDLE_LDAC_BT hLdacBt, int priority );
303*aef9bcd9SKiyoung Kim 
304*aef9bcd9SKiyoung Kim 
305*aef9bcd9SKiyoung Kim /* LDAC encode processing.
306*aef9bcd9SKiyoung Kim  * The LDAC handle must be initialized by API function ldacBT_init_handle_encode() prior to calling
307*aef9bcd9SKiyoung Kim  * this API function.
308*aef9bcd9SKiyoung Kim  * <Regarding on a input PCM signal>
309*aef9bcd9SKiyoung Kim  *  Number of samples in input PCM signal for encoding is fixed to 128 samples per channel, and it
310*aef9bcd9SKiyoung Kim  *  is not affected by sampling frequency.
311*aef9bcd9SKiyoung Kim  *
312*aef9bcd9SKiyoung Kim  *  The region in input signal buffer without any PCM signal must be filled with zero, if the
313*aef9bcd9SKiyoung Kim  *  number of samples is less than 128 samples.
314*aef9bcd9SKiyoung Kim  *
315*aef9bcd9SKiyoung Kim  *  The format of PCM signal is determined by "fmt" configured by API function
316*aef9bcd9SKiyoung Kim  *  ldacBT_init_handle_encode().
317*aef9bcd9SKiyoung Kim  *
318*aef9bcd9SKiyoung Kim  *  Total size of referenced PCM signal (in byte) will be set in "pcm_used" on return. The value of
319*aef9bcd9SKiyoung Kim  *  "Number of input samples * Number of channels * sizeof(PCM word length)" will be set in normal.
320*aef9bcd9SKiyoung Kim  *
321*aef9bcd9SKiyoung Kim  *  Finalize processing of encode will be carried out with setting "p_pcm" as zero.
322*aef9bcd9SKiyoung Kim  *
323*aef9bcd9SKiyoung Kim  * <Regarding on output encoded data>
324*aef9bcd9SKiyoung Kim  *  An output data in "ldac_transport_frame" sequence will be set to "p_stream" after several frame
325*aef9bcd9SKiyoung Kim  *  processing. So the output is not necessarily present at each calling of this API function.
326*aef9bcd9SKiyoung Kim  *
327*aef9bcd9SKiyoung Kim  *  The presence of the output can be verified by checking whether the value of "stream_wrote",
328*aef9bcd9SKiyoung Kim  *  representing the number of written bytes for "p_stream", is positive or not.
329*aef9bcd9SKiyoung Kim  *
330*aef9bcd9SKiyoung Kim  *  In addition, encoded data size for output will be determined by the value of "mtu" configured
331*aef9bcd9SKiyoung Kim  *  by API function ldacBT_init_handle_encode().
332*aef9bcd9SKiyoung Kim  *
333*aef9bcd9SKiyoung Kim  *  The number of "ldac_transport_frame" corresponding to "ldac_transport_frame" sequence as output
334*aef9bcd9SKiyoung Kim  *  will be set to "frame_num".
335*aef9bcd9SKiyoung Kim  *
336*aef9bcd9SKiyoung Kim  *  Format
337*aef9bcd9SKiyoung Kim  *      int  ldacBT_encode( HANDLE_LDAC_BT hLdacBt, void *p_pcm, int *pcm_used,
338*aef9bcd9SKiyoung Kim  *                          unsigned char *p_stream, int *stream_sz, int *frame_num );
339*aef9bcd9SKiyoung Kim  *  Arguments
340*aef9bcd9SKiyoung Kim  *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
341*aef9bcd9SKiyoung Kim  *      p_pcm      void *            Input PCM signal sequence
342*aef9bcd9SKiyoung Kim  *      pcm_used   int *             Data size of referenced PCM singnal. Unit:Byte.
343*aef9bcd9SKiyoung Kim  *      p_stream   unsigned char *   Output "ldac_transport_frame" sequence.
344*aef9bcd9SKiyoung Kim  *      stream_sz  int *             Size of output data. Unit:Byte.
345*aef9bcd9SKiyoung Kim  *      frame_num  int *             Number of output "ldac_transport_frame"
346*aef9bcd9SKiyoung Kim  *  Return value
347*aef9bcd9SKiyoung Kim  *      int : 0 for success, -1 for failure.
348*aef9bcd9SKiyoung Kim  */
349*aef9bcd9SKiyoung Kim LDACBT_API int  ldacBT_encode( HANDLE_LDAC_BT hLdacBt, void *p_pcm, int *pcm_used,
350*aef9bcd9SKiyoung Kim                                unsigned char *p_stream, int *stream_sz, int *frame_num );
351*aef9bcd9SKiyoung Kim 
352*aef9bcd9SKiyoung Kim /* Acquisition of previously established error code.
353*aef9bcd9SKiyoung Kim  * The LDAC handle must be allocated by API function ldacBT_get_handle() prior to calling this function.
354*aef9bcd9SKiyoung Kim  * The details of error code are described below at the end of this header file.
355*aef9bcd9SKiyoung Kim  * Tips for error code handling.
356*aef9bcd9SKiyoung Kim  * The macro function LDACBT_FATAL() is useful to determine whether the error code is Fatal or not.
357*aef9bcd9SKiyoung Kim  *      Ex.) if( LDACBT_FATAL(err) ) // Fatal Error occurred.
358*aef9bcd9SKiyoung Kim  *
359*aef9bcd9SKiyoung Kim  * The macro function LDACBT_ERROR() is useful to determine whether the error occurred or not.
360*aef9bcd9SKiyoung Kim  *      Ex.) if( LDACBT_ERROR(err) ) // Error occurred.
361*aef9bcd9SKiyoung Kim  *
362*aef9bcd9SKiyoung Kim  * The macro function LDACBT_HANDLE_ERR() is useful to get the handle level error code.
363*aef9bcd9SKiyoung Kim  *      Ex.) err_handle_lv = LDACBT_HANDLE_ERR(err);
364*aef9bcd9SKiyoung Kim  *
365*aef9bcd9SKiyoung Kim  * The macro function LDACBT_BLOCK_ERR() is useful to get the block level error code.
366*aef9bcd9SKiyoung Kim  *      Ex.) err_block_lv = LDACBT_BLOCK_ERR(err);
367*aef9bcd9SKiyoung Kim  *
368*aef9bcd9SKiyoung Kim  *  Format
369*aef9bcd9SKiyoung Kim  *      int  ldacBT_get_error_code( HANDLE_LDAC_BT hLdacBt );
370*aef9bcd9SKiyoung Kim  *  Arguments
371*aef9bcd9SKiyoung Kim  *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
372*aef9bcd9SKiyoung Kim  *  Return value
373*aef9bcd9SKiyoung Kim  *      int : Error code.
374*aef9bcd9SKiyoung Kim  */
375*aef9bcd9SKiyoung Kim LDACBT_API int  ldacBT_get_error_code( HANDLE_LDAC_BT hLdacBt );
376*aef9bcd9SKiyoung Kim 
377*aef9bcd9SKiyoung Kim /*******************************************************************************
378*aef9bcd9SKiyoung Kim     Error Code
379*aef9bcd9SKiyoung Kim *******************************************************************************/
380*aef9bcd9SKiyoung Kim #define LDACBT_ERR_NONE                     0
381*aef9bcd9SKiyoung Kim 
382*aef9bcd9SKiyoung Kim /*    Non Fatal Error ***********************************************************/
383*aef9bcd9SKiyoung Kim #define LDACBT_ERR_NON_FATAL                1
384*aef9bcd9SKiyoung Kim 
385*aef9bcd9SKiyoung Kim /*    Non Fatal Error (Block Level) *********************************************/
386*aef9bcd9SKiyoung Kim #define LDACBT_ERR_BIT_ALLOCATION           5
387*aef9bcd9SKiyoung Kim 
388*aef9bcd9SKiyoung Kim /*    Non Fatal Error (Handle Level) ********************************************/
389*aef9bcd9SKiyoung Kim #define LDACBT_ERR_NOT_IMPLEMENTED          128
390*aef9bcd9SKiyoung Kim #define LDACBT_ERR_NON_FATAL_ENCODE         132
391*aef9bcd9SKiyoung Kim 
392*aef9bcd9SKiyoung Kim /*    Fatal Error ***************************************************************/
393*aef9bcd9SKiyoung Kim #define LDACBT_ERR_FATAL                    256
394*aef9bcd9SKiyoung Kim 
395*aef9bcd9SKiyoung Kim /*    Fatal Error (Block Level) *************************************************/
396*aef9bcd9SKiyoung Kim #define LDACBT_ERR_SYNTAX_BAND              260
397*aef9bcd9SKiyoung Kim #define LDACBT_ERR_SYNTAX_GRAD_A            261
398*aef9bcd9SKiyoung Kim #define LDACBT_ERR_SYNTAX_GRAD_B            262
399*aef9bcd9SKiyoung Kim #define LDACBT_ERR_SYNTAX_GRAD_C            263
400*aef9bcd9SKiyoung Kim #define LDACBT_ERR_SYNTAX_GRAD_D            264
401*aef9bcd9SKiyoung Kim #define LDACBT_ERR_SYNTAX_GRAD_E            265
402*aef9bcd9SKiyoung Kim #define LDACBT_ERR_SYNTAX_IDSF              266
403*aef9bcd9SKiyoung Kim #define LDACBT_ERR_SYNTAX_SPEC              267
404*aef9bcd9SKiyoung Kim 
405*aef9bcd9SKiyoung Kim #define LDACBT_ERR_BIT_PACKING              280
406*aef9bcd9SKiyoung Kim 
407*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ALLOC_MEMORY             300
408*aef9bcd9SKiyoung Kim 
409*aef9bcd9SKiyoung Kim /*    Fatal Error (Handle Level) ************************************************/
410*aef9bcd9SKiyoung Kim #define LDACBT_ERR_FATAL_HANDLE             512
411*aef9bcd9SKiyoung Kim 
412*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ILL_SYNCWORD             516
413*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ILL_SMPL_FORMAT          517
414*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ILL_PARAM                518
415*aef9bcd9SKiyoung Kim 
416*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ASSERT_SAMPLING_FREQ     530
417*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ASSERT_SUP_SAMPLING_FREQ 531
418*aef9bcd9SKiyoung Kim #define LDACBT_ERR_CHECK_SAMPLING_FREQ      532
419*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ASSERT_CHANNEL_CONFIG    533
420*aef9bcd9SKiyoung Kim #define LDACBT_ERR_CHECK_CHANNEL_CONFIG     534
421*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ASSERT_FRAME_LENGTH      535
422*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ASSERT_SUP_FRAME_LENGTH  536
423*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ASSERT_FRAME_STATUS      537
424*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ASSERT_NSHIFT            538
425*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ASSERT_CHANNEL_MODE      539
426*aef9bcd9SKiyoung Kim 
427*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ENC_INIT_ALLOC           550
428*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ENC_ILL_GRADMODE         551
429*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ENC_ILL_GRADPAR_A        552
430*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ENC_ILL_GRADPAR_B        553
431*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ENC_ILL_GRADPAR_C        554
432*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ENC_ILL_GRADPAR_D        555
433*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ENC_ILL_NBANDS           556
434*aef9bcd9SKiyoung Kim #define LDACBT_ERR_PACK_BLOCK_FAILED        557
435*aef9bcd9SKiyoung Kim 
436*aef9bcd9SKiyoung Kim #define LDACBT_ERR_DEC_INIT_ALLOC           570
437*aef9bcd9SKiyoung Kim #define LDACBT_ERR_INPUT_BUFFER_SIZE        571
438*aef9bcd9SKiyoung Kim #define LDACBT_ERR_UNPACK_BLOCK_FAILED      572
439*aef9bcd9SKiyoung Kim #define LDACBT_ERR_UNPACK_BLOCK_ALIGN       573
440*aef9bcd9SKiyoung Kim #define LDACBT_ERR_UNPACK_FRAME_ALIGN       574
441*aef9bcd9SKiyoung Kim #define LDACBT_ERR_FRAME_LENGTH_OVER        575
442*aef9bcd9SKiyoung Kim #define LDACBT_ERR_FRAME_ALIGN_OVER         576
443*aef9bcd9SKiyoung Kim 
444*aef9bcd9SKiyoung Kim 
445*aef9bcd9SKiyoung Kim /* LDAC API for Encode */
446*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ALTER_EQMID_LIMITED      21
447*aef9bcd9SKiyoung Kim #define LDACBT_ERR_HANDLE_NOT_INIT          1000
448*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ILL_EQMID                1024
449*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ILL_SAMPLING_FREQ        1025
450*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ILL_NUM_CHANNEL          1026
451*aef9bcd9SKiyoung Kim #define LDACBT_ERR_ILL_MTU_SIZE             1027
452*aef9bcd9SKiyoung Kim /* LDAC API for Decode */
453*aef9bcd9SKiyoung Kim #define LDACBT_ERR_DEC_CONFIG_UPDATED       40
454*aef9bcd9SKiyoung Kim 
455*aef9bcd9SKiyoung Kim 
456*aef9bcd9SKiyoung Kim /* Macro Functions for Error Code ********************************************/
457*aef9bcd9SKiyoung Kim #define LDACBT_API_ERR(err)    ((err >> 20) & 0x0FFF)
458*aef9bcd9SKiyoung Kim #define LDACBT_HANDLE_ERR(err) ((err >> 10) & 0x03FF)
459*aef9bcd9SKiyoung Kim #define LDACBT_BLOCK_ERR(err)  ( err & 0x03FF)
460*aef9bcd9SKiyoung Kim #define LDACBT_ERROR(err)      ((LDACBT_ERR_NON_FATAL) <= LDACBT_API_ERR(err) ? 1 : 0)
461*aef9bcd9SKiyoung Kim #define LDACBT_FATAL(err)      ((LDACBT_ERR_FATAL) <= LDACBT_API_ERR(err) ? 1 : 0)
462*aef9bcd9SKiyoung Kim 
463*aef9bcd9SKiyoung Kim 
464*aef9bcd9SKiyoung Kim 
465*aef9bcd9SKiyoung Kim /* Codec Specific Information Elements for LDAC
466*aef9bcd9SKiyoung Kim  * (based on "LDAC Specification of Bluetooth A2DP Rev.2.0.1")
467*aef9bcd9SKiyoung Kim  *                  |  7  |  6  |  5  |  4  |  3  |  2  |  1  |  0  |
468*aef9bcd9SKiyoung Kim  *  service_caps[4] |   SONY ID                                     | Octet0
469*aef9bcd9SKiyoung Kim  *  service_caps[5] |   SONY ID                                     | Octet1
470*aef9bcd9SKiyoung Kim  *  service_caps[6] |   SONY ID                                     | Octet2
471*aef9bcd9SKiyoung Kim  *  service_caps[7] |   SONY ID                                     | Octet3
472*aef9bcd9SKiyoung Kim  *  service_caps[8] |   SONY Specific Codec ID                      | Octet4
473*aef9bcd9SKiyoung Kim  *  service_caps[9] |   SONY Specific Codec ID                      | Octet5
474*aef9bcd9SKiyoung Kim  *  service_caps[A] |   RFA     |   Sampling Frequency              | Octet6
475*aef9bcd9SKiyoung Kim  *  service_caps[B] |   RFA                       | Channel Mode ID | Octet7
476*aef9bcd9SKiyoung Kim  */
477*aef9bcd9SKiyoung Kim #define LDACBT_MEDIA_CODEC_SC_SZ         (10+2)
478*aef9bcd9SKiyoung Kim 
479*aef9bcd9SKiyoung Kim /* [Octet 0-3] Vendor ID for SONY */
480*aef9bcd9SKiyoung Kim #define LDACBT_VENDOR_ID0 0x2D
481*aef9bcd9SKiyoung Kim #define LDACBT_VENDOR_ID1 0x01
482*aef9bcd9SKiyoung Kim #define LDACBT_VENDOR_ID2 0x0
483*aef9bcd9SKiyoung Kim #define LDACBT_VENDOR_ID3 0x0
484*aef9bcd9SKiyoung Kim 
485*aef9bcd9SKiyoung Kim /* [Octet 4-5] Vendor Specific A2DP Codec ID for LDAC */
486*aef9bcd9SKiyoung Kim #define LDACBT_CODEC_ID0 0xAA
487*aef9bcd9SKiyoung Kim #define LDACBT_CODEC_ID1 0x00
488*aef9bcd9SKiyoung Kim 
489*aef9bcd9SKiyoung Kim /* [Octet 6]
490*aef9bcd9SKiyoung Kim  * [b7,b6] : RFA
491*aef9bcd9SKiyoung Kim  *       Reserved for future additions.
492*aef9bcd9SKiyoung Kim  *       Bits with this designation shall be set to zero.
493*aef9bcd9SKiyoung Kim  *       Receivers shall ignore these bits.
494*aef9bcd9SKiyoung Kim  * -----------------------------------------------------
495*aef9bcd9SKiyoung Kim  * [b5-b0] : Sampling frequency and its associated bit field in LDAC are shown below.
496*aef9bcd9SKiyoung Kim  *    |  5  |  4  |  3  |  2  |  1  |  0  |
497*aef9bcd9SKiyoung Kim  *    |  o  |     |     |     |     |     |  44100
498*aef9bcd9SKiyoung Kim  *    |     |  o  |     |     |     |     |  48000
499*aef9bcd9SKiyoung Kim  *    |     |     |  o  |     |     |     |  88200
500*aef9bcd9SKiyoung Kim  *    |     |     |     |  o  |     |     |  96000
501*aef9bcd9SKiyoung Kim  *    |     |     |     |     |  o  |     | 176400
502*aef9bcd9SKiyoung Kim  *    |     |     |     |     |     |  o  | 192000
503*aef9bcd9SKiyoung Kim  *
504*aef9bcd9SKiyoung Kim  */
505*aef9bcd9SKiyoung Kim /* Support for 44.1kHz sampling frequency */
506*aef9bcd9SKiyoung Kim #define LDACBT_SAMPLING_FREQ_044100        0x20
507*aef9bcd9SKiyoung Kim /* Support for 48kHz sampling frequency */
508*aef9bcd9SKiyoung Kim #define LDACBT_SAMPLING_FREQ_048000        0x10
509*aef9bcd9SKiyoung Kim /* Support for 88.2kHz sampling frequency */
510*aef9bcd9SKiyoung Kim #define LDACBT_SAMPLING_FREQ_088200        0x08
511*aef9bcd9SKiyoung Kim /* Support for 96kHz sampling frequency */
512*aef9bcd9SKiyoung Kim #define LDACBT_SAMPLING_FREQ_096000        0x04
513*aef9bcd9SKiyoung Kim /* Support for 176.4kHz sampling frequency */
514*aef9bcd9SKiyoung Kim #define LDACBT_SAMPLING_FREQ_176400        0x02
515*aef9bcd9SKiyoung Kim /* Support for 192kHz sampling frequency */
516*aef9bcd9SKiyoung Kim #define LDACBT_SAMPLING_FREQ_192000        0x01
517*aef9bcd9SKiyoung Kim 
518*aef9bcd9SKiyoung Kim /* [Octet 7]
519*aef9bcd9SKiyoung Kim  * [b7-b3] : RFA
520*aef9bcd9SKiyoung Kim  *       Reserved for future additions.
521*aef9bcd9SKiyoung Kim  *       Bits with this designation shall be set to zero.
522*aef9bcd9SKiyoung Kim  *       Receivers shall ignore these bits.
523*aef9bcd9SKiyoung Kim  * ------------------------------------------------------
524*aef9bcd9SKiyoung Kim  * [b2-b0] : Channel mode and its associated bit field in LDAC are shown below.
525*aef9bcd9SKiyoung Kim  *    |  2  |  1  |  0  |
526*aef9bcd9SKiyoung Kim  *    |  o  |     |     | MONO
527*aef9bcd9SKiyoung Kim  *    |     |  o  |     | DUAL CHANNEL
528*aef9bcd9SKiyoung Kim  *    |     |     |  o  | STEREO
529*aef9bcd9SKiyoung Kim  */
530*aef9bcd9SKiyoung Kim /* Support for MONO */
531*aef9bcd9SKiyoung Kim #define LDACBT_CHANNEL_MODE_MONO           0x04
532*aef9bcd9SKiyoung Kim /* Support for DUAL CHANNEL */
533*aef9bcd9SKiyoung Kim #define LDACBT_CHANNEL_MODE_DUAL_CHANNEL   0x02
534*aef9bcd9SKiyoung Kim /* Support for STEREO */
535*aef9bcd9SKiyoung Kim #define LDACBT_CHANNEL_MODE_STEREO         0x01
536*aef9bcd9SKiyoung Kim 
537*aef9bcd9SKiyoung Kim #ifdef __cplusplus
538*aef9bcd9SKiyoung Kim }
539*aef9bcd9SKiyoung Kim #endif
540*aef9bcd9SKiyoung Kim #endif /* _LDACBT_H_ */
541