[asterisk-commits] rmudgett: trunk r411724 - in /trunk: ./ channels/ configs/ include/asterisk/ ...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri Apr 4 14:20:17 CDT 2014


Author: rmudgett
Date: Fri Apr  4 14:19:55 2014
New Revision: 411724

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=411724
Log:
internal_timing: Remove the option and always make it enabled if a timing module is loaded.

The masquerade supertest frequently fails because either the local channel
chain doesn't completely optimize out or the DTMF handshake doesn't
completely get accross.  Local channel optimization requires frames
flowing to trigger when optimization can happen.  When optimization
happens the media frame that triggered the optimization is dropped.
Sending DTMF requires frames to flow in the other direction for timing
purposes while sending nothing.  If internal timing is not enabled when
MOH is playing, Asterisk switches to received timing when an audio frame
is received.  With optimization dropping media frames and MOH not sending
frames unless it receives frames, occasionaly there are no more frames
being passed and the test fails.

* The asterisk command line -I option and the asterisk.conf
internal_timing option are removed.  Asterisk now always uses internal
timing when needed if any timing module is loaded.  The issue
ASTERISK-14861 did this quite awhile ago in v1.4 but effectively is broken
if other internal timing modules besides DAHDI are used.  The
ast_read_generator_actions() now only does received timing if it has no
choice for frame generators like MOH, silence, and playback streaming.

* Cleaned up some code dealing with frame generators in
ast_deactivate_generator(), generator_write_format_change(),
ast_activate_generator(), and ast_channel_stop_silence_generator().

* Removed ast_internal_timing_enabled(), AST_OPT_FLAG_INTERNAL_TIMING, and
ast_opt_internal_timing.

ASTERISK-22846 #close
Reported by: Matt Jordan

Review: https://reviewboard.asterisk.org/r/3414/
........

Merged revisions 411715 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........

Merged revisions 411716 from http://svn.asterisk.org/svn/asterisk/branches/11
........

Merged revisions 411717 from http://svn.asterisk.org/svn/asterisk/branches/12

Modified:
    trunk/   (props changed)
    trunk/UPGRADE.txt
    trunk/channels/chan_sip.c
    trunk/configs/asterisk.conf.sample
    trunk/include/asterisk/channel.h
    trunk/include/asterisk/options.h
    trunk/main/asterisk.c
    trunk/main/channel.c
    trunk/utils/extconf.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-12-merged' - no diff available.

Modified: trunk/UPGRADE.txt
URL: http://svnview.digium.com/svn/asterisk/trunk/UPGRADE.txt?view=diff&rev=411724&r1=411723&r2=411724
==============================================================================
--- trunk/UPGRADE.txt (original)
+++ trunk/UPGRADE.txt Fri Apr  4 14:19:55 2014
@@ -23,14 +23,17 @@
 
 From 12 to 13:
 
-- The per console verbose level feature as previously implemented caused a
-  large performance penalty.  The fix required some minor incompatibilities
-  if the new rasterisk is used to connect to an earlier version.  If the new
-  rasterisk connects to an older Asterisk version then the root console verbose
-  level is always affected by the "core set verbose" command of the remote
-  console even though it may appear to only affect the current console.  If
-  an older version of rasterisk connects to the new version then the
-  "core set verbose" command will have no effect.
+ - The asterisk command line -I option and the asterisk.conf internal_timing
+   option are removed and always enabled if any timing module is loaded.
+
+ - The per console verbose level feature as previously implemented caused a
+   large performance penalty.  The fix required some minor incompatibilities
+   if the new rasterisk is used to connect to an earlier version.  If the new
+   rasterisk connects to an older Asterisk version then the root console verbose
+   level is always affected by the "core set verbose" command of the remote
+   console even though it may appear to only affect the current console.  If
+   an older version of rasterisk connects to the new version then the
+   "core set verbose" command will have no effect.
 
 ARI:
  - The ARI version has been changed from 1.0.0 to 1.1.0. This is to reflect

