summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--UPGRADE.txt19
-rw-r--r--channels/chan_sip.c2
-rw-r--r--configs/asterisk.conf.sample1
-rw-r--r--include/asterisk/channel.h11
-rw-r--r--include/asterisk/options.h7
-rw-r--r--main/asterisk.c8
-rw-r--r--main/channel.c138
-rw-r--r--utils/extconf.c3
8 files changed, 86 insertions, 103 deletions
diff --git a/UPGRADE.txt b/UPGRADE.txt
index 41f21f2ec..85a764379 100644
--- a/UPGRADE.txt
+++ b/UPGRADE.txt
@@ -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
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 3d52ce4b8..4db0fe59f 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -13444,7 +13444,7 @@ static enum sip_result add_sdp(struct sip_request *resp, struct sip_pvt *p, int
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");
}
diff --git a/configs/asterisk.conf.sample b/configs/asterisk.conf.sample
index 985c80c28..e10385fbd 100644
--- a/configs/asterisk.conf.sample
+++ b/configs/asterisk.conf.sample
@@ -28,7 +28,6 @@ astsbindir => /usr/sbin
;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,
diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h
index 497ef0bd3..8cef68e87 100644
--- a/include/asterisk/channel.h
+++ b/include/asterisk/channel.h
@@ -2387,17 +2387,6 @@ struct ast_silence_generator *ast_channel_start_silence_generator(struct ast_cha
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
* \param a First channel
* \param b Second channel
diff --git a/include/asterisk/options.h b/include/asterisk/options.h
index 2761415b8..1b35b3666 100644
--- a/include/asterisk/options.h
+++ b/include/asterisk/options.h
@@ -76,8 +76,6 @@ enum ast_option_flags {
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 @@ enum ast_option_flags {
};
/*! 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 @@ enum ast_option_flags {
#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)
diff --git a/main/asterisk.c b/main/asterisk.c
index ffa9b6338..83a451852 100644
--- a/main/asterisk.c
+++ b/main/asterisk.c
@@ -637,7 +637,6 @@ static char *handle_show_settings(struct ast_cli_entry *e, int cmd, struct ast_c
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 @@ static int show_cli_help(void)
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 @@ static void ast_readconfig(void)
/* 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 @@ int main(int argc, char *argv[])
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;
diff --git a/main/channel.c b/main/channel.c
index 23ea4b7c0..94b0e8b1c 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -2943,12 +2943,13 @@ int ast_channel_get_up_time(struct ast_channel *chan)
return (ast_tvdiff_ms(ast_tvnow(), ast_channel_answertime(chan)) / 1000);
}
-void ast_deactivate_generator(struct ast_channel *chan)
+static void deactivate_generator_nolock(struct ast_channel *chan)
{
- 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 = 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 @@ void ast_deactivate_generator(struct ast_channel *chan)
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 @@ int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen,
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,49 +3654,57 @@ static void send_dtmf_end_event(struct ast_channel *chan,
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;
+ 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;
+ }
- if (ast_channel_timingfunc(chan)) {
- ast_debug(1, "Generator got voice, switching to phase locked mode\n");
- ast_settimeout(chan, 0, NULL, NULL);
- }
+ /*
+ * We must generate frames in phase locked mode since
+ * we have no internal timer available.
+ */
- 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;
- 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;
- }
+ 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);
+ 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 @@ done:
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 @@ struct ast_silence_generator *ast_channel_start_silence_generator(struct ast_cha
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 @@ static int internal_deactivate_generator(struct ast_channel *chan, void* generat
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");
diff --git a/utils/extconf.c b/utils/extconf.c
index 1d9884041..051ce7978 100644
--- a/utils/extconf.c
+++ b/utils/extconf.c
@@ -1841,8 +1841,6 @@ enum ast_option_flags {
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 @@ struct ast_flags ast_options = { AST_DEFAULT_OPTIONS };
#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)