]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-7512: add audio to png
authorSeven Du <dujinfang@gmail.com>
Tue, 7 Apr 2015 17:16:26 +0000 (01:16 +0800)
committerMichael Jerris <mike@jerris.com>
Thu, 28 May 2015 17:47:17 +0000 (12:47 -0500)
src/mod/formats/mod_png/mod_png.c

index 5e3eeb0138f7a53de629dc0301813972ba73bb3e..a64c2db4d0a4675e15b72b8c5204ed4f707d99f2 100644 (file)
@@ -23,7 +23,9 @@
  *
  * Contributor(s):
  *
- * mod_png -- play a png as video
+ * Seven Du <dujinfang@gmail.com>
+ *
+ * mod_png -- play a png as video, optionally with audio
  *
  */
 
@@ -44,6 +46,7 @@ struct png_file_context {
        int sent;
        int max;
        int samples;
+       switch_file_handle_t *audio_fh;
 };
 
 typedef struct png_file_context png_file_context_t;
@@ -87,6 +90,7 @@ static switch_status_t png_file_open(switch_file_handle_t *handle, const char *p
        context->max = 10000;
 
        if (handle->params) {
+               const char *audio_file = switch_event_get_header(handle->params, "audio_file");
                const char *max = switch_event_get_header(handle->params, "png_ms");
                int tmp;
 
@@ -94,6 +98,21 @@ static switch_status_t png_file_open(switch_file_handle_t *handle, const char *p
                        tmp = atol(max);
                        context->max = tmp;
                }
+
+               if (audio_file) {
+                       context->audio_fh = switch_core_alloc(handle->memory_pool, sizeof(*context->audio_fh));
+                       switch_assert(context->audio_fh);
+
+                       if (switch_core_file_open(context->audio_fh,
+                                                                         audio_file,
+                                                                         handle->channels,
+                                                                         handle->samplerate,
+                                                                         SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT,
+                                                                         NULL) != SWITCH_STATUS_SUCCESS) {
+                                                                         switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Failed to open audio file %s\n", audio_file);
+                                                                         context->audio_fh = NULL;
+                       }
+               }
        }
 
        if (context->max) {
@@ -120,6 +139,8 @@ static switch_status_t png_file_close(switch_file_handle_t *handle)
 
        switch_img_free(&context->img);
        
+       if (context->audio_fh) switch_core_file_close(context->audio_fh);
+
        return SWITCH_STATUS_SUCCESS;
 }
 
@@ -128,6 +149,10 @@ static switch_status_t png_file_read(switch_file_handle_t *handle, void *data, s
 
        png_file_context_t *context = (png_file_context_t *)handle->private_info;
 
+       if (context->audio_fh) {
+               return switch_core_file_read(context->audio_fh, data, len);
+       }
+
        if (!context->img || !context->samples) {
                return SWITCH_STATUS_FALSE;
        }