diff --git a/formats/format_gsm.c b/formats/format_gsm.c index 5f7b74b00fea78c744aa5bd6d07b4bd4b6efaa4d..0c36fde305ee19d386c05e50be5c2e24b3e1b9c6 100755 --- a/formats/format_gsm.c +++ b/formats/format_gsm.c @@ -30,6 +30,8 @@ #else #include <machine/endian.h> #endif +#include "msgsm.h" + /* Some Ideas for this code came from makegsme.c by Jeffery Chilton */ @@ -45,7 +47,7 @@ struct ast_filestream { struct ast_frame fr; /* Frame information */ char waste[AST_FRIENDLY_OFFSET]; /* Buffer for sending frames, etc */ char empty; /* Empty character */ - unsigned char gsm[33]; /* Two Real GSM Frames */ + unsigned char gsm[66]; /* Two Real GSM Frames */ int lasttimeout; struct timeval last; int adj; @@ -233,6 +235,7 @@ static int gsm_play(struct ast_filestream *s) static int gsm_write(struct ast_filestream *fs, struct ast_frame *f) { int res; + unsigned char gsm[66]; if (f->frametype != AST_FRAME_VOICE) { ast_log(LOG_WARNING, "Asked to write non-voice frame!\n"); return -1; @@ -241,20 +244,33 @@ static int gsm_write(struct ast_filestream *fs, struct ast_frame *f) ast_log(LOG_WARNING, "Asked to write non-GSM frame (%d)!\n", f->subclass); return -1; } - if (f->datalen % 33) { - ast_log(LOG_WARNING, "Invalid data length, %d, should be multiple of 33\n", f->datalen); - return -1; - } - if ((res = write(fs->fd, f->data, f->datalen)) != f->datalen) { - ast_log(LOG_WARNING, "Bad write (%d/33): %s\n", res, strerror(errno)); + if (!(f->datalen % 65)) { + /* This is in MSGSM format, need to be converted */ + int len=0; + while(len < f->datalen) { + conv65(f->data + len, gsm); + if ((res = write(fs->fd, gsm, 66)) != 66) { + ast_log(LOG_WARNING, "Bad write (%d/66): %s\n", res, strerror(errno)); + return -1; + } + len += 65; + } + } else { + if (f->datalen % 33) { + ast_log(LOG_WARNING, "Invalid data length, %d, should be multiple of 33\n", f->datalen); return -1; + } + if ((res = write(fs->fd, f->data, f->datalen)) != f->datalen) { + ast_log(LOG_WARNING, "Bad write (%d/33): %s\n", res, strerror(errno)); + return -1; + } } return 0; } static int gsm_seek(struct ast_filestream *fs, long sample_offset, int whence) { - off_t offset,min,cur,max,distance; + off_t offset=0,min,cur,max,distance; min = 0; cur = lseek(fs->fd, 0, SEEK_CUR); diff --git a/formats/format_wav_gsm.c b/formats/format_wav_gsm.c index fc6323b670db2cb4b47206409e4da8d37f72fe40..06275402f05e31b198b6cf8ca42693ed75d498ea 100755 --- a/formats/format_wav_gsm.c +++ b/formats/format_wav_gsm.c @@ -520,6 +520,7 @@ static int wav_write(struct ast_filestream *fs, struct ast_frame *f) int res; char msdata[66]; int len =0; + int alreadyms=0; if (f->frametype != AST_FRAME_VOICE) { ast_log(LOG_WARNING, "Asked to write non-voice frame!\n"); return -1; @@ -528,29 +529,42 @@ static int wav_write(struct ast_filestream *fs, struct ast_frame *f) ast_log(LOG_WARNING, "Asked to write non-GSM frame (%d)!\n", f->subclass); return -1; } + if (!(f->datalen % 65)) + alreadyms = 1; while(len < f->datalen) { - if (fs->secondhalf) { - memcpy(fs->gsm + 33, f->data + len, 33); - conv66(fs->gsm, msdata); - if ((res = write(fs->fd, msdata, 65)) != 65) { + if (alreadyms) { + fs->secondhalf = 0; + if ((res = write(fs->fd, f->data + len, 65)) != 65) { ast_log(LOG_WARNING, "Bad write (%d/65): %s\n", res, strerror(errno)); return -1; } fs->bytes += 65; update_header(fs->fd); + len += 65; } else { - /* Copy the data and do nothing */ - memcpy(fs->gsm, f->data + len, 33); + if (fs->secondhalf) { + memcpy(fs->gsm + 33, f->data + len, 33); + conv66(fs->gsm, msdata); + if ((res = write(fs->fd, msdata, 65)) != 65) { + ast_log(LOG_WARNING, "Bad write (%d/65): %s\n", res, strerror(errno)); + return -1; + } + fs->bytes += 65; + update_header(fs->fd); + } else { + /* Copy the data and do nothing */ + memcpy(fs->gsm, f->data + len, 33); + } + fs->secondhalf = !fs->secondhalf; + len += 33; } - fs->secondhalf = !fs->secondhalf; - len += 33; } return 0; } static int wav_seek(struct ast_filestream *fs, long sample_offset, int whence) { - off_t offset,distance,cur,min,max; + off_t offset=0,distance,cur,min,max; min = 52; cur = lseek(fs->fd, 0, SEEK_CUR); max = lseek(fs->fd, 0, SEEK_END);