]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
add conference member flag nomoh
authorAnthony Minessale <anthm@freeswitch.org>
Tue, 14 Jun 2011 18:41:25 +0000 (13:41 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Tue, 14 Jun 2011 18:41:25 +0000 (13:41 -0500)
src/mod/applications/mod_conference/mod_conference.c

index 572fdf0c8541d30fae0b79b47164866929ebbf70..69575432b931e7dd6a0975b93b8c6e268e032b7e 100644 (file)
@@ -143,7 +143,8 @@ typedef enum {
        MFLAG_DIST_DTMF = (1 << 15),
        MFLAG_MOD = (1 << 16),
        MFLAG_INDICATE_MUTE = (1 << 17),
-       MFLAG_INDICATE_UNMUTE = (1 << 18)
+       MFLAG_INDICATE_UNMUTE = (1 << 18),
+       MFLAG_NOMOH = (1 << 19)
 } member_flag_t;
 
 typedef enum {
@@ -1096,6 +1097,7 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v
                switch_size_t file_data_len = samples * 2;
                int has_file_data = 0, members_with_video = 0;
                uint32_t conf_energy = 0;
+               int nomoh = 0;
 
                /* Sync the conference to a single timing source */
                if (switch_core_timer_next(&timer) != SWITCH_STATUS_SUCCESS) {
@@ -1106,11 +1108,6 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v
                switch_mutex_lock(conference->mutex);
                has_file_data = ready = total = 0;
 
-               if (conference->perpetual_sound && !conference->async_fnode) {
-                       conference_play_file(conference, conference->perpetual_sound, CONF_DEFAULT_LEADIN, NULL, 1);
-               } else if (conference->moh_sound && (conference->count == 1 || switch_test_flag(conference, CFLAG_WAIT_MOD)) && !conference->async_fnode) {
-                       conference_play_file(conference, conference->moh_sound, CONF_DEFAULT_LEADIN, NULL, 1);
-               }
 
                /* Read one frame of audio from each member channel and save it for redistribution */
                for (imember = conference->members; imember; imember = imember->next) {
@@ -1118,8 +1115,14 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v
                        total++;
                        imember->read = 0;
 
-                       if (imember->session && switch_channel_test_flag(switch_core_session_get_channel(imember->session), CF_VIDEO)) {
-                               members_with_video++;
+                       if (imember->session) {
+                               if (switch_channel_test_flag(switch_core_session_get_channel(imember->session), CF_VIDEO)) {
+                                       members_with_video++;
+                               }
+
+                               if (switch_test_flag(imember, MFLAG_NOMOH)) {
+                                       nomoh++;
+                               }
                        }
 
                        switch_clear_flag_locked(imember, MFLAG_HAS_AUDIO);
@@ -1134,6 +1137,14 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v
                        switch_mutex_unlock(imember->audio_in_mutex);
                }
 
+               if (conference->perpetual_sound && !conference->async_fnode) {
+                       conference_play_file(conference, conference->perpetual_sound, CONF_DEFAULT_LEADIN, NULL, 1);
+               } else if (conference->moh_sound && ((nomoh == 0 && conference->count == 1) 
+                                                                                        || switch_test_flag(conference, CFLAG_WAIT_MOD)) && !conference->async_fnode) {
+                       conference_play_file(conference, conference->moh_sound, CONF_DEFAULT_LEADIN, NULL, 1);
+               }
+
+
                /* Find if no one talked for more than x number of second */
                if (conference->terminate_on_silence && conference->count > 1) {
                        int is_talking = 0;
@@ -5404,6 +5415,8 @@ static void set_mflags(const char *flags, member_flag_t *f)
                                *f |= MFLAG_DIST_DTMF;
                        } else if (!strcasecmp(argv[i], "moderator")) {
                                *f |= MFLAG_MOD;
+                       } else if (!strcasecmp(argv[i], "nomoh")) {
+                               *f |= MFLAG_NOMOH;
                        } else if (!strcasecmp(argv[i], "endconf")) {
                                *f |= MFLAG_ENDCONF;
                        } else if (!strcasecmp(argv[i], "mintwo")) {