KT24-1110_65E-HA-651B/apps/soundbox/smartbox/smartbox_setting/smartbox_eq_setting.c
2024-11-10 18:44:17 +08:00

270 lines
7.2 KiB
C

#include "app_config.h"
#include "syscfg_id.h"
#include "le_smartbox_module.h"
#include "smartbox_setting_sync.h"
#include "smartbox_setting_opt.h"
#if (TCFG_EQ_ENABLE && SMART_BOX_EN && RCSP_ADV_EQ_SET_ENABLE)
#ifndef CONFIG_MEDIA_NEW_ENABLE
#include "media/eq_config.h"
#else
#include "audio_eq.h"
#endif
/* extern int get_bt_tws_connect_status(); */
/* extern int eq_mode_get_freq(u8 mode, u16 index); */
/* extern s8 eq_mode_get_gain(u8 mode, u16 index); */
/* extern int eq_mode_set_custom_param(u16 index, int gain); */
/* extern int eq_mode_set(u8 mode); */
/* extern int eq_mode_get_cur(void); */
static u8 g_eq_setting_info[11] = {0};
/* int __attribute__((weak)) eq_mode_get_freq(u8 mode, u16 index) */
/* { */
/* return 0; */
/* } */
static void eq_setting_info_deal(u8 *eq_info_data)
{
u8 data;
u8 status;
u8 mode;
if (eq_info_data[0] >> 7) {
status = eq_info_data[2];
} else {
status = *(((u8 *)eq_info_data) + 1);
}
mode = eq_info_data[0] & 0x7F;
if (mode < EQ_MODE_CUSTOM) {
eq_mode_set(mode);
} else {
// 自定义修改EQ参数
if (EQ_MODE_CUSTOM == mode) {
if (status != 0x7F) {
u8 i;
for (i = 0; i < EQ_SECTION_MAX; i++) {
if (eq_info_data[0] >> 7) {
data = eq_info_data[i + 2];
} else {
data = eq_info_data[i + 1];
}
eq_mode_set_custom_param(i, (s8)data);
}
}
eq_mode_set(mode);
}
}
}
static void set_eq_setting(u8 *eq_setting)
{
u8 i;
u8 eq_setting_mode = eq_setting[0];
if (eq_setting_mode >> 7) {
// 多段eq
for (i = 2; i < eq_setting[1] + 2; i++) {
if ((eq_setting[i] > 12) && (eq_setting[i] < -12)) {
eq_setting[i] = 0;
}
}
} else {
// 10段eq
for (i = 1; i < 11; i++) {
if ((eq_setting[i] > 12) && (eq_setting[i] < -12)) {
eq_setting[i] = 0;
}
}
}
memcpy(g_eq_setting_info, eq_setting, 11);
}
static int get_eq_setting(u8 *eq_setting)
{
memcpy(eq_setting, g_eq_setting_info, 11);
return 0;
}
// 1、写入VM
static void update_eq_vm_value(u8 *eq_setting)
{
u8 status = *(((u8 *)eq_setting) + 1);
syscfg_write(CFG_RCSP_ADV_EQ_MODE_SETTING, eq_setting, 1);
/*自定义修改EQ参数*/
if (EQ_MODE_CUSTOM == (eq_setting[0] & 0x7F)) {
if (eq_setting[0] >> 7) {
// 多段eq
status = eq_setting[2];
}
if (status != 0x7F) {
syscfg_write(CFG_RCSP_ADV_EQ_DATA_SETTING, &eq_setting[1], 10);
}
}
}
// 2、同步对端
static void eq_sync(u8 *eq_setting)
{
#if TCFG_USER_TWS_ENABLE
if (get_bt_tws_connect_status()) {
update_smartbox_setting(ATTR_TYPE_EQ_SETTING);
}
#endif
}
static void deal_eq_setting(u8 *eq_setting, u8 write_vm, u8 tws_sync)
{
u8 eq_info[11] = {0};
if (!eq_setting) {
get_eq_setting(eq_info);
} else {
u8 status = *(((u8 *)eq_setting) + 1);
/*自定义修改EQ参数*/
if (EQ_MODE_CUSTOM == (eq_setting[0] & 0x7F)) {
if (eq_setting[0] >> 7) {
status = eq_setting[2];
}
if (status != 0x7F) {
memcpy(eq_info, eq_setting, 11);
set_eq_setting(eq_info);
} else {
g_eq_setting_info[0] = eq_setting[0];
get_eq_setting(eq_info);
}
} else {
memcpy(eq_info, eq_setting, 11);
g_eq_setting_info[0] = eq_setting[0];
}
}
if (write_vm) {
update_eq_vm_value(eq_info);
}
if (tws_sync) {
eq_sync(eq_info);
}
eq_setting_info_deal(eq_info);
}
static u8 app_get_eq_info(u8 *get_eq_info)
{
u16 i;
get_eq_info[0] = eq_mode_get_cur();
u8 data_len = 1;
if (10 == EQ_SECTION_MAX) {
// 10段eq : mode + gain[10byte]
for (i = 0; i < 10; i++) {
get_eq_info[data_len] = eq_mode_get_gain(get_eq_info[0], i);
data_len++;
}
} else {
// 多段eq : mode + num + value(freq[2byte] + gain[1byte])
get_eq_info[1] = EQ_SECTION_MAX;
data_len++;
for (i = 0; i < EQ_SECTION_MAX; i++) {
get_eq_info[data_len] = eq_mode_get_gain(get_eq_info[0], i);
data_len++;
}
get_eq_info[0] |= (1 << 7);
}
return data_len;
}
static u8 app_get_eq_all_info(u8 *get_eq_info)
{
u16 i;
u8 mode = EQ_MODE_NORMAL;
get_eq_info[0] = EQ_SECTION_MAX;
u8 data_len = 1;
// get freq
for (i = 0; i < EQ_SECTION_MAX; i++) {
u16 eq_freq = (u16)(eq_mode_get_freq(mode, i) & ((u16) - 1));
eq_freq = ((((u8 *)&eq_freq)[0] << 8) + ((u8 *)&eq_freq)[1]);
memcpy(get_eq_info + data_len, &eq_freq, sizeof(eq_freq));
data_len += 2;
}
// get gain
for (; mode < EQ_MODE_CUSTOM; mode++) {
get_eq_info[data_len] = mode;
if (10 != EQ_SECTION_MAX) {
get_eq_info[data_len] |= (1 << 7);
}
data_len++;
for (i = 0; i < EQ_SECTION_MAX; i++) {
u8 eq_gain = eq_mode_get_gain(mode, i);
get_eq_info[data_len] = eq_gain;
data_len++;
}
}
// get custom
get_eq_info[data_len] = EQ_MODE_CUSTOM;
if (10 != EQ_SECTION_MAX) {
get_eq_info[data_len] |= (1 << 7);
}
data_len++;
for (i = 0; i < EQ_SECTION_MAX; i++) {
if (10 == EQ_SECTION_MAX) {
get_eq_info[data_len] = g_eq_setting_info[i + 1];
} else {
get_eq_info[data_len] = g_eq_setting_info[i + 2];
}
data_len++;
}
return data_len;
}
static int eq_opt_init(void)
{
u8 eq_setting_vm_info[11] = {0};
u8 eq_setting_info[10] = {0};
u8 eq_setting_mode = 0;
u8 i;
if (smartbox_read_data_from_vm(CFG_RCSP_ADV_EQ_DATA_SETTING, &eq_setting_info, sizeof(eq_setting_info))) {
if (smartbox_read_data_from_vm(CFG_RCSP_ADV_EQ_MODE_SETTING, &eq_setting_mode, sizeof(eq_setting_mode))) {
eq_setting_vm_info[0] = eq_setting_mode;
memcpy(&eq_setting_vm_info[1], eq_setting_info, 10);
set_eq_setting(eq_setting_vm_info);
deal_eq_setting(NULL, 0, 0);
}
}
return 0;
}
static int eq_get_setting_extra_handle(void *setting_data, void *param)
{
u16 data_len = *((u16 *) param);
if (data_len > sizeof(g_eq_setting_info)) {
data_len = app_get_eq_all_info(setting_data);
} else {
data_len = app_get_eq_info(setting_data);
}
return data_len;
}
static SMARTBOX_SETTING_OPT eq_opt = {
.data_len = 11,
.setting_type = ATTR_TYPE_EQ_SETTING,
.syscfg_id = CFG_RCSP_ADV_EQ_DATA_SETTING,
.deal_opt_setting = deal_eq_setting,
.set_setting = set_eq_setting,
.get_setting = get_eq_setting,
.custom_setting_init = eq_opt_init,
.custom_vm_info_update = NULL,
.custom_setting_update = NULL,
.custom_sibling_setting_deal = NULL,
.custom_setting_release = NULL,
.set_setting_extra_handle = NULL,
.get_setting_extra_handle = eq_get_setting_extra_handle,
};
REGISTER_APP_SETTING_OPT(eq_opt);
#endif