155 lines
3.8 KiB
C
155 lines
3.8 KiB
C
#ifdef SUPPORT_MS_EXTENSIONS
|
|
#pragma bss_seg(".bt_audio_energy_detection.data.bss")
|
|
#pragma data_seg(".bt_audio_energy_detection.data")
|
|
#pragma const_seg(".bt_audio_energy_detection.text.const")
|
|
#pragma code_seg(".bt_audio_energy_detection.text")
|
|
#endif
|
|
#include "system/includes.h"
|
|
#include "btstack/a2dp_media_codec.h"
|
|
#include "bt_audio_energy_detection.h"
|
|
#include "app_config.h"
|
|
|
|
|
|
extern int aac_decoder_energy_detect_open(void *packet, u16 frame_len);
|
|
extern int aac_decoder_energy_detect_run(void *packet, u16 frame_len, u32 *energy);
|
|
extern void aac_decoder_energy_detect_close();
|
|
extern int ldac_decoder_energy_detect_open(void *packet, u16 frame_len);
|
|
extern int ldac_decoder_energy_detect_run(void *packet, u16 frame_len, u32 *energy);
|
|
extern void ldac_decoder_energy_detect_close();
|
|
|
|
extern unsigned int sbc_cal_energy(u8 *codedata, int len);
|
|
|
|
int sbc_energy_detect(u8 *packet, u16 size)
|
|
{
|
|
int length;
|
|
int frame_len;
|
|
int ret;
|
|
u8 *beg;
|
|
|
|
if (packet == NULL) {
|
|
return 0;
|
|
}
|
|
length = a2dp_media_get_rtp_header_len(A2DP_CODEC_SBC, packet, size);
|
|
beg = packet + length;
|
|
while (*beg != 0x9c) {
|
|
beg++;
|
|
if (beg >= packet + size) {
|
|
return 0;
|
|
}
|
|
}
|
|
//printf("<bitpool:%d>",beg[2]);
|
|
frame_len = sbc_frame_length(beg[1], beg[2]);
|
|
ret = sbc_cal_energy(beg, frame_len);
|
|
while (ret < 0) {
|
|
beg += frame_len;
|
|
if (beg + frame_len > packet + size) {
|
|
return 0;
|
|
}
|
|
ret = sbc_cal_energy(beg, frame_len);
|
|
}
|
|
/* printf("sbc --- energy = %d\n",ret); */
|
|
return ret;
|
|
}
|
|
|
|
static int aac_energy_detect(u8 *packet, u16 size)
|
|
{
|
|
int rtp_length;
|
|
int frame_len;
|
|
u32 ret = 0;
|
|
int err;
|
|
u8 *beg;
|
|
if (packet == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
rtp_length = a2dp_media_get_rtp_header_len(A2DP_CODEC_MPEG24, packet, size);
|
|
beg = packet + rtp_length;
|
|
frame_len = size - rtp_length;
|
|
|
|
err = aac_decoder_energy_detect_open(beg, frame_len);
|
|
if (err) {
|
|
return 0;
|
|
}
|
|
err = aac_decoder_energy_detect_run(beg, frame_len, &ret);
|
|
if (err) {
|
|
return 0;
|
|
}
|
|
/* printf("aac --- energy = %d\n",ret); */
|
|
return ret;
|
|
}
|
|
|
|
static int ldac_energy_detect(u8 *packet, u16 size)
|
|
{
|
|
int rtp_length;
|
|
int frame_len;
|
|
u32 ret = 0;
|
|
int err;
|
|
u8 *beg;
|
|
|
|
if (packet == NULL) {
|
|
return 0;
|
|
}
|
|
rtp_length = a2dp_media_get_rtp_header_len(A2DP_CODEC_LDAC, packet, size);
|
|
beg = packet + rtp_length + 1;
|
|
frame_len = size - rtp_length - 1;
|
|
err = ldac_decoder_energy_detect_open(beg, frame_len);
|
|
if (err) {
|
|
return 0;
|
|
}
|
|
err = ldac_decoder_energy_detect_run(beg, frame_len, &ret);
|
|
//printf("ldac --- energy = %d\n",ret);
|
|
if (err) {
|
|
return 0;
|
|
}
|
|
return ret;
|
|
|
|
}
|
|
|
|
int bt_audio_energy_detect_run(u8 codec_type, void *packet, u16 frame_len)
|
|
{
|
|
#ifdef CONFIG_FPGA_ENABLE
|
|
return 0;
|
|
#else
|
|
if (packet == NULL) {
|
|
return 0;
|
|
}
|
|
if (codec_type == A2DP_CODEC_SBC) {
|
|
#if TCFG_A2DP_SBC_SILENCE_DETECT_ENABLE
|
|
return sbc_energy_detect(packet, frame_len);
|
|
#endif
|
|
|
|
} else if (codec_type == A2DP_CODEC_MPEG24) {
|
|
#if TCFG_A2DP_AAC_SILENCE_DETECT_ENABLE
|
|
return aac_energy_detect(packet, frame_len);
|
|
#endif
|
|
} else if (codec_type == A2DP_CODEC_LDAC) {
|
|
#if TCFG_A2DP_LDAC_SILENCE_DETECT_ENABLE
|
|
return ldac_energy_detect(packet, frame_len);
|
|
#endif
|
|
} else {
|
|
//other format todo
|
|
}
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
void bt_audio_energy_detect_close(u8 codec_type)
|
|
{
|
|
#ifdef CONFIG_FPGA_ENABLE
|
|
return ;
|
|
#else
|
|
if (codec_type == A2DP_CODEC_MPEG24) {
|
|
#if TCFG_A2DP_AAC_SILENCE_DETECT_ENABLE
|
|
aac_decoder_energy_detect_close();
|
|
#endif
|
|
} else if (codec_type == A2DP_CODEC_LDAC) {
|
|
#if TCFG_A2DP_LDAC_SILENCE_DETECT_ENABLE
|
|
ldac_decoder_energy_detect_close();
|
|
#endif
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
|