]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
fix MODFORM-11 (Again)
authorAnthony Minessale <anthony.minessale@gmail.com>
Wed, 23 Jul 2008 22:10:48 +0000 (22:10 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Wed, 23 Jul 2008 22:10:48 +0000 (22:10 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@9148 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/formats/mod_shout/mod_shout.c
src/switch_ivr_play_say.c

index ff8ff12c46fdc40ceb08f06ea46b065695f507e4..a817fad148aa0b1abcb5c122a8b95349615b86e0 100644 (file)
@@ -248,6 +248,7 @@ static size_t decode_fd(shout_context_t *context, void *data, size_t bytes)
                x = 0;
 
                if (inlen < bytes) {
+                       bytes = inlen;
                        done = 1;
                }
 
index 5182f4c39cfaf405dcf039dbdce35a21013d1bef..2bd6039862043536af5279a555d71c0c0a8cabb8 100644 (file)
@@ -729,6 +729,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
        const char *timer_name;
        const char *prebuf;
        const char *alt = NULL;
+       int eof = 0;
+       switch_size_t bread = 0;
 
        switch_channel_pre_answer(channel);
 
@@ -953,13 +955,13 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
 
                if (!switch_channel_ready(channel)) {
                        status = SWITCH_STATUS_FALSE;
-                       break;
+                       break; 
                }
 
                if (switch_channel_test_flag(channel, CF_BREAK)) {
                        switch_channel_clear_flag(channel, CF_BREAK);
                        status = SWITCH_STATUS_BREAK;
-                       break;
+                       break; 
                }
 
                if (switch_core_session_private_event_count(session)) {
@@ -975,7 +977,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
                                if (!args->input_callback && !args->buf) {
                                        status = SWITCH_STATUS_BREAK;
                                        done = 1;
-                                       break;
+                                       break; 
                                }
                                switch_channel_dequeue_dtmf(channel, &dtmf);
                                if (args->input_callback) {
@@ -997,7 +999,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
 
                        if (status != SWITCH_STATUS_SUCCESS) {
                                done = 1;
-                               break;
+                               break; 
                        }
                }
 
@@ -1008,20 +1010,28 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
                        memset(abuf, 0, framelen);
                        olen = ilen;
                        do_speed = 0;
-               } else if (fh->sp_audio_buffer && (switch_buffer_inuse(fh->sp_audio_buffer) > (switch_size_t) (framelen))) {
-                       switch_buffer_read(fh->sp_audio_buffer, abuf, framelen);
-                       olen = asis ? framelen : ilen;
+               } else if (fh->sp_audio_buffer && (eof || (switch_buffer_inuse(fh->sp_audio_buffer) > (switch_size_t) (framelen)))) {
+                       if (!(bread = switch_buffer_read(fh->sp_audio_buffer, abuf, framelen))) {
+                               break; 
+                       }
+                       olen = asis ? bread : bread / 2;
                        do_speed = 0;
-               } else if (fh->audio_buffer && (switch_buffer_inuse(fh->audio_buffer) > (switch_size_t) (framelen))) {
-                       switch_buffer_read(fh->audio_buffer, abuf, framelen);
-                       olen = asis ? framelen : ilen;
+               } else if (fh->audio_buffer && (eof || (switch_buffer_inuse(fh->audio_buffer) > (switch_size_t) (framelen)))) {
+                       if (!(bread = switch_buffer_read(fh->audio_buffer, abuf, framelen))) {
+                               break; 
+                       }
+                       olen = asis ? bread : bread / 2;
                } else {
+                       if (eof) {
+                               break;
+                       }
                        olen = FILE_STARTSAMPLES;
                        if (!asis) {
                                olen /= 2;
                        }
                        if (switch_core_file_read(fh, abuf, &olen) != SWITCH_STATUS_SUCCESS) {
-                               break;
+                               eof++;
+                               continue;
                        }
                        switch_buffer_write(fh->audio_buffer, abuf, asis ? olen : olen * 2);
                        olen = switch_buffer_read(fh->audio_buffer, abuf, framelen);
@@ -1031,7 +1041,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
                }
 
                if (done || olen <= 0) {
-                       break;
+                       break; 
                }
 
                if (!asis) {
@@ -1134,16 +1144,16 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
                        continue;
                } else if (status != SWITCH_STATUS_SUCCESS) {
                        done = 1;
-                       break;
+                       break; 
                }
 
                if (done) {
-                       break;
+                       break; 
                }
 
                if (timer_name) {
                        if (switch_core_timer_next(&timer) != SWITCH_STATUS_SUCCESS) {
-                               break;
+                               break; 
                        }
                } else {                                /* time off the channel (if you must) */
                        switch_frame_t *read_frame;
@@ -1155,7 +1165,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
                        tstatus = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
 
                        if (!SWITCH_READ_ACCEPTABLE(tstatus)) {
-                               break;
+                               break; 
                        }
 
                        if (args && (args->read_frame_callback)) {
@@ -1166,7 +1176,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
                                }
                                switch_clear_flag(fh, SWITCH_FILE_CALLBACK);
                                if (!ok) {
-                                       break;
+                                       break; 
                                }
                        }
                }