]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
update
authorAnthony Minessale <anthony.minessale@gmail.com>
Tue, 5 Feb 2008 00:53:39 +0000 (00:53 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Tue, 5 Feb 2008 00:53:39 +0000 (00:53 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@7521 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/applications/mod_conference/mod_conference.c

index f2a430402bcd36c0c64fa599d944eee15aeb8b18..553e6d4307924550577108fc2a1cff955da06add 100644 (file)
@@ -248,6 +248,7 @@ struct conference_member {
        switch_buffer_t *mux_buffer;
        switch_buffer_t *resample_buffer;
        uint32_t flags;
+       uint32_t score;
        switch_mutex_t *flag_mutex;
        switch_mutex_t *audio_in_mutex;
        switch_mutex_t *audio_out_mutex;
@@ -735,7 +736,7 @@ static void *SWITCH_THREAD_FUNC conference_video_thread_run(switch_thread_t *thr
        conference_member_t *imember, *last_member = NULL;
        switch_frame_t *vid_frame;
        switch_status_t status;
-       int skip = 0, has_vid = 1;
+       int has_vid = 1;
 
        conference->video_running = 1;
 
@@ -757,20 +758,8 @@ static void *SWITCH_THREAD_FUNC conference_video_thread_run(switch_thread_t *thr
                                continue;
                        }
 
-                       if (last_member != conference->floor_holder && vid_frame->datalen < 1000) {
-                               skip = 1000;
-                       }
-
                        last_member = conference->floor_holder;
                        
-                       if (skip && vid_frame->datalen >= skip) {
-                               skip = 0;
-                       }
-
-                       if (skip) {
-                               continue;
-                       }
-                       
                        switch_mutex_lock(conference->member_mutex);    
                        has_vid = 0;
                        for (imember = conference->members; imember; imember = imember->next) {
@@ -1451,7 +1440,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t * thread,
                /* if the member can speak, compute the audio energy level and */
                /* generate events when the level crosses the threshold        */
                if (switch_test_flag(member, MFLAG_CAN_SPEAK) && energy_level) {
-                       uint32_t energy = 0, i = 0, samples = 0, j = 0, score = 0;
+                       uint32_t energy = 0, i = 0, samples = 0, j = 0;
                        int16_t *data;
                        int divisor = 0;
 
@@ -1461,16 +1450,18 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t * thread,
                                divisor = 1;
                        }
 
+                       member->score = 0;
+
                        if ((samples = read_frame->datalen / sizeof(*data))) {
                                for (i = 0; i < samples; i++) {
                                        energy += abs(data[j]);
                                        j += read_codec->implementation->number_of_channels;
                                }
-                               score = energy / (samples / divisor);
+                               member->score = energy / (samples / divisor);
                        }
 
-                       if (score > energy_level) {
-                               uint32_t diff = score - energy_level;
+                       if (member->score > energy_level) {
+                               uint32_t diff = member->score - energy_level;
                                if (hangover_hits) {
                                        hangover_hits--;
                                }
@@ -1483,7 +1474,8 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t * thread,
                                                switch_set_flag_locked(member, MFLAG_TALKING);
                                                switch_set_flag_locked(member, MFLAG_FLUSH_BUFFER);
                                                switch_mutex_lock(member->conference->member_mutex);
-                                               if (!member->conference->floor_holder || !switch_test_flag(member->conference->floor_holder, MFLAG_TALKING)) {
+                                               if (!member->conference->floor_holder || 
+                                                       !switch_test_flag(member->conference->floor_holder, MFLAG_TALKING) || member->score > member->conference->floor_holder->score) {
                                                        if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
                                                                conference_add_event_member_data(member, event);
                                                                switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Action", "floor-change");
@@ -2555,6 +2547,11 @@ static void conference_list(conference_obj_t * conference, switch_stream_handle_
                        count++;
                }
 
+               if (switch_test_flag(member, MFLAG_TALKING)) {
+                       stream->write_function(stream, "%s%s", count ? "|" : "", "talking");
+                       count++;
+               }
+
                if (member == member->conference->floor_holder) {
                        stream->write_function(stream, "%s%s", count ? "|" : "", "floor");
                        count++;