]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
patch for FSCORE-205
authorAnthony Minessale <anthony.minessale@gmail.com>
Thu, 30 Oct 2008 12:46:09 +0000 (12:46 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Thu, 30 Oct 2008 12:46:09 +0000 (12:46 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@10202 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/endpoints/mod_portaudio/mod_portaudio.c
src/switch_core_file.c
src/switch_core_timer.c

index 6a4d84c49aa2b3cc642a1a3c9bacba9df8e52f9b..685a628506537023d8494f27d2be5e220591f026 100644 (file)
@@ -308,10 +308,30 @@ static switch_status_t channel_on_execute(switch_core_session_t *session)
 static void deactivate_audio_device(void)
 {
        switch_mutex_lock(globals.device_lock);
+       /* LOCKED ************************************************************************************************** */
+
        if (globals.audio_stream) {
                CloseAudioStream(globals.audio_stream);
                globals.audio_stream = NULL;
        }
+
+       if (globals.read_codec.implementation) {
+               switch_core_codec_destroy(&globals.read_codec);
+       }
+
+       if (globals.write_codec.implementation) {
+               switch_core_codec_destroy(&globals.write_codec);
+       }
+
+       if (globals.timer.timer_interface) {
+               switch_core_timer_destroy(&globals.timer);
+       }
+
+       if (globals.hold_timer.timer_interface) {
+               switch_core_timer_destroy(&globals.hold_timer);
+       }
+
+       /* UNLOCKED ************************************************************************************************* */
        switch_mutex_unlock(globals.device_lock);
 }
 
@@ -1142,13 +1162,17 @@ static switch_status_t engage_device(int sample_rate, int codec_ms)
                        codec_ms = globals.codec_ms;
                }
 
-               if (switch_core_codec_init(&globals.read_codec,
-                                                                  "L16",
-                                                                  NULL, sample_rate, codec_ms, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL,
-                                                                  NULL) != SWITCH_STATUS_SUCCESS) {
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n");
-                       return SWITCH_STATUS_FALSE;
-               } else {
+               if (!globals.read_codec.implementation) {
+                       if (switch_core_codec_init(&globals.read_codec,
+                                                                          "L16",
+                                                                          NULL, sample_rate, codec_ms, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL,
+                                                                          NULL) != SWITCH_STATUS_SUCCESS) {
+                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n");
+                               return SWITCH_STATUS_FALSE;
+                       }
+               }
+
+               if (!globals.write_codec.implementation) {
                        if (switch_core_codec_init(&globals.write_codec,
                                                                           "L16",
                                                                           NULL,
@@ -1160,25 +1184,29 @@ static switch_status_t engage_device(int sample_rate, int codec_ms)
                        }
                }
 
-               if (switch_core_timer_init(&globals.timer,
-                                                                  globals.timer_name, codec_ms, globals.read_codec.implementation->samples_per_packet,
-                                                                  module_pool) != SWITCH_STATUS_SUCCESS) {
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "setup timer failed!\n");
-                       switch_core_codec_destroy(&globals.read_codec);
-                       switch_core_codec_destroy(&globals.write_codec);
-                       return SWITCH_STATUS_FALSE;
+               if (!globals.timer.timer_interface) {
+                       if (switch_core_timer_init(&globals.timer,
+                                                                          globals.timer_name, codec_ms, globals.read_codec.implementation->samples_per_packet,
+                                                                          module_pool) != SWITCH_STATUS_SUCCESS) {
+                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "setup timer failed!\n");
+                               switch_core_codec_destroy(&globals.read_codec);
+                               switch_core_codec_destroy(&globals.write_codec);
+                               return SWITCH_STATUS_FALSE;
+                       }
                }
 
-               if (switch_core_timer_init(&globals.hold_timer,
+               if (!globals.hold_timer.timer_interface) {
+                       if (switch_core_timer_init(&globals.hold_timer,
                                                                           globals.timer_name, codec_ms, globals.read_codec.implementation->samples_per_packet,
-                                                                  module_pool) != SWITCH_STATUS_SUCCESS) {
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "setup hold timer failed!\n");
-                       switch_core_codec_destroy(&globals.read_codec);
-                       switch_core_codec_destroy(&globals.write_codec);
-                       switch_core_timer_destroy(&globals.timer);
-                       return SWITCH_STATUS_FALSE;
+                                                                          module_pool) != SWITCH_STATUS_SUCCESS) {
+                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "setup hold timer failed!\n");
+                               switch_core_codec_destroy(&globals.read_codec);
+                               switch_core_codec_destroy(&globals.write_codec);
+                               switch_core_timer_destroy(&globals.timer);
+                               return SWITCH_STATUS_FALSE;
+                       }
                }
-
+               
                globals.read_frame.rate = sample_rate;
                globals.read_frame.codec = &globals.read_codec;
 
@@ -1204,7 +1232,8 @@ static switch_status_t engage_device(int sample_rate, int codec_ms)
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't open audio device!\n");
                        switch_core_codec_destroy(&globals.read_codec);
                        switch_core_codec_destroy(&globals.write_codec);
-
+                       switch_core_timer_destroy(&globals.timer);
+                       switch_core_timer_destroy(&globals.hold_timer);
                        return SWITCH_STATUS_FALSE;
                }
        }
index 7afb01099c46f084f92d2b1ea1bad6cc498bcfa3..633cdff8f13b95e0728adb7b704e7dc280264676 100644 (file)
@@ -285,6 +285,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_file_close(switch_file_handle_t *fh)
                switch_core_destroy_memory_pool(&fh->memory_pool);
        }
 
+       memset(fh, 0, sizeof(*fh));
+
        return status;
 }
 
index 442c6e03cfe8e38a34975783730443386414dbc2..d9502bb8f2cde575a2a033debebdbf96d0e5f515 100644 (file)
@@ -125,6 +125,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_timer_destroy(switch_timer_t *timer)
                switch_core_destroy_memory_pool(&timer->memory_pool);
        }
 
+       memset(timer, 0, sizeof(*timer));
+
        return SWITCH_STATUS_SUCCESS;
 }