From 623ba5c271846bf81f9b46def437d0674c977bd6 Mon Sep 17 00:00:00 2001 From: Anthony Minessale <anthony.minessale@gmail.com> Date: Thu, 30 Oct 2008 12:46:09 +0000 Subject: [PATCH] patch for FSCORE-205 git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@10202 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- .../endpoints/mod_portaudio/mod_portaudio.c | 77 +++++++++++++------ src/switch_core_file.c | 2 + src/switch_core_timer.c | 2 + 3 files changed, 57 insertions(+), 24 deletions(-) diff --git a/src/mod/endpoints/mod_portaudio/mod_portaudio.c b/src/mod/endpoints/mod_portaudio/mod_portaudio.c index 6a4d84c49a..685a628506 100644 --- a/src/mod/endpoints/mod_portaudio/mod_portaudio.c +++ b/src/mod/endpoints/mod_portaudio/mod_portaudio.c @@ -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 (switch_core_timer_init(&globals.hold_timer, + 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 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 timer failed!\n"); + switch_core_codec_destroy(&globals.read_codec); + switch_core_codec_destroy(&globals.write_codec); + return SWITCH_STATUS_FALSE; + } } + 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; + } + } + 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; } } diff --git a/src/switch_core_file.c b/src/switch_core_file.c index 7afb01099c..633cdff8f1 100644 --- a/src/switch_core_file.c +++ b/src/switch_core_file.c @@ -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; } diff --git a/src/switch_core_timer.c b/src/switch_core_timer.c index 442c6e03cf..d9502bb8f2 100644 --- a/src/switch_core_timer.c +++ b/src/switch_core_timer.c @@ -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; }