Skip to content
Commits on Source (3)
16.1.1
\ No newline at end of file
16.2.0
\ No newline at end of file
......@@ -8,6 +8,55 @@
===
==============================================================================
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 16.1.0 to Asterisk 16.2.0 ------------
------------------------------------------------------------------------------
ARI
------------------
* Whenever an ARI application is started, a context will be created for it
automatically as long as one does not already exist, following the format
'stasis-<app_name>'. Two extensions are also added to this context: a match-all
extension, and the 'h' extension. Any phone that registers under this context
will place all calls to the corresponding Stasis application.
res_pjsip
------------------
* Added "send_contact_status_on_update_registration" global configuration option
to enable sending AMI ContactStatus event when a device refreshes its registration.
Core
------------------
* Reworked the media indexer so it doesn't cache the index. Testing revealed
that the cache added no benefit but that it could consume excessive memory.
Two new index related functions were created: ast_sounds_get_index_for_file()
and ast_media_index_update_for_file() which restrict index updating to
specific sound files. The original ast_sounds_get_index() and
ast_media_index_update() calls are still available but since they no longer
cache the results internally, developers should re-use an index they may
already have instead of calling ast_sounds_get_index() repeatedly. If
information for only a single file is needed, ast_sounds_get_index_for_file()
should be called instead of ast_sounds_get_index().
Features
------------------
* Before Asterisk 12, when using the automon or automixmon features defined
in features.conf, a channel variable (TOUCH_MIXMONITOR_OUTPUT) was set on
both channels, indicating the filename of the recording.
When bridging was overhauled in Asterisk 12, the behavior was changed such
that the variable was only set on the peer channel and not on the channel
that initiated the automon or automixmon.
The previous behavior has been restored so both channels receive the
channel variable when one of these features is invoked.
app_voicemail
------------------
* You can now specify a special context with the "aliasescontext" parameter
in voicemail.conf which will allow you to create aliases for physical
mailboxes.
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 16.0.0 to Asterisk 16.1.0 ------------
------------------------------------------------------------------------------
......
This diff is collapsed.
......@@ -1360,7 +1360,7 @@ int conf_handle_inactive_waitmarked(struct confbridge_user *user)
return 0;
}
int conf_handle_only_unmarked(struct confbridge_user *user)
int conf_handle_only_person(struct confbridge_user *user)
{
/* If audio prompts have not been quieted or this prompt quieted play it on out */
if (!ast_test_flag(&user->u_profile, USER_OPT_QUIET | USER_OPT_NOONLYPERSON)) {
......
......@@ -4667,7 +4667,7 @@ static int ring_one(struct queue_ent *qe, struct callattempt *outgoing, int *bus
/* Ring just the best channel */
ast_debug(1, "Trying '%s' with metric %d\n", best->interface, best->metric);
ret = ring_entry(qe, best, busies);
if (qe->predial_callee && cur->chan) {
if (qe->predial_callee && best->chan) {
ast_autoservice_start(best->chan);
}
}
......
......@@ -999,6 +999,7 @@ static int skipms;
static int maxlogins;
static int minpassword;
static int passwordlocation;
static char aliasescontext[MAX_VM_CONTEXT_LEN];
 
/*! Poll mailboxes for changes since there is something external to
* app_voicemail that may change them. */
......@@ -1051,6 +1052,27 @@ static struct ast_taskprocessor *mwi_subscription_tps;
 
static AST_RWLIST_HEAD_STATIC(mwi_subs, mwi_sub);
 
struct alias_mailbox_mapping {
char *alias;
char *mailbox;
char buf[0];
};
struct mailbox_alias_mapping {
char *alias;
char *mailbox;
char buf[0];
};
#define MAPPING_BUCKETS 511
static struct ao2_container *alias_mailbox_mappings;
AO2_STRING_FIELD_HASH_FN(alias_mailbox_mapping, alias);
AO2_STRING_FIELD_CMP_FN(alias_mailbox_mapping, alias);
static struct ao2_container *mailbox_alias_mappings;
AO2_STRING_FIELD_HASH_FN(mailbox_alias_mapping, mailbox);
AO2_STRING_FIELD_CMP_FN(mailbox_alias_mapping, mailbox);
/* custom audio control prompts for voicemail playback */
static char listen_control_forward_key[12];
static char listen_control_reverse_key[12];
......@@ -1765,9 +1787,31 @@ static struct ast_vm_user *find_user(struct ast_vm_user *ivm, const char *contex
ast_set2_flag(vmu, !ivm, VM_ALLOCED);
AST_LIST_NEXT(vmu, list) = NULL;
}
} else
vmu = find_user_realtime(ivm, context, mailbox);
}
AST_LIST_UNLOCK(&users);
if (!vmu) {
vmu = find_user_realtime(ivm, context, mailbox);
}
if (!vmu && !ast_strlen_zero(aliasescontext)) {
struct alias_mailbox_mapping *mapping;
char *search_string = ast_alloca(MAX_VM_MAILBOX_LEN);
snprintf(search_string, MAX_VM_MAILBOX_LEN, "%s%s%s",
mailbox,
ast_strlen_zero(context) ? "" : "@",
S_OR(context, ""));
mapping = ao2_find(alias_mailbox_mappings, search_string, OBJ_SEARCH_KEY);
if (mapping) {
char *search_mailbox = NULL;
char *search_context = NULL;
separate_mailbox(ast_strdupa(mapping->mailbox), &search_mailbox, &search_context);
ao2_ref(mapping, -1);
vmu = find_user(ivm, search_mailbox, search_context);
}
}
return vmu;
}
 
