[asterisk-commits] trunk r16473 - in /trunk: ./ apps/ channels/ doc/ include/asterisk/

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Wed Mar 29 23:07:07 MST 2006


Author: oej
Date: Thu Mar 30 00:07:04 2006
New Revision: 16473

URL: http://svn.digium.com/view/asterisk?rev=16473&view=rev
Log:
Issue #5374 - Enable internal timing of generators (cmantunes)

Thanks everyone involved for hard work, testing and testing!

Modified:
    trunk/   (props changed)
    trunk/Makefile
    trunk/apps/app_milliwatt.c
    trunk/apps/app_sms.c
    trunk/asterisk.8
    trunk/asterisk.c
    trunk/asterisk.sgml
    trunk/channel.c
    trunk/channels/chan_sip.c
    trunk/doc/asterisk-conf.txt
    trunk/include/asterisk/channel.h
    trunk/include/asterisk/options.h

Propchange: trunk/
------------------------------------------------------------------------------
    automerge = http://edvina.net

Propchange: trunk/
------------------------------------------------------------------------------
    automerge-email = oej at edvina.net

Propchange: trunk/
------------------------------------------------------------------------------
    svnmerge-integrated = /trunk:1-16427

Modified: trunk/Makefile
URL: http://svn.digium.com/view/asterisk/trunk/Makefile?rev=16473&r1=16472&r2=16473&view=diff
==============================================================================
--- trunk/Makefile (original)
+++ trunk/Makefile Thu Mar 30 00:07:04 2006
@@ -788,6 +788,8 @@
 		echo ";astctlowner = root" ; \
 		echo ";astctlgroup = apache" ; \
 		echo ";astctl = asterisk.ctl" ; \
+		echo ";[options]" ; \
+		echo ";internal_timing = yes" ; \
 		) > $(DESTDIR)$(ASTCONFPATH) ; \
 	else \
 		echo "Skipping asterisk.conf creation"; \

