diff options
Diffstat (limited to 'main/data.c')
-rw-r--r-- | main/data.c | 82 |
1 files changed, 45 insertions, 37 deletions
diff --git a/main/data.c b/main/data.c index 092d7aad5..746c52dfd 100644 --- a/main/data.c +++ b/main/data.c @@ -45,6 +45,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/manager.h" #include "asterisk/test.h" #include "asterisk/frame.h" +#include "asterisk/codec.h" /*** DOCUMENTATION <manager name="DataGet" language="en_US"> @@ -3097,62 +3098,69 @@ static int manager_data_get(struct mansession *s, const struct message *m) return RESULT_SUCCESS; } +static int data_add_codec(struct ast_data *codecs, struct ast_format *format) { + struct ast_data *codec; + struct ast_codec *tmp; + + tmp = ast_codec_get_by_id(ast_format_get_codec_id(format)); + if (!tmp) { + return -1; + } + + codec = ast_data_add_node(codecs, "codec"); + if (!codec) { + ao2_ref(tmp, -1); + return -1; + } + + ast_data_add_str(codec, "name", tmp->name); + ast_data_add_int(codec, "samplespersecond", tmp->sample_rate); + ast_data_add_str(codec, "description", tmp->description); + ast_data_add_int(codec, "frame_length", tmp->minimum_bytes); + ao2_ref(tmp, -1); + + return 0; +} + int ast_data_add_codec(struct ast_data *root, const char *node_name, struct ast_format *format) { - struct ast_data *codecs, *codec; - size_t fmlist_size; - const struct ast_format_list *fmlist; - int x; + struct ast_data *codecs; codecs = ast_data_add_node(root, node_name); if (!codecs) { return -1; } - fmlist = ast_format_list_get(&fmlist_size); - for (x = 0; x < fmlist_size; x++) { - if (ast_format_cmp(&fmlist[x].format, format) == AST_FORMAT_CMP_EQUAL) { - codec = ast_data_add_node(codecs, "codec"); - if (!codec) { - ast_format_list_destroy(fmlist); - return -1; - } - ast_data_add_str(codec, "name", fmlist[x].name); - ast_data_add_int(codec, "samplespersecond", fmlist[x].samplespersecond); - ast_data_add_str(codec, "description", fmlist[x].desc); - ast_data_add_int(codec, "frame_length", fmlist[x].fr_len); - } - } - ast_format_list_destroy(fmlist); - return 0; + return data_add_codec(codecs, format); } int ast_data_add_codecs(struct ast_data *root, const char *node_name, struct ast_format_cap *cap) { - struct ast_data *codecs, *codec; - size_t fmlist_size; - const struct ast_format_list *fmlist; - int x; + struct ast_data *codecs; + size_t i; + size_t count; codecs = ast_data_add_node(root, node_name); if (!codecs) { return -1; } - fmlist = ast_format_list_get(&fmlist_size); - for (x = 0; x < fmlist_size; x++) { - if (ast_format_cap_iscompatible(cap, &fmlist[x].format)) { - codec = ast_data_add_node(codecs, "codec"); - if (!codec) { - ast_format_list_destroy(fmlist); - return -1; - } - ast_data_add_str(codec, "name", fmlist[x].name); - ast_data_add_int(codec, "samplespersecond", fmlist[x].samplespersecond); - ast_data_add_str(codec, "description", fmlist[x].desc); - ast_data_add_int(codec, "frame_length", fmlist[x].fr_len); + + count = ast_format_cap_count(cap); + for (i = 1; i <= count; ++i) { + struct ast_format *fmt; + + fmt = ast_format_cap_get_format(cap, i); + if (!fmt) { + return -1; } + + if (data_add_codec(codecs, fmt)) { + ao2_ref(fmt, -1); + return -1; + } + + ao2_ref(fmt, -1); } - ast_format_list_destroy(fmlist); return 0; } |