提交 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
#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,
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);
......
......@@ -490,7 +490,6 @@ void conference_cdr_del(conference_member_t *member)
{
switch_mutex_lock(member->conference->member_mutex);
if (member->cdr_node) {
if (member->channel) {
switch_channel_get_variables(member->channel, &member->cdr_node->var_event);
}
......
......@@ -43,34 +43,11 @@
int conference_member_noise_gate_check(conference_member_t *member)
{
int r = 0;
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;
}
int r = (int32_t)member->score > member->energy_level;
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)
{
key_binding_t *binding;
......@@ -455,33 +432,6 @@ conference_member_t *conference_member_get_by_var(conference_obj_t *conference,
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)
{
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
member->conference = conference;
member->next = conference->members;
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->verbose_events = conference->verbose_events;
member->video_layer_id = -1;
......@@ -713,6 +667,7 @@ switch_status_t conference_member_add(conference_obj_t *conference, conference_m
switch_mutex_unlock(conference->member_mutex);
conference_cdr_add(member);
conference_api_set_agc(member, NULL);
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
conference_member_del_relationship(member, 0);
conference_cdr_del(member);
if (member->agc) {
switch_agc_destroy(&member->agc);
}
#ifdef OPENAL_POSITIONING
if (member->al && member->al->device) {
......
......@@ -130,6 +130,8 @@ void conference_utils_set_mflags(const char *flags, member_flag_t *f)
f[MFLAG_ENDCONF] = 1;
} else if (!strcasecmp(argv[i], "mintwo")) {
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")) {
f[MFLAG_VIDEO_BRIDGE] = 1;
} else if (!strcasecmp(argv[i], "ghost")) {
......
......@@ -212,6 +212,7 @@ typedef enum {
MFLAG_ROTATE_VIDEO,
MFLAG_INDICATE_DEAF,
MFLAG_INDICATE_UNDEAF,
MFLAG_TALK_DATA_EVENTS,
///////////////////////////
MFLAG_MAX
} member_flag_t;
......@@ -652,6 +653,16 @@ typedef struct conference_obj {
switch_thread_rwlock_t *rwlock;
uint32_t count;
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;
switch_speech_handle_t lsh;
switch_speech_handle_t *sh;
......@@ -677,11 +688,6 @@ typedef struct conference_obj {
uint32_t score;
int mux_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;
char *uuid_str;
uint32_t originating;
......@@ -762,14 +768,35 @@ struct conference_member {
uint32_t read;
uint32_t vol_period;
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_out_level;
int32_t agc_concur;
int32_t nt_tally;
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 gate_open;
uint32_t gate_count;
uint32_t nogate_count;
uint32_t talking_count;
switch_audio_resampler_t *read_resampler;
int16_t *resample_out;
uint32_t resample_out_len;
......@@ -778,9 +805,6 @@ struct conference_member {
switch_speech_handle_t lsh;
switch_speech_handle_t *sh;
uint32_t verbose_events;
uint32_t avg_score;
uint32_t avg_itt;
uint32_t avg_tally;
struct conference_member *next;
switch_ivr_dmachine_t *dmachine;
conference_cdr_node_t *cdr_node;
......@@ -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 conference_video_launch_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);
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
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);
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,
char *conference_name,
......@@ -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_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_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_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);
......@@ -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_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_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_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);
......
......@@ -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,
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
agc = switch_core_alloc(pool, sizeof(*agc));
agc->pool = pool;
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_agc_set(agc, energy_avg, low_energy_point, margin, change_factor, period_len);
*agcP = agc;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论