app_dial: Allow macro/gosub pre-bridge execution to occur on priorities
[asterisk/asterisk.git] / main / format_pref.c
index f24dbec..b96184a 100644 (file)
  * \brief Format Preference API
  */
 
+/*** MODULEINFO
+       <support_level>core</support_level>
+ ***/
+
 #include "asterisk.h"
 
 ASTERISK_FILE_VERSION(__FILE__, "$Revision$");
 
 #include "asterisk/_private.h"
-#include "asterisk/version.h"
 #include "asterisk/frame.h"
 #include "asterisk/channel.h"
 #include "asterisk/utils.h"
@@ -34,7 +37,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$");
 void ast_codec_pref_convert(struct ast_codec_pref *pref, char *buf, size_t size, int right)
 {
        size_t f_len;
-       const const struct ast_format_list *f_list = ast_format_list_get(&f_len);
+       const struct ast_format_list *f_list = ast_format_list_get(&f_len);
        int x, differential = (int) 'A', mem;
        char *from, *to;
 
@@ -117,7 +120,7 @@ void ast_codec_pref_remove(struct ast_codec_pref *pref, struct ast_format *forma
        struct ast_codec_pref oldorder;
        int x, y = 0;
        size_t f_len = 0;
-       const const struct ast_format_list *f_list;
+       const struct ast_format_list *f_list;
 
        if (!pref->order[0]) {
                return;
@@ -140,6 +143,42 @@ void ast_codec_pref_remove(struct ast_codec_pref *pref, struct ast_format *forma
        ast_format_list_destroy(f_list);
 }
 
+/*! \brief Append all codecs to a preference list, without distrubing existing order */
+void ast_codec_pref_append_all(struct ast_codec_pref *pref)
+{
+       int x, y, found;
+       size_t f_len = 0;
+       const struct ast_format_list *f_list = ast_format_list_get(&f_len);
+
+       /* leave any existing entries, and don't create duplicates (e.g. allow=ulaw,all) */
+       for (x = 0; x < f_len; x++) {
+               /* x = codec to add */
+               found = 0;
+               for (y = 0; y < f_len; y++) {
+                       /* y = scan of existing preferences */
+                       if (!pref->order[y]) {
+                               break;
+                       }
+                       if (x + 1 == pref->order[y]) {
+                               found = 1;
+                               break;
+                       }
+               }
+               if (found) {
+                       continue;
+               }
+               for (; y < f_len; y++) {
+                       /* add x to the end of y */
+                       if (!pref->order[y])
+                       {
+                               pref->order[y] = x + 1;
+                               ast_format_copy(&pref->formats[y], &f_list[x].format);
+                               break;
+                       }
+               }
+       }
+}
+
 /*! \brief Append codec to list */
 int ast_codec_pref_append(struct ast_codec_pref *pref, struct ast_format *format)
 {
@@ -196,6 +235,11 @@ void ast_codec_pref_prepend(struct ast_codec_pref *pref, struct ast_format *form
                        break;
        }
 
+       /* If we failed to find any occurrence, set to the end */
+       if (x == AST_CODEC_PREF_SIZE) {
+               --x;
+       }
+
        if (only_if_existing && !pref->order[x]) {
                ast_format_list_destroy(f_list);
                return;
@@ -275,6 +319,12 @@ struct ast_format_list ast_codec_pref_getsize(struct ast_codec_pref *pref, struc
                }
        }
 
+       if (idx < 0) {
+               ast_log(AST_LOG_WARNING, "Format %s unknown; unable to get preferred codec packet size\n", ast_getformatname(format));
+               ast_format_list_destroy(f_list);
+               return fmt;
+       }
+
        for (x = 0; x < f_len; x++) {
                if (pref->order[x] == (idx + 1)) {
                        framems = pref->framing[x];
@@ -303,7 +353,7 @@ struct ast_format_list ast_codec_pref_getsize(struct ast_codec_pref *pref, struc
 /*! \brief Pick a codec */
 struct ast_format *ast_codec_choose(struct ast_codec_pref *pref, struct ast_format_cap *cap, int find_best, struct ast_format *result)
 {
-       int x, slot, found;
+       int x, slot, found = 0;
        size_t f_len = 0;
        const struct ast_format_list *f_list = ast_format_list_get(&f_len);