/*
* Copyright (C) 2013 - 2016 Sony Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _LDACBT_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
* LDAC encode processing.
*
* 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.
*
*
* 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.
* - 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.
*
* - 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.
*
*
* 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;
/* 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 |
* -------------------------------------------
*/
/* 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.
* The LDAC handle must be initialized by API function ldacBT_init_handle_encode() prior to
* calling this function.
* 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.
* The LDAC handle must be initialized by API function ldacBT_init_handle_encode() prior to
* calling this function.
* 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 );
/* 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 );
/* 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
/* 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_ */