diff --git a/translate.c b/translate.c index 2bbda14da1387b7b09448d5985f2e1476ec91af4..0fd8f0951b55f5530bd62745f15b697d4da14430 100755 --- a/translate.c +++ b/translate.c @@ -3,9 +3,9 @@ * * Translate via the use of pseudo channels * - * Copyright (C) 1999, Mark Spencer + * Copyright (C) 1999-2004, Digium, Inc. * - * Mark Spencer <markster@linux-support.net> + * Mark Spencer <markster@digium.com> * * This program is free software, distributed under the terms of * the GNU General Public License @@ -442,33 +442,40 @@ int ast_translator_best_choice(int *dst, int *srcs) int bestdst=0; int cur = 1; int besttime=999999999; - ast_mutex_lock(&list_lock); - for (y=0;y<MAX_FORMAT;y++) { - if ((cur & *dst) && (cur & *srcs)) { - /* This is a common format to both. Pick it if we don't have one already */ - besttime=0; - bestdst = cur; - best = cur; - break; - } - if (cur & *dst) - for (x=0;x<MAX_FORMAT;x++) { - if (tr_matrix[x][y].step && /* There's a step */ - (tr_matrix[x][y].cost < besttime) && /* We're better than what exists now */ - (*srcs & (1 << x))) /* x is a valid source format */ - { - best = 1 << x; - bestdst = cur; - besttime = tr_matrix[x][y].cost; - } + if ((*dst) & (*srcs)) { + /* We have a format in common */ + for (y=0;y<MAX_FORMAT;y++) { + if ((cur & *dst) && (cur & *srcs)) { + /* This is a common format to both. Pick it if we don't have one already */ + besttime=0; + bestdst = cur; + best = cur; } - cur = cur << 1; + cur = cur << 1; + } + } else { + /* We will need to translate */ + ast_mutex_lock(&list_lock); + for (y=0;y<MAX_FORMAT;y++) { + if (cur & *dst) + for (x=0;x<MAX_FORMAT;x++) { + if (tr_matrix[x][y].step && /* There's a step */ + (tr_matrix[x][y].cost < besttime) && /* We're better than what exists now */ + (*srcs & (1 << x))) /* x is a valid source format */ + { + best = 1 << x; + bestdst = cur; + besttime = tr_matrix[x][y].cost; + } + } + cur = cur << 1; + } + ast_mutex_unlock(&list_lock); } if (best > -1) { *srcs = best; *dst = bestdst; best = 0; } - ast_mutex_unlock(&list_lock); return best; }