/*******************************************************************************
 *
 * Copyright (C) 2013 - 2017 Sony Corporation
 *
 ******************************************************************************/

#ifndef _LDACBT_H_
#define _LDACBT_H_
#ifdef __cplusplus
extern "C" {
#endif
#ifndef LDACBT_API
#define LDACBT_API
#endif /* LDACBT_API  */

/* This file contains the definitions, declarations and macros for an implimentation of 
#ifdef _ENCODE_ONLY
 * LDAC encode processing.
#endif
#ifdef _DECODE_ONLY
 * LDAC decode processing.
#endif
#ifndef _ENCODE_ONLY
#ifndef _DECODE_ONLY
 * LDAC encode and decode processing.
#endif
#endif
 *
#ifndef _DECODE_ONLY
 * The basic flow of the encode processing is as follows:
 * - The program creates an handle of an LDAC api using ldacBT_get_handle().
 * - The program initialize the handle for encode using ldacBT_init_handle_encode().
 * - The program calls ldacBT_encode() to encode data.
 * - If the program demands to control the Encode Quality Mode Index, then one of the following
 *   should be called:
 *     - ldacBT_set_eqmid()
 *     - ldacBT_alter_eqmid()
 * - The program finishes the encoding with passing NULL to input pcm buffer for ldacBT_encode(),
 *   which enables the encoder to encode remaining data in its input buffers.
 * - The handle may be closed using ldacBT_close_handle() then used again, or released with
 *   ldacBT_free_handle().
 * - The rest of the set functions should be called only if it is needed by the client.
#endif // _DECODE_ONLY
#ifndef _ENCODE_ONLY
 * The basic flow of the decode processing is as follows:
 * - The program creates an handle of an LDAC api using ldacBT_get_handle().
 * - The program initialize the handle for decode using ldacBT_init_handle_decode().
 * - The program calls ldacBT_decode() to decode data.
 * - The handle may be closed using ldacBT_close_handle() then used again, or released with
 *   ldacBT_free_handle().
 * - The rest of the set functions should be called only if it is needed by the client.
#endif // _ENCODE_ONLY
 *
 *
 * Note for an implimentation
 * - Error processing
 *     When continuous processing for next frame is performed after error detection, following
 *     processing must be carried out using C function provided in the library.
#ifdef _ENCODE_ONLY
 *      - Release of internal variables in encode processing using ldacBT_close_handle().
 *      - Allocation and initialization of internal variables in encode processing using
 *        ldacBT_init_handle_encode().
 *     Note that the encoded output for a few frames will not be present just after error recovery.
#endif // _ENCODE_ONLY
#ifdef _DECODE_ONLY
 *      - Release of internal variables in decode processing using ldacBT_close_handle().
 *      - Allocation and initialization of internal variables in decode processing using
 *        ldacBT_init_handle_decode().
 *     Note that the first decoded out PCM signal will not be present just after error recovery.
#endif // _DECODE_ONLY
#ifndef _ENCODE_ONLY
#ifndef _DECODE_ONLY
 *      - Release of internal variables in encode/decode processing using ldacBT_close_handle().
 *      - Allocation and initialization of internal variables in encode/decode processing using
 *        ldacBT_init_handle_encode() for encode, ldacBT_init_handle_decode() for decode.
 *     Note that the encoded output for a few frames will not be present just after error recovery.
 *     Note that the first decoded out PCM signal will not be present just after error recovery.
#endif
#endif
 *
#ifndef _DECODE_ONLY
 * - Resuming of the encode processing from an interruption
 *     In case of resuming of the encode processing from interruption (such as changing
 *     configuration, seeking and playback), initialization of internal variables in encode
 *     processing must be carried out as error processing described above.
 *     Note that the encoded output for a few frames will not be present just after initialization
 *     as above.
#endif 
#ifndef _ENCODE_ONLY
 * Resuming of the decode processing from an interruption
 *     In case of resuming of the decode processing from interruption (such as changing
 *     configuration, seeking and playback), initialization of internal variables in decode
 *     processing must be carried out as error processing described above.
 *     Note that the first decoded out PCM signal will not be present just after initialization
 *     as above.
#endif 
 *
 *
 * Glossary
 *  channel_config_index (cci)
 *    The channel setting information for ldaclib.
 *    See ldacBT_cm_to_cci() to get value from channel_mode.
 *
 *  channel_mode (cm)
 *    The channel setting information for LDAC specification of Bluetooth A2DP.
 *    See ldacBT_cci_to_cm() to get value from channel_config_index.
 *
 *  ldac_transport_frame
 *    See LDAC specification of bluetooth A2DP.
 *
 *  Maximum Transmission Unit (MTU)
 *    The minimum MTU that a L2CAP implementation for LDAC shall support is 679 bytes, because LDAC
 *    is optimized with 2-DH5 packet as its target.
 *
 *  frame
 *    An audio signal sequence representing a certain number of PCM audio signals.
 *    Encoding and decoding are processed frame by frame in LDAC. Number of samples in a frame is
 *    determined by sampling frequency as described below.
 *
 *  Sampling frequency and frame sample.
 *    Supported sampling frequencies are 44.1, 48, 88.2 and 96 kHz.
 *    The relationship between sampling frequency and frame sample in LDAC are shown below.
 *       --------------------------------------------------------
 *      | sampling frequency       [kHz] | 44.1 | 48 | 88.2 | 96 |
 *      | frame sample [samples/channel] |     128   |     256   |
 *       --------------------------------------------------------
 *    Though the frame size varies in LDAC core as described in the table, the number of samples in
 *    input PCM signal for encoding is fixed to 128 sample/channel, and it is not affected by
 *    sampling frequency.
 */
#define LDACBT_ENC_LSU 128
#define LDACBT_MAX_LSU 512

/* channel_config_index.
 * Supported value are below.
 */
#define LDAC_CCI_MONO         0 /* MONO */
#define LDAC_CCI_DUAL_CHANNEL 1 /* DUAL CHANNEL */
#define LDAC_CCI_STEREO       2 /* STEREO */

/* PCM format.
 * Supported PCM format are shown below.
 *   - LDACBT_SMPL_FMT_S16 : signed 16bits little endian.
 *   - LDACBT_SMPL_FMT_S24 : signed 24bits little endian.
 *   - LDACBT_SMPL_FMT_S32 : signed 32bits little endian.
 *   - LDACBT_SMPL_FMT_F32 : single-precision floating point.
 * The data sequency must be interleaved format by 1 sample.
 * Ex) 2 channel audio, the data sequences are aligned as below.
 *       seq : |L[0]|R[0]|L[1]|R[1]|...
 */
typedef enum {
    LDACBT_SMPL_FMT_S16 = 0x2,
    LDACBT_SMPL_FMT_S24 = 0x3,
    LDACBT_SMPL_FMT_S32 = 0x4,
    LDACBT_SMPL_FMT_F32 = 0x5,
} LDACBT_SMPL_FMT_T;

#ifndef _DECODE_ONLY
/* Encode Quality Mode Index. (EQMID)
 *  The configuration of encoding in LDAC will be coordinated by "Encode Quality Mode Index"
 *  parameter. Configurable values are shown below.
 *   - LDACBT_EQMID_HQ : Encode setting for High Quality.
 *   - LDACBT_EQMID_SQ : Encode setting for Standard Quality.
 *   - LDACBT_EQMID_MQ : Encode setting for Mobile use Quality.
 */
enum {
    LDACBT_EQMID_HQ = 0,
    LDACBT_EQMID_SQ,
    LDACBT_EQMID_MQ,
    LDACBT_EQMID_NUM,     /* terminater */
};

/* Bit rates
 *  Bit rates in each EQMID are depend on sampling frequency.
 *  In this API specification, these relations are shown below.
 *     ___________________________________________
 *    |                 | Sampling Frequency[kHz] |
 *    |      EQMID      | 44.1, 88.2 |   48, 96   |
 *    +-----------------+------------+------------+
 *    | LDACBT_EQMID_HQ |   909kbps  |   990kbps  |
 *    | LDACBT_EQMID_SQ |   606kbps  |   660kbps  |
 *    | LDACBT_EQMID_MQ |   303kbps  |   330kbps  |
 *     -------------------------------------------
 */
#endif 

/* Maximum size of the "ldac_transport_frame" sequence at transportation. */
#define LDACBT_MAX_NBYTES 1024 /* byte */

/* Maximum number of channel for LDAC */
#define LDAC_PRCNCH 2

/* LDAC handle type */
typedef struct _st_ldacbt_handle * HANDLE_LDAC_BT;

/* Allocation of LDAC handle.
 *  Format
 *      HANDLE_LDAC_BT ldacBT_get_handle( void );
 *  Arguments
 *      None.
 *  Return value
 *      HANDLE_LDAC_BT for success, NULL for failure.
 */
LDACBT_API HANDLE_LDAC_BT ldacBT_get_handle( void );

/* Release of LDAC handle.
 *  Format
 *      void ldacBT_free_handle( HANDLE_LDAC_BT hLdacBt );
 *  Arguments
 *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
 *  Return value
 *      None.
 */
LDACBT_API void ldacBT_free_handle( HANDLE_LDAC_BT hLdacBt );

/* Closing of initialized LDAC handle.
 * Closed handle can be initialized and used again.
 *  Format
 *      void ldacBT_close_handle( HANDLE_LDAC_BT hLdacBt );
 *  Arguments
 *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
 *  Return value
 *      None.
 */
LDACBT_API void ldacBT_close_handle( HANDLE_LDAC_BT hLdacBt );

/* Acquisition of the library version.
 *  Format
 *      int  ldacBT_get_version( void );
 *  Arguments
 *      None.
 *  Return value
 *      int : version number.
 *              23-16 bit : major version
 *              15- 8 bit : minor version
 *               7- 0 bit : branch version
 *              Ex) 0x00010203 -> version 1.02.03
 */
LDACBT_API int  ldacBT_get_version( void );

/* Acquisition of the sampling frequency in current configuration.
#ifdef _ENCODE_ONLY
 * The LDAC handle must be initialized by API function ldacBT_init_handle_encode() prior to
 * calling this function.
#endif
#ifdef _DECODE_ONLY
 * The LDAC handle must be initialized by API function ldacBT_init_handle_decode() prior to
 * calling this function.
#endif
#ifndef _ENCODE_ONLY
#ifndef _DECODE_ONLY
 * The LDAC handle must be initialized by API function ldacBT_init_handle_encode() or
 * ldacBT_init_handle_decode() prior to calling this function.
#endif
#endif
 *  Format
 *      int  ldacBT_get_sampling_freq( HANDLE_LDAC_BT hLdacBt );
 *  Arguments
 *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
 *  Return value
 *      int : sampling frequency in current configuration. -1 for failure.
 */
LDACBT_API int  ldacBT_get_sampling_freq( HANDLE_LDAC_BT hLdacBt );

/* Acquisition of the Bit-rate.
#ifdef _ENCODE_ONLY
 * The LDAC handle must be initialized by API function ldacBT_init_handle_encode() prior to
 * calling this function.
#endif
#ifdef _DECODE_ONLY
 * The LDAC handle must be initialized by API function ldacBT_init_handle_decode() prior to
 * calling this function.
#endif
#ifndef _ENCODE_ONLY
#ifndef _DECODE_ONLY
 * The LDAC handle must be initialized by API function ldacBT_init_handle_encode() or
 * ldacBT_init_handle_decode() prior to calling this function.
#endif
#endif
 *  Format
 *      int  ldacBT_get_bitrate( HANDLE_LDAC_BT hLdacBt );
 *  Arguments
 *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
 *  Return value
 *      int : Bit-rate for previously processed ldac_transport_frame for success. -1 for failure.
 */
LDACBT_API int  ldacBT_get_bitrate( HANDLE_LDAC_BT hLdacBt );

#ifndef _DECODE_ONLY
/* Initialization of a LDAC handle for encode processing.
 * The LDAC handle must be allocated by API function ldacBT_get_handle() prior to calling this API.
 * "mtu" value should be configured to MTU size of AVDTP Transport Channel, which is determined by
 * SRC and SNK devices in Bluetooth transmission.
 * "eqmid" is configured to desired value of "Encode Quality Mode Index".
 * "cm" is configured to channel_mode in LDAC, which is determined by SRC and SNK devices in
 * Bluetooth transmission.
 * "fmt" is configured to input pcm audio format.
 * When the configuration of "mtu", "cm", or "sf" changed, the re-initialization is required. 
 *
 *  Format
 *      int  ldacBT_init_handle_encode( HANDLE_LDAC_BT hLdacBt, int mtu, int eqmid, int cm,
 *                                      LDACBT_SMPL_FMT_T fmt, int sf );
 *  Arguments
 *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
 *      mtu        int               MTU value. Unit:Byte.
 *      eqmid      int               Encode Quality Mode Index.
 *      cm         int               Information of the channel_mode.
 *      fmt        LDACBT_SMPL_FMT_T Audio format type of input pcm.
 *      sf         int               Sampling frequency of input pcm.
 *  Return value
 *      int : 0 for success, -1 for failure.
 */
LDACBT_API int  ldacBT_init_handle_encode( HANDLE_LDAC_BT hLdacBt, int mtu, int eqmid, int cm,
                                           LDACBT_SMPL_FMT_T fmt, int sf );

/* Configuration of Encode Quality Mode Index.
 * The LDAC handle must be initialized by API function ldacBT_init_handle_encode() prior to
 * calling this function.
 * The API function can be called at any time, after the completion of initializing.
 *  Format
 *      int  ldacBT_set_eqmid( HANDLE_LDAC_BT hLdacBt, int eqmid );
 *  Arguments
 *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
 *      eqmid      int               Encode Quality Mode Index.
 *  Return value
 *      int : 0 for success, -1 for failure.
 */
LDACBT_API int  ldacBT_set_eqmid( HANDLE_LDAC_BT hLdacBt, int eqmid );

/* Acquisition of prescribed Encode Quality Mode Index in current configuration.
 * The LDAC handle must be initialized by API function ldacBT_init_handle_encode() prior to
 * calling this function.
 *  Format
 *      int  ldacBT_get_eqmid( HANDLE_LDAC_BT hLdacBt );
 *  Arguments
 *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
 *  Return value
 *      int : Encode Quality Mode Index for success, -1 for failure.
 */
LDACBT_API int  ldacBT_get_eqmid( HANDLE_LDAC_BT hLdacBt );

/* Changing of configuration for Encode Quality Mode Index by one step.
 * The LDAC handle must be initialized by API function ldacBT_init_handle_encode() prior to
 * calling this function.
 * Configuralbe values for "priority" are shown below.
 *   - LDACBT_EQMID_INC_QUALITY    : Adjustment for EQMID by one step for the direction of
 *                                   getting close to LDACBT_EQMID_HQ.
 *   - LDACBT_EQMID_INC_CONNECTION : Adjustment for EQMID by one step for the direction of
 *                                   getting away from LDACBT_EQMID_HQ.
 * For restoring prescribed value for "Encode Quality Mode Index", it must be configured again by
 * API function ldacBT_init_handle_encode() or ldacBT_set_qmode().
 * A transition to the state other than "Encode Quality Mode Index" mention before may be occurred
 * caused by an adjustment using this API function.
 * The API function can be called at any time, after the completion of initializing.
 *  Format
 *      int  ldacBT_alter_eqmid_priority( HANDLE_LDAC_BT hLdacBt, int priority );
 *  Arguments
 *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
 *      priority   int               The direction of changing EQMID.
 *  Return value
 *      int : 0 for success, -1 for failure.
 */
#define LDACBT_EQMID_INC_QUALITY     1
#define LDACBT_EQMID_INC_CONNECTION -1
LDACBT_API int  ldacBT_alter_eqmid_priority( HANDLE_LDAC_BT hLdacBt, int priority );


/* LDAC encode processing.
 * The LDAC handle must be initialized by API function ldacBT_init_handle_encode() prior to calling
 * this API function.
 * <Regarding on a input PCM signal>
 *  Number of samples in input PCM signal for encoding is fixed to 128 samples per channel, and it
 *  is not affected by sampling frequency.
 *
 *  The region in input signal buffer without any PCM signal must be filled with zero, if the
 *  number of samples is less than 128 samples.
 *
 *  The format of PCM signal is determined by "fmt" configured by API function
 *  ldacBT_init_handle_encode().
 *
 *  Total size of referenced PCM signal (in byte) will be set in "pcm_used" on return. The value of
 *  "Number of input samples * Number of channels * sizeof(PCM word length)" will be set in normal.
 *
 *  Finalize processing of encode will be carried out with setting "p_pcm" as zero.
 *
 * <Regarding on output encoded data>
 *  An output data in "ldac_transport_frame" sequence will be set to "p_stream" after several frame
 *  processing. So the output is not necessarily present at each calling of this API function.
 *
 *  The presence of the output can be verified by checking whether the value of "stream_wrote",
 *  representing the number of written bytes for "p_stream", is positive or not.
 *
 *  In addition, encoded data size for output will be determined by the value of "mtu" configured
 *  by API function ldacBT_init_handle_encode().
 *
 *  The number of "ldac_transport_frame" corresponding to "ldac_transport_frame" sequence as output
 *  will be set to "frame_num".
 *
 *  Format
 *      int  ldacBT_encode( HANDLE_LDAC_BT hLdacBt, void *p_pcm, int *pcm_used,
 *                          unsigned char *p_stream, int *stream_sz, int *frame_num );
 *  Arguments
 *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
 *      p_pcm      void *            Input PCM signal sequence
 *      pcm_used   int *             Data size of referenced PCM singnal. Unit:Byte.
 *      p_stream   unsigned char *   Output "ldac_transport_frame" sequence.
 *      stream_sz  int *             Size of output data. Unit:Byte.
 *      frame_num  int *             Number of output "ldac_transport_frame"
 *  Return value
 *      int : 0 for success, -1 for failure.
 */
LDACBT_API int  ldacBT_encode( HANDLE_LDAC_BT hLdacBt, void *p_pcm, int *pcm_used,
                               unsigned char *p_stream, int *stream_sz, int *frame_num );
#endif /* _DECODE_ONLY */
#ifndef _ENCODE_ONLY
/* for decode */
/* Initialization of a LDAC handle for decode processing.
 * The LDAC handle must be allocated by API function ldac_get_handle() prior to calling this
 * function.
 * "cm" is configured to channel_mode in LDAC, which is determined by SRC and SNK devices in
 * Bluetooth transmission.
 * "sf" is configured to sampling frequency, which is determined by SRC and SNK devices in
 * Bluetooth transmission.
 * Reserved arguments must be set to "0".
 *  Format
 *      int  ldacBT_init_handle_decode( HANDLE_LDAC_BT hLdacBt, int cm, int sf, int nshift,
 *                                      int var0, int var1 );
 *  Arguments
 *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
 *      cm         int               Information of the channel_mode.
 *      sf         int               Sampling frequency of input LDAC bit stream.
 *      nshift     int               Reserved, must be "0".
 *      var0       int               Reserved, must be "0".
 *      var1       int               Reserved, must be "0".
 *  Return value
 *      int : 0 for success, -1 for failure.
 */
LDACBT_API int ldacBT_init_handle_decode( HANDLE_LDAC_BT hLdacBt, int cm, int sf,
                                          int var0, int var1, int var2 );

/* LDAC decode processing.
 * The LDAC handle must be initialized by API function ldacBT_init_handle_decode() prior to
 * calling this function.
 * < Regarding on input "ldac_transport_frame" >
 *   The valid data size of "ldac_transport_frame" must be set in "stream_bytes".
 *   Referenced data size of "ldac_transport_frame" for decode processing will be set in
 *   "used_bytes" on return.
 *   As a reading once of "ldac_transport_frame" is performed by internal processing with
 *   looking ahead of two bytes, "LDAC_MAX_NBYTES+2" bytes must be allocated for
 *   "ldac_transport_frame" (p_bs) in API function caller side.
 * < Regarding on output PCM signal >
 *   "fmt" is configured to output pcm audio format.
 *   The size of output PCM signal will be set to "wrote_bytes". The value of
 *   "frame sample" * "Number of channels" * "bit length of pcm sample"/8 will be set in normal.
 *   The first decoded out PCM signal just after initialization will not be present.
 *
 *  Format
 *      int  ldac_decode ( HANDLE_LDAC_BT hLdacBt, unsigned char * p_bs, unsigned char * p_pcm
 *                         LDACBT_SMPL_FMT_T fmt, int bs_bytes,
 *                         int *used_bytes, int *wrote_bytes );
 *  Arguments
 *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
 *      p_bs       unsigned char *   Pointer to "ldac_transport_frame".
 *      p_pcm      unsigned char *   Decoded out PCM signal sequence.
 *      fmt        LDACBT_SMPL_FMT_T Audio format type of output pcm.
 *      bs_bytes    int *            Data size of input "ldac_transport_frame". Unit: Byte.
 *      used_bytes  int *            Data size of referenced "ldac_transport_frame". Unit: Byte.
 *      wrote_bytes int *            Size of decoded out PCM signal. Unit: Byte.
 *  Return value
 *      int : 0 for success, -1 for failure.
 */
LDACBT_API int ldacBT_decode( HANDLE_LDAC_BT hLdacBt, unsigned char *p_bs, unsigned char *p_pcm,
                              LDACBT_SMPL_FMT_T fmt, int bs_bytes,
                              int *used_bytes, int *wrote_bytes );

#endif /* _ENCODE_ONLY */

/* Acquisition of previously established error code.
 * The LDAC handle must be allocated by API function ldacBT_get_handle() prior to calling this function.
 * The details of error code are described below at the end of this header file.
 * Tips for error code handling.
 * The macro function LDACBT_FATAL() is useful to determine whether the error code is Fatal or not.
 *      Ex.) if( LDACBT_FATAL(err) ) // Fatal Error occurred.
 *
 * The macro function LDACBT_ERROR() is useful to determine whether the error occurred or not.
 *      Ex.) if( LDACBT_ERROR(err) ) // Error occurred.
 *
 * The macro function LDACBT_HANDLE_ERR() is useful to get the handle level error code.
 *      Ex.) err_handle_lv = LDACBT_HANDLE_ERR(err);
 *
 * The macro function LDACBT_BLOCK_ERR() is useful to get the block level error code.
 *      Ex.) err_block_lv = LDACBT_BLOCK_ERR(err);
 *
 *  Format
 *      int  ldacBT_get_error_code( HANDLE_LDAC_BT hLdacBt );
 *  Arguments
 *      hLdacBt    HANDLE_LDAC_BT    LDAC handle.
 *  Return value
 *      int : Error code.
 */
LDACBT_API int  ldacBT_get_error_code( HANDLE_LDAC_BT hLdacBt );

/*******************************************************************************
    Error Code
*******************************************************************************/
#define LDACBT_ERR_NONE                     0

/*    Non Fatal Error ***********************************************************/
#define LDACBT_ERR_NON_FATAL                1

/*    Non Fatal Error (Block Level) *********************************************/
#define LDACBT_ERR_BIT_ALLOCATION           5

/*    Non Fatal Error (Handle Level) ********************************************/
#define LDACBT_ERR_NOT_IMPLEMENTED          128
#define LDACBT_ERR_NON_FATAL_ENCODE         132
#define LDACBT_ERR_RESTRICTED_BY_NUM_FRAMES 255

/*    Fatal Error ***************************************************************/
#define LDACBT_ERR_FATAL                    256

/*    Fatal Error (Block Level) *************************************************/
#define LDACBT_ERR_SYNTAX_BAND              260
#define LDACBT_ERR_SYNTAX_GRAD_A            261
#define LDACBT_ERR_SYNTAX_GRAD_B            262
#define LDACBT_ERR_SYNTAX_GRAD_C            263
#define LDACBT_ERR_SYNTAX_GRAD_D            264
#define LDACBT_ERR_SYNTAX_GRAD_E            265
#define LDACBT_ERR_SYNTAX_IDSF              266
#define LDACBT_ERR_SYNTAX_SPEC              267

#define LDACBT_ERR_BIT_PACKING              280

#define LDACBT_ERR_ALLOC_MEMORY             300

/*    Fatal Error (Handle Level) ************************************************/
#define LDACBT_ERR_FATAL_HANDLE             512

#define LDACBT_ERR_ILL_SYNCWORD             516
#define LDACBT_ERR_ILL_SMPL_FORMAT          517
#define LDACBT_ERR_ILL_PARAM                518

#define LDACBT_ERR_ASSERT_SAMPLING_FREQ     530
#define LDACBT_ERR_ASSERT_SUP_SAMPLING_FREQ 531
#define LDACBT_ERR_CHECK_SAMPLING_FREQ      532
#define LDACBT_ERR_ASSERT_CHANNEL_CONFIG    533
#define LDACBT_ERR_CHECK_CHANNEL_CONFIG     534
#define LDACBT_ERR_ASSERT_FRAME_LENGTH      535
#define LDACBT_ERR_ASSERT_SUP_FRAME_LENGTH  536
#define LDACBT_ERR_ASSERT_FRAME_STATUS      537
#define LDACBT_ERR_ASSERT_NSHIFT            538
#define LDACBT_ERR_ASSERT_CHANNEL_MODE      539

#define LDACBT_ERR_ENC_INIT_ALLOC           550
#define LDACBT_ERR_ENC_ILL_GRADMODE         551
#define LDACBT_ERR_ENC_ILL_GRADPAR_A        552
#define LDACBT_ERR_ENC_ILL_GRADPAR_B        553
#define LDACBT_ERR_ENC_ILL_GRADPAR_C        554
#define LDACBT_ERR_ENC_ILL_GRADPAR_D        555
#define LDACBT_ERR_ENC_ILL_NBANDS           556
#define LDACBT_ERR_PACK_BLOCK_FAILED        557

#define LDACBT_ERR_DEC_INIT_ALLOC           570
#define LDACBT_ERR_INPUT_BUFFER_SIZE        571
#define LDACBT_ERR_UNPACK_BLOCK_FAILED      572
#define LDACBT_ERR_UNPACK_BLOCK_ALIGN       573
#define LDACBT_ERR_UNPACK_FRAME_ALIGN       574
#define LDACBT_ERR_FRAME_LENGTH_OVER        575
#define LDACBT_ERR_FRAME_ALIGN_OVER         576


/* LDAC API for Encode */
#define LDACBT_ERR_ALTER_EQMID_LIMITED      21
#define LDACBT_ERR_HANDLE_NOT_INIT          1000
#define LDACBT_ERR_ILL_EQMID                1024
#define LDACBT_ERR_ILL_SAMPLING_FREQ        1025
#define LDACBT_ERR_ILL_NUM_CHANNEL          1026
#define LDACBT_ERR_ILL_MTU_SIZE             1027
/* LDAC API for Decode */
#define LDACBT_ERR_DEC_CONFIG_UPDATED       40


/* Macro Functions for Error Code ********************************************/
#define LDACBT_API_ERR(err)    ((err >> 20) & 0x0FFF)
#define LDACBT_HANDLE_ERR(err) ((err >> 10) & 0x03FF)
#define LDACBT_BLOCK_ERR(err)  ( err & 0x03FF)
#define LDACBT_ERROR(err)      ((LDACBT_ERR_NON_FATAL) <= LDACBT_API_ERR(err) ? 1 : 0)
#define LDACBT_FATAL(err)      ((LDACBT_ERR_FATAL) <= LDACBT_API_ERR(err) ? 1 : 0)



/* Codec Specific Information Elements for LDAC
 * (based on "LDAC Specification of Bluetooth A2DP Rev.2.0.1")
 *                  |  7  |  6  |  5  |  4  |  3  |  2  |  1  |  0  |
 *  service_caps[4] |   SONY ID                                     | Octet0
 *  service_caps[5] |   SONY ID                                     | Octet1
 *  service_caps[6] |   SONY ID                                     | Octet2
 *  service_caps[7] |   SONY ID                                     | Octet3
 *  service_caps[8] |   SONY Specific Codec ID                      | Octet4
 *  service_caps[9] |   SONY Specific Codec ID                      | Octet5
 *  service_caps[A] |   RFA     |   Sampling Frequency              | Octet6
 *  service_caps[B] |   RFA                       | Channel Mode ID | Octet7
 */
#define LDACBT_MEDIA_CODEC_SC_SZ         (10+2)

/* [Octet 0-3] Vendor ID for SONY */
#define LDACBT_VENDOR_ID0 0x2D
#define LDACBT_VENDOR_ID1 0x01
#define LDACBT_VENDOR_ID2 0x0
#define LDACBT_VENDOR_ID3 0x0

/* [Octet 4-5] Vendor Specific A2DP Codec ID for LDAC */
#define LDACBT_CODEC_ID0 0xAA
#define LDACBT_CODEC_ID1 0x00

/* [Octet 6]
 * [b7,b6] : RFA
 *       Reserved for future additions.
 *       Bits with this designation shall be set to zero.
 *       Receivers shall ignore these bits.
 * -----------------------------------------------------
 * [b5-b0] : Sampling frequency and its associated bit field in LDAC are shown below.
 *    |  5  |  4  |  3  |  2  |  1  |  0  |
 *    |  o  |     |     |     |     |     |  44100
 *    |     |  o  |     |     |     |     |  48000
 *    |     |     |  o  |     |     |     |  88200
 *    |     |     |     |  o  |     |     |  96000
 *    |     |     |     |     |  o  |     | 176400
 *    |     |     |     |     |     |  o  | 192000
 *
 */
/* Support for 44.1kHz sampling frequency */
#define LDACBT_SAMPLING_FREQ_044100        0x20
/* Support for 48kHz sampling frequency */
#define LDACBT_SAMPLING_FREQ_048000        0x10
/* Support for 88.2kHz sampling frequency */
#define LDACBT_SAMPLING_FREQ_088200        0x08
/* Support for 96kHz sampling frequency */
#define LDACBT_SAMPLING_FREQ_096000        0x04
/* Support for 176.4kHz sampling frequency */
#define LDACBT_SAMPLING_FREQ_176400        0x02
/* Support for 192kHz sampling frequency */
#define LDACBT_SAMPLING_FREQ_192000        0x01

/* [Octet 7]
 * [b7-b3] : RFA
 *       Reserved for future additions.
 *       Bits with this designation shall be set to zero.
 *       Receivers shall ignore these bits.
 * ------------------------------------------------------
 * [b2-b0] : Channel mode and its associated bit field in LDAC are shown below.
 *    |  2  |  1  |  0  |
 *    |  o  |     |     | MONO
 *    |     |  o  |     | DUAL CHANNEL
 *    |     |     |  o  | STEREO
 */
/* Support for MONO */
#define LDACBT_CHANNEL_MODE_MONO           0x04
/* Support for DUAL CHANNEL */
#define LDACBT_CHANNEL_MODE_DUAL_CHANNEL   0x02
/* Support for STEREO */
#define LDACBT_CHANNEL_MODE_STEREO         0x01

#ifdef __cplusplus
}
#endif
#endif /* _LDACBT_H_ */