Modified: trunk/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/trunk/channels/chan_sip.c?view=diff&rev=411724&r1=411723&r2=411724
==============================================================================
--- trunk/channels/chan_sip.c (original)
+++ trunk/channels/chan_sip.c Fri Apr  4 14:19:55 2014
@@ -13444,7 +13444,7 @@
 
 		ast_debug(3, "-- Done with adding codecs to SDP\n");
 
-		if (!p->owner || !ast_internal_timing_enabled(p->owner)) {
+		if (!p->owner || ast_channel_timingfd(p->owner) == -1) {
 			ast_str_append(&a_audio, 0, "a=silenceSupp:off - - - -\r\n");
 		}
 

Modified: trunk/configs/asterisk.conf.sample
URL: http://svnview.digium.com/svn/asterisk/trunk/configs/asterisk.conf.sample?view=diff&rev=411724&r1=411723&r2=411724
==============================================================================
--- trunk/configs/asterisk.conf.sample (original)
+++ trunk/configs/asterisk.conf.sample Fri Apr  4 14:19:55 2014
@@ -28,7 +28,6 @@
 ;dontwarn = yes			; Disable some warnings.
 ;dumpcore = yes			; Dump core on crash (same as -g at startup).
 ;languageprefix = yes		; Use the new sound prefix path syntax.
-;internal_timing = yes
 ;systemname = my_system_name	; Prefix uniqueid with a system name for
 				; Global uniqueness issues.
 ;autosystemname = yes		; Automatically set systemname to hostname,

Modified: trunk/include/asterisk/channel.h
URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/channel.h?view=diff&rev=411724&r1=411723&r2=411724
==============================================================================
--- trunk/include/asterisk/channel.h (original)
+++ trunk/include/asterisk/channel.h Fri Apr  4 14:19:55 2014
@@ -2385,17 +2385,6 @@
  * to its previous write format.
  */
 void ast_channel_stop_silence_generator(struct ast_channel *chan, struct ast_silence_generator *state);
-
-/*!
- * \brief Check if the channel can run in internal timing mode.
- * \param chan The channel to check
- * \return boolean
- *
- * \details
- * This function will return 1 if internal timing is enabled and the timing
- * device is available.
- */
-int ast_internal_timing_enabled(struct ast_channel *chan);
 
 /*!
  * \brief Determine which channel has an older linkedid

Modified: trunk/include/asterisk/options.h
URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/options.h?view=diff&rev=411724&r1=411723&r2=411724
==============================================================================
--- trunk/include/asterisk/options.h (original)
+++ trunk/include/asterisk/options.h Fri Apr  4 14:19:55 2014
@@ -76,8 +76,6 @@
 	AST_OPT_FLAG_DONT_WARN = (1 << 18),
 	/*! End CDRs before the 'h' extension */
 	AST_OPT_FLAG_END_CDR_BEFORE_H_EXTEN = (1 << 19),
-	/*! Use DAHDI Timing for generators if available */
-	AST_OPT_FLAG_INTERNAL_TIMING = (1 << 20),
 	/*! Always fork, even if verbose or debug settings are non-zero */
 	AST_OPT_FLAG_ALWAYS_FORK = (1 << 21),
 	/*! Disable log/verbose output to remote consoles */
@@ -101,11 +99,7 @@
 };
 
 /*! These are the options that set by default when Asterisk starts */
-#if (defined(HAVE_DAHDI_VERSION) && HAVE_DAHDI_VERSION >= 230)
-#define AST_DEFAULT_OPTIONS AST_OPT_FLAG_TRANSCODE_VIA_SLIN | AST_OPT_FLAG_INTERNAL_TIMING
-#else
 #define AST_DEFAULT_OPTIONS AST_OPT_FLAG_TRANSCODE_VIA_SLIN
-#endif
 
 #define ast_opt_exec_includes		ast_test_flag(&ast_options, AST_OPT_FLAG_EXEC_INCLUDES)
 #define ast_opt_no_fork			ast_test_flag(&ast_options, AST_OPT_FLAG_NO_FORK)