......@@ -2043,10 +2087,6 @@ static void free_user(struct ast_vm_user *vmu)
return;
}
 
if (!ast_strlen_zero(vmu->mailbox)) {
ast_delete_mwi_state_full(vmu->mailbox, vmu->context, NULL);
}
ast_free(vmu->email);
vmu->email = NULL;
ast_free(vmu->emailbody);
......@@ -2059,6 +2099,19 @@ static void free_user(struct ast_vm_user *vmu)
}
}
 
static void free_user_final(struct ast_vm_user *vmu)
{
if (!vmu) {
return;
}
if (!ast_strlen_zero(vmu->mailbox)) {
ast_delete_mwi_state_full(vmu->mailbox, vmu->context, NULL);
}
free_user(vmu);
}
static int vm_allocate_dh(struct vm_state *vms, struct ast_vm_user *vmu, int count_msg) {
 
int arraysize = (vmu->maxmsg > count_msg ? vmu->maxmsg : count_msg);
......@@ -6047,6 +6100,9 @@ static int __has_voicemail(const char *context, const char *mailbox, const char
struct dirent *de;
char fn[256];
int ret = 0;
struct alias_mailbox_mapping *mapping;
char *c;
char *m;
 
/* If no mailbox, return immediately */
if (ast_strlen_zero(mailbox))
......@@ -6057,7 +6113,21 @@ static int __has_voicemail(const char *context, const char *mailbox, const char
if (ast_strlen_zero(context))
context = "default";
 
snprintf(fn, sizeof(fn), "%s%s/%s/%s", VM_SPOOL_DIR, context, mailbox, folder);
c = (char *)context;
m = (char *)mailbox;
if (!ast_strlen_zero(aliasescontext)) {
char tmp[MAX_VM_MAILBOX_LEN];
snprintf(tmp, MAX_VM_MAILBOX_LEN, "%s@%s", mailbox, context);
mapping = ao2_find(alias_mailbox_mappings, tmp, OBJ_SEARCH_KEY);
if (mapping) {
separate_mailbox(ast_strdupa(mapping->mailbox), &m, &c);
ao2_ref(mapping, -1);
}
}
snprintf(fn, sizeof(fn), "%s%s/%s/%s", VM_SPOOL_DIR, c, m, folder);
 
if (!(dir = opendir(fn)))
return 0;
......@@ -7082,6 +7152,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, struct leave_vm_
RENAME(dir, msgnum, vmu->mailbox, vmu->context, urgdir, x, sfn, dfn);
/* Notification must happen for this new message in Urgent folder, not INBOX */
ast_copy_string(fn, dfn, sizeof(fn));
pbx_builtin_setvar_helper(chan, "VM_MESSAGEFILE", fn);
msgnum = x;
}
#endif
......@@ -8086,7 +8157,24 @@ static void queue_mwi_event(const char *channel_id, const char *box, int urgent,
return;
}
 
ast_debug(3, "Queueing event for mailbox %s New: %d Old: %d\n", box, new + urgent, old);
ast_publish_mwi_state_channel(mailbox, context, new + urgent, old, channel_id);
if (!ast_strlen_zero(aliasescontext)) {
struct ao2_iterator *aliases;
struct mailbox_alias_mapping *mapping;
aliases = ao2_find(mailbox_alias_mappings, box, OBJ_SEARCH_KEY | OBJ_MULTIPLE);
while ((mapping = ao2_iterator_next(aliases))) {
mailbox = NULL;
context = NULL;
ast_debug(3, "Found alias mapping: %s -> %s\n", mapping->alias, box);
separate_mailbox(ast_strdupa(mapping->alias), &mailbox, &context);
ast_publish_mwi_state_channel(mailbox, context, new + urgent, old, channel_id);
ao2_ref(mapping, -1);
}
ao2_iterator_destroy(aliases);
}
}
 
/*!
......@@ -12990,6 +13078,46 @@ static char *handle_voicemail_show_zones(struct ast_cli_entry *e, int cmd, struc
return res;
}
 
/*! \brief Show a list of voicemail zones in the CLI */
static char *handle_voicemail_show_aliases(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
struct ao2_iterator aliases;
struct alias_mailbox_mapping *mapping;
#define ALIASES_OUTPUT_FORMAT "%-32s %-32s\n"
char *res = CLI_SUCCESS;
switch (cmd) {
case CLI_INIT:
e->command = "voicemail show aliases";
e->usage =
"Usage: voicemail show aliases\n"
" Lists mailbox aliases\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
if (a->argc != 3)
return CLI_SHOWUSAGE;
if (ast_strlen_zero(aliasescontext)) {
ast_cli(a->fd, "Aliases are not enabled\n");
return res;
}
ast_cli(a->fd, "Aliases context: %s\n", aliasescontext);
ast_cli(a->fd, ALIASES_OUTPUT_FORMAT, "Alias", "Mailbox");
aliases = ao2_iterator_init(alias_mailbox_mappings, 0);
while ((mapping = ao2_iterator_next(&aliases))) {
ast_cli(a->fd, ALIASES_OUTPUT_FORMAT, mapping->alias, mapping->mailbox);
ao2_ref(mapping, -1);
}
ao2_iterator_destroy(&aliases);
return res;
}
/*! \brief Reload voicemail configuration from the CLI */
static char *handle_voicemail_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
......@@ -13016,6 +13144,7 @@ static char *handle_voicemail_reload(struct ast_cli_entry *e, int cmd, struct as
static struct ast_cli_entry cli_voicemail[] = {
AST_CLI_DEFINE(handle_voicemail_show_users, "List defined voicemail boxes"),
AST_CLI_DEFINE(handle_voicemail_show_zones, "List zone message formats"),
AST_CLI_DEFINE(handle_voicemail_show_aliases, "List mailbox aliases"),
AST_CLI_DEFINE(handle_voicemail_reload, "Reload voicemail configuration"),
};
 
......@@ -13234,7 +13363,6 @@ static void mwi_event_cb(void *userdata, struct stasis_subscription *sub, struct
if (stasis_message_type(msg) != stasis_subscription_change_type()) {
return;
}
change = stasis_message_data(msg);
if (change->topic == ast_mwi_topic_all()) {
return;
......@@ -13540,7 +13668,7 @@ static void free_vm_users(void)
AST_LIST_LOCK(&users);
while ((current = AST_LIST_REMOVE_HEAD(&users, list))) {
ast_set_flag(current, VM_ALLOCED);
free_user(current);
free_user_final(current);
}
AST_LIST_UNLOCK(&users);
}
......@@ -13652,11 +13780,98 @@ static int load_config_from_memory(int reload, struct ast_config *cfg, struct as
}
#endif
 
static struct alias_mailbox_mapping *alias_mailbox_mapping_create(const char *alias, const char *mailbox)
{
struct alias_mailbox_mapping *mapping;
size_t from_len = strlen(alias) + 1;
size_t to_len = strlen(mailbox) + 1;
mapping = ao2_alloc(sizeof(*mapping) + from_len + to_len, NULL);
if (!mapping) {
return NULL;
}
mapping->alias = mapping->buf;
mapping->mailbox = mapping->buf + from_len;
strcpy(mapping->alias, alias); /* Safe */
strcpy(mapping->mailbox, mailbox); /* Safe */
return mapping;
}
static void load_aliases(struct ast_config *cfg)
{
struct ast_variable *var;
if (ast_strlen_zero(aliasescontext)) {
return;
}
var = ast_variable_browse(cfg, aliasescontext);
while (var) {
struct alias_mailbox_mapping *mapping = alias_mailbox_mapping_create(var->name, var->value);
if (mapping) {
ao2_link(alias_mailbox_mappings, mapping);
ao2_link(mailbox_alias_mappings, mapping);
ao2_ref(mapping, -1);
}
var = var->next;
}
}
static void load_zonemessages(struct ast_config *cfg)
{
struct ast_variable *var;
var = ast_variable_browse(cfg, "zonemessages");
while (var) {
struct vm_zone *z;
char *msg_format, *tzone;
z = ast_malloc(sizeof(*z));
if (!z) {
return;
}
msg_format = ast_strdupa(var->value);
tzone = strsep(&msg_format, "|,");
if (msg_format) {
ast_copy_string(z->name, var->name, sizeof(z->name));
ast_copy_string(z->timezone, tzone, sizeof(z->timezone));
ast_copy_string(z->msg_format, msg_format, sizeof(z->msg_format));
AST_LIST_LOCK(&zones);
AST_LIST_INSERT_HEAD(&zones, z, list);
AST_LIST_UNLOCK(&zones);
} else {
ast_log(AST_LOG_WARNING, "Invalid timezone definition at line %d\n", var->lineno);
ast_free(z);
}
var = var->next;
}
}
static void load_users(struct ast_config *cfg)
{
struct ast_variable *var;
char *cat = NULL;
while ((cat = ast_category_browse(cfg, cat))) {
if (strcasecmp(cat, "general") == 0
|| strcasecmp(cat, aliasescontext) == 0
|| strcasecmp(cat, "zonemessages") == 0) {
continue;
}
var = ast_variable_browse(cfg, cat);
while (var) {
append_mailbox(cat, var->name, var->value);
var = var->next;
}
}
}
static int actual_load_config(int reload, struct ast_config *cfg, struct ast_config *ucfg)
{
struct ast_vm_user *current;
char *cat;
struct ast_variable *var;
const char *val;
char *q, *stringp, *tmp;
int x;
......@@ -13685,6 +13900,10 @@ static int actual_load_config(int reload, struct ast_config *cfg, struct ast_con
/* Free all the zones structure */
free_vm_zones();
 
/* Remove all aliases */
ao2_callback(alias_mailbox_mappings, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, NULL, NULL);
ao2_callback(mailbox_alias_mappings, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, NULL, NULL);
AST_LIST_LOCK(&users);
 
memset(ext_pass_cmd, 0, sizeof(ext_pass_cmd));
......@@ -13696,6 +13915,11 @@ static int actual_load_config(int reload, struct ast_config *cfg, struct ast_con
if (!(val = ast_variable_retrieve(cfg, "general", "userscontext")))
val = "default";
ast_copy_string(userscontext, val, sizeof(userscontext));
aliasescontext[0] = '\0';
val = ast_variable_retrieve(cfg, "general", "aliasescontext");
ast_copy_string(aliasescontext, S_OR(val, ""), sizeof(aliasescontext));
/* Attach voice message to mail message ? */
if (!(val = ast_variable_retrieve(cfg, "general", "attach")))
val = "yes";
......@@ -14297,45 +14521,16 @@ static int actual_load_config(int reload, struct ast_config *cfg, struct ast_con
}
 
/* load mailboxes from voicemail.conf */
cat = ast_category_browse(cfg, NULL);
while (cat) {
if (strcasecmp(cat, "general")) {
var = ast_variable_browse(cfg, cat);
if (strcasecmp(cat, "zonemessages")) {
/* Process mailboxes in this context */
while (var) {
append_mailbox(cat, var->name, var->value);
var = var->next;
}
} else {
/* Timezones in this context */
while (var) {
struct vm_zone *z;
if ((z = ast_malloc(sizeof(*z)))) {
char *msg_format, *tzone;
msg_format = ast_strdupa(var->value);
tzone = strsep(&msg_format, "|,");
if (msg_format) {
ast_copy_string(z->name, var->name, sizeof(z->name));
ast_copy_string(z->timezone, tzone, sizeof(z->timezone));
ast_copy_string(z->msg_format, msg_format, sizeof(z->msg_format));
AST_LIST_LOCK(&zones);
AST_LIST_INSERT_HEAD(&zones, z, list);
AST_LIST_UNLOCK(&zones);
} else {
ast_log(AST_LOG_WARNING, "Invalid timezone definition at line %d\n", var->lineno);
ast_free(z);
}
} else {
AST_LIST_UNLOCK(&users);
return -1;
}
var = var->next;
}
}
}
cat = ast_category_browse(cfg, cat);
}
/*
* Aliases must be loaded before users or the aliases won't be notified
* if there's existing voicemail in the user mailbox.
*/
load_aliases(cfg);
load_zonemessages(cfg);
load_users(cfg);
 
AST_LIST_UNLOCK(&users);
 
......@@ -15086,6 +15281,16 @@ static int unload_module(void)
return res;
}
 
static void print_mappings(void *v_obj, void *where, ao2_prnt_fn *prnt)
{
struct alias_mailbox_mapping *mapping = v_obj;
if (!mapping) {
return;
}
prnt(where, "Alias: %s Mailbox: %s", mapping->alias, mapping->mailbox);
}
/*!
* \brief Load the module
*
......@@ -15112,6 +15317,38 @@ static int load_module(void)
return AST_MODULE_LOAD_DECLINE;
}
 
alias_mailbox_mappings = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, MAPPING_BUCKETS,
alias_mailbox_mapping_hash_fn, NULL, alias_mailbox_mapping_cmp_fn);
if (!alias_mailbox_mappings) {
ast_log(LOG_ERROR, "Unable to create alias_mailbox_mappings container\n");
ao2_cleanup(inprocess_container);
return AST_MODULE_LOAD_DECLINE;
}
res = ao2_container_register("voicemail_alias_mailbox_mappings", alias_mailbox_mappings, print_mappings);
if (res) {
ast_log(LOG_ERROR, "Unable to register alias_mailbox_mappings container\n");
ao2_cleanup(inprocess_container);
ao2_cleanup(alias_mailbox_mappings);
return AST_MODULE_LOAD_DECLINE;
}
mailbox_alias_mappings = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, MAPPING_BUCKETS,
mailbox_alias_mapping_hash_fn, NULL, mailbox_alias_mapping_cmp_fn);
if (!mailbox_alias_mappings) {
ast_log(LOG_ERROR, "Unable to create mailbox_alias_mappings container\n");
ao2_cleanup(inprocess_container);
ao2_cleanup(alias_mailbox_mappings);
return AST_MODULE_LOAD_DECLINE;
}
res = ao2_container_register("voicemail_mailbox_alias_mappings", mailbox_alias_mappings, print_mappings);
if (res) {
ast_log(LOG_ERROR, "Unable to register mailbox_alias_mappings container\n");
ao2_cleanup(inprocess_container);
ao2_cleanup(alias_mailbox_mappings);
ao2_cleanup(mailbox_alias_mappings);
return AST_MODULE_LOAD_DECLINE;
}
/* compute the location of the voicemail spool directory */
snprintf(VM_SPOOL_DIR, sizeof(VM_SPOOL_DIR), "%s/voicemail/", ast_config_AST_SPOOL_DIR);
 
......
......@@ -56,7 +56,7 @@ static void join_unmarked(struct confbridge_user *user)
{
conf_add_user_active(user->conference, user);
conf_handle_first_join(user->conference);
conf_add_post_join_action(user, conf_handle_only_unmarked);
conf_add_post_join_action(user, conf_handle_only_person);
conf_change_state(user, CONF_STATE_SINGLE);
}
......@@ -73,6 +73,7 @@ static void join_marked(struct confbridge_user *user)
{
conf_add_user_marked(user->conference, user);
conf_handle_first_join(user->conference);
conf_add_post_join_action(user, conf_handle_only_person);
conf_change_state(user, CONF_STATE_SINGLE_MARKED);
}
......
......@@ -51,7 +51,7 @@ struct confbridge_state *CONF_STATE_INACTIVE = &STATE_INACTIVE;
static void join_unmarked(struct confbridge_user *user)
{
conf_add_user_active(user->conference, user);
conf_add_post_join_action(user, conf_handle_only_unmarked);
conf_add_post_join_action(user, conf_handle_only_person);
conf_change_state(user, CONF_STATE_SINGLE);
}
......
......@@ -490,13 +490,11 @@ void conf_handle_first_join(struct confbridge_conference *conference);
*/
int conf_handle_inactive_waitmarked(struct confbridge_user *user);
/*! \brief Handle actions whenever an unmarked user joins an inactive conference
* \note These actions seem like they could apply just as well to a marked user
* and possibly be made to happen any time transitioning to a single state.
/*! \brief Handle actions whenever an user joins an empty conference
*
* \param user The unmarked user
* \param user The user
*/
int conf_handle_only_unmarked(struct confbridge_user *user);
int conf_handle_only_person(struct confbridge_user *user);
/*! \brief Handle when a conference moves to having more than one active participant
* \param conference The conference bridge with more than one active participant
......
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><title>Release Summary - asterisk-16.1.1</title><h1 align="center"><a name="top">Release Summary</a></h1><h3 align="center">asterisk-16.1.1</h3><h3 align="center">Date: 2018-12-26</h3><h3 align="center">&lt;asteriskteam@digium.com&gt;</h3><hr><h2 align="center">Table of Contents</h2><ol>
<li><a href="#summary">Summary</a></li>
<li><a href="#contributors">Contributors</a></li>
<li><a href="#closed_issues">Closed Issues</a></li>
<li><a href="#diffstat">Diffstat</a></li>
</ol><hr><a name="summary"><h2 align="center">Summary</h2></a><center><a href="#top">[Back to Top]</a></center><p>This release is a point release of an existing major version. The changes included were made to address problems that have been identified in this release series, or are minor, backwards compatible new features or improvements. Users should be able to safely upgrade to this version if this release series is already in use. Users considering upgrading from a previous version are strongly encouraged to review the UPGRADE.txt document as well as the CHANGES document for information about upgrading to this release series.</p><p>The data in this summary reflects changes that have been made since the previous release, asterisk-16.1.0.</p><hr><a name="contributors"><h2 align="center">Contributors</h2></a><center><a href="#top">[Back to Top]</a></center><p>This table lists the people who have submitted code, those that have tested patches, as well as those that reported issues on the issue tracker that were resolved in this release. For coders, the number is how many of their patches (of any size) were committed into this release. For testers, the number is the number of times their name was listed as assisting with testing a patch. Finally, for reporters, the number is the number of issues that they reported that were affected by commits that went into this release.</p><table width="100%" border="0">
<tr><th width="33%">Coders</th><th width="33%">Testers</th><th width="33%">Reporters</th></tr>
<tr valign="top"><td width="33%">1 George Joseph <gjoseph@digium.com><br/></td><td width="33%"><td width="33%">1 abelbeck <lonnie@abelbeck.com><br/></td></tr>
</table><hr><a name="closed_issues"><h2 align="center">Closed Issues</h2></a><center><a href="#top">[Back to Top]</a></center><p>This is a list of all issues from the issue tracker that were closed by changes that went into this release.</p><h3>Bug</h3><h4>Category: Applications/app_voicemail</h4><a href="https://issues.asterisk.org/jira/browse/ASTERISK-28222">ASTERISK-28222</a>: Regression: MWI polling no longer works<br/>Reported by: abelbeck<ul>
<li><a href="https://code.asterisk.org/code/changelog/asterisk?cs=227c8bb8023e79d4c4923a3b6e2f275ac942a5cb">[227c8bb802]</a> George Joseph -- Revert "stasis_cache: Stop caching stasis subscription change messages"</li>
</ul><br><hr><a name="diffstat"><h2 align="center">Diffstat Results</h2></a><center><a href="#top">[Back to Top]</a></center><p>This is a summary of the changes to the source code that went into this release that was generated using the diffstat utility.</p><pre>asterisk-16.1.0-summary.html | 620 -------
asterisk-16.1.0-summary.txt | 1442 ----------------
b/.version | 2
b/ChangeLog | 4
b/asterisk-16.1.0-rc1-summary.html | 625 +++++++
b/asterisk-16.1.0-rc1-summary.txt | 1443 +++++++++++++++++
b/contrib/realtime/mssql/mssql_cdr.sql | 3
b/contrib/realtime/mssql/mssql_config.sql | 3
b/contrib/realtime/mssql/mssql_voicemail.sql | 3
b/contrib/realtime/mysql/mysql_cdr.sql | 3
b/contrib/realtime/mysql/mysql_config.sql | 3
b/contrib/realtime/mysql/mysql_voicemail.sql | 3
b/contrib/realtime/oracle/oracle_cdr.sql | 3
b/contrib/realtime/oracle/oracle_config.sql | 3
b/contrib/realtime/oracle/oracle_voicemail.sql | 3
b/contrib/realtime/postgresql/postgresql_cdr.sql | 3
b/contrib/realtime/postgresql/postgresql_config.sql | 3
b/contrib/realtime/postgresql/postgresql_voicemail.sql | 3
b/main/stasis_cache.c | 21
19 files changed, 2093 insertions(+), 2100 deletions(-)</pre><br></html>
\ No newline at end of file
Release Summary
asterisk-16.1.1
Date: 2018-12-26
<asteriskteam@digium.com>
----------------------------------------------------------------------
Table of Contents
1. Summary
2. Contributors
3. Closed Issues
4. Diffstat
----------------------------------------------------------------------
Summary
[Back to Top]
This release is a point release of an existing major version. The changes
included were made to address problems that have been identified in this
release series, or are minor, backwards compatible new features or
improvements. Users should be able to safely upgrade to this version if
this release series is already in use. Users considering upgrading from a
previous version are strongly encouraged to review the UPGRADE.txt
document as well as the CHANGES document for information about upgrading
to this release series.
The data in this summary reflects changes that have been made since the
previous release, asterisk-16.1.0.
----------------------------------------------------------------------
Contributors
[Back to Top]
This table lists the people who have submitted code, those that have
tested patches, as well as those that reported issues on the issue tracker
that were resolved in this release. For coders, the number is how many of
their patches (of any size) were committed into this release. For testers,
the number is the number of times their name was listed as assisting with
testing a patch. Finally, for reporters, the number is the number of
issues that they reported that were affected by commits that went into
this release.
Coders Testers Reporters
1 George Joseph 1 abelbeck
----------------------------------------------------------------------
Closed Issues
[Back to Top]
This is a list of all issues from the issue tracker that were closed by
changes that went into this release.
Bug
Category: Applications/app_voicemail
ASTERISK-28222: Regression: MWI polling no longer works
Reported by: abelbeck
* [227c8bb802] George Joseph -- Revert "stasis_cache: Stop caching
stasis subscription change messages"
----------------------------------------------------------------------
Diffstat Results
[Back to Top]
This is a summary of the changes to the source code that went into this
release that was generated using the diffstat utility.
asterisk-16.1.0-summary.html | 620 -------
asterisk-16.1.0-summary.txt | 1442 ----------------
b/.version | 2
b/ChangeLog | 4
b/asterisk-16.1.0-rc1-summary.html | 625 +++++++
b/asterisk-16.1.0-rc1-summary.txt | 1443 +++++++++++++++++
b/contrib/realtime/mssql/mssql_cdr.sql | 3
b/contrib/realtime/mssql/mssql_config.sql | 3
b/contrib/realtime/mssql/mssql_voicemail.sql | 3
b/contrib/realtime/mysql/mysql_cdr.sql | 3
b/contrib/realtime/mysql/mysql_config.sql | 3
b/contrib/realtime/mysql/mysql_voicemail.sql | 3
b/contrib/realtime/oracle/oracle_cdr.sql | 3
b/contrib/realtime/oracle/oracle_config.sql | 3
b/contrib/realtime/oracle/oracle_voicemail.sql | 3
b/contrib/realtime/postgresql/postgresql_cdr.sql | 3
b/contrib/realtime/postgresql/postgresql_config.sql | 3
b/contrib/realtime/postgresql/postgresql_voicemail.sql | 3
b/main/stasis_cache.c | 21
19 files changed, 2093 insertions(+), 2100 deletions(-)
This diff is collapsed.
This diff is collapsed.
......@@ -213,6 +213,7 @@ static void start_automonitor(struct ast_bridge_channel *bridge_channel, struct
ast_bridge_channel_write_playfile(bridge_channel, NULL, start_message, NULL);
}
pbx_builtin_setvar_helper(bridge_channel->chan, "TOUCH_MONITOR_OUTPUT", touch_filename);
pbx_builtin_setvar_helper(peer_chan, "TOUCH_MONITOR_OUTPUT", touch_filename);
}
......@@ -400,6 +401,7 @@ static void start_automixmonitor(struct ast_bridge_channel *bridge_channel, stru
ast_bridge_channel_write_playfile(bridge_channel, NULL, start_message, NULL);
}
pbx_builtin_setvar_helper(bridge_channel->chan, "TOUCH_MIXMONITOR_OUTPUT", touch_filename);
pbx_builtin_setvar_helper(peer_chan, "TOUCH_MIXMONITOR_OUTPUT", touch_filename);
}
......
......@@ -502,6 +502,7 @@ static int append_source_streams(struct ast_stream_topology *dest,
const struct ast_stream_topology *source)
{
int i;
const char *stream_identify;
for (i = 0; i < ast_stream_topology_get_count(source); ++i) {
struct ast_stream *stream;
......@@ -513,8 +514,13 @@ static int append_source_streams(struct ast_stream_topology *dest,
continue;
}
stream_identify = ast_stream_get_metadata(stream, "MSID:LABEL");
if (!stream_identify) {
stream_identify = ast_stream_get_name(stream);
}
if (ast_asprintf(&stream_clone_name, "%s_%s_%s", SOFTBRIDGE_VIDEO_DEST_PREFIX,
channel_name, ast_stream_get_name(stream)) < 0) {
channel_name, stream_identify) < 0) {
return -1;
}
......@@ -2186,6 +2192,7 @@ static void softmix_bridge_stream_topology_changed(struct ast_bridge *bridge, st
for (i = 0; i < ast_stream_topology_get_count(topology); ++i) {
struct ast_stream *stream = ast_stream_topology_get_stream(topology, i);
const char *stream_identify;
if (is_video_source(stream)) {
AST_VECTOR_APPEND(&media_types, AST_MEDIA_TYPE_VIDEO);
......@@ -2202,7 +2209,12 @@ static void softmix_bridge_stream_topology_changed(struct ast_bridge *bridge, st
*/
ast_channel_unlock(participant->chan);
ast_bridge_channel_unlock(participant);
map_source_to_destinations(ast_stream_get_name(stream), ast_channel_name(participant->chan),
stream_identify = ast_stream_get_metadata(stream, "MSID:LABEL");
if (!stream_identify) {
stream_identify = ast_stream_get_name(stream);
}
map_source_to_destinations(stream_identify, ast_channel_name(participant->chan),
AST_VECTOR_SIZE(&media_types) - 1, &bridge->channels);
ast_bridge_channel_lock(participant);
ast_channel_lock(participant->chan);
......
......@@ -5317,6 +5317,7 @@ static void sip_destroy_peer(struct sip_peer *peer)
 
register_peer_exten(peer, FALSE);
ast_free_acl_list(peer->acl);
ast_free_acl_list(peer->contactacl);
ast_free_acl_list(peer->directmediaacl);
if (peer->selfdestruct)
ast_atomic_fetchadd_int(&apeerobjs, -1);
......@@ -21178,6 +21179,7 @@ static char *_sip_show_peer(int type, int fd, struct mansession *s, const struct
ast_cli(fd, " Force rport : %s\n", force_rport_string(peer->flags));
ast_cli(fd, " Symmetric RTP: %s\n", comedia_string(peer->flags));
ast_cli(fd, " ACL : %s\n", AST_CLI_YESNO(ast_acl_list_is_empty(peer->acl) == 0));
ast_cli(fd, " ContactACL : %s\n", AST_CLI_YESNO(ast_acl_list_is_empty(peer->contactacl) == 0));
ast_cli(fd, " DirectMedACL : %s\n", AST_CLI_YESNO(ast_acl_list_is_empty(peer->directmediaacl) == 0));
ast_cli(fd, " T.38 support : %s\n", AST_CLI_YESNO(ast_test_flag(&peer->flags[1], SIP_PAGE2_T38SUPPORT)));
ast_cli(fd, " T.38 EC mode : %s\n", faxec2str(ast_test_flag(&peer->flags[1], SIP_PAGE2_T38SUPPORT)));
......@@ -31524,6 +31526,7 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v_head
struct ast_variable *v = v_head;
struct sip_peer *peer = NULL;
struct ast_acl_list *oldacl = NULL;
struct ast_acl_list *oldcontactacl = NULL;
struct ast_acl_list *olddirectmediaacl = NULL;
int found = 0;
int firstpass = 1;
......@@ -31601,6 +31604,8 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v_head
if (firstpass) {
oldacl = peer->acl;
peer->acl = NULL;
oldcontactacl = peer->contactacl;
peer->contactacl = NULL;
olddirectmediaacl = peer->directmediaacl;
peer->directmediaacl = NULL;
set_peer_defaults(peer); /* Set peer defaults */
......@@ -32283,6 +32288,7 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v_head
peer->the_mark = 0;
 
oldacl = ast_free_acl_list(oldacl);
oldcontactacl = ast_free_acl_list(oldcontactacl);
olddirectmediaacl = ast_free_acl_list(olddirectmediaacl);
if (!ast_strlen_zero(peer->callback)) { /* build string from peer info */
char *reg_string;
This diff is collapsed.
This diff is collapsed.
......@@ -92,7 +92,6 @@ load = res_pjsip_pidf_eyebeam_body_supplement.so
load = res_pjsip_publish_asterisk.so
load = res_pjsip_pubsub.so
load = res_pjsip_refer.so
load = res_pjsip_registrar_expire.so
load = res_pjsip_registrar.so
load = res_pjsip_rfc3326.so
load = res_pjsip_sdp_rtp.so
......
......@@ -164,6 +164,11 @@ packetloss_percentage=10;
;============================ OPUS Section Options ============================
;
; NOTE: Accurate documentation corresponding to your downloaded version of
; codec_opus is available from Asterisk's CLI:
;
; *CLI> config show help codec_opus opus
;
;[opus]
;type= ; Must be of type "opus" (default: "")
;packet_loss= ; Encoder's packet loss percentage. Can be any number between 0
......@@ -182,35 +187,28 @@ packetloss_percentage=10;
;max_playback_rate= ; Override the maximum playback rate in the offer's SDP.
; Any value between 8000 and 48000 (inclusive) is valid,
; however typically it should match one of the usual opus
; bandwidths. A value of "sdp" is also allowed. When set
; to "sdp" then the value from the offer's SDP is used.
; (default: "sdp")
; bandwidths. (default: 48000)
;bitrate= ; Override the maximum average bitrate in the offer's SDP. Any value
; between 500 and 512000 is valid. The following values are also
; allowed: auto, max, sdp. When set to "sdp" then the value from
; the offer's sdp is used. (default: "sdp")
; allowed: auto, max. (default: auto)
;cbr= ; Override the constant bit rate parameter in the offer's SDP. A value of
; 0/false/no represents a variable bit rate whereas 1/true/yes represents
; a constant bit rate. A value of "sdp" is also allowed. When set to "sdp"
; then the value from the offer's sdp is used. (default: "sdp")
; a constant bit rate. (default: no)
;fec= ; Override the use inband fec parameter in the offer's SDP. A value of
; 0/false/no represents disabled whereas 1/true/yes represents enabled.
; A value of "sdp" is also allowed. When set to "sdp" then the value from
; the offer's sdp is used. (default: "sdp")
; (default: yes)
;dtx= ; Override the use dtx parameter in the offer's SDP. A value of 0/false/no
; represents disabled whereas 1/true/yes represents enabled. A value of
; "sdp" is also allowed. When set to "sdp" then the value from the offer's
; sdp is used. (default: "sdp")
; represents disabled whereas 1/true/yes represents enabled. (default: no)
;=============================== OPUS Examples ================================
;
;[opus]
;type=opus
;max_playback_rate=8000 ; Limit the maximum playback rate on the encoder
;fec=no ; Force no inband fec on the encoder (i.e don't use what's on the SDP)
;fec=no ; No inband fec
;[myopus]
;type=opus
;max_bandwidth=wide ; Maximum encoded bandwidth set to wide band (0-8000 Hz
; ; audio bandwidth at 16Khz sample rate)
;cbr=yes ; Force a constant bit rate (i.e don't use what's on the SDP)
;cbr=yes ; Negotiate a constant bit rate