668 lines
28 KiB
C
668 lines
28 KiB
C
|
/*******************************************************************************
|
||
|
*
|
||
|
* 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_ */
|