Audio Software Codecs
Loading...
Searching...
No Matches
Overview

Audio Software Codec middleware enables encoding and decoding for audio compression for a given streaming media coding format, which reduces throughput, storage and RAM resources. These codecs are used to decode audio from cloud services, stored files or external peripherals. The user can choose what kind of encoding and decoding scheme to use from the list of supported audio codecs.

Prerequisite

Please refer to README.md for quick start on platforms

Code Snippets

Code Snippet 1: Encoder app example

This code snippet demonstrates how to initialize the codec middleware for encoder with configuration for OPUS , SBC codec and get the encoded data back

#ifdef ENABLE_SBC_ENCODE
cy_asc_sbc_encode_config_t get_sbc_config( bool wide_band, uint8_t quality, uint32_t n_channels, uint32_t sample_rate );
#endif
cy_rslt_t snippet_encoder_app_example(void)
{
cy_audio_sw_codec_t enc_handle = NULL;
cy_rslt_t result;
uint32_t recommended_in_size = 0;
uint32_t min_out_size = 0;
uint32_t in_size = 0;
uint32_t out_size = 0;
uint8_t *input_buff = NULL;
uint8_t *output_buff = NULL;
#ifdef ENABLE_OPUS_ENCODE
#elif ENABLE_SBC_ENCODE
enc_config.codec_specific_config.sbc = get_sbc_config( false, 0, 2, 16000 );
#endif
do
{
(void *)&enc_config,
&enc_handle);
if(CY_RSLT_SUCCESS != result)
{
printf("Sw encoder init failed\n");
break;
}
result = cy_audio_sw_codec_get_encoder_recommended_inbuf_size(enc_handle, &recommended_in_size);
if(CY_RSLT_SUCCESS != result)
{
printf("failed to get recommended input buf sz.\n");
break;
}
result = cy_audio_sw_codec_get_encoder_recommended_outbuf_size(enc_handle, recommended_in_size, &min_out_size);
if(CY_RSLT_SUCCESS != result)
{
printf("failed to get recommended output buf sz.\n");
break;
}
input_buff = (uint8_t*)malloc(recommended_in_size);
if(NULL == input_buff)
{
printf("out of memory.\n");
break;
}
output_buff = (uint8_t*)malloc(min_out_size);
if(NULL == output_buff)
{
printf("out of memory.\n");
break;
}
/* Encoding Loop */
while(true)
{
result = cy_audio_sw_codec_encode(enc_handle, (uint8_t *)input_buff, &in_size, (uint8_t *)output_buff, &out_size);
if(CY_RSLT_SUCCESS != result)
{
printf("Encode failed\n");
break;
}
}
}while(false);
result = cy_audio_sw_codec_deinit(&enc_handle);
if(CY_RSLT_SUCCESS != result)
{
printf("sw encoder deinit failed\n");
}
if(input_buff)
{
free(input_buff);
input_buff = NULL;
}
if(output_buff)
{
free(output_buff);
output_buff = NULL;
}
return result;
}
#ifdef ENABLE_SBC_ENCODE
cy_asc_sbc_encode_config_t get_sbc_config( bool wide_band, uint8_t quality, uint32_t n_channels, uint32_t sample_rate )
{
cy_asc_sbc_encode_config_t sbc_config;
if(true == wide_band)
{
sbc_config.sbc_mode = 1;
sbc_config.uui_id = 2;
}
else
{
//A2DP
sbc_config.allocation_method = 0;
sbc_config.sbc_mode = 0;
sbc_config.sub_blocks = 16;
sbc_config.sub_bands = 8;
if(0 == quality) // Medium
{
if(1 == n_channels && sample_rate == 48000)
{
sbc_config.bit_pool = 18;
sbc_config.channel_mode = 0;
}
else if(1 == n_channels && sample_rate == 44100)
{
sbc_config.bit_pool = 19;
sbc_config.channel_mode = 0;
}
else if(2 == n_channels && sample_rate == 48000)
{
sbc_config.bit_pool = 33;
sbc_config.channel_mode = 3;
}
else if(2 == n_channels && sample_rate == 44100)
{
sbc_config.bit_pool = 35;
sbc_config.channel_mode = 3;
}
}
else if(1 == quality) // High
{
if(1 == n_channels && sample_rate == 48000)
{
sbc_config.bit_pool = 29;
sbc_config.channel_mode = 0;
}
else if(1 == n_channels && sample_rate == 44100)
{
sbc_config.bit_pool = 31;
sbc_config.channel_mode = 0;
}
else if(2 == n_channels && sample_rate == 48000)
{
sbc_config.bit_pool = 51;
sbc_config.channel_mode = 3;
}
else if(2 == n_channels && sample_rate == 44100)
{
sbc_config.bit_pool = 53;
sbc_config.channel_mode = 3;
}
}
}
return sbc_config;
}
#endif
#define CY_RSLT_ASC_OUT_OF_MEMORY
Out of memory.
Definition cy_audio_sw_codecs_errors.h:67
@ CY_AUDIO_CODEC_BITRATE_96kbps
bitrate @ 96kbps
Definition cy_audio_sw_codecs.h:254
@ CY_AUDIO_CODEC_SAMPLING_RATE_16000HZ
Sampling Rate 16KHz.
Definition cy_audio_sw_codecs.h:150
@ CY_AUDIO_CODEC_FRAME_MS_20
Frame 20 ms.
Definition cy_audio_sw_codecs.h:294
@ CY_AUDIO_CODEC_CHANNEL_STEREO
Channels Stereo.
Definition cy_audio_sw_codecs.h:190
@ CY_AUDIO_CODEC_OPERATION_ENCODE
Encode operation.
Definition cy_audio_sw_codecs.h:119
@ CY_AUDIO_CODEC_BITWIDTH_16
Bitwidth 16 bit.
Definition cy_audio_sw_codecs.h:214
@ CY_AUDIO_CODEC_TYPE_OPUS
OPUS.
Definition cy_audio_sw_codecs.h:87
@ CY_AUDIO_CODEC_TYPE_SBC
SBC.
Definition cy_audio_sw_codecs.h:91
cy_rslt_t cy_audio_sw_codec_get_encoder_recommended_inbuf_size(cy_audio_sw_codec_t handle, uint32_t *recommended_in_size)
Get the recommended size of the input buffer for the codec encode operation configured.
cy_rslt_t cy_audio_sw_codec_deinit(cy_audio_sw_codec_t *handle)
Deinit the software codec instance.
cy_rslt_t cy_audio_sw_codec_get_encoder_recommended_outbuf_size(cy_audio_sw_codec_t handle, uint32_t in_size, uint32_t *recommended_out_size)
Get the recommended size of the output buffer for the codec encoding operation configured.
cy_rslt_t cy_audio_sw_codec_encode(cy_audio_sw_codec_t handle, uint8_t *in_pcm_buff, uint32_t *in_pcm_data_len, uint8_t *out_buff, uint32_t *outbuf_len)
Encodes the input PCM data and returns the encoded data.
cy_rslt_t cy_audio_sw_codec_init(cy_audio_sw_codec_operation_t codec_operation, void *codec_config, cy_audio_sw_codec_t *handle)
Initializes the software codec for either decoding and encoding.
void * cy_audio_sw_codec_t
audio software codec instance
Definition cy_audio_sw_codecs.h:315
Audio Software Codec Encode configuration.
Definition cy_audio_sw_codecs.h:473
cy_audio_sw_codec_type_t codec_type
Codec type used for encoding, Following are the supported codecs for Encoding:
Definition cy_audio_sw_codecs.h:481
cy_audio_sw_codec_frame_ms_t frame_ms
frame duration informations
Definition cy_audio_sw_codecs.h:506
cy_audio_sw_codec_sampling_rate_t sampling_rate
Sampling rate.
Definition cy_audio_sw_codecs.h:486
cy_audio_sw_codec_bitwidth_t bitwidth
Bit-width informations.
Definition cy_audio_sw_codecs.h:496
cy_audio_sw_codec_channel_t channel
Channel informations.
Definition cy_audio_sw_codecs.h:491
cy_audio_sw_codec_specific_encode_config_t codec_specific_config
Additional config based on codec usage.
Definition cy_audio_sw_codecs.h:511
cy_audio_sw_codec_bitrate_t bitrate
bitrate informations
Definition cy_audio_sw_codecs.h:501
cy_asc_sbc_encode_config_t sbc
Additional struct specific to SBC codec.
Definition cy_audio_sw_codecs.h:376

