初版
This commit is contained in:
@@ -0,0 +1,154 @@
|
||||
#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
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user