[asterisk-commits] dvossel: branch dvossel/hd_confbridge r311611 - in /team/dvossel/hd_confbridg...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed Mar 23 16:35:41 CDT 2011
Author: dvossel
Date: Wed Mar 23 16:35:37 2011
New Revision: 311611
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=311611
Log:
Introduces the 'mixing_interval' option to confbridge.conf
Modified:
team/dvossel/hd_confbridge/apps/app_confbridge.c
team/dvossel/hd_confbridge/apps/confbridge/conf_config_parser.c
team/dvossel/hd_confbridge/apps/confbridge/include/confbridge.h
team/dvossel/hd_confbridge/bridges/bridge_softmix.c
team/dvossel/hd_confbridge/configs/confbridge.conf.sample
team/dvossel/hd_confbridge/include/asterisk/bridging.h
team/dvossel/hd_confbridge/main/bridging.c
Modified: team/dvossel/hd_confbridge/apps/app_confbridge.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/hd_confbridge/apps/app_confbridge.c?view=diff&rev=311611&r1=311610&r2=311611
==============================================================================
--- team/dvossel/hd_confbridge/apps/app_confbridge.c (original)
+++ team/dvossel/hd_confbridge/apps/app_confbridge.c Wed Mar 23 16:35:37 2011
@@ -763,6 +763,8 @@
/* Set the internal sample rate on the bridge from the bridge profile */
ast_bridge_set_internal_sample_rate(conference_bridge->bridge, conference_bridge->b_profile.internal_sample_rate);
+ /* Set the internal mixing interval on the bridge from the bridge profile */
+ ast_bridge_set_mixing_interval(conference_bridge->bridge, conference_bridge->b_profile.mix_interval);
/* Setup lock for playback channel */
ast_mutex_init(&conference_bridge->playback_lock);
Modified: team/dvossel/hd_confbridge/apps/confbridge/conf_config_parser.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/hd_confbridge/apps/confbridge/conf_config_parser.c?view=diff&rev=311611&r1=311610&r2=311611
==============================================================================
--- team/dvossel/hd_confbridge/apps/confbridge/conf_config_parser.c (original)
+++ team/dvossel/hd_confbridge/apps/confbridge/conf_config_parser.c Wed Mar 23 16:35:37 2011
@@ -279,6 +279,21 @@
} else if (sscanf(value, "%30u", &b_profile->internal_sample_rate) != 1) {
return -1;
}
+ } else if (!strcasecmp(name, "mixing_interval")) {
+ if (sscanf(value, "%30u", &b_profile->mix_interval) != 1) {
+ return -1;
+ }
+ switch (b_profile->mix_interval) {
+ case 10:
+ case 20:
+ case 40:
+ case 80:
+ break;
+ default:
+ ast_log(LOG_WARNING, "invalid mixing interval %u\n", b_profile->mix_interval);
+ b_profile->mix_interval = 0;
+ return -1;
+ }
} else if (!strcasecmp(name, "record_conference")) {
b_profile->flags = ast_true(value) ?
b_profile->flags | BRIDGE_OPT_RECORD_CONFERENCE :
@@ -444,6 +459,7 @@
b_profile->internal_sample_rate = 0;
b_profile->flags = 0;
b_profile->max_members = 0;
+ b_profile->mix_interval = 0;
memset(b_profile->rec_file, 0, sizeof(b_profile->rec_file));
ao2_ref(b_profile->sounds, -1); /* sounds is read only. Once it has been created
* it can never be altered. This prevents having to
@@ -877,24 +893,33 @@
ast_cli(a->fd,"--------------------------------------------\n");
ast_cli(a->fd,"Name: %s\n", b_profile.name);
+
+ if (b_profile.internal_sample_rate) {
+ snprintf(tmp, sizeof(tmp), "%d", b_profile.internal_sample_rate);
+ } else {
+ snprintf(tmp, sizeof(tmp), "auto");
+ }
+ ast_cli(a->fd,"Internal Sample Rate: %s\n", tmp);
+
+ if (b_profile.mix_interval) {
+ ast_cli(a->fd,"Mixing Interval: %d\n", b_profile.mix_interval);
+ } else {
+ ast_cli(a->fd,"Mixing Interval: Default 20ms\n");
+ }
+
ast_cli(a->fd,"Record Conference: %s\n",
b_profile.flags & BRIDGE_OPT_RECORD_CONFERENCE ?
"yes" : "no");
+
ast_cli(a->fd,"Record File: %s\n",
ast_strlen_zero(b_profile.rec_file) ? "Auto Generated" :
b_profile.rec_file);
+
if (b_profile.max_members) {
ast_cli(a->fd,"Max Members: %d\n", b_profile.max_members);
} else {
ast_cli(a->fd,"Max Members: No Limit\n");
}
- if (b_profile.internal_sample_rate) {
- snprintf(tmp, sizeof(tmp), "%d", b_profile.internal_sample_rate);
- } else {
- snprintf(tmp, sizeof(tmp), "auto");
- }
- ast_cli(a->fd,"Internal Sample Rate: %s\n", tmp);
-
ast_cli(a->fd,"sound_only_person: %s\n", conf_get_sound(CONF_SOUND_ONLY_PERSON, b_profile.sounds));
ast_cli(a->fd,"sound_has_joined: %s\n", conf_get_sound(CONF_SOUND_HAS_JOINED, b_profile.sounds));
ast_cli(a->fd,"sound_has_left: %s\n", conf_get_sound(CONF_SOUND_HAS_LEFT, b_profile.sounds));
Modified: team/dvossel/hd_confbridge/apps/confbridge/include/confbridge.h
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/hd_confbridge/apps/confbridge/include/confbridge.h?view=diff&rev=311611&r1=311610&r2=311611
==============================================================================
--- team/dvossel/hd_confbridge/apps/confbridge/include/confbridge.h (original)
+++ team/dvossel/hd_confbridge/apps/confbridge/include/confbridge.h Wed Mar 23 16:35:37 2011
@@ -169,6 +169,7 @@
unsigned int flags;
unsigned int max_members; /*!< The maximum number of participants allowed in the conference */
unsigned int internal_sample_rate; /*!< The internal sample rate of the bridge. 0 when set to auto adjust mode. */
+ unsigned int mix_interval; /*!< The internal mixing interval used by the bridge. When set to 0 the bridgewill use a default interval. */
struct bridge_profile_sounds *sounds;
int delme;
};
Modified: team/dvossel/hd_confbridge/bridges/bridge_softmix.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/hd_confbridge/bridges/bridge_softmix.c?view=diff&rev=311611&r1=311610&r2=311611
==============================================================================
--- team/dvossel/hd_confbridge/bridges/bridge_softmix.c (original)
+++ team/dvossel/hd_confbridge/bridges/bridge_softmix.c Wed Mar 23 16:35:37 2011
@@ -54,13 +54,13 @@
#define MAX_DATALEN 3840
/*! \brief Interval at which mixing will take place. Valid options are 10, 20, and 40. */
-#define SOFTMIX_INTERVAL 20
+#define DEFAULT_SOFTMIX_INTERVAL 20
/*! \brief Size of the buffer used for sample manipulation */
-#define SOFTMIX_DATALEN(rate) ((rate/50) * (SOFTMIX_INTERVAL / 10))
+#define SOFTMIX_DATALEN(rate, interval) ((rate/50) * (interval / 10))
/*! \brief Number of samples we are dealing with */
-#define SOFTMIX_SAMPLES(rate) (SOFTMIX_DATALEN(rate) / 2)
+#define SOFTMIX_SAMPLES(rate, interval) (SOFTMIX_DATALEN(rate, interval) / 2)
/*! \brief Number of mixing iterations to perform between gathering statistics. */
#define SOFTMIX_STAT_INTERVAL 100
@@ -98,6 +98,7 @@
struct softmix_bridge_data {
struct ast_timer *timer;
unsigned int internal_rate;
+ unsigned int internal_mixing_interval;
};
struct softmix_stats {
@@ -275,43 +276,44 @@
static void softmix_bridge_data_destroy(void *obj)
{
- struct softmix_bridge_data *bridge_data = obj;
- ast_timer_close(bridge_data->timer);
+ struct softmix_bridge_data *softmix_data = obj;
+ ast_timer_close(softmix_data->timer);
}
/*! \brief Function called when a bridge is created */
static int softmix_bridge_create(struct ast_bridge *bridge)
{
- struct softmix_bridge_data *bridge_data;
-
- if (!(bridge_data = ao2_alloc(sizeof(*bridge_data), softmix_bridge_data_destroy))) {
+ struct softmix_bridge_data *softmix_data;
+
+ if (!(softmix_data = ao2_alloc(sizeof(*softmix_data), softmix_bridge_data_destroy))) {
return -1;
}
- if (!(bridge_data->timer = ast_timer_open())) {
- ao2_ref(bridge_data, -1);
+ if (!(softmix_data->timer = ast_timer_open())) {
+ ao2_ref(softmix_data, -1);
return -1;
}
/* start at 8khz, let it grow from there */
- bridge_data->internal_rate = 8000;
-
- bridge->bridge_pvt = bridge_data;
+ softmix_data->internal_rate = 8000;
+ softmix_data->internal_mixing_interval = DEFAULT_SOFTMIX_INTERVAL;
+
+ bridge->bridge_pvt = softmix_data;
return 0;
}
/*! \brief Function called when a bridge is destroyed */
static int softmix_bridge_destroy(struct ast_bridge *bridge)
{
- struct softmix_bridge_data *bridge_data = bridge->bridge_pvt;
+ struct softmix_bridge_data *softmix_data = bridge->bridge_pvt;
if (!bridge->bridge_pvt) {
return -1;
}
- ao2_ref(bridge_data, -1);
+ ao2_ref(softmix_data, -1);
bridge->bridge_pvt = NULL;
return 0;
}
-static void set_softmix_bridge_data(int rate, struct ast_bridge_channel *bridge_channel, int reset)
+static void set_softmix_bridge_data(int rate, int interval, struct ast_bridge_channel *bridge_channel, int reset)
{
struct softmix_channel *sc = bridge_channel->bridge_pvt;
unsigned int channel_read_rate = ast_format_rate(&bridge_channel->chan->rawreadformat);
@@ -325,14 +327,14 @@
sc->write_frame.frametype = AST_FRAME_VOICE;
ast_format_set(&sc->write_frame.subclass.format, ast_format_slin_by_rate(rate), 0);
sc->write_frame.data.ptr = sc->final_buf;
- sc->write_frame.datalen = SOFTMIX_DATALEN(rate);
- sc->write_frame.samples = SOFTMIX_SAMPLES(rate);
+ sc->write_frame.datalen = SOFTMIX_DATALEN(rate, interval);
+ sc->write_frame.samples = SOFTMIX_SAMPLES(rate, interval);
sc->read_frame.frametype = AST_FRAME_VOICE;
ast_format_set(&sc->read_frame.subclass.format, ast_format_slin_by_rate(channel_read_rate), 0);
sc->read_frame.data.ptr = sc->our_buf;
- sc->read_frame.datalen = SOFTMIX_DATALEN(channel_read_rate);
- sc->read_frame.samples = SOFTMIX_SAMPLES(channel_read_rate);
+ sc->read_frame.datalen = SOFTMIX_DATALEN(channel_read_rate, interval);
+ sc->read_frame.samples = SOFTMIX_SAMPLES(channel_read_rate, interval);
/* Setup smoother */
ast_slinfactory_init_with_format(&sc->factory, &sc->write_frame.subclass.format);
@@ -357,7 +359,7 @@
static int softmix_bridge_join(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel)
{
struct softmix_channel *sc = NULL;
- struct softmix_bridge_data *bridge_data = bridge->bridge_pvt;
+ struct softmix_bridge_data *softmix_data = bridge->bridge_pvt;
/* Create a new softmix_channel structure and allocate various things on it */
if (!(sc = ast_calloc(1, sizeof(*sc)))) {
@@ -370,7 +372,9 @@
/* Can't forget to record our pvt structure within the bridged channel structure */
bridge_channel->bridge_pvt = sc;
- set_softmix_bridge_data(bridge_data->internal_rate, bridge_channel, 0);
+ set_softmix_bridge_data(softmix_data->internal_rate,
+ softmix_data->internal_mixing_interval ? softmix_data->internal_mixing_interval : DEFAULT_SOFTMIX_INTERVAL,
+ bridge_channel, 0);
return 0;
}
@@ -419,7 +423,7 @@
static enum ast_bridge_write_result softmix_bridge_write(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel, struct ast_frame *frame)
{
struct softmix_channel *sc = bridge_channel->bridge_pvt;
- struct softmix_bridge_data *bridge_data = bridge->bridge_pvt;
+ struct softmix_bridge_data *softmix_data = bridge->bridge_pvt;
int totalsilence = 0;
int silence_threshold = bridge_channel->tech_args.silence_threshold ?
bridge_channel->tech_args.silence_threshold :
@@ -452,7 +456,7 @@
/* Before adding audio in, make sure we haven't fallen behind. If audio has fallen
* behind 4 times the amount of samples mixed on every iteration of the mixer, Re-sync
* the audio by flushing the buffer before adding new audio in. */
- if (ast_slinfactory_available(&sc->factory) > (4 * SOFTMIX_SAMPLES(bridge_data->internal_rate))) {
+ if (ast_slinfactory_available(&sc->factory) > (4 * SOFTMIX_SAMPLES(softmix_data->internal_rate, softmix_data->internal_mixing_interval))) {
ast_slinfactory_flush(&sc->factory);
}
@@ -497,7 +501,7 @@
}
static void gather_softmix_stats(struct softmix_stats *stats,
- const struct softmix_bridge_data *bridge_data,
+ const struct softmix_bridge_data *softmix_data,
struct ast_bridge_channel *bridge_channel)
{
int channel_native_rate;
@@ -509,7 +513,7 @@
if (channel_native_rate > stats->highest_supported_rate) {
stats->highest_supported_rate = channel_native_rate;
}
- if (channel_native_rate > bridge_data->internal_rate) {
+ if (channel_native_rate > softmix_data->internal_rate) {
for (i = 0; i < ARRAY_LEN(stats->sample_rates); i++) {
if (stats->sample_rates[i] == channel_native_rate) {
stats->num_channels[i]++;
@@ -521,7 +525,7 @@
}
}
stats->num_above_internal_rate++;
- } else if (channel_native_rate == bridge_data->internal_rate) {
+ } else if (channel_native_rate == softmix_data->internal_rate) {
stats->num_at_internal_rate++;
}
}
@@ -533,7 +537,7 @@
* \retval 0, no changes to internal rate
* \ratval 1, internal rate was changed, update all the channels on the next mixing iteration.
*/
-static unsigned int analyse_softmix_stats(struct softmix_stats *stats, struct softmix_bridge_data *bridge_data)
+static unsigned int analyse_softmix_stats(struct softmix_stats *stats, struct softmix_bridge_data *softmix_data)
{
int i;
/* Re-adjust the internal bridge sample rate if
@@ -545,9 +549,9 @@
if (stats->locked_rate) {
/* if the rate is locked by the bridge, only update it if it differs
* from the current rate we are using. */
- if (bridge_data->internal_rate != stats->locked_rate) {
- bridge_data->internal_rate = stats->locked_rate;
- ast_debug(1, " Bridge is locked in at sample rate %d\n", bridge_data->internal_rate);
+ if (softmix_data->internal_rate != stats->locked_rate) {
+ softmix_data->internal_rate = stats->locked_rate;
+ ast_debug(1, " Bridge is locked in at sample rate %d\n", softmix_data->internal_rate);
return 1;
}
} else if (stats->num_above_internal_rate >= 2) {
@@ -586,13 +590,13 @@
}
}
- ast_debug(1, " Bridge changed from %d To %d\n", bridge_data->internal_rate, best_rate);
- bridge_data->internal_rate = best_rate;
+ ast_debug(1, " Bridge changed from %d To %d\n", softmix_data->internal_rate, best_rate);
+ softmix_data->internal_rate = best_rate;
return 1;
} else if (!stats->num_at_internal_rate && !stats->num_above_internal_rate) {
/* In this case, the highest supported rate is actually lower than the internal rate */
- bridge_data->internal_rate = stats->highest_supported_rate;
- ast_debug(1, " Bridge changed from %d to %d\n", bridge_data->internal_rate, stats->highest_supported_rate);
+ softmix_data->internal_rate = stats->highest_supported_rate;
+ ast_debug(1, " Bridge changed from %d to %d\n", softmix_data->internal_rate, stats->highest_supported_rate);
return 1;
}
return 0;
@@ -632,7 +636,7 @@
{
struct softmix_stats stats = { { 0 }, };
struct softmix_mixing_array mixing_array;
- struct softmix_bridge_data *bridge_data = bridge->bridge_pvt;
+ struct softmix_bridge_data *softmix_data = bridge->bridge_pvt;
struct ast_timer *timer;
struct softmix_translate_helper trans_helper;
int16_t buf[MAX_DATALEN] = { 0, };
@@ -642,15 +646,15 @@
int i, x;
int res = -1;
- if (!(bridge_data = bridge->bridge_pvt)) {
+ if (!(softmix_data = bridge->bridge_pvt)) {
goto softmix_cleanup;
}
- ao2_ref(bridge_data, 1);
- timer = bridge_data->timer;
+ ao2_ref(softmix_data, 1);
+ timer = softmix_data->timer;
timingfd = ast_timer_fd(timer);
- softmix_translate_helper_init(&trans_helper, bridge_data->internal_rate);
- ast_timer_set_rate(timer, (1000 / SOFTMIX_INTERVAL));
+ softmix_translate_helper_init(&trans_helper, softmix_data->internal_rate);
+ ast_timer_set_rate(timer, (1000 / softmix_data->internal_mixing_interval));
/* Give the mixing array room to grow, memory is cheap but allocations are expensive. */
if (softmix_mixing_array_init(&mixing_array, bridge->num + 10)) {
@@ -661,9 +665,9 @@
while (!bridge->stop && !bridge->refresh && bridge->array_num) {
struct ast_bridge_channel *bridge_channel = NULL;
int timeout = -1;
- enum ast_format_id cur_slin_id = ast_format_slin_by_rate(bridge_data->internal_rate);
- unsigned int softmix_samples = SOFTMIX_SAMPLES(bridge_data->internal_rate);
- unsigned int softmix_datalen = SOFTMIX_DATALEN(bridge_data->internal_rate);
+ enum ast_format_id cur_slin_id = ast_format_slin_by_rate(softmix_data->internal_rate);
+ unsigned int softmix_samples = SOFTMIX_SAMPLES(softmix_data->internal_rate, softmix_data->internal_mixing_interval);
+ unsigned int softmix_datalen = SOFTMIX_DATALEN(softmix_data->internal_rate, softmix_data->internal_mixing_interval);
if (softmix_datalen > MAX_DATALEN) {
/* This should NEVER happen, but if it does we need to know about it. Almost
@@ -691,7 +695,7 @@
/* If the sample rate has changed, update the translator helper */
if (update_all_rates) {
- softmix_translate_helper_change_rate(&trans_helper, bridge_data->internal_rate);
+ softmix_translate_helper_change_rate(&trans_helper, softmix_data->internal_rate);
}
/* Go through pulling audio from each factory that has it available */
@@ -700,12 +704,12 @@
/* Update the sample rate to match the bridge's native sample rate if necessary. */
if (update_all_rates) {
- set_softmix_bridge_data(bridge_data->internal_rate, bridge_channel, 1);
+ set_softmix_bridge_data(softmix_data->internal_rate, softmix_data->internal_mixing_interval, bridge_channel, 1);
}
/* If stat_iteration_counter is 0, then collect statistics during this mixing interation */
if (!stat_iteration_counter) {
- gather_softmix_stats(&stats, bridge_data, bridge_channel);
+ gather_softmix_stats(&stats, softmix_data, bridge_channel);
}
/* if the channel is suspended, don't check for audio, but still gather stats */
@@ -761,7 +765,7 @@
update_all_rates = 0;
if (!stat_iteration_counter) {
- update_all_rates = analyse_softmix_stats(&stats, bridge_data);
+ update_all_rates = analyse_softmix_stats(&stats, softmix_data);
stat_iteration_counter = SOFTMIX_STAT_INTERVAL;
}
stat_iteration_counter--;
@@ -773,6 +777,13 @@
ast_waitfor_n_fd(&timingfd, 1, &timeout, NULL);
ast_timer_ack(timer, 1);
ao2_lock(bridge);
+
+ /* make sure to detect mixing interval changes if they occur. */
+ if (bridge->internal_mixing_interval && (bridge->internal_mixing_interval != softmix_data->internal_mixing_interval)) {
+ softmix_data->internal_mixing_interval = bridge->internal_mixing_interval;
+ ast_timer_set_rate(timer, (1000 / softmix_data->internal_mixing_interval));
+ update_all_rates = 1; /* if the interval changes, the rates must be adjusted as well just to be notified new interval.*/
+ }
}
res = 0;
@@ -780,8 +791,8 @@
softmix_cleanup:
softmix_translate_helper_destroy(&trans_helper);
softmix_mixing_array_destroy(&mixing_array);
- if (bridge_data) {
- ao2_ref(bridge_data, -1);
+ if (softmix_data) {
+ ao2_ref(softmix_data, -1);
}
return res;
}
Modified: team/dvossel/hd_confbridge/configs/confbridge.conf.sample
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/hd_confbridge/configs/confbridge.conf.sample?view=diff&rev=311611&r1=311610&r2=311611
==============================================================================
--- team/dvossel/hd_confbridge/configs/confbridge.conf.sample (original)
+++ team/dvossel/hd_confbridge/configs/confbridge.conf.sample Wed Mar 23 16:35:37 2011
@@ -96,6 +96,13 @@
; closest sample rate Asterisk does support to the one requested
; will be used.
+;mixing_interval=40 ; Sets the internal mixing interval in milliseconds for the bridge. This
+ ; number reflects how tight or loose the mixing will be for the conference.
+ ; In order to improve performance a larger mixing interval such as 40ms may
+ ; be chosen. Using a larger mixing interval comes at the cost of introducing
+ ; larger amounts of delay into the bridge. Valid values here are 10, 20, 40,
+ ; or 80. By default 20ms is used.
+
; All sounds in the conference are customizable using the bridge profile options below.
; Simply state the option followed by the filename or full path of the filename after
; the option. Example: sound_had_joined=conf-hasjoin This will play the conf-hasjoin
Modified: team/dvossel/hd_confbridge/include/asterisk/bridging.h
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/hd_confbridge/include/asterisk/bridging.h?view=diff&rev=311611&r1=311610&r2=311611
==============================================================================
--- team/dvossel/hd_confbridge/include/asterisk/bridging.h (original)
+++ team/dvossel/hd_confbridge/include/asterisk/bridging.h Wed Mar 23 16:35:37 2011
@@ -176,6 +176,10 @@
/*! The internal sample rate this bridge is mixed at when multiple channels are being mixed.
* If this value is 0, the bridge technology may auto adjust the internal mixing rate. */
unsigned int internal_sample_rate;
+ /*! The mixing interval indicates how quickly the bridges internal mixing should occur
+ * for bridge technologies that mix audio. When set to 0, the bridge tech must choose a
+ * default interval for itself. */
+ unsigned int internal_mixing_interval;
/*! Bit to indicate that the bridge thread is waiting on channels in the bridge array */
unsigned int waiting:1;
/*! Bit to indicate the bridge thread should stop */
@@ -462,6 +466,16 @@
*/
void ast_bridge_set_internal_sample_rate(struct ast_bridge *bridge, unsigned int sample_rate);
+/*! \brief Adjust the internal mixing interval of a bridge used during
+ * multimix mode.
+ *
+ * \param bridge_channel Channel to change the sample rate on.
+ * \param mixing_interval, the sample rate to change to. If 0 is set
+ * the bridge tech is free to choose any mixing interval it uses by default.
+ */
+void ast_bridge_set_mixing_interval(struct ast_bridge *bridge, unsigned int mixing_interval);
+
+
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif
Modified: team/dvossel/hd_confbridge/main/bridging.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/hd_confbridge/main/bridging.c?view=diff&rev=311611&r1=311610&r2=311611
==============================================================================
--- team/dvossel/hd_confbridge/main/bridging.c (original)
+++ team/dvossel/hd_confbridge/main/bridging.c Wed Mar 23 16:35:37 2011
@@ -1456,6 +1456,13 @@
return 0;
}
+void ast_bridge_set_mixing_interval(struct ast_bridge *bridge, unsigned int mixing_interval)
+{
+ ao2_lock(bridge);
+ bridge->internal_mixing_interval = mixing_interval;
+ ao2_unlock(bridge);
+}
+
void ast_bridge_set_internal_sample_rate(struct ast_bridge *bridge, unsigned int sample_rate)
{
More information about the asterisk-commits
mailing list