提交 51dd5e87 authored 作者: Anthony Minessale's avatar Anthony Minessale

FS-9922: [mod_conference] Auto Energy Level #resolve

上级 5c51617d
...@@ -177,6 +177,8 @@ SWITCH_DECLARE(void) switch_mux_channels(int16_t *data, switch_size_t samples, u ...@@ -177,6 +177,8 @@ SWITCH_DECLARE(void) switch_mux_channels(int16_t *data, switch_size_t samples, u
#define switch_resample_calc_buffer_size(_to, _from, _srclen) ((uint32_t)(((float)_to / (float)_from) * (float)_srclen) * 2) #define switch_resample_calc_buffer_size(_to, _from, _srclen) ((uint32_t)(((float)_to / (float)_from) * (float)_srclen) * 2)
SWITCH_DECLARE(void) switch_agc_set(switch_agc_t *agc, uint32_t energy_avg,
uint32_t low_energy_point, uint32_t margin, uint32_t change_factor, uint32_t period_len);
SWITCH_DECLARE(switch_status_t) switch_agc_create(switch_agc_t **agcP, uint32_t energy_avg, SWITCH_DECLARE(switch_status_t) switch_agc_create(switch_agc_t **agcP, uint32_t energy_avg,
uint32_t low_energy_point, uint32_t margin, uint32_t change_factor, uint32_t period_len); uint32_t low_energy_point, uint32_t margin, uint32_t change_factor, uint32_t period_len);
SWITCH_DECLARE(void) switch_agc_destroy(switch_agc_t **agcP); SWITCH_DECLARE(void) switch_agc_destroy(switch_agc_t **agcP);
......
...@@ -490,7 +490,6 @@ void conference_cdr_del(conference_member_t *member) ...@@ -490,7 +490,6 @@ void conference_cdr_del(conference_member_t *member)
{ {
switch_mutex_lock(member->conference->member_mutex); switch_mutex_lock(member->conference->member_mutex);
if (member->cdr_node) { if (member->cdr_node) {
if (member->channel) { if (member->channel) {
switch_channel_get_variables(member->channel, &member->cdr_node->var_event); switch_channel_get_variables(member->channel, &member->cdr_node->var_event);
} }
......
...@@ -43,34 +43,11 @@ ...@@ -43,34 +43,11 @@
int conference_member_noise_gate_check(conference_member_t *member) int conference_member_noise_gate_check(conference_member_t *member)
{ {
int r = 0; int r = (int32_t)member->score > member->energy_level;
if (member->conference->agc_level && member->agc_volume_in_level != 0) {
int target_score = 0;
target_score = (member->energy_level + (25 * member->agc_volume_in_level));
if (target_score < 0) target_score = 0;
r = (int)member->score > target_score;
} else {
r = (int32_t)member->score > member->energy_level;
}
return r; return r;
} }
void conference_member_clear_avg(conference_member_t *member)
{
member->avg_score = 0;
member->avg_itt = 0;
member->avg_tally = 0;
member->agc_concur = 0;
}
void conference_member_do_binding(conference_member_t *member, conference_key_callback_t handler, const char *digits, const char *data) void conference_member_do_binding(conference_member_t *member, conference_key_callback_t handler, const char *digits, const char *data)
{ {
key_binding_t *binding; key_binding_t *binding;
...@@ -455,33 +432,6 @@ conference_member_t *conference_member_get_by_var(conference_obj_t *conference, ...@@ -455,33 +432,6 @@ conference_member_t *conference_member_get_by_var(conference_obj_t *conference,
return member; return member;
} }
void conference_member_check_agc_levels(conference_member_t *member)
{
int x = 0;
if (!member->avg_score) return;
if ((int)member->avg_score < member->conference->agc_level - 100) {
member->agc_volume_in_level++;
switch_normalize_volume_granular(member->agc_volume_in_level);
x = 1;
} else if ((int)member->avg_score > member->conference->agc_level + 100) {
member->agc_volume_in_level--;
switch_normalize_volume_granular(member->agc_volume_in_level);
x = -1;
}
if (x) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG7,
"AGC %s:%d diff:%d level:%d cur:%d avg:%d vol:%d %s\n",
member->conference->name,
member->id, member->conference->agc_level - member->avg_score, member->conference->agc_level,
member->score, member->avg_score, member->agc_volume_in_level, x > 0 ? "+++" : "---");
conference_member_clear_avg(member);
}
}
void conference_member_check_channels(switch_frame_t *frame, conference_member_t *member, switch_bool_t in) void conference_member_check_channels(switch_frame_t *frame, conference_member_t *member, switch_bool_t in)
{ {
if (member->conference->channels != member->read_impl.number_of_channels || conference_utils_member_test_flag(member, MFLAG_POSITIONAL)) { if (member->conference->channels != member->read_impl.number_of_channels || conference_utils_member_test_flag(member, MFLAG_POSITIONAL)) {
...@@ -701,6 +651,10 @@ switch_status_t conference_member_add(conference_obj_t *conference, conference_m ...@@ -701,6 +651,10 @@ switch_status_t conference_member_add(conference_obj_t *conference, conference_m
member->conference = conference; member->conference = conference;
member->next = conference->members; member->next = conference->members;
member->energy_level = conference->energy_level; member->energy_level = conference->energy_level;
member->auto_energy_level = conference->auto_energy_level;
member->max_energy_level = conference->max_energy_level;
member->max_energy_hit_trigger = conference->max_energy_hit_trigger;
member->burst_mute_count = conference->burst_mute_count;;
member->score_iir = 0; member->score_iir = 0;
member->verbose_events = conference->verbose_events; member->verbose_events = conference->verbose_events;
member->video_layer_id = -1; member->video_layer_id = -1;
...@@ -713,6 +667,7 @@ switch_status_t conference_member_add(conference_obj_t *conference, conference_m ...@@ -713,6 +667,7 @@ switch_status_t conference_member_add(conference_obj_t *conference, conference_m
switch_mutex_unlock(conference->member_mutex); switch_mutex_unlock(conference->member_mutex);
conference_cdr_add(member); conference_cdr_add(member);
conference_api_set_agc(member, NULL);
if (!conference_utils_member_test_flag(member, MFLAG_NOCHANNEL)) { if (!conference_utils_member_test_flag(member, MFLAG_NOCHANNEL)) {
...@@ -1125,6 +1080,10 @@ switch_status_t conference_member_del(conference_obj_t *conference, conference_m ...@@ -1125,6 +1080,10 @@ switch_status_t conference_member_del(conference_obj_t *conference, conference_m
conference_member_del_relationship(member, 0); conference_member_del_relationship(member, 0);
conference_cdr_del(member); conference_cdr_del(member);
if (member->agc) {
switch_agc_destroy(&member->agc);
}
#ifdef OPENAL_POSITIONING #ifdef OPENAL_POSITIONING
if (member->al && member->al->device) { if (member->al && member->al->device) {
......
...@@ -130,6 +130,8 @@ void conference_utils_set_mflags(const char *flags, member_flag_t *f) ...@@ -130,6 +130,8 @@ void conference_utils_set_mflags(const char *flags, member_flag_t *f)
f[MFLAG_ENDCONF] = 1; f[MFLAG_ENDCONF] = 1;
} else if (!strcasecmp(argv[i], "mintwo")) { } else if (!strcasecmp(argv[i], "mintwo")) {
f[MFLAG_MINTWO] = 1; f[MFLAG_MINTWO] = 1;
} else if (!strcasecmp(argv[i], "talk-data-events")) {
f[MFLAG_TALK_DATA_EVENTS] = 1;
} else if (!strcasecmp(argv[i], "video-bridge")) { } else if (!strcasecmp(argv[i], "video-bridge")) {
f[MFLAG_VIDEO_BRIDGE] = 1; f[MFLAG_VIDEO_BRIDGE] = 1;
} else if (!strcasecmp(argv[i], "ghost")) { } else if (!strcasecmp(argv[i], "ghost")) {
......
...@@ -212,6 +212,7 @@ typedef enum { ...@@ -212,6 +212,7 @@ typedef enum {
MFLAG_ROTATE_VIDEO, MFLAG_ROTATE_VIDEO,
MFLAG_INDICATE_DEAF, MFLAG_INDICATE_DEAF,
MFLAG_INDICATE_UNDEAF, MFLAG_INDICATE_UNDEAF,
MFLAG_TALK_DATA_EVENTS,
/////////////////////////// ///////////////////////////
MFLAG_MAX MFLAG_MAX
} member_flag_t; } member_flag_t;
...@@ -652,6 +653,16 @@ typedef struct conference_obj { ...@@ -652,6 +653,16 @@ typedef struct conference_obj {
switch_thread_rwlock_t *rwlock; switch_thread_rwlock_t *rwlock;
uint32_t count; uint32_t count;
int32_t energy_level; int32_t energy_level;
int32_t auto_energy_level;
int32_t max_energy_level;
uint32_t agc_level;
uint32_t agc_low_energy_level;
uint32_t agc_margin;
uint32_t agc_change_factor;
uint32_t agc_period_len;
uint32_t max_energy_hit_trigger;
uint32_t auto_energy_sec;
uint32_t burst_mute_count;
uint8_t min; uint8_t min;
switch_speech_handle_t lsh; switch_speech_handle_t lsh;
switch_speech_handle_t *sh; switch_speech_handle_t *sh;
...@@ -677,11 +688,6 @@ typedef struct conference_obj { ...@@ -677,11 +688,6 @@ typedef struct conference_obj {
uint32_t score; uint32_t score;
int mux_loop_count; int mux_loop_count;
int member_loop_count; int member_loop_count;
int agc_level;
uint32_t avg_score;
uint32_t avg_itt;
uint32_t avg_tally;
switch_time_t run_time; switch_time_t run_time;
char *uuid_str; char *uuid_str;
uint32_t originating; uint32_t originating;
...@@ -762,14 +768,35 @@ struct conference_member { ...@@ -762,14 +768,35 @@ struct conference_member {
uint32_t read; uint32_t read;
uint32_t vol_period; uint32_t vol_period;
int32_t energy_level; int32_t energy_level;
int32_t agc_volume_in_level; int32_t auto_energy_level;
int32_t max_energy_level;
uint32_t agc_level;
uint32_t agc_low_energy_level;
uint32_t agc_margin;
uint32_t agc_change_factor;
uint32_t agc_period_len;
switch_agc_t *agc;
uint32_t mute_counter;
uint32_t burst_mute_count;
uint32_t score_avg;
uint32_t max_energy_hits;
uint32_t max_energy_hit_trigger;
int32_t volume_in_level; int32_t volume_in_level;
int32_t volume_out_level; int32_t volume_out_level;
int32_t agc_concur;
int32_t nt_tally;
switch_time_t join_time; switch_time_t join_time;
switch_time_t last_talking; time_t last_talking;
switch_time_t first_talk_detect;
uint32_t talk_detects;
uint32_t auto_energy_track;
uint32_t talk_track;
uint32_t score_count;
uint32_t score_accum;
uint32_t score_delta_accum;
uint32_t native_rate; uint32_t native_rate;
uint32_t gate_open;
uint32_t gate_count;
uint32_t nogate_count;
uint32_t talking_count;
switch_audio_resampler_t *read_resampler; switch_audio_resampler_t *read_resampler;
int16_t *resample_out; int16_t *resample_out;
uint32_t resample_out_len; uint32_t resample_out_len;
...@@ -778,9 +805,6 @@ struct conference_member { ...@@ -778,9 +805,6 @@ struct conference_member {
switch_speech_handle_t lsh; switch_speech_handle_t lsh;
switch_speech_handle_t *sh; switch_speech_handle_t *sh;
uint32_t verbose_events; uint32_t verbose_events;
uint32_t avg_score;
uint32_t avg_itt;
uint32_t avg_tally;
struct conference_member *next; struct conference_member *next;
switch_ivr_dmachine_t *dmachine; switch_ivr_dmachine_t *dmachine;
conference_cdr_node_t *cdr_node; conference_cdr_node_t *cdr_node;
...@@ -1030,8 +1054,7 @@ switch_status_t conference_text_thread_callback(switch_core_session_t *session, ...@@ -1030,8 +1054,7 @@ switch_status_t conference_text_thread_callback(switch_core_session_t *session,
void *SWITCH_THREAD_FUNC conference_video_muxing_write_thread_run(switch_thread_t *thread, void *obj); void *SWITCH_THREAD_FUNC conference_video_muxing_write_thread_run(switch_thread_t *thread, void *obj);
void conference_video_launch_layer_thread(conference_member_t *member); void conference_video_launch_layer_thread(conference_member_t *member);
void conference_video_wake_layer_thread(conference_member_t *member); void conference_video_wake_layer_thread(conference_member_t *member);
void conference_member_check_agc_levels(conference_member_t *member);
void conference_member_clear_avg(conference_member_t *member);
int conference_member_noise_gate_check(conference_member_t *member); int conference_member_noise_gate_check(conference_member_t *member);
void conference_member_check_channels(switch_frame_t *frame, conference_member_t *member, switch_bool_t in); void conference_member_check_channels(switch_frame_t *frame, conference_member_t *member, switch_bool_t in);
...@@ -1065,6 +1088,7 @@ void conference_video_canvas_set_fnode_layer(mcu_canvas_t *canvas, conference_fi ...@@ -1065,6 +1088,7 @@ void conference_video_canvas_set_fnode_layer(mcu_canvas_t *canvas, conference_fi
void conference_list(conference_obj_t *conference, switch_stream_handle_t *stream, char *delim); void conference_list(conference_obj_t *conference, switch_stream_handle_t *stream, char *delim);
const char *conference_utils_combine_flag_var(switch_core_session_t *session, const char *var_name); const char *conference_utils_combine_flag_var(switch_core_session_t *session, const char *var_name);
int conference_loop_mapping_len(); int conference_loop_mapping_len();
void conference_api_set_agc(conference_member_t *member, const char *data);
switch_status_t conference_outcall(conference_obj_t *conference, switch_status_t conference_outcall(conference_obj_t *conference,
char *conference_name, char *conference_name,
...@@ -1136,7 +1160,6 @@ switch_status_t conference_api_sub_play_status(conference_obj_t *conference, swi ...@@ -1136,7 +1160,6 @@ switch_status_t conference_api_sub_play_status(conference_obj_t *conference, swi
switch_status_t conference_api_sub_play(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv); switch_status_t conference_api_sub_play(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
switch_status_t conference_api_sub_say(conference_obj_t *conference, switch_stream_handle_t *stream, const char *text); switch_status_t conference_api_sub_say(conference_obj_t *conference, switch_stream_handle_t *stream, const char *text);
switch_status_t conference_api_sub_dial(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv); switch_status_t conference_api_sub_dial(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
switch_status_t conference_api_sub_agc(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
switch_status_t conference_api_sub_bgdial(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv); switch_status_t conference_api_sub_bgdial(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
switch_status_t conference_api_sub_auto_position(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv); switch_status_t conference_api_sub_auto_position(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
switch_status_t conference_api_sub_saymember(conference_obj_t *conference, switch_stream_handle_t *stream, const char *text); switch_status_t conference_api_sub_saymember(conference_obj_t *conference, switch_stream_handle_t *stream, const char *text);
...@@ -1172,6 +1195,9 @@ switch_status_t conference_api_sub_list(conference_obj_t *conference, switch_str ...@@ -1172,6 +1195,9 @@ switch_status_t conference_api_sub_list(conference_obj_t *conference, switch_str
switch_status_t conference_api_sub_xml_list(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv); switch_status_t conference_api_sub_xml_list(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
switch_status_t conference_api_sub_json_list(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv); switch_status_t conference_api_sub_json_list(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
switch_status_t conference_api_sub_energy(conference_member_t *member, switch_stream_handle_t *stream, void *data); switch_status_t conference_api_sub_energy(conference_member_t *member, switch_stream_handle_t *stream, void *data);
switch_status_t conference_api_sub_auto_energy(conference_member_t *member, switch_stream_handle_t *stream, void *data);
switch_status_t conference_api_sub_agc(conference_member_t *member, switch_stream_handle_t *stream, void *data);
switch_status_t conference_api_sub_max_energy(conference_member_t *member, switch_stream_handle_t *stream, void *data);
switch_status_t conference_api_sub_watching_canvas(conference_member_t *member, switch_stream_handle_t *stream, void *data); switch_status_t conference_api_sub_watching_canvas(conference_member_t *member, switch_stream_handle_t *stream, void *data);
switch_status_t conference_api_sub_canvas(conference_member_t *member, switch_stream_handle_t *stream, void *data); switch_status_t conference_api_sub_canvas(conference_member_t *member, switch_stream_handle_t *stream, void *data);
switch_status_t conference_api_sub_layer(conference_member_t *member, switch_stream_handle_t *stream, void *data); switch_status_t conference_api_sub_layer(conference_member_t *member, switch_stream_handle_t *stream, void *data);
......
...@@ -417,6 +417,15 @@ struct switch_agc_s { ...@@ -417,6 +417,15 @@ struct switch_agc_s {
}; };
SWITCH_DECLARE(void) switch_agc_set(switch_agc_t *agc, uint32_t energy_avg,
uint32_t low_energy_point, uint32_t margin, uint32_t change_factor, uint32_t period_len)
{
agc->energy_avg = energy_avg;
agc->margin = margin;
agc->change_factor = change_factor;
agc->period_len = period_len;
agc->low_energy_point = low_energy_point;
}
SWITCH_DECLARE(switch_status_t) switch_agc_create(switch_agc_t **agcP, uint32_t energy_avg, SWITCH_DECLARE(switch_status_t) switch_agc_create(switch_agc_t **agcP, uint32_t energy_avg,
uint32_t low_energy_point, uint32_t margin, uint32_t change_factor, uint32_t period_len) uint32_t low_energy_point, uint32_t margin, uint32_t change_factor, uint32_t period_len)
...@@ -430,11 +439,8 @@ SWITCH_DECLARE(switch_status_t) switch_agc_create(switch_agc_t **agcP, uint32_t ...@@ -430,11 +439,8 @@ SWITCH_DECLARE(switch_status_t) switch_agc_create(switch_agc_t **agcP, uint32_t
agc = switch_core_alloc(pool, sizeof(*agc)); agc = switch_core_alloc(pool, sizeof(*agc));
agc->pool = pool; agc->pool = pool;
agc->energy_avg = energy_avg;
agc->margin = margin; switch_agc_set(agc, energy_avg, low_energy_point, margin, change_factor, period_len);
agc->change_factor = change_factor;
agc->period_len = period_len;
agc->low_energy_point = low_energy_point;
*agcP = agc; *agcP = agc;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论