Fix 'show translations'
[asterisk/asterisk.git] / translate.c
index 366287d..24ed38f 100755 (executable)
@@ -39,7 +39,7 @@
 /* This could all be done more efficiently *IF* we chained packets together
    by default, but it would also complicate virtually every application. */
    
-static pthread_mutex_t list_lock = AST_MUTEX_INITIALIZER;
+static ast_mutex_t list_lock = AST_MUTEX_INITIALIZER;
 static struct ast_translator *list = NULL;
 
 struct ast_translator_dir {
@@ -125,7 +125,8 @@ struct ast_trans_pvt *ast_translator_build_path(int dest, int source)
                        }
                } else {
                        /* We shouldn't have allocated any memory */
-                       ast_log(LOG_WARNING, "No translator path from %d to %d\n", source, dest);
+                       ast_log(LOG_WARNING, "No translator path from %s to %s\n", 
+                               ast_getformatname(source), ast_getformatname(dest));
                        return NULL;
                }
        }
@@ -199,7 +200,7 @@ static void rebuild_matrix(void)
                                                                        tr_matrix[x][z].cost = tr_matrix[x][y].cost + 
                                                                                                                   tr_matrix[y][z].cost;
                                                                        if (option_debug)
-                                                                               ast_log(LOG_DEBUG, "Discovered %d cost path from %d to %d, via %d\n", tr_matrix[x][z].cost, x, z, y);
+                                                                               ast_log(LOG_DEBUG, "Discovered %d cost path from %s to %s, via %d\n", tr_matrix[x][z].cost, ast_getformatname(x), ast_getformatname(z), y);
                                                                        changed++;
                                                                 }
                
@@ -252,31 +253,33 @@ static void calc_cost(struct ast_translator *t)
 
 static int show_translation(int fd, int argc, char *argv[])
 {
-#define SHOW_TRANS 14
+#define SHOW_TRANS 11
        int x,y;
        char line[80];
        if (argc != 2) 
                return RESULT_SHOWUSAGE;
-       ast_cli(fd, "                        Translation times between formats (in milliseconds)\n");
-       ast_cli(fd, "                                 Destination Format\n");
-       ast_pthread_mutex_lock(&list_lock);
-       for (x=0;x<SHOW_TRANS; x++) {
-               if (x == 1) 
-                       strcpy(line, "  Src  ");
-               else if (x == 2)
-                       strcpy(line, "  Fmt  ");
-               else
-                       strcpy(line, "       ");
-               for (y=0;y<SHOW_TRANS;y++) {
-                       if (tr_matrix[x][y].step)
-                               snprintf(line + strlen(line), sizeof(line) - strlen(line), " %4d", tr_matrix[x][y].cost);
+       ast_cli(fd, "         Translation times between formats (in milliseconds)\n");
+       ast_cli(fd, "          Source Format (Rows) Destination Format(Columns)\n\n");
+       ast_mutex_lock(&list_lock);
+       for (x=-1;x<SHOW_TRANS; x++) {
+               strcpy(line, " ");
+               for (y=-1;y<SHOW_TRANS;y++) {
+                       if (x >= 0 && y >= 0 && tr_matrix[x][y].step)
+                               snprintf(line + strlen(line), sizeof(line) - strlen(line), " %5d", tr_matrix[x][y].cost >= 99999 ? tr_matrix[x][y].cost-99999 : tr_matrix[x][y].cost);
                        else
-                               snprintf(line + strlen(line), sizeof(line) - strlen(line), "  n/a");
+                               if (((x == -1 && y >= 0) || (y == -1 && x >= 0))) {
+                                       snprintf(line + strlen(line), sizeof(line) - strlen(line), 
+                                               " %5s", ast_getformatname(1<<(x+y+1)) );
+                               } else if (x != -1 && y != -1) {
+                                       snprintf(line + strlen(line), sizeof(line) - strlen(line), "     -");
+                               } else {
+                                       snprintf(line + strlen(line), sizeof(line) - strlen(line), "      ");
+                               }
                }
                snprintf(line + strlen(line), sizeof(line) - strlen(line), "\n");
                ast_cli(fd, line);                      
        }
-       ast_pthread_mutex_unlock(&list_lock);
+       ast_mutex_unlock(&list_lock);
        return RESULT_SUCCESS;
 }
 
@@ -296,13 +299,13 @@ int ast_register_translator(struct ast_translator *t)
        t->srcfmt = powerof(t->srcfmt);
        t->dstfmt = powerof(t->dstfmt);
        if ((t->srcfmt >= MAX_FORMAT) || (t->dstfmt >= MAX_FORMAT)) {
-               ast_log(LOG_WARNING, "Format %d is larger than MAX_FORMAT\n", t->srcfmt);
+               ast_log(LOG_WARNING, "Format %s is larger than MAX_FORMAT\n", ast_getformatname(t->srcfmt));
                return -1;
        }
        calc_cost(t);
        if (option_verbose > 1)
-               ast_verbose(VERBOSE_PREFIX_2 "Registered translator '%s' from format %d to %d, cost %d\n", term_color(tmp, t->name, COLOR_MAGENTA, COLOR_BLACK, sizeof(tmp)), t->srcfmt, t->dstfmt, t->cost);
-       ast_pthread_mutex_lock(&list_lock);
+               ast_verbose(VERBOSE_PREFIX_2 "Registered translator '%s' from format %s to %s, cost %d\n", term_color(tmp, t->name, COLOR_MAGENTA, COLOR_BLACK, sizeof(tmp)), ast_getformatname(1 << t->srcfmt), ast_getformatname(1 << t->dstfmt), t->cost);
+       ast_mutex_lock(&list_lock);
        if (!added_cli) {
                ast_cli_register(&show_trans);
                added_cli++;
@@ -310,14 +313,14 @@ int ast_register_translator(struct ast_translator *t)
        t->next = list;
        list = t;
        rebuild_matrix();
-       ast_pthread_mutex_unlock(&list_lock);
+       ast_mutex_unlock(&list_lock);
        return 0;
 }
 
 int ast_unregister_translator(struct ast_translator *t)
 {
        struct ast_translator *u, *ul = NULL;
-       ast_pthread_mutex_lock(&list_lock);
+       ast_mutex_lock(&list_lock);
        u = list;
        while(u) {
                if (u == t) {
@@ -331,7 +334,7 @@ int ast_unregister_translator(struct ast_translator *t)
                u = u->next;
        }
        rebuild_matrix();
-       ast_pthread_mutex_unlock(&list_lock);
+       ast_mutex_unlock(&list_lock);
        return (u ? 0 : -1);
 }
 
@@ -343,7 +346,7 @@ int ast_translator_best_choice(int *dst, int *srcs)
        int bestdst=0;
        int cur = 1;
        int besttime=999999999;
-       ast_pthread_mutex_lock(&list_lock);
+       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 */
@@ -370,6 +373,6 @@ int ast_translator_best_choice(int *dst, int *srcs)
                *dst = bestdst;
                best = 0;
        }
-       ast_pthread_mutex_unlock(&list_lock);
+       ast_mutex_unlock(&list_lock);
        return best;
 }