Modified: trunk/apps/app_milliwatt.c
URL: http://svn.digium.com/view/asterisk/trunk/apps/app_milliwatt.c?rev=16473&r1=16472&r2=16473&view=diff
==============================================================================
--- trunk/apps/app_milliwatt.c (original)
+++ trunk/apps/app_milliwatt.c Thu Mar 30 00:07:04 2006
@@ -71,20 +71,27 @@
 {
 	struct ast_frame wf;
 	unsigned char buf[AST_FRIENDLY_OFFSET + 640];
-	int i,*indexp = (int *) data;
+	const int maxsamples = sizeof (buf) / sizeof (buf[0]);
+	int i, *indexp = (int *) data;
 
-	if (len + AST_FRIENDLY_OFFSET > sizeof(buf))
-	{
-		ast_log(LOG_WARNING,"Only doing %d bytes (%d bytes requested)\n",(int)(sizeof(buf) - AST_FRIENDLY_OFFSET),len);
-		len = sizeof(buf) - AST_FRIENDLY_OFFSET;
+	/* Instead of len, use samples, because channel.c generator_force
+	* generate(chan, tmp, 0, 160) ignores len. In any case, len is
+	* a multiple of samples, given by number of samples times bytes per
+	* sample. In the case of ulaw, len = samples. for signed linear
+	* len = 2 * samples */
+
+	if (samples > maxsamples) {
+		ast_log(LOG_WARNING, "Only doing %d samples (%d requested)\n", maxsamples, samples);
+		samples = maxsamples;
 	}
+	len = samples * sizeof (buf[0]);
 	wf.frametype = AST_FRAME_VOICE;
 	wf.subclass = AST_FORMAT_ULAW;
 	wf.offset = AST_FRIENDLY_OFFSET;
 	wf.mallocd = 0;
 	wf.data = buf + AST_FRIENDLY_OFFSET;
 	wf.datalen = len;
-	wf.samples = wf.datalen;
+	wf.samples = samples;
 	wf.src = "app_milliwatt";
 	wf.delivery.tv_sec = 0;
 	wf.delivery.tv_usec = 0;

Modified: trunk/apps/app_sms.c
URL: http://svn.digium.com/view/asterisk/trunk/apps/app_sms.c?rev=16473&r1=16472&r2=16473&view=diff
==============================================================================
--- trunk/apps/app_sms.c (original)
+++ trunk/apps/app_sms.c Thu Mar 30 00:07:04 2006
@@ -1177,32 +1177,31 @@
 {
 	struct ast_frame f = { 0 };
 	unsigned char waste[AST_FRIENDLY_OFFSET];
+#define MAXSAMPLES (800)
 #ifdef OUTALAW
-	unsigned char buf[800];
+	unsigned char buf[MAXSAMPLES];
 #else
-	signed short buf[800];
+	signed short buf[MAXSAMPLES];
 #endif
+#define SAMPLE2LEN (sizeof (buf[0]))
 	sms_t *h = data;
 	int i;
 
-	if (len > sizeof (buf)) {
-		ast_log (LOG_WARNING, "Only doing %d bytes (%d bytes requested)\n", (int)(sizeof (buf) / sizeof (signed short)), len);
-		len = sizeof (buf);
-#ifdef OUTALAW
-		samples = len;
-#else
-		samples = len / 2;
-#endif
-	}
-	waste[0] = 0;					 /* make compiler happy */
+	if (samples > MAXSAMPLES) {
+		ast_log (LOG_WARNING, "Only doing %d samples (%d requested)\n",
+			 MAXSAMPLES, samples);
+		samples = MAXSAMPLES;
+	}
+	len = samples * SAMPLE2LEN;
+
+	waste[0] = 0;				 /* make compiler happy */
 	f.frametype = AST_FRAME_VOICE;
 #ifdef OUTALAW
 	f.subclass = AST_FORMAT_ALAW;
-	f.datalen = samples;
 #else
 	f.subclass = AST_FORMAT_SLINEAR;
-	f.datalen = samples * 2;
 #endif
+	f.datalen = len;
 	f.offset = AST_FRIENDLY_OFFSET;
 	f.mallocd = 0;
 	f.data = buf;
@@ -1254,6 +1253,8 @@
 		return -1;
 	}
 	return 0;
+#undef SAMPLE2LEN
+#undef MAXSAMPLES
 }
 
 static void sms_process (sms_t * h, int samples, signed short *data)

Modified: trunk/asterisk.8
URL: http://svn.digium.com/view/asterisk/trunk/asterisk.8?rev=16473&r1=16472&r2=16473&view=diff
==============================================================================
--- trunk/asterisk.8 (original)
+++ trunk/asterisk.8 Thu Mar 30 00:07:04 2006
@@ -9,7 +9,7 @@
 asterisk \- All-purpose telephony server.
 .SH SYNOPSIS
 
-\fBasterisk\fR [ \fB-tThfdvVqpRgcin\fR ] [ \fB-C \fIfile\fB\fR ] [ \fB-U \fIuser\fB\fR ] [ \fB-G \fIgroup\fB\fR ] [ \fB-x \fIcommand\fB\fR ] [ \fB-M \fIvalue\fB\fR ]
+\fBasterisk\fR [ \fB-tThfdvVqpRgciIn\fR ] [ \fB-C \fIfile\fB\fR ] [ \fB-U \fIuser\fB\fR ] [ \fB-G \fIgroup\fB\fR ] [ \fB-x \fIcommand\fB\fR ] [ \fB-M \fIvalue\fB\fR ]
 
 
 \fBasterisk -r\fR [ \fB-v\fR ] [ \fB-x \fIcommand\fB\fR ]
@@ -114,6 +114,12 @@
 for controlling it. Additionally, if connection to the Asterisk 
 process is lost, attempt to reconnect for as long as 30 seconds.
 .TP
+\fB-I\fR
+Enable internal timing if Zaptel timer is available
+The default behaviour is that outbound packets are phase locked
+to inbound packets. Enabling this switch causes them to be
+locked to the internal Zaptel timer instead.
+.TP
 \fB-t\fR
 When recording files, write them first into a temporary holding directory, 
 then move them into the final location when done.

Modified: trunk/asterisk.c
URL: http://svn.digium.com/view/asterisk/trunk/asterisk.c?rev=16473&r1=16472&r2=16473&view=diff
==============================================================================
--- trunk/asterisk.c (original)
+++ trunk/asterisk.c Thu Mar 30 00:07:04 2006
@@ -160,6 +160,9 @@
 
 double option_maxload = 0.0;			/*!< Max load avg on system */
 int option_maxcalls = 0;			/*!< Max number of active calls */
+
+int option_internal_timing = 0;
+
 
 /*! @} */
 
@@ -1970,6 +1973,9 @@
 		/* Transmit SLINEAR silence while a channel is being recorded */
 		} else if (!strcasecmp(v->name, "transmit_silence_during_record")) {
 			ast_set2_flag(&ast_options, ast_true(v->value), AST_OPT_FLAG_TRANSMIT_SILENCE);
+		/* Enable internal timing */
+		} else if (!strcasecmp(v->name, "internal_timing")) {
+			option_internal_timing = ast_true(v->value);
 		} else if (!strcasecmp(v->name, "maxcalls")) {
 			if ((sscanf(v->value, "%d", &option_maxcalls) != 1) || (option_maxcalls < 0)) {
 				option_maxcalls = 0;
@@ -2049,7 +2055,7 @@
 	}
 	*/
 	/* Check for options */
-	while((c=getopt(argc, argv, "tThfdvVqprRgcinx:U:G:C:L:M:")) != -1) {
+	while((c=getopt(argc, argv, "tThfdvVqprRgciInx:U:G:C:L:M:")) != -1) {
 		switch(c) {
 		case 'd':
 			option_debug++;
@@ -2088,6 +2094,7 @@
 		case 'q':
 			ast_set_flag(&ast_options, AST_OPT_FLAG_QUIET);
 			break;
+			break;
 		case 't':
 			ast_set_flag(&ast_options, AST_OPT_FLAG_CACHE_RECORD_FILES);
 			break;
@@ -2101,6 +2108,9 @@
 		case 'C':
 			ast_copy_string(ast_config_AST_CONFIG_FILE, optarg, sizeof(ast_config_AST_CONFIG_FILE));
 			ast_set_flag(&ast_options, AST_OPT_FLAG_OVERRIDE_CONFIG);
+			break;
+		case 'I':
+			option_internal_timing = 1;
 			break;
 		case 'i':
 			ast_set_flag(&ast_options, AST_OPT_FLAG_INIT_KEYS);

Modified: trunk/asterisk.sgml
URL: http://svn.digium.com/view/asterisk/trunk/asterisk.sgml?rev=16473&r1=16472&r2=16473&view=diff
==============================================================================
--- trunk/asterisk.sgml (original)
+++ trunk/asterisk.sgml Thu Mar 30 00:07:04 2006
@@ -21,7 +21,7 @@
 <refsynopsisdiv>
 	<cmdsynopsis>
 	<command>asterisk</command>
-<arg><option>-tThfdvVqpRgcin</option></arg>
+<arg><option>-tThfdvVqpRgciIn</option></arg>
 <arg><option>-C </option><replaceable class="parameter">file</replaceable></arg>
 <arg><option>-U </option><replaceable class="parameter">user</replaceable></arg>
 <arg><option>-G </option><replaceable class="parameter">group</replaceable></arg>
@@ -38,7 +38,7 @@
 </refsynopsisdiv>
 <refsect1>
 	<refsect1info>
-		<date>2004-07-01</date>
+		<date>2006-03-29</date>
 	</refsect1info>
 	<title>DESCRIPTION</title>
 	<para>
@@ -154,6 +154,17 @@
 		</listitem>
 	</varlistentry>
 	<varlistentry>
+		<term>-I</term>
+		<listitem>
+			<para>
+			Enable internal timing if Zaptel timing is available.
+			The default behaviour is that outbound packets are phase locked
+			to inbound packets. Enabling this switch causes them to be
+			locked to the internal Zaptel timer instead.
+			</para>
+		</listitem>
+	</varlistentry>
+	<varlistentry>
 		<term>-L <replaceable class="parameter">loadaverage</replaceable></term>
 		<listitem>
 			<para>

Modified: trunk/channel.c
URL: http://svn.digium.com/view/asterisk/trunk/channel.c?rev=16473&r1=16472&r2=16473&view=diff
==============================================================================
--- trunk/channel.c (original)
+++ trunk/channel.c Thu Mar 30 00:07:04 2006
@@ -1976,30 +1976,34 @@
 						f = &ast_null_frame;
 				}
 
-				/* Run any generator sitting on the channel */
-				if (chan->generatordata) {
-					/* Mask generator data temporarily and apply.  If there is a timing function, it
-					   will be calling the generator instead */
+				/* Run generator sitting on the line if timing device not available
+				* and synchronous generation of outgoing frames is necessary       */
+				if (chan->generatordata &&  !ast_internal_timing_enabled(chan)) {
 					void *tmp;
 					int res;
 					int (*generate)(struct ast_channel *chan, void *tmp, int datalen, int samples);
-					
+
 					if (chan->timingfunc) {
-						ast_log(LOG_DEBUG, "Generator got voice, switching to phase locked mode\n");
+						if (option_debug > 1)
+							ast_log(LOG_DEBUG, "Generator got voice, switching to phase locked mode\n");
 						ast_settimeout(chan, 0, NULL, NULL);
 					}
+
 					tmp = chan->generatordata;
 					chan->generatordata = NULL;
 					generate = chan->generator->generate;
 					res = generate(chan, tmp, f->datalen, f->samples);
 					chan->generatordata = tmp;
 					if (res) {
-						ast_log(LOG_DEBUG, "Auto-deactivating generator\n");
+						if (option_debug > 1)
+							ast_log(LOG_DEBUG, "Auto-deactivating generator\n");
 						ast_deactivate_generator(chan);
 					}
+
 				} else if (f->frametype == AST_FRAME_CNG) {
 					if (chan->generator && !chan->timingfunc && (chan->timingfd > -1)) {
-						ast_log(LOG_DEBUG, "Generator got CNG, switching to timed mode\n");
+						if (option_debug > 1)
+							ast_log(LOG_DEBUG, "Generator got CNG, switching to timed mode\n");
 						ast_settimeout(chan, 160, generator_force, chan);
 					}
 				}
@@ -2025,6 +2029,14 @@
 	ast_mutex_unlock(&chan->lock);
 
 	return f;
+}
+
+int ast_internal_timing_enabled(struct ast_channel *chan)
+{
+	int ret = option_internal_timing && chan->timingfd > -1;
+	if (option_verbose > 2) 
+		ast_verbose(VERBOSE_PREFIX_3 "Internal timing is %s (option_internal_timing=%d chan->timingfd=%d)\n", ret? "enabled": "disabled", option_internal_timing, chan->timingfd);
+	return ret;
 }
 
 struct ast_frame *ast_read(struct ast_channel *chan)

Modified: trunk/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/chan_sip.c?rev=16473&r1=16472&r2=16473&view=diff
==============================================================================
--- trunk/channels/chan_sip.c (original)
+++ trunk/channels/chan_sip.c Thu Mar 30 00:07:04 2006
@@ -4699,7 +4699,8 @@
 				    debug);
 	}
 
-	ast_build_string(&a_audio_next, &a_audio_left, "a=silenceSupp:off - - - -\r\n");
+	if(!ast_internal_timing_enabled(p->owner))
+		ast_build_string(&a_audio_next, &a_audio_left, "a=silenceSupp:off - - - -\r\n");
 
 	if ((m_audio_left < 2) || (m_video_left < 2) || (a_audio_left == 0) || (a_video_left == 0))
 		ast_log(LOG_WARNING, "SIP SDP may be truncated due to undersized buffer!!\n");

Modified: trunk/doc/asterisk-conf.txt
URL: http://svn.digium.com/view/asterisk/trunk/doc/asterisk-conf.txt?rev=16473&r1=16472&r2=16473&view=diff
==============================================================================
--- trunk/doc/asterisk-conf.txt (original)
+++ trunk/doc/asterisk-conf.txt Thu Mar 30 00:07:04 2006
@@ -52,6 +52,7 @@
 runuser = asterisk				; User to run asterisk as (-U) NOTE: will require changes to
 						; directory and device permisions
 rungroup = asterisk				; Group to run asterisk as (-G)
+internal_timing = yes | no			; Enable internal timing support (-I)
 
 ;These options have no command line equivalent
 cache_record_files = yes | no			; Cache record() files in another directory until completion

Modified: trunk/include/asterisk/channel.h
URL: http://svn.digium.com/view/asterisk/trunk/include/asterisk/channel.h?rev=16473&r1=16472&r2=16473&view=diff
==============================================================================
--- trunk/include/asterisk/channel.h (original)
+++ trunk/include/asterisk/channel.h Thu Mar 30 00:07:04 2006
@@ -1124,6 +1124,16 @@
  */
 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
+
+  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);
+
 /* Misc. functions below */
 
 /* if fd is a valid descriptor, set *pfd with the descriptor

Modified: trunk/include/asterisk/options.h
URL: http://svn.digium.com/view/asterisk/trunk/include/asterisk/options.h?rev=16473&r1=16472&r2=16473&view=diff
==============================================================================
--- trunk/include/asterisk/options.h (original)
+++ trunk/include/asterisk/options.h Thu Mar 30 00:07:04 2006
@@ -101,10 +101,10 @@
 extern struct ast_flags ast_options;
 
 extern int option_verbose;
-extern int option_debug;
-extern int option_maxcalls;
+extern int option_debug;		/*!< Debugging */
+extern int option_maxcalls;		/*!< Maximum number of simultaneous channels */
 extern double option_maxload;
-
+extern int option_internal_timing;	/*!< Flag for internal timing (RTP) */
 extern char defaultlanguage[];
 
 extern time_t ast_startuptime;



More information about the asterisk-commits mailing list