mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-04 20:25:29 +00:00
bridge_softmix.c,channel.c: Minor code simplification and cleanup.
* Made code easier to follow in bridge_softmix.c:analyse_softmix_stats() and made some debug messages more helpful. * Made some debug and warning messages more helpful in channel.c:set_format(). Review: https://reviewboard.asterisk.org/r/4607/ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/13@434617 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -144,11 +144,11 @@ struct softmix_stats {
|
|||||||
unsigned int sample_rates[16];
|
unsigned int sample_rates[16];
|
||||||
/*! Each index represents the number of channels using the same index in the sample_rates array. */
|
/*! Each index represents the number of channels using the same index in the sample_rates array. */
|
||||||
unsigned int num_channels[16];
|
unsigned int num_channels[16];
|
||||||
/*! the number of channels above the internal sample rate */
|
/*! The number of channels above the internal sample rate */
|
||||||
unsigned int num_above_internal_rate;
|
unsigned int num_above_internal_rate;
|
||||||
/*! the number of channels at the internal sample rate */
|
/*! The number of channels at the internal sample rate */
|
||||||
unsigned int num_at_internal_rate;
|
unsigned int num_at_internal_rate;
|
||||||
/*! the absolute highest sample rate supported by any channel in the bridge */
|
/*! The absolute highest sample rate preferred by any channel in the bridge */
|
||||||
unsigned int highest_supported_rate;
|
unsigned int highest_supported_rate;
|
||||||
/*! Is the sample rate locked by the bridge, if so what is that rate.*/
|
/*! Is the sample rate locked by the bridge, if so what is that rate.*/
|
||||||
unsigned int locked_rate;
|
unsigned int locked_rate;
|
||||||
@@ -753,6 +753,7 @@ static void gather_softmix_stats(struct softmix_stats *stats,
|
|||||||
stats->num_at_internal_rate++;
|
stats->num_at_internal_rate++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \internal
|
* \internal
|
||||||
* \brief Analyse mixing statistics and change bridges internal rate
|
* \brief Analyse mixing statistics and change bridges internal rate
|
||||||
@@ -764,7 +765,9 @@ static void gather_softmix_stats(struct softmix_stats *stats,
|
|||||||
static unsigned int analyse_softmix_stats(struct softmix_stats *stats, struct softmix_bridge_data *softmix_data)
|
static unsigned int analyse_softmix_stats(struct softmix_stats *stats, struct softmix_bridge_data *softmix_data)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
/* Re-adjust the internal bridge sample rate if
|
|
||||||
|
/*
|
||||||
|
* Re-adjust the internal bridge sample rate if
|
||||||
* 1. The bridge's internal sample rate is locked in at a sample
|
* 1. The bridge's internal sample rate is locked in at a sample
|
||||||
* rate other than the current sample rate being used.
|
* rate other than the current sample rate being used.
|
||||||
* 2. two or more channels support a higher sample rate
|
* 2. two or more channels support a higher sample rate
|
||||||
@@ -774,9 +777,9 @@ static unsigned int analyse_softmix_stats(struct softmix_stats *stats, struct so
|
|||||||
/* if the rate is locked by the bridge, only update it if it differs
|
/* if the rate is locked by the bridge, only update it if it differs
|
||||||
* from the current rate we are using. */
|
* from the current rate we are using. */
|
||||||
if (softmix_data->internal_rate != stats->locked_rate) {
|
if (softmix_data->internal_rate != stats->locked_rate) {
|
||||||
|
ast_debug(1, "Locking at new rate. Bridge changed from %u to %u.\n",
|
||||||
|
softmix_data->internal_rate, stats->locked_rate);
|
||||||
softmix_data->internal_rate = stats->locked_rate;
|
softmix_data->internal_rate = stats->locked_rate;
|
||||||
ast_debug(1, "Bridge is locked in at sample rate %u\n",
|
|
||||||
softmix_data->internal_rate);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
} else if (stats->num_above_internal_rate >= 2) {
|
} else if (stats->num_above_internal_rate >= 2) {
|
||||||
@@ -788,42 +791,47 @@ static unsigned int analyse_softmix_stats(struct softmix_stats *stats, struct so
|
|||||||
if (stats->num_channels[i]) {
|
if (stats->num_channels[i]) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* best_rate starts out being the first sample rate
|
if (2 <= stats->num_channels[i]) {
|
||||||
* greater than the internal sample rate that 2 or
|
/* Two or more channels support this rate. */
|
||||||
* more channels support. */
|
if (best_index == -1
|
||||||
if (stats->num_channels[i] >= 2 && (best_index == -1)) {
|
|| stats->sample_rates[best_index] < stats->sample_rates[i]) {
|
||||||
best_rate = stats->sample_rates[i];
|
/*
|
||||||
best_index = i;
|
* best_rate starts out being the first sample rate
|
||||||
/* If it has been detected that multiple rates above
|
* greater than the internal sample rate that two or
|
||||||
* the internal rate are present, compare those rates
|
* more channels support.
|
||||||
* to each other and pick the highest one two or more
|
*
|
||||||
* channels support. */
|
* or
|
||||||
} else if (((best_index != -1) &&
|
*
|
||||||
(stats->num_channels[i] >= 2) &&
|
* There are multiple rates above the internal rate
|
||||||
(stats->sample_rates[best_index] < stats->sample_rates[i]))) {
|
* and this rate is higher than the previous rate two
|
||||||
best_rate = stats->sample_rates[i];
|
* or more channels support.
|
||||||
best_index = i;
|
*/
|
||||||
/* It is possible that multiple channels exist with native sample
|
best_rate = stats->sample_rates[i];
|
||||||
* rates above the internal sample rate, but none of those channels
|
best_index = i;
|
||||||
* have the same rate in common. In this case, the lowest sample
|
}
|
||||||
* rate among those channels is picked. Over time as additional
|
|
||||||
* statistic runs are made the internal sample rate number will
|
|
||||||
* adjust to the most optimal sample rate, but it may take multiple
|
|
||||||
* iterations. */
|
|
||||||
} else if (best_index == -1) {
|
} else if (best_index == -1) {
|
||||||
|
/*
|
||||||
|
* It is possible that multiple channels exist with native sample
|
||||||
|
* rates above the internal sample rate, but none of those channels
|
||||||
|
* have the same rate in common. In this case, the lowest sample
|
||||||
|
* rate among those channels is picked. Over time as additional
|
||||||
|
* statistic runs are made the internal sample rate number will
|
||||||
|
* adjust to the most optimal sample rate, but it may take multiple
|
||||||
|
* iterations.
|
||||||
|
*/
|
||||||
best_rate = MIN(best_rate, stats->sample_rates[i]);
|
best_rate = MIN(best_rate, stats->sample_rates[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ast_debug(1, "Bridge changed from %u To %u\n",
|
ast_debug(1, "Multiple above internal rate. Bridge changed from %u to %u.\n",
|
||||||
softmix_data->internal_rate, best_rate);
|
softmix_data->internal_rate, best_rate);
|
||||||
softmix_data->internal_rate = best_rate;
|
softmix_data->internal_rate = best_rate;
|
||||||
return 1;
|
return 1;
|
||||||
} else if (!stats->num_at_internal_rate && !stats->num_above_internal_rate) {
|
} 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 */
|
/* In this case, the highest supported rate is actually lower than the internal rate */
|
||||||
softmix_data->internal_rate = stats->highest_supported_rate;
|
ast_debug(1, "All below internal rate. Bridge changed from %u to %u.\n",
|
||||||
ast_debug(1, "Bridge changed from %u to %u\n",
|
|
||||||
softmix_data->internal_rate, stats->highest_supported_rate);
|
softmix_data->internal_rate, stats->highest_supported_rate);
|
||||||
|
softmix_data->internal_rate = stats->highest_supported_rate;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -5337,15 +5337,16 @@ static int set_format(struct ast_channel *chan, struct ast_format_cap *cap_set,
|
|||||||
res = ast_translator_best_choice(cap_native, cap_set, &best_native_fmt, &best_set_fmt);
|
res = ast_translator_best_choice(cap_native, cap_set, &best_native_fmt, &best_set_fmt);
|
||||||
}
|
}
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
struct ast_str *codec_from = ast_str_alloca(64);
|
struct ast_str *codec_native = ast_str_alloca(256);
|
||||||
struct ast_str *codec_to = ast_str_alloca(64);
|
struct ast_str *codec_set = ast_str_alloca(256);
|
||||||
|
|
||||||
ast_format_cap_get_names(cap_native, &codec_from);
|
ast_format_cap_get_names(cap_native, &codec_native);
|
||||||
ast_channel_unlock(chan);
|
ast_channel_unlock(chan);
|
||||||
ast_format_cap_get_names(cap_set, &codec_to);
|
ast_format_cap_get_names(cap_set, &codec_set);
|
||||||
|
|
||||||
ast_log(LOG_WARNING, "Unable to find a codec translation path from %s to %s\n",
|
ast_log(LOG_WARNING, "Unable to find a codec translation path: %s -> %s\n",
|
||||||
ast_str_buffer(codec_from), ast_str_buffer(codec_to));
|
ast_str_buffer(direction ? codec_set : codec_native),
|
||||||
|
ast_str_buffer(direction ? codec_native : codec_set));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5389,10 +5390,11 @@ static int set_format(struct ast_channel *chan, struct ast_format_cap *cap_set,
|
|||||||
access->set_format(chan, best_set_fmt);
|
access->set_format(chan, best_set_fmt);
|
||||||
access->set_rawformat(chan, best_native_fmt);
|
access->set_rawformat(chan, best_native_fmt);
|
||||||
|
|
||||||
ast_debug(1, "Set channel %s to %s format %s\n",
|
ast_debug(1, "Channel %s setting %s format path: %s -> %s\n",
|
||||||
ast_channel_name(chan),
|
ast_channel_name(chan),
|
||||||
access->direction,
|
access->direction,
|
||||||
ast_format_get_name(best_set_fmt));
|
ast_format_get_name(direction ? best_set_fmt : best_native_fmt),
|
||||||
|
ast_format_get_name(direction ? best_native_fmt : best_set_fmt));
|
||||||
}
|
}
|
||||||
|
|
||||||
ast_channel_unlock(chan);
|
ast_channel_unlock(chan);
|
||||||
|
Reference in New Issue
Block a user