[asterisk-commits] bebuild: tag 11.3.0-rc2 r383970 - in /tags/11.3.0-rc2: ./ apps/ apps/confbrid...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed Mar 27 09:07:19 CDT 2013
Author: bebuild
Date: Wed Mar 27 09:07:16 2013
New Revision: 383970
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=383970
Log:
Update version, remove summaries, merge blockers
* Merged r381306 for ASTERISK-20650
* Merged r380894 for ASTERISK-20990
* Merged r380892 for ASTERISK-20991
* Merged r383840 for ASTERISK-21162
* Merged r381702, r381737 for AST-1088
* Merged r382390 for AST-1128
* Merged r381835, r382617 for DPMA-294
Removed:
tags/11.3.0-rc2/asterisk-11.3.0-rc1-summary.html
tags/11.3.0-rc2/asterisk-11.3.0-rc1-summary.txt
Modified:
tags/11.3.0-rc2/ (props changed)
tags/11.3.0-rc2/.version
tags/11.3.0-rc2/apps/app_confbridge.c
tags/11.3.0-rc2/apps/app_page.c
tags/11.3.0-rc2/apps/app_voicemail.c
tags/11.3.0-rc2/apps/confbridge/conf_state_multi_marked.c
tags/11.3.0-rc2/main/cdr.c
tags/11.3.0-rc2/main/event.c
tags/11.3.0-rc2/main/rtp_engine.c
Propchange: tags/11.3.0-rc2/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.
Propchange: tags/11.3.0-rc2/
------------------------------------------------------------------------------
--- svn:mergeinfo (added)
+++ svn:mergeinfo Wed Mar 27 09:07:16 2013
@@ -1,0 +1,2 @@
+/branches/11:380892,380894,381306,381702,381737,381835,382390,382617,383840
+/certified/branches/1.8.15:382389
Modified: tags/11.3.0-rc2/.version
URL: http://svnview.digium.com/svn/asterisk/tags/11.3.0-rc2/.version?view=diff&rev=383970&r1=383969&r2=383970
==============================================================================
--- tags/11.3.0-rc2/.version (original)
+++ tags/11.3.0-rc2/.version Wed Mar 27 09:07:16 2013
@@ -1,1 +1,1 @@
-11.3.0-rc1
+11.3.0-rc2
Modified: tags/11.3.0-rc2/apps/app_confbridge.c
URL: http://svnview.digium.com/svn/asterisk/tags/11.3.0-rc2/apps/app_confbridge.c?view=diff&rev=383970&r1=383969&r2=383970
==============================================================================
--- tags/11.3.0-rc2/apps/app_confbridge.c (original)
+++ tags/11.3.0-rc2/apps/app_confbridge.c Wed Mar 27 09:07:16 2013
@@ -407,6 +407,34 @@
return tmp;
}
+static void set_rec_filename(struct conference_bridge *bridge, struct ast_str **filename)
+{
+ char *rec_file = bridge->b_profile.rec_file;
+ time_t now;
+ char *ext;
+
+ if (ast_str_strlen(*filename)) {
+ return;
+ }
+
+ time(&now);
+
+ ast_str_reset(*filename);
+ if (ast_strlen_zero(rec_file)) {
+ ast_str_set(filename, 0, "confbridge-%s-%u.wav", bridge->name, (unsigned int)now);
+ } else {
+ /* insert time before file extension */
+ ext = strrchr(rec_file, '.');
+ if (ext) {
+ ast_str_set_substr(filename, 0, rec_file, ext - rec_file);
+ ast_str_append(filename, 0, "-%u%s", (unsigned int)now, ext);
+ } else {
+ ast_str_set(filename, 0, "%s-%u", rec_file, (unsigned int)now);
+ }
+ }
+ ast_str_append(filename, 0, ",a");
+}
+
static void *record_thread(void *obj)
{
struct conference_bridge *conference_bridge = obj;
@@ -425,16 +453,7 @@
/* XXX If we get an EXIT right here, START will essentially be a no-op */
while (conference_bridge->record_state != CONF_RECORD_EXIT) {
- if (!(ast_strlen_zero(conference_bridge->b_profile.rec_file))) {
- ast_str_append(&filename, 0, "%s", conference_bridge->b_profile.rec_file);
- } else {
- time_t now;
- time(&now);
- ast_str_append(&filename, 0, "confbridge-%s-%u.wav",
- conference_bridge->name,
- (unsigned int) now);
- }
-
+ set_rec_filename(conference_bridge, &filename);
chan = ast_channel_ref(conference_bridge->record_chan);
ast_answer(chan);
pbx_exec(chan, mixmonapp, ast_str_buffer(filename));
@@ -562,9 +581,16 @@
*/
static int start_conf_record_thread(struct conference_bridge *conference_bridge)
{
+ conf_start_record(conference_bridge);
+
+ /*
+ * if the thread has already been started, don't start another
+ */
+ if (conference_bridge->record_thread != AST_PTHREADT_NULL) {
+ return 0;
+ }
+
ao2_ref(conference_bridge, +1); /* give the record thread a ref */
-
- conf_start_record(conference_bridge);
if (ast_pthread_create_background(&conference_bridge->record_thread, NULL, record_thread, conference_bridge)) {
ast_log(LOG_WARNING, "Failed to create recording channel for conference %s\n", conference_bridge->name);
@@ -739,9 +765,8 @@
/*!
* \brief Play back an audio file to a channel
*
- * \param conference_bridge Conference bridge they are in
- * \param chan Channel to play audio prompt to
- * \param file Prompt to play
+ * \param cbu User to play audio prompt to
+ * \param filename Prompt to play
*
* \return Returns 0 on success, -1 if the user hung up
* \note Generally this should be called when the conference is unlocked to avoid blocking
@@ -1206,6 +1231,15 @@
}
ao2_unlock(conference_bridge);
+
+ /* If an announcement is to be played play it */
+ if (!ast_strlen_zero(conference_bridge_user->u_profile.announcement)) {
+ if (play_prompt_to_user(conference_bridge_user,
+ conference_bridge_user->u_profile.announcement)) {
+ leave_conference(conference_bridge_user);
+ return NULL;
+ }
+ }
/* Announce number of users if need be */
if (ast_test_flag(&conference_bridge_user->u_profile, USER_OPT_ANNOUNCEUSERCOUNT)) {
@@ -1526,7 +1560,6 @@
if (args.argc > 2 && !ast_strlen_zero(args.u_profile_name)) {
u_profile_name = args.u_profile_name;
}
-
if (!conf_find_user_profile(chan, u_profile_name, &conference_bridge_user.u_profile)) {
ast_log(LOG_WARNING, "Conference user profile %s does not exist\n", u_profile_name);
res = -1;
Modified: tags/11.3.0-rc2/apps/app_page.c
URL: http://svnview.digium.com/svn/asterisk/tags/11.3.0-rc2/apps/app_page.c?view=diff&rev=383970&r1=383969&r2=383970
==============================================================================
--- tags/11.3.0-rc2/apps/app_page.c (original)
+++ tags/11.3.0-rc2/apps/app_page.c Wed Mar 27 09:07:16 2013
@@ -141,6 +141,70 @@
struct ast_flags flags;
};
+/*!
+ * \internal
+ * \brief Setup the page bridge profile.
+ *
+ * \param chan Setup bridge profile on this channel.
+ * \param options Options to setup bridge profile.
+ *
+ * \return Nothing
+ */
+static void setup_profile_bridge(struct ast_channel *chan, struct page_options *options)
+{
+ /* Use default_bridge as a starting point */
+ ast_func_write(chan, "CONFBRIDGE(bridge,template)", "");
+ if (ast_test_flag(&options->flags, PAGE_RECORD)) {
+ ast_func_write(chan, "CONFBRIDGE(bridge,record_conference)", "yes");
+ }
+}
+
+/*!
+ * \internal
+ * \brief Setup the paged user profile.
+ *
+ * \param chan Setup user profile on this channel.
+ * \param options Options to setup paged user profile.
+ *
+ * \return Nothing
+ */
+static void setup_profile_paged(struct ast_channel *chan, struct page_options *options)
+{
+ /* Use default_user as a starting point */
+ ast_func_write(chan, "CONFBRIDGE(user,template)", "");
+ ast_func_write(chan, "CONFBRIDGE(user,quiet)", "yes");
+ ast_func_write(chan, "CONFBRIDGE(user,end_marked)", "yes");
+ if (!ast_test_flag(&options->flags, PAGE_DUPLEX)) {
+ ast_func_write(chan, "CONFBRIDGE(user,startmuted)", "yes");
+ }
+ if (ast_test_flag(&options->flags, PAGE_ANNOUNCE)
+ && !ast_strlen_zero(options->opts[OPT_ARG_ANNOUNCE])) {
+ ast_func_write(chan, "CONFBRIDGE(user,announcement)", options->opts[OPT_ARG_ANNOUNCE]);
+ }
+}
+
+/*!
+ * \internal
+ * \brief Setup the caller user profile.
+ *
+ * \param chan Setup user profile on this channel.
+ * \param options Options to setup caller user profile.
+ *
+ * \return Nothing
+ */
+static void setup_profile_caller(struct ast_channel *chan, struct page_options *options)
+{
+ /* Use default_user as a starting point if not already setup. */
+ ast_func_write(chan, "CONFBRIDGE(user,template)", "");
+ ast_func_write(chan, "CONFBRIDGE(user,quiet)", "yes");
+ ast_func_write(chan, "CONFBRIDGE(user,marked)", "yes");
+ if (!ast_test_flag(&options->flags, PAGE_NOCALLERANNOUNCE)
+ && ast_test_flag(&options->flags, PAGE_ANNOUNCE)
+ && !ast_strlen_zero(options->opts[OPT_ARG_ANNOUNCE])) {
+ ast_func_write(chan, "CONFBRIDGE(user,announcement)", options->opts[OPT_ARG_ANNOUNCE]);
+ }
+}
+
static void page_state_callback(struct ast_dial *dial)
{
struct ast_channel *chan;
@@ -152,22 +216,8 @@
return;
}
- ast_func_write(chan, "CONFBRIDGE(bridge,template)", "default_bridge");
-
- if (ast_test_flag(&options->flags, PAGE_RECORD)) {
- ast_func_write(chan, "CONFBRIDGE(bridge,record_conference)", "yes");
- }
-
- ast_func_write(chan, "CONFBRIDGE(user,quiet)", "yes");
- ast_func_write(chan, "CONFBRIDGE(user,end_marked)", "yes");
-
- if (!ast_test_flag(&options->flags, PAGE_DUPLEX)) {
- ast_func_write(chan, "CONFBRIDGE(user,startmuted)", "yes");
- }
-
- if (ast_test_flag(&options->flags, PAGE_ANNOUNCE) && !ast_strlen_zero(options->opts[OPT_ARG_ANNOUNCE])) {
- ast_func_write(chan, "CONFBRIDGE(user,announcement)", options->opts[OPT_ARG_ANNOUNCE]);
- }
+ setup_profile_bridge(chan, options);
+ setup_profile_paged(chan, options);
}
static int page_exec(struct ast_channel *chan, const char *data)
@@ -302,17 +352,10 @@
}
if (!res) {
- ast_func_write(chan, "CONFBRIDGE(bridge,template)", "default_bridge");
-
- if (ast_test_flag(&options.flags, PAGE_RECORD)) {
- ast_func_write(chan, "CONFBRIDGE(bridge,record_conference)", "yes");
- }
-
- ast_func_write(chan, "CONFBRIDGE(user,quiet)", "yes");
- ast_func_write(chan, "CONFBRIDGE(user,marked)", "yes");
+ setup_profile_bridge(chan, &options);
+ setup_profile_caller(chan, &options);
snprintf(confbridgeopts, sizeof(confbridgeopts), "%u", confid);
-
pbx_exec(chan, app, confbridgeopts);
}
Modified: tags/11.3.0-rc2/apps/app_voicemail.c
URL: http://svnview.digium.com/svn/asterisk/tags/11.3.0-rc2/apps/app_voicemail.c?view=diff&rev=383970&r1=383969&r2=383970
==============================================================================
--- tags/11.3.0-rc2/apps/app_voicemail.c (original)
+++ tags/11.3.0-rc2/apps/app_voicemail.c Wed Mar 27 09:07:16 2013
@@ -14975,8 +14975,9 @@
int i;
int this_index_only = -1;
int open = 0;
- int inbox_index = 0;
- int old_index = 1;
+ int inbox_index = get_folder_by_name("INBOX");
+ int old_index = get_folder_by_name("Old");
+ int urgent_index = get_folder_by_name("Urgent");
if (ast_strlen_zero(mailbox)) {
ast_log(LOG_WARNING, "Cannot create a mailbox snapshot since no mailbox was specified\n");
@@ -15018,15 +15019,23 @@
for (i = 0; i < mailbox_snapshot->folders; i++) {
int combining_old = 0;
- if ((i == old_index) && (combine_INBOX_and_OLD)) {
+ /* Assume we are combining folders if:
+ * - The current index is the old folder index OR
+ * - The current index is urgent and we were looking for INBOX or all folders OR
+ * - The current index is INBOX and we were looking for Urgent or all folders
+ */
+ if ((i == old_index ||
+ (i == urgent_index && (this_index_only == inbox_index || this_index_only == -1)) ||
+ (i == inbox_index && (this_index_only == urgent_index || this_index_only == -1))) && (combine_INBOX_and_OLD)) {
combining_old = 1;
}
/* This if statement is confusing looking. Here is what it means in english.
* - If a folder is given to the function and that folder's index is not the one we are iterating over, skip it...
- * - Unless the folder provided is the INBOX folder and the current index is the OLD folder and we are combining OLD and INBOX msgs.
+ * - Unless we are combining old and new messages and the current index is one of old, new, or urgent folders
*/
- if ((this_index_only != -1) && (this_index_only != i) && !(combining_old && i == old_index && this_index_only == inbox_index)) {
+ if ((this_index_only != -1 && this_index_only != i) &&
+ !(combining_old && (i == old_index || i == urgent_index || i == inbox_index))) {
continue;
}
Modified: tags/11.3.0-rc2/apps/confbridge/conf_state_multi_marked.c
URL: http://svnview.digium.com/svn/asterisk/tags/11.3.0-rc2/apps/confbridge/conf_state_multi_marked.c?view=diff&rev=383970&r1=383969&r2=383970
==============================================================================
--- tags/11.3.0-rc2/apps/confbridge/conf_state_multi_marked.c (original)
+++ tags/11.3.0-rc2/apps/confbridge/conf_state_multi_marked.c Wed Mar 27 09:07:16 2013
@@ -95,8 +95,6 @@
AST_LIST_TRAVERSE_SAFE_BEGIN(&cbu->conference_bridge->active_list, cbu_iter, list) {
/* Kick ENDMARKED cbu_iters */
if (ast_test_flag(&cbu_iter->u_profile, USER_OPT_ENDMARKED)) {
- AST_LIST_REMOVE_CURRENT(list);
- cbu_iter->conference_bridge->activeusers--;
cbu_iter->kicked = 1;
ast_bridge_remove(cbu_iter->conference_bridge->bridge, cbu_iter->chan);
} else if (ast_test_flag(&cbu_iter->u_profile, USER_OPT_WAITMARKED) &&
@@ -139,7 +137,8 @@
case 0:
conf_change_state(cbu, CONF_STATE_SINGLE_MARKED);
break;
- case 1: break; /* Stay in marked */
+ case 1:
+ break; /* Stay in marked */
}
break;
}
@@ -149,7 +148,8 @@
case 0:
conf_change_state(cbu, CONF_STATE_MULTI);
break;
- default: break; /* Stay in marked */
+ default:
+ break; /* Stay in marked */
}
}
}
Modified: tags/11.3.0-rc2/main/cdr.c
URL: http://svnview.digium.com/svn/asterisk/tags/11.3.0-rc2/main/cdr.c?view=diff&rev=383970&r1=383969&r2=383970
==============================================================================
--- tags/11.3.0-rc2/main/cdr.c (original)
+++ tags/11.3.0-rc2/main/cdr.c Wed Mar 27 09:07:16 2013
@@ -114,6 +114,8 @@
static int batchsafeshutdown;
static const int BATCH_SAFE_SHUTDOWN_DEFAULT = 1;
+
+AST_MUTEX_DEFINE_STATIC(cdr_sched_lock);
AST_MUTEX_DEFINE_STATIC(cdr_batch_lock);
@@ -1349,17 +1351,24 @@
{
ast_cdr_submit_batch(0);
/* manually reschedule from this point in time */
+ ast_mutex_lock(&cdr_sched_lock);
cdr_sched = ast_sched_add(sched, batchtime * 1000, submit_scheduled_batch, NULL);
+ ast_mutex_unlock(&cdr_sched_lock);
/* returning zero so the scheduler does not automatically reschedule */
return 0;
}
+/*! Do not hold the batch lock while calling this function */
static void submit_unscheduled_batch(void)
{
+ /* Prevent two deletes from happening at the same time */
+ ast_mutex_lock(&cdr_sched_lock);
/* this is okay since we are not being called from within the scheduler */
AST_SCHED_DEL(sched, cdr_sched);
/* schedule the submission to occur ASAP (1 ms) */
cdr_sched = ast_sched_add(sched, 1, submit_scheduled_batch, NULL);
+ ast_mutex_unlock(&cdr_sched_lock);
+
/* signal the do_cdr thread to wakeup early and do some work (that lazy thread ;) */
ast_mutex_lock(&cdr_pending_lock);
ast_cond_signal(&cdr_pending_cond);
@@ -1370,6 +1379,7 @@
{
struct ast_cdr_batch_item *newtail;
int curr;
+ int submit_batch = 0;
if (!cdr)
return;
@@ -1416,10 +1426,14 @@
/* if we have enough stuff to post, then do it */
if (curr >= (batchsize - 1)) {
+ submit_batch = 1;
+ }
+ ast_mutex_unlock(&cdr_batch_lock);
+
+ /* Don't call submit_unscheduled_batch with the cdr_batch_lock held */
+ if (submit_batch) {
submit_unscheduled_batch();
}
-
- ast_mutex_unlock(&cdr_batch_lock);
}
static void *do_cdr(void *data)
@@ -1565,7 +1579,9 @@
}
/* don't run the next scheduled CDR posting while reloading */
+ ast_mutex_lock(&cdr_sched_lock);
AST_SCHED_DEL(sched, cdr_sched);
+ ast_mutex_unlock(&cdr_sched_lock);
for (v = ast_variable_browse(config, "general"); v; v = v->next) {
if (!strcasecmp(v->name, "enable")) {
@@ -1606,7 +1622,9 @@
if (enabled && !batchmode) {
ast_log(LOG_NOTICE, "CDR simple logging enabled.\n");
} else if (enabled && batchmode) {
+ ast_mutex_lock(&cdr_sched_lock);
cdr_sched = ast_sched_add(sched, batchtime * 1000, submit_scheduled_batch, NULL);
+ ast_mutex_unlock(&cdr_sched_lock);
ast_log(LOG_NOTICE, "CDR batch mode logging enabled, first of either size %d or time %d seconds.\n", batchsize, batchtime);
} else {
ast_log(LOG_NOTICE, "CDR logging disabled, data will be lost.\n");
@@ -1618,7 +1636,9 @@
ast_cond_init(&cdr_pending_cond, NULL);
if (ast_pthread_create_background(&cdr_thread, NULL, do_cdr, NULL) < 0) {
ast_log(LOG_ERROR, "Unable to start CDR thread.\n");
+ ast_mutex_lock(&cdr_sched_lock);
AST_SCHED_DEL(sched, cdr_sched);
+ ast_mutex_unlock(&cdr_sched_lock);
} else {
ast_cli_register(&cli_submit);
ast_register_atexit(ast_cdr_engine_term);
Modified: tags/11.3.0-rc2/main/event.c
URL: http://svnview.digium.com/svn/asterisk/tags/11.3.0-rc2/main/event.c?view=diff&rev=383970&r1=383969&r2=383970
==============================================================================
--- tags/11.3.0-rc2/main/event.c (original)
+++ tags/11.3.0-rc2/main/event.c Wed Mar 27 09:07:16 2013
@@ -215,6 +215,7 @@
[AST_EVENT_CEL] = "CEL",
[AST_EVENT_SECURITY] = "Security",
[AST_EVENT_NETWORK_CHANGE] = "NetworkChange",
+ [AST_EVENT_PRESENCE_STATE] = "PresenceState",
};
/*!
@@ -279,7 +280,11 @@
[AST_EVENT_IE_RECEIVED_HASH] = { AST_EVENT_IE_PLTYPE_STR, "ReceivedHash" },
[AST_EVENT_IE_USING_PASSWORD] = { AST_EVENT_IE_PLTYPE_UINT, "UsingPassword" },
[AST_EVENT_IE_ATTEMPTED_TRANSPORT] = { AST_EVENT_IE_PLTYPE_STR, "AttemptedTransport" },
- [AST_EVENT_IE_CACHABLE] = { AST_EVENT_IE_PLTYPE_UINT, "Cachable" },
+ [AST_EVENT_IE_CACHABLE] = { AST_EVENT_IE_PLTYPE_UINT, "Cachable" },
+ [AST_EVENT_IE_PRESENCE_PROVIDER] = { AST_EVENT_IE_PLTYPE_STR, "PresenceProvider" },
+ [AST_EVENT_IE_PRESENCE_STATE] = { AST_EVENT_IE_PLTYPE_UINT, "PresenceState" },
+ [AST_EVENT_IE_PRESENCE_SUBTYPE] = { AST_EVENT_IE_PLTYPE_STR, "PresenceSubtype" },
+ [AST_EVENT_IE_PRESENCE_MESSAGE] = { AST_EVENT_IE_PLTYPE_STR, "PresenceMessage" },
};
const char *ast_event_get_type_name(const struct ast_event *event)
Modified: tags/11.3.0-rc2/main/rtp_engine.c
URL: http://svnview.digium.com/svn/asterisk/tags/11.3.0-rc2/main/rtp_engine.c?view=diff&rev=383970&r1=383969&r2=383970
==============================================================================
--- tags/11.3.0-rc2/main/rtp_engine.c (original)
+++ tags/11.3.0-rc2/main/rtp_engine.c Wed Mar 27 09:07:16 2013
@@ -1460,6 +1460,7 @@
struct ast_format_cap *cap0 = ast_format_cap_alloc_nolock();
struct ast_format_cap *cap1 = ast_format_cap_alloc_nolock();
int unlock_chans = 1;
+ int read_ptime0, read_ptime1, write_ptime0, write_ptime1;
if (!cap0 || !cap1) {
unlock_chans = 0;
@@ -1564,6 +1565,18 @@
ast_debug(1, "Channel codec0 = %s is not codec1 = %s, cannot native bridge in RTP.\n",
ast_getformatname_multiple(tmp0, sizeof(tmp0), cap0),
ast_getformatname_multiple(tmp1, sizeof(tmp1), cap1));
+ res = AST_BRIDGE_FAILED_NOWARN;
+ goto done;
+ }
+
+ read_ptime0 = (ast_codec_pref_getsize(&instance0->codecs.pref, ast_channel_rawreadformat(c0))).cur_ms;
+ read_ptime1 = (ast_codec_pref_getsize(&instance1->codecs.pref, ast_channel_rawreadformat(c1))).cur_ms;
+ write_ptime0 = (ast_codec_pref_getsize(&instance0->codecs.pref, ast_channel_rawwriteformat(c0))).cur_ms;
+ write_ptime1 = (ast_codec_pref_getsize(&instance1->codecs.pref, ast_channel_rawwriteformat(c1))).cur_ms;
+
+ if (read_ptime0 != write_ptime1 || read_ptime1 != write_ptime0) {
+ ast_debug(1, "Packetization differs between RTP streams (%d != %d or %d != %d). Cannot native bridge in RTP\n",
+ read_ptime0, write_ptime1, read_ptime1, write_ptime0);
res = AST_BRIDGE_FAILED_NOWARN;
goto done;
}
More information about the asterisk-commits
mailing list