]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
MODFORM-21 add a bit more error checking to mod_shout write function
authorMichael Jerris <mike@jerris.com>
Tue, 25 Nov 2008 21:23:40 +0000 (21:23 +0000)
committerMichael Jerris <mike@jerris.com>
Tue, 25 Nov 2008 21:23:40 +0000 (21:23 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@10538 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/formats/mod_shout/mod_shout.c

index 5f27188d60efcf45fa0192146c27aac66fc237cd..c6c9817a91d65d4c255347b793a6d25641bc5bf5 100644 (file)
@@ -902,12 +902,22 @@ static switch_status_t shout_file_read(switch_file_handle_t *handle, void *data,
 
 static switch_status_t shout_file_write(switch_file_handle_t *handle, void *data, size_t *len)
 {
-       shout_context_t *context = handle->private_info;
+       shout_context_t *context;
        unsigned char mp3buf[8192] = "";
        int rlen;
        int16_t *audio = data;
        int nsamples = *len;
 
+       if (!handle) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error no handle\n");
+               return SWITCH_STATUS_FALSE;
+       }
+
+       if (!(context = handle->private_info)) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error no context\n");
+               return SWITCH_STATUS_FALSE;
+       }
+
        if (context->shout && !context->shout_init) {
                context->shout_init++;
                if (shout_open(context->shout) != SHOUTERR_SUCCESS) {
@@ -918,7 +928,7 @@ static switch_status_t shout_file_write(switch_file_handle_t *handle, void *data
                launch_write_stream_thread(context);
        }
 
-       if (handle->handler) {
+       if (handle->handler && context->audio_mutex) {
                switch_mutex_lock(context->audio_mutex);
                if (context->audio_buffer) {
                        if (!switch_buffer_write(context->audio_buffer, data, (nsamples * sizeof(int16_t) * handle->channels))) {
@@ -928,47 +938,50 @@ static switch_status_t shout_file_write(switch_file_handle_t *handle, void *data
                } else {
                        context->err++;
                }
+
                switch_mutex_unlock(context->audio_mutex);
                if (context->err) {
                        return SWITCH_STATUS_FALSE;
                }
-       } else {
 
-               if (!context->lame_ready) {
-                       lame_init_params(context->gfp);
-                       lame_print_config(context->gfp);
-                       context->lame_ready = 1;
-               }
+               handle->sample_count += *len;
+               return SWITCH_STATUS_SUCCESS;
+       }
 
-               if (handle->channels == 2) {
-                       int16_t l[4096] = { 0 };
-                       int16_t r[4096] = { 0 };
-                       int i, j = 0;
+       if (!context->lame_ready) {
+               lame_init_params(context->gfp);
+               lame_print_config(context->gfp);
+               context->lame_ready = 1;
+       }
 
-                       for (i = 0; i < nsamples; i++) {
-                               l[i] = audio[j++];
-                               r[i] = audio[j++];
-                       }
+       if (handle->channels == 2) {
+               int16_t l[4096] = { 0 };
+               int16_t r[4096] = { 0 };
+               int i, j = 0;
 
-                       if ((rlen = lame_encode_buffer(context->gfp, l, r, nsamples, mp3buf, sizeof(mp3buf))) < 0) {
-                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "MP3 encode error %d!\n", rlen);
-                               return SWITCH_STATUS_FALSE;
-                       }
+               for (i = 0; i < nsamples; i++) {
+                       l[i] = audio[j++];
+                       r[i] = audio[j++];
+               }
 
-               } else if (handle->channels == 1) {
-                       if ((rlen = lame_encode_buffer(context->gfp, audio, NULL, nsamples, mp3buf, sizeof(mp3buf))) < 0) {
-                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "MP3 encode error %d!\n", rlen);
-                               return SWITCH_STATUS_FALSE;
-                       }
-               } else {
-                       rlen = 0;
+               if ((rlen = lame_encode_buffer(context->gfp, l, r, nsamples, mp3buf, sizeof(mp3buf))) < 0) {
+                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "MP3 encode error %d!\n", rlen);
+                       return SWITCH_STATUS_FALSE;
                }
 
-               if (rlen) {
-                       int ret = fwrite(mp3buf, 1, rlen, context->fp);
-                       if (ret < 0) {
-                               return SWITCH_STATUS_FALSE;
-                       }
+       } else if (handle->channels == 1) {
+               if ((rlen = lame_encode_buffer(context->gfp, audio, NULL, nsamples, mp3buf, sizeof(mp3buf))) < 0) {
+                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "MP3 encode error %d!\n", rlen);
+                       return SWITCH_STATUS_FALSE;
+               }
+       } else {
+               rlen = 0;
+       }
+
+       if (rlen) {
+               int ret = fwrite(mp3buf, 1, rlen, context->fp);
+               if (ret < 0) {
+                       return SWITCH_STATUS_FALSE;
                }
        }