342 lines
12 KiB
C
342 lines
12 KiB
C
#ifdef SUPPORT_MS_EXTENSIONS
|
|
#pragma bss_seg(".scene_switch.data.bss")
|
|
#pragma data_seg(".scene_switch.data")
|
|
#pragma const_seg(".scene_switch.text.const")
|
|
#pragma code_seg(".scene_switch.text")
|
|
#endif
|
|
#include "jlstream.h"
|
|
#include "effects/effects_adj.h"
|
|
#include "node_param_update.h"
|
|
#include "scene_switch.h"
|
|
#include "app_main.h"
|
|
#include "effects/audio_vocal_remove.h"
|
|
|
|
static u8 music_scene = 0; //记录音乐场景序号
|
|
static u8 music_eq_preset_index = 0; //记录 Eq0Media EQ配置序号
|
|
static u8 mic_scene = 0; //记录混响场景序号
|
|
|
|
/* 命名规则:节点名+模式名,如 SurBt、CrossAux、Eq0File */
|
|
#if defined(MEDIA_UNIFICATION_EN)&&MEDIA_UNIFICATION_EN
|
|
static char *music_mode[] = {"Media", "Media", "Media", "Media", "Media"};
|
|
#else
|
|
static char *music_mode[] = {"Bt", "Aux", "File", "Fm", "Spd"};
|
|
#endif
|
|
static char *sur_name[] = {"Sur"};
|
|
static char *crossover_name[] = {"Cross"};
|
|
static char *band_merge_name[] = {"Band"};
|
|
static char *bass_treble_name[] = {"Bass"};
|
|
static char *smix_name[] = {"Smix0", "Smix1"};
|
|
static char *eq_name[] = {"Eq0", "Eq1", "Eq2", "Eq3"};
|
|
static char *drc_name[] = {"Drc0", "Drc1", "Drc2", "Drc3", "Drc4"};
|
|
static char *vbass_name[] = {"VBass"};
|
|
static char *gain_name[] = {"Gain"};
|
|
static char *harmonic_exciter_name[] = {"Hexciter"};
|
|
static char *dy_eq_name[] = {"DyEq"};
|
|
|
|
/* 混响模块命名 */
|
|
static char *mic_name = "Eff";
|
|
static char *mic_bass_treble_name[] = {"BassTre"};
|
|
static char *mic_noisegate_name[] = {"NoiseGate"};
|
|
static char *mic_crossover_name[] = {"Crossover"};
|
|
static char *mic_band_merge_name[] = {"BMerge1", "BMerge2"};
|
|
static char *mic_howling_fs_name[] = {"Fshift"};
|
|
static char *mic_howling_supress_name[] = {"Hspress"};
|
|
static char *mic_voice_changer_name[] = {"Vchanger"};
|
|
static char *mic_autotune_name[] = {"Atune"};
|
|
static char *mic_plate_reverb_advance_name[] = {"PReverb"};
|
|
static char *mic_echo_name[] = {"Echo"};
|
|
static char *mic_eq_name[] = {"Eq1", "Eq2", "Eq3", "Eq4", "Eq5", "Eq6"};
|
|
static char *mic_drc_name[] = {"Drc1", "Drc2", "Drc3", "Drc4", "Drc5", "Drc6", "Drc7"};
|
|
|
|
/* 获取音乐模式场景序号 */
|
|
u8 get_current_scene()
|
|
{
|
|
return music_scene;
|
|
}
|
|
/* 获取mic混响模式场景序号 */
|
|
u8 get_mic_current_scene()
|
|
{
|
|
return mic_scene;
|
|
}
|
|
|
|
void set_default_scene(u8 index)
|
|
{
|
|
music_scene = index;
|
|
}
|
|
|
|
/* 获EQ0 配置序号 */
|
|
u8 get_music_eq_preset_index(void)
|
|
{
|
|
return music_eq_preset_index;
|
|
}
|
|
void set_music_eq_preset_index(u8 index)
|
|
{
|
|
music_eq_preset_index = index;
|
|
syscfg_write(CFG_EQ0_INDEX, &music_eq_preset_index, 1);
|
|
}
|
|
|
|
/* 获取当前处于的模式 */
|
|
u8 get_current_mode_index()
|
|
{
|
|
struct app_mode *mode;
|
|
mode = app_get_current_mode();
|
|
switch (mode->name) {
|
|
case APP_MODE_BT:
|
|
return BT_MODE;
|
|
case APP_MODE_LINEIN:
|
|
return AUX_MODE;
|
|
case APP_MODE_MUSIC:
|
|
return FILE_MODE;
|
|
case APP_MODE_FM:
|
|
return FM_MODE;
|
|
case APP_MODE_SPDIF:
|
|
return SPDIF_MODE;
|
|
case APP_MODE_PC:
|
|
return PC_MODE;
|
|
default:
|
|
printf("mode not support scene switch %d\n", mode->name);
|
|
return NOT_SUPPORT_MODE;
|
|
}
|
|
}
|
|
|
|
/* 获取当前模式中场景个数 */
|
|
int get_mode_scene_num()
|
|
{
|
|
struct app_mode *mode;
|
|
mode = app_get_current_mode();
|
|
u16 uuid;
|
|
u8 scene_num;
|
|
switch (mode->name) {
|
|
case APP_MODE_BT:
|
|
uuid = jlstream_event_notify(STREAM_EVENT_GET_PIPELINE_UUID, (int)"a2dp");
|
|
break;
|
|
case APP_MODE_LINEIN:
|
|
uuid = jlstream_event_notify(STREAM_EVENT_GET_PIPELINE_UUID, (int)"linein");
|
|
break;
|
|
case APP_MODE_MUSIC:
|
|
uuid = jlstream_event_notify(STREAM_EVENT_GET_PIPELINE_UUID, (int)"music");
|
|
break;
|
|
case APP_MODE_FM:
|
|
uuid = jlstream_event_notify(STREAM_EVENT_GET_PIPELINE_UUID, (int)"fm");
|
|
break;
|
|
case APP_MODE_SPDIF:
|
|
uuid = jlstream_event_notify(STREAM_EVENT_GET_PIPELINE_UUID, (int)"spdif");
|
|
break;
|
|
case APP_MODE_PC:
|
|
uuid = jlstream_event_notify(STREAM_EVENT_GET_PIPELINE_UUID, (int)"pc_spk");
|
|
break;
|
|
default:
|
|
printf("mode not support scene switch %d\n", mode->name);
|
|
return -1;
|
|
}
|
|
jlstream_read_pipeline_param_group_num(uuid, &scene_num);
|
|
return scene_num;
|
|
}
|
|
|
|
/* 音乐模式:根据参数组序号进行场景切换 */
|
|
void effect_scene_set(u8 scene)
|
|
{
|
|
int scene_num = get_mode_scene_num();
|
|
if (scene >= scene_num) {
|
|
printf("err : without this scene %d\n", scene);
|
|
return;
|
|
}
|
|
|
|
music_scene = scene;
|
|
printf("current music scene : %d\n", scene);
|
|
syscfg_write(CFG_SCENE_INDEX, &music_scene, 1);
|
|
char tar_name[16];
|
|
u8 cur_mode = get_current_mode_index();
|
|
for (int i = 0; i < ARRAY_SIZE(sur_name); i++) {
|
|
sprintf(tar_name, "%s%s", sur_name[i], music_mode[cur_mode]);
|
|
surround_effect_update_parm(scene, tar_name, 0);
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(crossover_name); i++) {
|
|
sprintf(tar_name, "%s%s", crossover_name[i], music_mode[cur_mode]);
|
|
crossover_update_parm(scene, tar_name, 0);
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(band_merge_name); i++) {
|
|
sprintf(tar_name, "%s%s", band_merge_name[i], music_mode[cur_mode]);
|
|
band_merge_update_parm(scene, tar_name, 0);
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(bass_treble_name); i++) {
|
|
sprintf(tar_name, "%s%s", bass_treble_name[i], music_mode[cur_mode]);
|
|
bass_treble_update_parm(scene, tar_name, 0);
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(smix_name); i++) {
|
|
sprintf(tar_name, "%s%s", smix_name[i], music_mode[cur_mode]);
|
|
stereo_mix_update_parm(scene, tar_name, 0);
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(eq_name); i++) {
|
|
sprintf(tar_name, "%s%s", eq_name[i], music_mode[cur_mode]);
|
|
if (i == 0) {
|
|
eq_update_parm(scene, tar_name, music_eq_preset_index);
|
|
} else {
|
|
eq_update_parm(scene, tar_name, 0);
|
|
}
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(drc_name); i++) {
|
|
sprintf(tar_name, "%s%s", drc_name[i], music_mode[cur_mode]);
|
|
drc_update_parm(scene, tar_name, 0);
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(vbass_name); i++) {
|
|
sprintf(tar_name, "%s%s", vbass_name[i], music_mode[cur_mode]);
|
|
virtual_bass_update_parm(scene, tar_name, 0);
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(gain_name); i++) {
|
|
sprintf(tar_name, "%s%s", gain_name[i], music_mode[cur_mode]);
|
|
gain_update_parm(scene, tar_name, 0);
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(harmonic_exciter_name); i++) {
|
|
sprintf(tar_name, "%s%s", harmonic_exciter_name[i], music_mode[cur_mode]);
|
|
harmonic_exciter_update_parm(scene, tar_name, 0);
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(dy_eq_name); i++) {
|
|
sprintf(tar_name, "%s%s", dy_eq_name[i], music_mode[cur_mode]);
|
|
dynamic_eq_update_parm(scene, tar_name, 0);
|
|
}
|
|
}
|
|
|
|
/* 音乐模式:根据参数组个数顺序切换场景 */
|
|
void effect_scene_switch()
|
|
{
|
|
int scene_num = get_mode_scene_num();
|
|
if (!scene_num) {
|
|
puts("scene switch err\n");
|
|
return;
|
|
}
|
|
music_scene++;
|
|
if (music_scene >= scene_num) {
|
|
music_scene = 0;
|
|
}
|
|
effect_scene_set(music_scene);
|
|
}
|
|
|
|
/* mic混响:获取场景个数 */
|
|
static u8 get_mic_effect_scene_num()
|
|
{
|
|
u8 scene_num;
|
|
u16 uuid = jlstream_event_notify(STREAM_EVENT_GET_PIPELINE_UUID, (int)"mic_effect");
|
|
jlstream_read_pipeline_param_group_num(uuid, &scene_num);
|
|
return scene_num;
|
|
}
|
|
|
|
/* mic混响:根据参数组序号进行场景切换 */
|
|
void mic_effect_scene_set(u8 scene)
|
|
{
|
|
u8 scene_num = get_mic_effect_scene_num();
|
|
if (scene >= scene_num) {
|
|
printf("err : without this scene %d\n", scene);
|
|
return;
|
|
}
|
|
mic_scene = scene;
|
|
char tar_name[16];
|
|
for (int i = 0; i < ARRAY_SIZE(mic_noisegate_name); i++) {
|
|
sprintf(tar_name, "%s%s", mic_noisegate_name[i], mic_name);
|
|
noisegate_update_parm(scene, tar_name, 0);
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(mic_crossover_name); i++) {
|
|
sprintf(tar_name, "%s%s", mic_crossover_name[i], mic_name);
|
|
crossover_update_parm(scene, tar_name, 0);
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(mic_band_merge_name); i++) {
|
|
sprintf(tar_name, "%s%s", mic_band_merge_name[i], mic_name);
|
|
band_merge_update_parm(scene, tar_name, 0);
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(mic_howling_fs_name); i++) {
|
|
sprintf(tar_name, "%s%s", mic_howling_fs_name[i], mic_name);
|
|
howling_frequency_shift_update_parm(scene, tar_name, 0);
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(mic_howling_supress_name); i++) {
|
|
sprintf(tar_name, "%s%s", mic_howling_supress_name[i], mic_name);
|
|
howling_suppress_update_parm(scene, tar_name, 0);
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(mic_voice_changer_name); i++) {
|
|
sprintf(tar_name, "%s%s", mic_voice_changer_name[i], mic_name);
|
|
voice_changer_update_parm(scene, tar_name, 0);
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(mic_autotune_name); i++) {
|
|
sprintf(tar_name, "%s%s", mic_autotune_name[i], mic_name);
|
|
autotune_update_parm(scene, tar_name, 0);
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(mic_plate_reverb_advance_name); i++) {
|
|
sprintf(tar_name, "%s%s", mic_plate_reverb_advance_name[i], mic_name);
|
|
reverb_advance_update_parm(scene, tar_name, 0);
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(mic_echo_name); i++) {
|
|
sprintf(tar_name, "%s%s", mic_echo_name[i], mic_name);
|
|
echo_update_parm(scene, tar_name, 0);
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(mic_eq_name); i++) {
|
|
sprintf(tar_name, "%s%s", mic_eq_name[i], mic_name);
|
|
eq_update_parm(scene, tar_name, 0);
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(mic_drc_name); i++) {
|
|
sprintf(tar_name, "%s%s", mic_drc_name[i], mic_name);
|
|
drc_update_parm(scene, tar_name, 0);
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(mic_bass_treble_name); i++) {
|
|
sprintf(tar_name, "%s%s", mic_bass_treble_name[i], mic_name);
|
|
bass_treble_update_parm(scene, tar_name, 0);
|
|
}
|
|
}
|
|
|
|
/* mic混响:根据参数组个数顺序切换场景 */
|
|
void mic_effect_scene_switch()
|
|
{
|
|
int scene_num = get_mic_effect_scene_num();
|
|
if (!scene_num) {
|
|
puts("scene switch err\n");
|
|
return;
|
|
}
|
|
mic_scene++;
|
|
if (mic_scene >= scene_num) {
|
|
mic_scene = 0;
|
|
}
|
|
mic_effect_scene_set(mic_scene);
|
|
}
|
|
|
|
|
|
static u8 vocla_remove_mark = 0xff;//
|
|
//实时更新media数据流中人声消除bypass参数,启停人声消除功能
|
|
void music_vocal_remover_switch(void)
|
|
{
|
|
#if TCFG_VOCAL_REMOVER_NODE_ENABLE
|
|
vocal_remover_param_tool_set cfg = {0};
|
|
char *vocal_node_name = "VocalRemovMedia";
|
|
int ret = jlstream_read_form_data(0, vocal_node_name, 0, &cfg);
|
|
if (!ret) {
|
|
printf("read parm err, %s, %s\n", __func__, vocal_node_name);
|
|
return;
|
|
}
|
|
if (vocla_remove_mark == 0xff) {
|
|
vocla_remove_mark = cfg.is_bypass;
|
|
}
|
|
vocla_remove_mark ^= 1;
|
|
cfg.is_bypass = vocla_remove_mark;
|
|
jlstream_set_node_param(NODE_UUID_VOCAL_REMOVER, vocal_node_name, &cfg, sizeof(cfg));
|
|
#endif
|
|
}
|
|
//media数据流启动后更新人声消除bypass参数
|
|
void music_vocal_remover_update_parm()
|
|
{
|
|
#if TCFG_VOCAL_REMOVER_NODE_ENABLE
|
|
vocal_remover_param_tool_set cfg = {0};
|
|
char *vocal_node_name = "VocalRemovMedia";
|
|
int ret = jlstream_read_form_data(0, vocal_node_name, 0, &cfg);
|
|
if (!ret) {
|
|
printf("read parm err, %s, %s\n", __func__, vocal_node_name);
|
|
return;
|
|
}
|
|
if (vocla_remove_mark == 0xff) {
|
|
vocla_remove_mark = cfg.is_bypass;
|
|
}
|
|
cfg.is_bypass = vocla_remove_mark;
|
|
jlstream_set_node_param(NODE_UUID_VOCAL_REMOVER, vocal_node_name, &cfg, sizeof(cfg));
|
|
#endif
|
|
}
|
|
u8 get_music_vocal_remover_statu(void)
|
|
{
|
|
return vocla_remove_mark ;
|
|
}
|