@@ -128,7 +122,6 @@
 #define ast_opt_transmit_silence	ast_test_flag(&ast_options, AST_OPT_FLAG_TRANSMIT_SILENCE)
 #define ast_opt_dont_warn		ast_test_flag(&ast_options, AST_OPT_FLAG_DONT_WARN)
 #define ast_opt_end_cdr_before_h_exten	ast_test_flag(&ast_options, AST_OPT_FLAG_END_CDR_BEFORE_H_EXTEN)
-#define ast_opt_internal_timing		ast_test_flag(&ast_options, AST_OPT_FLAG_INTERNAL_TIMING)
 #define ast_opt_always_fork		ast_test_flag(&ast_options, AST_OPT_FLAG_ALWAYS_FORK)
 #define ast_opt_mute			ast_test_flag(&ast_options, AST_OPT_FLAG_MUTE)
 #define ast_opt_dbg_module		ast_test_flag(&ast_options, AST_OPT_FLAG_DEBUG_MODULE)

Modified: trunk/main/asterisk.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/asterisk.c?view=diff&rev=411724&r1=411723&r2=411724
==============================================================================
--- trunk/main/asterisk.c (original)
+++ trunk/main/asterisk.c Fri Apr  4 14:19:55 2014
@@ -637,7 +637,6 @@
 	ast_cli(a->fd, "  User name and group:         %s/%s\n", ast_config_AST_RUN_USER, ast_config_AST_RUN_GROUP);
 	ast_cli(a->fd, "  Executable includes:         %s\n", ast_test_flag(&ast_options, AST_OPT_FLAG_EXEC_INCLUDES) ? "Enabled" : "Disabled");
 	ast_cli(a->fd, "  Transcode via SLIN:          %s\n", ast_test_flag(&ast_options, AST_OPT_FLAG_TRANSCODE_VIA_SLIN) ? "Enabled" : "Disabled");
-	ast_cli(a->fd, "  Internal timing:             %s\n", ast_test_flag(&ast_options, AST_OPT_FLAG_INTERNAL_TIMING) ? "Enabled" : "Disabled");
 	ast_cli(a->fd, "  Transmit silence during rec: %s\n", ast_test_flag(&ast_options, AST_OPT_FLAG_TRANSMIT_SILENCE) ? "Enabled" : "Disabled");
 	ast_cli(a->fd, "  Generic PLC:                 %s\n", ast_test_flag(&ast_options, AST_OPT_FLAG_GENERIC_PLC) ? "Enabled" : "Disabled");
 	ast_cli(a->fd, "  Min DTMF duration::          %u\n", option_dtmfminduration);
@@ -3363,7 +3362,6 @@
 	printf("   -g              Dump core in case of a crash\n");
 	printf("   -h              This help screen\n");
 	printf("   -i              Initialize crypto keys at startup\n");
-	printf("   -I              Enable internal timing if DAHDI timer is available\n");
 	printf("   -L <load>       Limit the maximum load average before rejecting new calls\n");
 	printf("   -M <value>      Limit the maximum number of calls to the specified value\n");
 	printf("   -m              Mute debugging and console output on the console\n");
