From f703658741069f9cdf221bca5e5fabdbe48cc92a Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 21 Feb 2007 06:35:55 +0000 Subject: [PATCH] add 120ms to g711, fix errs in g711 alaw defs, tweak buffer in file playback and add kill to hupall git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@4341 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/mod/codecs/mod_g711/mod_g711.c | 67 ++++++++++++++++++++++++------ src/switch_core.c | 1 + src/switch_ivr.c | 13 +++++- 3 files changed, 67 insertions(+), 14 deletions(-) diff --git a/src/mod/codecs/mod_g711/mod_g711.c b/src/mod/codecs/mod_g711/mod_g711.c index 55631c3516..83b8d54388 100644 --- a/src/mod/codecs/mod_g711/mod_g711.c +++ b/src/mod/codecs/mod_g711/mod_g711.c @@ -188,6 +188,26 @@ static switch_status_t switch_g711a_destroy(switch_codec_t *codec) /* Registration */ +static const switch_codec_implementation_t g711u_8k_120ms_implementation = { + /*.codec_type */ SWITCH_CODEC_TYPE_AUDIO, + /*.ianacode */ 0, + /*.iananame */ "PCMU", + /*.fmtp */ NULL, + /*.samples_per_second */ 8000, + /*.bits_per_second */ 64000, + /*.microseconds_per_frame */ 120000, + /*.samples_per_frame */ 960, + /*.bytes_per_frame */ 1920, + /*.encoded_bytes_per_frame */ 960, + /*.number_of_channels */ 1, + /*.pref_frames_per_packet */ 1, + /*.max_frames_per_packet */ 1, + /*.init */ switch_g711u_init, + /*.encode */ switch_g711u_encode, + /*.decode */ switch_g711u_decode, + /*.destroy */ switch_g711u_destroy +}; + static const switch_codec_implementation_t g711u_8k_60ms_implementation = { /*.codec_type */ SWITCH_CODEC_TYPE_AUDIO, /*.ianacode */ 0, @@ -205,7 +225,8 @@ static const switch_codec_implementation_t g711u_8k_60ms_implementation = { /*.init */ switch_g711u_init, /*.encode */ switch_g711u_encode, /*.decode */ switch_g711u_decode, - /*.destroy */ switch_g711u_destroy + /*.destroy */ switch_g711u_destroy, + /*.next*/ &g711u_8k_120ms_implementation }; static const switch_codec_implementation_t g711u_8k_30ms_implementation = { @@ -273,6 +294,25 @@ static const switch_codec_implementation_t g711u_8k_10ms_implementation = { +static const switch_codec_implementation_t g711a_8k_120ms_implementation = { + /*.codec_type */ SWITCH_CODEC_TYPE_AUDIO, + /*.ianacode */ 8, + /*.iananame */ "PCMA", + /*.fmtp */ NULL, + /*.samples_per_second */ 8000, + /*.bits_per_second */ 64000, + /*.microseconds_per_frame */ 120000, + /*.samples_per_frame */ 960, + /*.bytes_per_frame */ 1920, + /*.encoded_bytes_per_frame */ 960, + /*.number_of_channels */ 1, + /*.pref_frames_per_packet */ 1, + /*.max_frames_per_packet */ 1, + /*.init */ switch_g711a_init, + /*.encode */ switch_g711a_encode, + /*.decode */ switch_g711a_decode, + /*.destroy */ switch_g711a_destroy +}; static const switch_codec_implementation_t g711a_8k_60ms_implementation = { /*.codec_type */ SWITCH_CODEC_TYPE_AUDIO, @@ -288,10 +328,11 @@ static const switch_codec_implementation_t g711a_8k_60ms_implementation = { /*.number_of_channels */ 1, /*.pref_frames_per_packet */ 1, /*.max_frames_per_packet */ 1, - /*.init */ switch_g711u_init, - /*.encode */ switch_g711u_encode, - /*.decode */ switch_g711u_decode, - /*.destroy */ switch_g711u_destroy, + /*.init */ switch_g711a_init, + /*.encode */ switch_g711a_encode, + /*.decode */ switch_g711a_decode, + /*.destroy */ switch_g711a_destroy, + /*.next*/ &g711a_8k_120ms_implementation }; static const switch_codec_implementation_t g711a_8k_30ms_implementation = { @@ -308,10 +349,10 @@ static const switch_codec_implementation_t g711a_8k_30ms_implementation = { /*.number_of_channels */ 1, /*.pref_frames_per_packet */ 1, /*.max_frames_per_packet */ 1, - /*.init */ switch_g711u_init, - /*.encode */ switch_g711u_encode, - /*.decode */ switch_g711u_decode, - /*.destroy */ switch_g711u_destroy, + /*.init */ switch_g711a_init, + /*.encode */ switch_g711a_encode, + /*.decode */ switch_g711a_decode, + /*.destroy */ switch_g711a_destroy, /*.next*/ &g711a_8k_60ms_implementation }; @@ -350,10 +391,10 @@ static const switch_codec_implementation_t g711a_8k_10ms_implementation = { /*.number_of_channels */ 1, /*.pref_frames_per_packet */ 1, /*.max_frames_per_packet */ 1, - /*.init */ switch_g711u_init, - /*.encode */ switch_g711u_encode, - /*.decode */ switch_g711u_decode, - /*.destroy */ switch_g711u_destroy, + /*.init */ switch_g711a_init, + /*.encode */ switch_g711a_encode, + /*.decode */ switch_g711a_decode, + /*.destroy */ switch_g711a_destroy, /*.next*/ &g711a_8k_20ms_implementation }; diff --git a/src/switch_core.c b/src/switch_core.c index 95b99a71b3..0f2a2c99b9 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -693,6 +693,7 @@ SWITCH_DECLARE(void) switch_core_session_hupall(switch_call_cause_t cause) session = (switch_core_session_t *) val; channel = switch_core_session_get_channel(session); switch_channel_hangup(channel, cause); + switch_core_session_kill_channel(session, SWITCH_SIG_KILL); } } switch_mutex_unlock(runtime.session_table_mutex); diff --git a/src/switch_ivr.c b/src/switch_ivr.c index dcad96f2d3..245d223fea 100644 --- a/src/switch_ivr.c +++ b/src/switch_ivr.c @@ -1218,6 +1218,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess if (!fh->audio_buffer) { switch_buffer_create_dynamic(&fh->audio_buffer, FILE_BLOCKSIZE, FILE_BUFSIZE, 0); + if (!fh->audio_buffer) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "setup buffer failed\n"); + + switch_core_file_close(fh); + switch_core_session_reset(session); + + return SWITCH_STATUS_GENERR; + } } if (asis) { @@ -1334,7 +1342,10 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess olen = asis ? framelen : ilen; do_speed = 0; } else { - olen = 32 * framelen; + olen = sizeof(abuf); + if (!asis) { + olen /= 2; + } switch_core_file_read(fh, abuf, &olen); switch_buffer_write(fh->audio_buffer, abuf, asis ? olen : olen * 2); olen = switch_buffer_read(fh->audio_buffer, abuf, framelen);