Code Snippet 2: Decoder app example

This code snippet demonstrates how to initialize the codec middleware for decoder with configuration for SBC codec and get the encoded data back

cy_rslt_t cy_audio_sw_codec_decode_stream_info_cb(
void *callback_user_arg);
cy_rslt_t snippet_decoder_app_example(void)
{
cy_audio_sw_codec_t dec_handle = NULL;
cy_rslt_t result;
uint32_t recommended_out_size;
uint32_t in_size = 0;
uint32_t out_size = 0;
uint32_t size = 1024;
uint8_t *input_buff = NULL;
uint8_t *output_buff = NULL;
dec_config.stream_info = cy_audio_sw_codec_decode_stream_info_cb;
dec_config.callback_user_arg = (void*)NULL;
#ifdef ENABLE_SBC_DECODE
{
dec_config.codec_specific_config.sbc.sbc_mode = 0;
}
/*
{
//Wide band mode
dec_config.codec_specific_config.sbc.sbc_mode = 1;
dec_config.codec_specific_config.sbc.uui_id = 2;
}
*/
#endif
do
{
(void *)&dec_config,
&dec_handle);
if(CY_RSLT_SUCCESS != result)
{
printf("sw encoder init failed\n");
break;
}
input_buff = (uint8_t*)malloc(size);
if(NULL == input_buff)
{
printf("out of memory.\n");
break;
}
dec_handle,
input_buff,
&in_size,
&stream_info);
if(CY_RSLT_SUCCESS != result)
{
printf("Parse header failed.\n");
break;
}
dec_handle,&stream_info, &recommended_out_size);
if(CY_RSLT_SUCCESS != result)
{
printf("recommended size\n");
break;
}
output_buff = (uint8_t *)malloc(sizeof(uint8_t)*recommended_out_size);
if(NULL == output_buff)
{
printf("out of memory - out buff\n");
break;
}
while(true)
{
result = cy_audio_sw_codec_decode(dec_handle, input_buff, &in_size, output_buff, &out_size);
if(CY_RSLT_SUCCESS != result)
{
printf("Decoding failed\n");
break;
}
}
}while(false);
result = cy_audio_sw_codec_deinit(&dec_handle);
if(CY_RSLT_SUCCESS != result)
{
printf("sw encoder deinit failed\n");
}
if(input_buff)
{
free(input_buff);
input_buff = NULL;
}
if(output_buff)
{
free(output_buff);
output_buff = NULL;
}
return result;
}
cy_rslt_t cy_audio_sw_codec_decode_stream_info_cb(
void *callback_user_arg)
{
printf("StreamInfoCbk:: Hdl:%p StreamInfo{Bitwidth:%d,Ch:%d,SampleR:%d}"
,handle,stream_info.bitwidth,stream_info.channel,stream_info.sampling_rate );
return CY_RSLT_SUCCESS;
}
@ CY_AUDIO_CODEC_OPERATION_DECODE
Decode operation.
Definition cy_audio_sw_codecs.h:123
cy_rslt_t cy_audio_sw_codec_get_decoder_recommended_outbuf_size(cy_audio_sw_codec_t handle, cy_audio_sw_codec_stream_info_t *stream_info, uint32_t *recommended_out_size)
Get the recommended size of the output buffer for the codec decoding operation configured.
cy_rslt_t cy_audio_sw_codec_decode_stream_info_header(cy_audio_sw_codec_t handle, uint8_t *in_encoded_buff, uint32_t *in_encoded_data_len, cy_audio_sw_codec_stream_info_t *stream_info)
Parse the header information from the input encoded data, used with decoder.
cy_rslt_t cy_audio_sw_codec_decode(cy_audio_sw_codec_t handle, uint8_t *in_encoded_buff, uint32_t *in_encoded_data_len, uint8_t *out_buff, uint32_t *outbuf_len)
Decodes the encoded data and returns the PCM data.
Audio Software Codec Decode configuration.
Definition cy_audio_sw_codecs.h:519
cy_audio_sw_codec_channel_t channel
Channel informations of the data.
Definition cy_audio_sw_codecs.h:557
cy_audio_sw_codec_bitwidth_t bitwidth
Bitwidth information.
Definition cy_audio_sw_codecs.h:575
cy_audio_sw_codec_specific_decode_config_t codec_specific_config
Additional config based on codec usage.
Definition cy_audio_sw_codecs.h:598
void * callback_user_arg
Application specific user argument, Passed argument will be passed back to application in the MW call...
Definition cy_audio_sw_codecs.h:582
cy_audio_sw_codec_sampling_rate_t sampling_rate
Sampling rate of the data.
Definition cy_audio_sw_codecs.h:540
cy_audio_sw_codec_decode_stream_info_callback_t stream_info
Decoded stream information callback.
Definition cy_audio_sw_codecs.h:592
cy_audio_sw_codec_type_t codec_type
Codec used for decoding.
Definition cy_audio_sw_codecs.h:523
Stream information.
Definition cy_audio_sw_codecs.h:412
cy_audio_sw_codec_sampling_rate_t sampling_rate
Sampling Rate.
Definition cy_audio_sw_codecs.h:416
cy_audio_sw_codec_bitwidth_t bitwidth
Audio bit-width information.
Definition cy_audio_sw_codecs.h:424
cy_audio_sw_codec_channel_t channel
Audio channel information.
Definition cy_audio_sw_codecs.h:420
cy_asc_sbc_decode_config_t sbc
Additional struct specific to SBC codec.
Definition cy_audio_sw_codecs.h:343