]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-9706 #resolve [Add loops param to file playback in conference]
authorAnthony Minessale <anthm@freeswitch.org>
Mon, 7 Nov 2016 18:17:56 +0000 (12:17 -0600)
committerAnthony Minessale <anthm@freeswitch.org>
Mon, 7 Nov 2016 18:17:56 +0000 (12:17 -0600)
src/mod/applications/mod_conference/conference_file.c
src/mod/applications/mod_conference/mod_conference.c
src/mod/applications/mod_conference/mod_conference.h

index eceff51148b1763ce8e84032dcb70192d7a1ea76..801aab168abef7987286bdd93b63986442a15545 100644 (file)
@@ -275,7 +275,16 @@ switch_status_t conference_file_play(conference_obj_t *conference, char *file, u
                const char *vol = switch_event_get_header(fnode->fh.params, "vol");
                const char *position = switch_event_get_header(fnode->fh.params, "position");
                const char *canvasstr = switch_event_get_header(fnode->fh.params, "canvas");
+               const char *loopsstr = switch_event_get_header(fnode->fh.params, "loops");
                int canvas_id = -1;
+               
+               if (loopsstr) {
+                       fnode->loops = atoi(loopsstr);
+
+                       if (!strcasecmp(loopsstr, "inf") || !strcasecmp(loopsstr, "infinite")) {
+                               fnode->loops = -1;
+                       }
+               }
 
                if (canvasstr) {
                        canvas_id = atoi(canvasstr) - 1;
index 75b2e3b27efd8109f71e7fd67f669d3527e5e42f..5d8961dd069b9d35059d8a425181f3c9e698a792 100644 (file)
@@ -446,6 +446,7 @@ void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, void *ob
                                        }
                                } else if (conference->fnode->type == NODE_TYPE_FILE) {
                                        switch_core_file_read(&conference->fnode->fh, file_frame, &file_sample_len);
+                                       
                                        if (conference->fnode->fh.vol) {
                                                switch_change_sln_volume_granular((void *)file_frame, (uint32_t)file_sample_len * conference->fnode->fh.channels,
                                                                                                                  conference->fnode->fh.vol);
@@ -456,7 +457,20 @@ void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, void *ob
                                }
 
                                if (file_sample_len <= 0) {
-                                       conference->fnode->done++;
+                                       if (conference->fnode->loops) {
+                                               if (--conference->fnode->loops < 0) {
+                                                       conference->fnode->loops = -1;
+                                               }
+                                               
+                                               if (conference->fnode->loops) {
+                                                       uint32_t pos = 0;
+                                                       switch_core_file_seek(&conference->fnode->fh, &pos, 0, SEEK_SET);
+                                               }
+                                       }
+                                       
+                                       if (!conference->fnode->loops) {
+                                               conference->fnode->done++;
+                                       }
                                } else {
                                        has_file_data = 1;
                                }
@@ -474,7 +488,20 @@ void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, void *ob
                                        conference_al_process(conference->async_fnode->al, file_frame, file_sample_len * 2, conference->async_fnode->fh.samplerate);
                                }
                                if (file_sample_len <= 0) {
-                                       conference->async_fnode->done++;
+                                       if (conference->async_fnode->loops) {
+                                               if (--conference->async_fnode->loops < 0) {
+                                                       conference->async_fnode->loops = -1;
+                                               }
+                                               
+                                               if (conference->async_fnode->loops) {
+                                                       uint32_t pos = 0;
+                                                       switch_core_file_seek(&conference->async_fnode->fh, &pos, 0, SEEK_SET);
+                                               }
+                                       }
+                                       
+                                       if (!conference->async_fnode->loops) {
+                                               conference->async_fnode->done++;
+                                       }
                                } else {
                                        if (has_file_data) {
                                                switch_size_t x;
index a4aca869fc9ec7626d3199aaa5d19da2c5b77c6c..cc8d36b4fdd039be75de44adf00bc45358038790 100644 (file)
@@ -386,6 +386,7 @@ typedef struct conference_file_node {
        int canvas_id;
        struct conference_obj *conference;
        char *res_id;
+       int loops;
 } conference_file_node_t;
 
 typedef enum {