diff options
author | Patrick McHardy <kaber@trash.net> | 2011-07-22 16:44:20 +0200 |
---|---|---|
committer | Patrick McHardy <kaber@trash.net> | 2011-07-22 16:44:20 +0200 |
commit | 2b9be10b177024bd663bd5fce19ea0fb76260c27 (patch) | |
tree | f6c296350683ee94c120213bef57e14fd153b23a /formats | |
parent | 916e420bf0c8db7a8cb1f60557cd2807652142cf (diff) | |
parent | 28da2a199d7e1624ac56ccb27d3671117f4e2717 (diff) |
Diffstat (limited to 'formats')
-rw-r--r-- | formats/format_attr_silk.c | 215 | ||||
-rw-r--r-- | formats/format_g719.c | 4 | ||||
-rw-r--r-- | formats/format_g723.c | 4 | ||||
-rw-r--r-- | formats/format_g726.c | 4 | ||||
-rw-r--r-- | formats/format_g729.c | 4 | ||||
-rw-r--r-- | formats/format_gsm.c | 4 | ||||
-rw-r--r-- | formats/format_h263.c | 4 | ||||
-rw-r--r-- | formats/format_h264.c | 4 | ||||
-rw-r--r-- | formats/format_ilbc.c | 4 | ||||
-rw-r--r-- | formats/format_jpeg.c | 4 | ||||
-rw-r--r-- | formats/format_ogg_vorbis.c | 1 | ||||
-rw-r--r-- | formats/format_pcm.c | 4 | ||||
-rw-r--r-- | formats/format_siren14.c | 4 | ||||
-rw-r--r-- | formats/format_siren7.c | 4 | ||||
-rw-r--r-- | formats/format_sln.c | 170 | ||||
-rw-r--r-- | formats/format_sln16.c | 142 | ||||
-rw-r--r-- | formats/format_vox.c | 4 | ||||
-rw-r--r-- | formats/format_wav.c | 4 | ||||
-rw-r--r-- | formats/format_wav_gsm.c | 4 |
19 files changed, 216 insertions, 372 deletions
diff --git a/formats/format_attr_silk.c b/formats/format_attr_silk.c deleted file mode 100644 index 49122fe80..000000000 --- a/formats/format_attr_silk.c +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Asterisk -- An open source telephony toolkit. - * - * Copyright (C) 2011, Digium, Inc. - * - * David Vossel <dvossel@digium.com> - * - * See http://www.asterisk.org for more information about - * the Asterisk project. Please do not directly contact - * any of the maintainers of this project for assistance; - * the project provides a web site, mailing lists and IRC - * channels for your use. - * - * This program is free software, distributed under the terms of - * the GNU General Public License Version 2. See the LICENSE file - * at the top of the source tree. - */ - -/*! - * \file - * \brief SILK format attribute interface - * - * \author David Vossel <dvossel@digium.com> - */ - -#include "asterisk.h" - -ASTERISK_FILE_VERSION(__FILE__, "$Revision$") - -#include "asterisk/module.h" -#include "asterisk/format.h" - -/*! - * \brief SILK attribute structure. - * - * \note The only attribute that affects compatibility here is the sample rate. - */ -struct silk_attr { - unsigned int samplerate; - unsigned int maxbitrate; - unsigned int dtx; - unsigned int fec; - unsigned int packetloss_percentage; -}; - -static enum ast_format_cmp_res silk_cmp(const struct ast_format_attr *fattr1, const struct ast_format_attr *fattr2) -{ - struct silk_attr *attr1 = (struct silk_attr *) fattr1; - struct silk_attr *attr2 = (struct silk_attr *) fattr2; - - if (attr1->samplerate == attr2->samplerate) { - return AST_FORMAT_CMP_EQUAL; - } - return AST_FORMAT_CMP_NOT_EQUAL; -} - -static int silk_get_val(const struct ast_format_attr *fattr, int key, void *result) -{ - const struct silk_attr *attr = (struct silk_attr *) fattr; - int *val = result; - - switch (key) { - case SILK_ATTR_KEY_SAMP_RATE: - *val = attr->samplerate; - break; - case SILK_ATTR_KEY_MAX_BITRATE: - *val = attr->maxbitrate; - break; - case SILK_ATTR_KEY_DTX: - *val = attr->dtx; - break; - case SILK_ATTR_KEY_FEC: - *val = attr->fec; - break; - case SILK_ATTR_KEY_PACKETLOSS_PERCENTAGE: - *val = attr->packetloss_percentage; - break; - default: - return -1; - ast_log(LOG_WARNING, "unknown attribute type %d\n", key); - } - return 0; -} - -static int silk_isset(const struct ast_format_attr *fattr, va_list ap) -{ - enum silk_attr_keys key; - const struct silk_attr *attr = (struct silk_attr *) fattr; - - for (key = va_arg(ap, int); - key != AST_FORMAT_ATTR_END; - key = va_arg(ap, int)) - { - switch (key) { - case SILK_ATTR_KEY_SAMP_RATE: - if (attr->samplerate != (va_arg(ap, int))) { - return -1; - } - break; - case SILK_ATTR_KEY_MAX_BITRATE: - if (attr->maxbitrate != (va_arg(ap, int))) { - return -1; - } - break; - case SILK_ATTR_KEY_DTX: - if (attr->dtx != (va_arg(ap, int))) { - return -1; - } - break; - case SILK_ATTR_KEY_FEC: - if (attr->fec != (va_arg(ap, int))) { - return -1; - } - break; - case SILK_ATTR_KEY_PACKETLOSS_PERCENTAGE: - if (attr->packetloss_percentage != (va_arg(ap, int))) { - return -1; - } - break; - default: - return -1; - ast_log(LOG_WARNING, "unknown attribute type %d\n", key); - } - } - return 0; -} -static int silk_getjoint(const struct ast_format_attr *fattr1, const struct ast_format_attr *fattr2, struct ast_format_attr *result) -{ - struct silk_attr *attr1 = (struct silk_attr *) fattr1; - struct silk_attr *attr2 = (struct silk_attr *) fattr2; - struct silk_attr *attr_res = (struct silk_attr *) result; - int joint = -1; - - attr_res->samplerate = attr1->samplerate & attr2->samplerate; - /* sample rate is the only attribute that has any bearing on if joint capabilities exist or not */ - if (attr_res->samplerate) { - joint = 0; - } - /* Take the lowest max bitrate */ - attr_res->maxbitrate = MIN(attr1->maxbitrate, attr2->maxbitrate); - - /* Only do dtx if both sides want it. DTX is a trade off between - * computational complexity and bandwidth. */ - attr_res->dtx = attr1->dtx && attr2->dtx ? 1 : 0; - - /* Only do FEC if both sides want it. If a peer specifically requests not - * to receive with FEC, it may be a waste of bandwidth. */ - attr_res->fec = attr1->fec && attr2->fec ? 1 : 0; - - /* Use the maximum packetloss percentage between the two attributes. This affects how - * much redundancy is used in the FEC. */ - attr_res->packetloss_percentage = MAX(attr1->packetloss_percentage, attr2->packetloss_percentage); - return joint; -} - -static void silk_set(struct ast_format_attr *fattr, va_list ap) -{ - enum silk_attr_keys key; - struct silk_attr *attr = (struct silk_attr *) fattr; - - for (key = va_arg(ap, int); - key != AST_FORMAT_ATTR_END; - key = va_arg(ap, int)) - { - switch (key) { - case SILK_ATTR_KEY_SAMP_RATE: - attr->samplerate = (va_arg(ap, int)); - break; - case SILK_ATTR_KEY_MAX_BITRATE: - attr->maxbitrate = (va_arg(ap, int)); - break; - case SILK_ATTR_KEY_DTX: - attr->dtx = (va_arg(ap, int)); - break; - case SILK_ATTR_KEY_FEC: - attr->fec = (va_arg(ap, int)); - break; - case SILK_ATTR_KEY_PACKETLOSS_PERCENTAGE: - attr->packetloss_percentage = (va_arg(ap, int)); - break; - default: - ast_log(LOG_WARNING, "unknown attribute type %d\n", key); - } - } -} - -static struct ast_format_attr_interface silk_interface = { - .id = AST_FORMAT_SILK, - .format_attr_cmp = silk_cmp, - .format_attr_get_joint = silk_getjoint, - .format_attr_set = silk_set, - .format_attr_isset = silk_isset, - .format_attr_get_val = silk_get_val, -}; - -static int load_module(void) -{ - if (ast_format_attr_reg_interface(&silk_interface)) { - return AST_MODULE_LOAD_DECLINE; - } - - return AST_MODULE_LOAD_SUCCESS; -} - -static int unload_module(void) -{ - ast_format_attr_unreg_interface(&silk_interface); - return 0; -} - -AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "SILK Format Attribute Module", - .load = load_module, - .unload = unload_module, - .load_pri = AST_MODPRI_CHANNEL_DEPEND, -); diff --git a/formats/format_g719.c b/formats/format_g719.c index b679122f8..aace0edc7 100644 --- a/formats/format_g719.c +++ b/formats/format_g719.c @@ -22,6 +22,10 @@ * \arg File name extensions: g719 * \ingroup formats */ + +/*** MODULEINFO + <support_level>core</support_level> + ***/ #include "asterisk.h" diff --git a/formats/format_g723.c b/formats/format_g723.c index 6dab66a86..7eba74147 100644 --- a/formats/format_g723.c +++ b/formats/format_g723.c @@ -24,6 +24,10 @@ * \arg Extensions: g723, g723sf * \ingroup formats */ + +/*** MODULEINFO + <support_level>core</support_level> + ***/ #include "asterisk.h" diff --git a/formats/format_g726.c b/formats/format_g726.c index 73a57c8ee..636aff091 100644 --- a/formats/format_g726.c +++ b/formats/format_g726.c @@ -27,6 +27,10 @@ * \arg 16 kbps: g726-16 * \ingroup formats */ + +/*** MODULEINFO + <support_level>core</support_level> + ***/ #include "asterisk.h" diff --git a/formats/format_g729.c b/formats/format_g729.c index 22b3c3282..042977728 100644 --- a/formats/format_g729.c +++ b/formats/format_g729.c @@ -25,6 +25,10 @@ * \arg Extensions: g729 * \ingroup formats */ + +/*** MODULEINFO + <support_level>core</support_level> + ***/ #include "asterisk.h" diff --git a/formats/format_gsm.c b/formats/format_gsm.c index 26257c39f..03419c2f6 100644 --- a/formats/format_gsm.c +++ b/formats/format_gsm.c @@ -22,6 +22,10 @@ * \arg File name extension: gsm * \ingroup formats */ + +/*** MODULEINFO + <support_level>core</support_level> + ***/ #include "asterisk.h" diff --git a/formats/format_h263.c b/formats/format_h263.c index 76555a67c..77c1229c3 100644 --- a/formats/format_h263.c +++ b/formats/format_h263.c @@ -23,6 +23,10 @@ * \ingroup formats * \arg See \ref AstVideo */ + +/*** MODULEINFO + <support_level>core</support_level> + ***/ #include "asterisk.h" diff --git a/formats/format_h264.c b/formats/format_h264.c index ea82454f3..155f46975 100644 --- a/formats/format_h264.c +++ b/formats/format_h264.c @@ -23,6 +23,10 @@ * \ingroup formats * \arg See \ref AstVideo */ + +/*** MODULEINFO + <support_level>core</support_level> + ***/ #include "asterisk.h" diff --git a/formats/format_ilbc.c b/formats/format_ilbc.c index a60b585d7..7a08ca515 100644 --- a/formats/format_ilbc.c +++ b/formats/format_ilbc.c @@ -25,6 +25,10 @@ * \ingroup formats */ +/*** MODULEINFO + <support_level>core</support_level> + ***/ + #include "asterisk.h" ASTERISK_FILE_VERSION(__FILE__, "$Revision$") diff --git a/formats/format_jpeg.c b/formats/format_jpeg.c index 99de8dac1..d6733020e 100644 --- a/formats/format_jpeg.c +++ b/formats/format_jpeg.c @@ -23,6 +23,10 @@ * \arg File name extension: jpeg, jpg * \ingroup formats */ + +/*** MODULEINFO + <support_level>extended</support_level> + ***/ #include "asterisk.h" diff --git a/formats/format_ogg_vorbis.c b/formats/format_ogg_vorbis.c index 949a13f78..46056b894 100644 --- a/formats/format_ogg_vorbis.c +++ b/formats/format_ogg_vorbis.c @@ -28,6 +28,7 @@ /*** MODULEINFO <depend>vorbis</depend> <depend>ogg</depend> + <support_level>core</support_level> ***/ #include "asterisk.h" diff --git a/formats/format_pcm.c b/formats/format_pcm.c index ec628c5b3..3bf27388c 100644 --- a/formats/format_pcm.c +++ b/formats/format_pcm.c @@ -23,6 +23,10 @@ * * \ingroup formats */ + +/*** MODULEINFO + <support_level>core</support_level> + ***/ #include "asterisk.h" diff --git a/formats/format_siren14.c b/formats/format_siren14.c index 53c9ea922..1ce50fad4 100644 --- a/formats/format_siren14.c +++ b/formats/format_siren14.c @@ -22,6 +22,10 @@ * \arg File name extensions: siren14 * \ingroup formats */ + +/*** MODULEINFO + <support_level>core</support_level> + ***/ #include "asterisk.h" diff --git a/formats/format_siren7.c b/formats/format_siren7.c index 16eca5df5..2e5182d3c 100644 --- a/formats/format_siren7.c +++ b/formats/format_siren7.c @@ -22,6 +22,10 @@ * \arg File name extensions: siren7 * \ingroup formats */ + +/*** MODULEINFO + <support_level>core</support_level> + ***/ #include "asterisk.h" diff --git a/formats/format_sln.c b/formats/format_sln.c index 0cb27949d..1a73cdfbb 100644 --- a/formats/format_sln.c +++ b/formats/format_sln.c @@ -17,10 +17,13 @@ /*! \file * - * \brief RAW SLINEAR Format - * \arg File name extensions: sln, raw + * \brief RAW SLINEAR Formats * \ingroup formats */ + +/*** MODULEINFO + <support_level>core</support_level> + ***/ #include "asterisk.h" @@ -30,18 +33,15 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/module.h" #include "asterisk/endian.h" -#define BUF_SIZE 320 /* 320 bytes, 160 samples */ -#define SLIN_SAMPLES 160 - -static struct ast_frame *slinear_read(struct ast_filestream *s, int *whennext) +static struct ast_frame *generic_read(struct ast_filestream *s, int *whennext, unsigned int buf_size, enum ast_format_id id) { int res; /* Send a frame from the file to the appropriate channel */ s->fr.frametype = AST_FRAME_VOICE; - ast_format_set(&s->fr.subclass.format, AST_FORMAT_SLINEAR, 0); + ast_format_set(&s->fr.subclass.format, id, 0); s->fr.mallocd = 0; - AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, BUF_SIZE); + AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, buf_size); if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) < 1) { if (res) ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", res, strerror(errno)); @@ -52,14 +52,14 @@ static struct ast_frame *slinear_read(struct ast_filestream *s, int *whennext) return &s->fr; } -static int slinear_write(struct ast_filestream *fs, struct ast_frame *f) +static int generic_write(struct ast_filestream *fs, struct ast_frame *f, enum ast_format_id id) { int res; if (f->frametype != AST_FRAME_VOICE) { ast_log(LOG_WARNING, "Asked to write non-voice frame!\n"); return -1; } - if (f->subclass.format.id != AST_FORMAT_SLINEAR) { + if (f->subclass.format.id != id) { ast_log(LOG_WARNING, "Asked to write non-slinear frame (%s)!\n", ast_getformatname(&f->subclass.format)); return -1; } @@ -103,6 +103,8 @@ static off_t slinear_tell(struct ast_filestream *fs) return ftello(fs->f) / 2; } +static int slinear_write(struct ast_filestream *fs, struct ast_frame *f){return generic_write(fs, f, AST_FORMAT_SLINEAR);} +static struct ast_frame *slinear_read(struct ast_filestream *s, int *whennext){return generic_read(s, whennext, 320, AST_FORMAT_SLINEAR);} static struct ast_format_def slin_f = { .name = "sln", .exts = "sln|raw", @@ -111,23 +113,161 @@ static struct ast_format_def slin_f = { .trunc = slinear_trunc, .tell = slinear_tell, .read = slinear_read, - .buf_size = BUF_SIZE + AST_FRIENDLY_OFFSET, + .buf_size = 320 + AST_FRIENDLY_OFFSET, +}; + +static int slinear12_write(struct ast_filestream *fs, struct ast_frame *f){return generic_write(fs, f, AST_FORMAT_SLINEAR12);} +static struct ast_frame *slinear12_read(struct ast_filestream *s, int *whennext){return generic_read(s, whennext, 480, AST_FORMAT_SLINEAR12);} +static struct ast_format_def slin12_f = { + .name = "sln12", + .exts = "sln12", + .write = slinear12_write, + .seek = slinear_seek, + .trunc = slinear_trunc, + .tell = slinear_tell, + .read = slinear12_read, + .buf_size = 480 + AST_FRIENDLY_OFFSET, +}; + +static int slinear16_write(struct ast_filestream *fs, struct ast_frame *f){return generic_write(fs, f, AST_FORMAT_SLINEAR16);} +static struct ast_frame *slinear16_read(struct ast_filestream *s, int *whennext){return generic_read(s, whennext, 640, AST_FORMAT_SLINEAR16);} +static struct ast_format_def slin16_f = { + .name = "sln16", + .exts = "sln16", + .write = slinear16_write, + .seek = slinear_seek, + .trunc = slinear_trunc, + .tell = slinear_tell, + .read = slinear16_read, + .buf_size = 640 + AST_FRIENDLY_OFFSET, +}; + +static int slinear24_write(struct ast_filestream *fs, struct ast_frame *f){return generic_write(fs, f, AST_FORMAT_SLINEAR24);} +static struct ast_frame *slinear24_read(struct ast_filestream *s, int *whennext){return generic_read(s, whennext, 960, AST_FORMAT_SLINEAR24);} +static struct ast_format_def slin24_f = { + .name = "sln24", + .exts = "sln24", + .write = slinear24_write, + .seek = slinear_seek, + .trunc = slinear_trunc, + .tell = slinear_tell, + .read = slinear24_read, + .buf_size = 960 + AST_FRIENDLY_OFFSET, +}; + +static int slinear32_write(struct ast_filestream *fs, struct ast_frame *f){return generic_write(fs, f, AST_FORMAT_SLINEAR32);} +static struct ast_frame *slinear32_read(struct ast_filestream *s, int *whennext){return generic_read(s, whennext, 1280, AST_FORMAT_SLINEAR32);} +static struct ast_format_def slin32_f = { + .name = "sln32", + .exts = "sln32", + .write = slinear32_write, + .seek = slinear_seek, + .trunc = slinear_trunc, + .tell = slinear_tell, + .read = slinear32_read, + .buf_size = 1280 + AST_FRIENDLY_OFFSET, +}; + +static int slinear44_write(struct ast_filestream *fs, struct ast_frame *f){return generic_write(fs, f, AST_FORMAT_SLINEAR44);} +static struct ast_frame *slinear44_read(struct ast_filestream *s, int *whennext){return generic_read(s, whennext, 1764, AST_FORMAT_SLINEAR44);} +static struct ast_format_def slin44_f = { + .name = "sln44", + .exts = "sln44", + .write = slinear44_write, + .seek = slinear_seek, + .trunc = slinear_trunc, + .tell = slinear_tell, + .read = slinear44_read, + .buf_size = 1764 + AST_FRIENDLY_OFFSET, +}; + +static int slinear48_write(struct ast_filestream *fs, struct ast_frame *f){return generic_write(fs, f, AST_FORMAT_SLINEAR48);} +static struct ast_frame *slinear48_read(struct ast_filestream *s, int *whennext){return generic_read(s, whennext, 1920, AST_FORMAT_SLINEAR48);} +static struct ast_format_def slin48_f = { + .name = "sln48", + .exts = "sln48", + .write = slinear48_write, + .seek = slinear_seek, + .trunc = slinear_trunc, + .tell = slinear_tell, + .read = slinear48_read, + .buf_size = 1920 + AST_FRIENDLY_OFFSET, +}; + +static int slinear96_write(struct ast_filestream *fs, struct ast_frame *f){return generic_write(fs, f, AST_FORMAT_SLINEAR96);} +static struct ast_frame *slinear96_read(struct ast_filestream *s, int *whennext){return generic_read(s, whennext, 3840, AST_FORMAT_SLINEAR96);} +static struct ast_format_def slin96_f = { + .name = "sln96", + .exts = "sln96", + .write = slinear96_write, + .seek = slinear_seek, + .trunc = slinear_trunc, + .tell = slinear_tell, + .read = slinear96_read, + .buf_size = 3840 + AST_FRIENDLY_OFFSET, +}; + +static int slinear192_write(struct ast_filestream *fs, struct ast_frame *f){return generic_write(fs, f, AST_FORMAT_SLINEAR192);} +static struct ast_frame *slinear192_read(struct ast_filestream *s, int *whennext){return generic_read(s, whennext, 7680, AST_FORMAT_SLINEAR192);} +static struct ast_format_def slin192_f = { + .name = "sln192", + .exts = "sln192", + .write = slinear192_write, + .seek = slinear_seek, + .trunc = slinear_trunc, + .tell = slinear_tell, + .read = slinear192_read, + .buf_size = 7680 + AST_FRIENDLY_OFFSET, +}; + +static struct ast_format_def *slin_list[] = { + &slin_f, + &slin12_f, + &slin16_f, + &slin24_f, + &slin32_f, + &slin44_f, + &slin48_f, + &slin96_f, + &slin192_f, }; static int load_module(void) { + int i; ast_format_set(&slin_f.format, AST_FORMAT_SLINEAR, 0); - if (ast_format_def_register(&slin_f)) - return AST_MODULE_LOAD_FAILURE; + ast_format_set(&slin12_f.format, AST_FORMAT_SLINEAR12, 0); + ast_format_set(&slin16_f.format, AST_FORMAT_SLINEAR16, 0); + ast_format_set(&slin24_f.format, AST_FORMAT_SLINEAR24, 0); + ast_format_set(&slin32_f.format, AST_FORMAT_SLINEAR32, 0); + ast_format_set(&slin44_f.format, AST_FORMAT_SLINEAR44, 0); + ast_format_set(&slin48_f.format, AST_FORMAT_SLINEAR48, 0); + ast_format_set(&slin96_f.format, AST_FORMAT_SLINEAR96, 0); + ast_format_set(&slin192_f.format, AST_FORMAT_SLINEAR192, 0); + + for (i = 0; i < ARRAY_LEN(slin_list); i++) { + if (ast_format_def_register(slin_list[i])) { + return AST_MODULE_LOAD_FAILURE; + } + } + return AST_MODULE_LOAD_SUCCESS; } static int unload_module(void) { - return ast_format_def_unregister(slin_f.name); + int res = 0; + int i = 0; + + for (i = 0; i < ARRAY_LEN(slin_list); i++) { + if (ast_format_def_unregister(slin_list[i]->name)) { + res |= AST_MODULE_LOAD_FAILURE; + } + } + return res; } -AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Raw Signed Linear Audio support (SLN)", +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Raw Signed Linear Audio support (SLN) 8khz-192khz", .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_APP_DEPEND diff --git a/formats/format_sln16.c b/formats/format_sln16.c deleted file mode 100644 index cac019615..000000000 --- a/formats/format_sln16.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Asterisk -- An open source telephony toolkit. - * - * Copyright (C) 1999 - 2008, Anthony Minessale and Digium, Inc. - * Anthony Minessale (anthmct@yahoo.com) - * Kevin P. Fleming <kpfleming@digium.com> - * - * See http://www.asterisk.org for more information about - * the Asterisk project. Please do not directly contact - * any of the maintainers of this project for assistance; - * the project provides a web site, mailing lists and IRC - * channels for your use. - * - * This program is free software, distributed under the terms of - * the GNU General Public License Version 2. See the LICENSE file - * at the top of the source tree. - */ - -/*! \file - * - * \brief RAW SLINEAR 16 Format - * \arg File name extensions: sln16 - * \ingroup formats - */ - -#include "asterisk.h" - -ASTERISK_FILE_VERSION(__FILE__, "$Revision$") - -#include "asterisk/mod_format.h" -#include "asterisk/module.h" -#include "asterisk/endian.h" - -#define BUF_SIZE 640 /* 640 bytes, 320 samples */ -#define SLIN_SAMPLES 320 - -static struct ast_frame *slinear_read(struct ast_filestream *s, int *whennext) -{ - int res; - /* Send a frame from the file to the appropriate channel */ - - s->fr.frametype = AST_FRAME_VOICE; - ast_format_set(&s->fr.subclass.format, AST_FORMAT_SLINEAR16, 0); - s->fr.mallocd = 0; - AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, BUF_SIZE); - if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) < 1) { - if (res) - ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", res, strerror(errno)); - return NULL; - } - *whennext = s->fr.samples = res/2; - s->fr.datalen = res; - return &s->fr; -} - -static int slinear_write(struct ast_filestream *fs, struct ast_frame *f) -{ - int res; - - if (f->frametype != AST_FRAME_VOICE) { - ast_log(LOG_WARNING, "Asked to write non-voice frame!\n"); - return -1; - } - if (f->subclass.format.id != AST_FORMAT_SLINEAR16) { - ast_log(LOG_WARNING, "Asked to write non-slinear16 frame (%s)!\n", ast_getformatname(&f->subclass.format)); - return -1; - } - if ((res = fwrite(f->data.ptr, 1, f->datalen, fs->f)) != f->datalen) { - ast_log(LOG_WARNING, "Bad write (%d/%d): %s\n", res, f->datalen, strerror(errno)); - return -1; - } - return 0; -} - -static int slinear_seek(struct ast_filestream *fs, off_t sample_offset, int whence) -{ - off_t offset = 0, min = 0, cur, max; - - sample_offset <<= 1; - - cur = ftello(fs->f); - - fseeko(fs->f, 0, SEEK_END); - - max = ftello(fs->f); - - if (whence == SEEK_SET) - offset = sample_offset; - else if (whence == SEEK_CUR || whence == SEEK_FORCECUR) - offset = sample_offset + cur; - else if (whence == SEEK_END) - offset = max - sample_offset; - - if (whence != SEEK_FORCECUR) - offset = (offset > max) ? max : offset; - - /* always protect against seeking past begining. */ - offset = (offset < min) ? min : offset; - - return fseeko(fs->f, offset, SEEK_SET); -} - -static int slinear_trunc(struct ast_filestream *fs) -{ - return ftruncate(fileno(fs->f), ftello(fs->f)); -} - -static off_t slinear_tell(struct ast_filestream *fs) -{ - return ftello(fs->f) / 2; -} - -static struct ast_format_def slin_f = { - .name = "sln16", - .exts = "sln16", - .write = slinear_write, - .seek = slinear_seek, - .trunc = slinear_trunc, - .tell = slinear_tell, - .read = slinear_read, - .buf_size = BUF_SIZE + AST_FRIENDLY_OFFSET, -}; - -static int load_module(void) -{ - ast_format_set(&slin_f.format, AST_FORMAT_SLINEAR16, 0); - if (ast_format_def_register(&slin_f)) - return AST_MODULE_LOAD_FAILURE; - - return AST_MODULE_LOAD_SUCCESS; -} - -static int unload_module(void) -{ - return ast_format_def_unregister(slin_f.name); -} - -AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Raw Signed Linear 16KHz Audio support (SLN16)", - .load = load_module, - .unload = unload_module, - .load_pri = AST_MODPRI_APP_DEPEND -); diff --git a/formats/format_vox.c b/formats/format_vox.c index 05ecdeeaf..7d34df99c 100644 --- a/formats/format_vox.c +++ b/formats/format_vox.c @@ -23,6 +23,10 @@ * * \ingroup formats */ + +/*** MODULEINFO + <support_level>extended</support_level> + ***/ #include "asterisk.h" diff --git a/formats/format_wav.c b/formats/format_wav.c index f35fd5278..f311522e5 100644 --- a/formats/format_wav.c +++ b/formats/format_wav.c @@ -24,6 +24,10 @@ * \ingroup formats */ +/*** MODULEINFO + <support_level>core</support_level> + ***/ + #include "asterisk.h" ASTERISK_FILE_VERSION(__FILE__, "$Revision$") diff --git a/formats/format_wav_gsm.c b/formats/format_wav_gsm.c index ae1f11ed8..35d4339f9 100644 --- a/formats/format_wav_gsm.c +++ b/formats/format_wav_gsm.c @@ -26,6 +26,10 @@ * e-mail attachments mainly. * \ingroup formats */ + +/*** MODULEINFO + <support_level>core</support_level> + ***/ #include "asterisk.h" |