@@ -3539,9 +3537,6 @@
 		/* Transmit SLINEAR silence while a channel is being recorded or DTMF is being generated on a channel */
 		} else if (!strcasecmp(v->name, "transmit_silence_during_record") || !strcasecmp(v->name, "transmit_silence")) {
 			ast_set2_flag(&ast_options, ast_true(v->value), AST_OPT_FLAG_TRANSMIT_SILENCE);
-		/* Enable internal timing */
-		} else if (!strcasecmp(v->name, "internal_timing")) {
-			ast_set2_flag(&ast_options, ast_true(v->value), AST_OPT_FLAG_INTERNAL_TIMING);
 		} else if (!strcasecmp(v->name, "mindtmfduration")) {
 			if (sscanf(v->value, "%30u", &option_dtmfminduration) != 1) {
 				option_dtmfminduration = AST_MIN_DTMF_DURATION;
@@ -3869,9 +3864,6 @@
 		case 'h':
 			show_cli_help();
 			exit(0);
-		case 'I':
-			ast_set_flag(&ast_options, AST_OPT_FLAG_INTERNAL_TIMING);
-			break;
 		case 'i':
 			ast_set_flag(&ast_options, AST_OPT_FLAG_INIT_KEYS);
 			break;

Modified: trunk/main/channel.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/channel.c?view=diff&rev=411724&r1=411723&r2=411724
==============================================================================
--- trunk/main/channel.c (original)
+++ trunk/main/channel.c Fri Apr  4 14:19:55 2014
@@ -2943,12 +2943,13 @@
 	return (ast_tvdiff_ms(ast_tvnow(), ast_channel_answertime(chan)) / 1000);
 }
 
-void ast_deactivate_generator(struct ast_channel *chan)
-{
-	ast_channel_lock(chan);
+static void deactivate_generator_nolock(struct ast_channel *chan)
+{
 	if (ast_channel_generatordata(chan)) {
-		if (ast_channel_generator(chan) && ast_channel_generator(chan)->release) {
-			ast_channel_generator(chan)->release(chan, ast_channel_generatordata(chan));
+		struct ast_generator *generator = ast_channel_generator(chan);
+
+		if (generator && generator->release) {
+			generator->release(chan, ast_channel_generatordata(chan));
 		}
 		ast_channel_generatordata_set(chan, NULL);
 		ast_channel_generator_set(chan, NULL);
@@ -2956,14 +2957,23 @@
 		ast_clear_flag(ast_channel_flags(chan), AST_FLAG_WRITE_INT);
 		ast_settimeout(chan, 0, NULL, NULL);
 	}
+}
+
+void ast_deactivate_generator(struct ast_channel *chan)
+{
+	ast_channel_lock(chan);
+	deactivate_generator_nolock(chan);
 	ast_channel_unlock(chan);
 }
 
 static void generator_write_format_change(struct ast_channel *chan)
 {
+	struct ast_generator *generator;
+
 	ast_channel_lock(chan);
-	if (ast_channel_generator(chan) && ast_channel_generator(chan)->write_format_change) {
-		ast_channel_generator(chan)->write_format_change(chan, ast_channel_generatordata(chan));
+	generator = ast_channel_generator(chan);
+	if (generator && generator->write_format_change) {
+		generator->write_format_change(chan, ast_channel_generatordata(chan));
 	}
 	ast_channel_unlock(chan);
 }
@@ -3009,8 +3019,10 @@
 
 	ast_channel_lock(chan);
 	if (ast_channel_generatordata(chan)) {
-		if (ast_channel_generator(chan) && ast_channel_generator(chan)->release) {
-			ast_channel_generator(chan)->release(chan, ast_channel_generatordata(chan));
+		struct ast_generator *generator_old = ast_channel_generator(chan);
+
+		if (generator_old && generator_old->release) {
+			generator_old->release(chan, ast_channel_generatordata(chan));
 		}
 	}
 	if (gen->alloc && !(generatordata = gen->alloc(chan, params))) {
@@ -3642,48 +3654,56 @@
 
 static void ast_read_generator_actions(struct ast_channel *chan, struct ast_frame *f)
 {
-	if (ast_channel_generator(chan) && ast_channel_generator(chan)->generate && ast_channel_generatordata(chan) &&  !ast_internal_timing_enabled(chan)) {
-		void *tmp = ast_channel_generatordata(chan);
-		int (*generate)(struct ast_channel *chan, void *tmp, int datalen, int samples) = ast_channel_generator(chan)->generate;
-		int res;
-		int samples;
-
-		if (ast_channel_timingfunc(chan)) {
-			ast_debug(1, "Generator got voice, switching to phase locked mode\n");
-			ast_settimeout(chan, 0, NULL, NULL);
-		}
-
-		ast_channel_generatordata_set(chan, NULL);     /* reset, to let writes go through */
-
-		if (ast_format_cmp(&f->subclass.format, ast_channel_writeformat(chan)) == AST_FORMAT_CMP_NOT_EQUAL) {
-			float factor;
-			factor = ((float) ast_format_rate(ast_channel_writeformat(chan))) / ((float) ast_format_rate(&f->subclass.format));
-			samples = (int) ( ((float) f->samples) * factor );
-		} else {
-			samples = f->samples;
-		}
-
-		/* This unlock is here based on two assumptions that hold true at this point in the
-		 * code. 1) this function is only called from within __ast_read() and 2) all generators
-		 * call ast_write() in their generate callback.
-		 *
-		 * The reason this is added is so that when ast_write is called, the lock that occurs
-		 * there will not recursively lock the channel. Doing this will cause intended deadlock
-		 * avoidance not to work in deeper functions
-		 */
-		ast_channel_unlock(chan);
-		res = generate(chan, tmp, f->datalen, samples);
-		ast_channel_lock(chan);
-		ast_channel_generatordata_set(chan, tmp);
+	struct ast_generator *generator;
+	void *gendata;
+	int res;
+	int samples;
+
+	generator = ast_channel_generator(chan);
+	if (!generator
+		|| !generator->generate
+		|| f->frametype != AST_FRAME_VOICE
+		|| !ast_channel_generatordata(chan)
+		|| ast_channel_timingfunc(chan)) {
+		return;
+	}
+
+	/*
+	 * We must generate frames in phase locked mode since
+	 * we have no internal timer available.
+	 */
+
+	if (ast_format_cmp(&f->subclass.format, ast_channel_writeformat(chan)) == AST_FORMAT_CMP_NOT_EQUAL) {
+		float factor;
+
+		factor = ((float) ast_format_rate(ast_channel_writeformat(chan))) / ((float) ast_format_rate(&f->subclass.format));
+		samples = (int) (((float) f->samples) * factor);
+	} else {
+		samples = f->samples;
+	}
+
+	gendata = ast_channel_generatordata(chan);
+	ast_channel_generatordata_set(chan, NULL);     /* reset, to let writes go through */
+
+	/*
+	 * This unlock is here based on two assumptions that hold true at
+	 * this point in the code. 1) this function is only called from
+	 * within __ast_read() and 2) all generators call ast_write() in
+	 * their generate callback.
+	 *
+	 * The reason this is added is so that when ast_write is called,
+	 * the lock that occurs there will not recursively lock the
+	 * channel.  Doing this will allow deadlock avoidance to work in
+	 * deeper functions.
+	 */
+	ast_channel_unlock(chan);
+	res = generator->generate(chan, gendata, f->datalen, samples);
+	ast_channel_lock(chan);
+	if (generator == ast_channel_generator(chan)) {
+		ast_channel_generatordata_set(chan, gendata);
 		if (res) {
 			ast_debug(1, "Auto-deactivating generator\n");
 			ast_deactivate_generator(chan);
-		}
-
-	} else if (f->frametype == AST_FRAME_CNG) {
-		if (ast_channel_generator(chan) && !ast_channel_timingfunc(chan) && (ast_channel_timingfd(chan) > -1)) {
-			ast_debug(1, "Generator got CNG, switching to timed mode\n");
-			ast_settimeout(chan, 50, generator_force, chan);
 		}
 	}
 }
@@ -4265,11 +4285,6 @@
 	return f;
 }
 
-int ast_internal_timing_enabled(struct ast_channel *chan)
-{
-	return (ast_opt_internal_timing && ast_channel_timingfd(chan) > -1);
-}
-
 struct ast_frame *ast_read(struct ast_channel *chan)
 {
 	return __ast_read(chan, 0);
@@ -7693,30 +7708,24 @@
 	return state;
 }
 
-static int internal_deactivate_generator(struct ast_channel *chan, void* generator)
+static int deactivate_silence_generator(struct ast_channel *chan)
 {
 	ast_channel_lock(chan);
 
 	if (!ast_channel_generatordata(chan)) {
-		ast_debug(1, "Trying to stop silence generator when there is no "
-		    "generator on '%s'\n", ast_channel_name(chan));
+		ast_debug(1, "Trying to stop silence generator when there is no generator on '%s'\n",
+			ast_channel_name(chan));
 		ast_channel_unlock(chan);
 		return 0;
 	}
-	if (ast_channel_generator(chan) != generator) {
-		ast_debug(1, "Trying to stop silence generator when it is not the current "
-		    "generator on '%s'\n", ast_channel_name(chan));
+	if (ast_channel_generator(chan) != &silence_generator) {
+		ast_debug(1, "Trying to stop silence generator when it is not the current generator on '%s'\n",
+			ast_channel_name(chan));
 		ast_channel_unlock(chan);
 		return 0;
 	}
-	if (ast_channel_generator(chan) && ast_channel_generator(chan)->release) {
-		ast_channel_generator(chan)->release(chan, ast_channel_generatordata(chan));
-	}
-	ast_channel_generatordata_set(chan, NULL);
-	ast_channel_generator_set(chan, NULL);
-	ast_channel_set_fd(chan, AST_GENERATOR_FD, -1);
-	ast_clear_flag(ast_channel_flags(chan), AST_FLAG_WRITE_INT);
-	ast_settimeout(chan, 0, NULL, NULL);
+	deactivate_generator_nolock(chan);
+
 	ast_channel_unlock(chan);
 
 	return 1;
@@ -7724,10 +7733,11 @@
 
 void ast_channel_stop_silence_generator(struct ast_channel *chan, struct ast_silence_generator *state)
 {
-	if (!state)
+	if (!state) {
 		return;
-
-	if (internal_deactivate_generator(chan, &silence_generator)) {
+	}
+
+	if (deactivate_silence_generator(chan)) {
 		ast_debug(1, "Stopped silence generator on '%s'\n", ast_channel_name(chan));
 		if (ast_set_write_format(chan, &state->old_write_format) < 0)
 			ast_log(LOG_ERROR, "Could not return write format to its original state\n");

Modified: trunk/utils/extconf.c
URL: http://svnview.digium.com/svn/asterisk/trunk/utils/extconf.c?view=diff&rev=411724&r1=411723&r2=411724
==============================================================================
--- trunk/utils/extconf.c (original)
+++ trunk/utils/extconf.c Fri Apr  4 14:19:55 2014
@@ -1841,8 +1841,6 @@
 	AST_OPT_FLAG_DONT_WARN = (1 << 18),
 	/*! End CDRs before the 'h' extension */
 	AST_OPT_FLAG_END_CDR_BEFORE_H_EXTEN = (1 << 19),
-	/*! Use DAHDI Timing for generators if available */
-	AST_OPT_FLAG_INTERNAL_TIMING = (1 << 20),
 	/*! Always fork, even if verbose or debug settings are non-zero */
 	AST_OPT_FLAG_ALWAYS_FORK = (1 << 21),
 	/*! Disable log/verbose output to remote consoles */
@@ -1888,7 +1886,6 @@
 #define ast_opt_transmit_silence	ast_test_flag(&ast_options, AST_OPT_FLAG_TRANSMIT_SILENCE)
 #define ast_opt_dont_warn		ast_test_flag(&ast_options, AST_OPT_FLAG_DONT_WARN)
 #define ast_opt_end_cdr_before_h_exten	ast_test_flag(&ast_options, AST_OPT_FLAG_END_CDR_BEFORE_H_EXTEN)
-#define ast_opt_internal_timing		ast_test_flag(&ast_options, AST_OPT_FLAG_INTERNAL_TIMING)
 #define ast_opt_always_fork		ast_test_flag(&ast_options, AST_OPT_FLAG_ALWAYS_FORK)
 #define ast_opt_mute			ast_test_flag(&ast_options, AST_OPT_FLAG_MUTE)
 




More information about the asterisk-commits mailing list