static struct ast_frame *mp3_read(struct ast_filestream *s, int *whennext) { struct mp3_private *p = s->_private; int delay =0; int save=0; /* Pre-populate the buffer that holds audio to be returned (dbuf) */ if (mp3_queue(s)) { return NULL; } if (p->dbuflen) { /* Read out what's waiting in dbuf */ for (p->buflen = 0; p->buflen < MP3_BUFLEN && p->buflen < p->dbuflen; p->buflen++) { s->buf[p->buflen + AST_FRIENDLY_OFFSET] = p->dbuf[p->buflen + p->dbufoffset]; } p->dbufoffset += p->buflen; p->dbuflen -= p->buflen; } if (p->buflen < MP3_BUFLEN) { /* dbuf didn't have enough, so reset dbuf, fill it back up and continue */ p->dbuflen = p->dbufoffset = 0; if (mp3_queue(s)) { return NULL; } /* Make sure dbuf has enough to complete this read attempt */ if (p->dbuflen >= (MP3_BUFLEN - p->buflen)) { for (save = p->buflen; p->buflen < MP3_BUFLEN; p->buflen++) { s->buf[p->buflen + AST_FRIENDLY_OFFSET] = p->dbuf[(p->buflen - save) + p->dbufoffset]; } p->dbufoffset += (MP3_BUFLEN - save); p->dbuflen -= (MP3_BUFLEN - save); } } p->offset += p->buflen; delay = p->buflen / 2; AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, p->buflen); s->fr.samples = delay; *whennext = delay; return &s->fr; }
static struct ast_frame *mp3_read(struct ast_filestream *s, int *whennext) { struct mp3_private *p = s->_private; int delay =0; int save=0; /* Send a frame from the file to the appropriate channel */ if(mp3_queue(s)) return NULL; if(p->dbuflen) { for(p->buflen=0; p->buflen < MP3_BUFLEN && p->buflen < p->dbuflen; p->buflen++) { s->buf[p->buflen + AST_FRIENDLY_OFFSET] = p->dbuf[p->buflen+p->dbufoffset]; p->sbufoffset++; } p->dbufoffset += p->buflen; p->dbuflen -= p->buflen; if(p->buflen < MP3_BUFLEN) { if(mp3_queue(s)) return NULL; for(save = p->buflen; p->buflen < MP3_BUFLEN; p->buflen++) { s->buf[p->buflen + AST_FRIENDLY_OFFSET] = p->dbuf[(p->buflen-save)+p->dbufoffset]; p->sbufoffset++; } p->dbufoffset += (MP3_BUFLEN - save); p->dbuflen -= (MP3_BUFLEN - save); } } p->offset += p->buflen; delay = p->buflen/2; s->fr.frametype = AST_FRAME_VOICE; s->fr.subclass = AST_FORMAT_SLINEAR; AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, p->buflen); s->fr.mallocd = 0; s->fr.samples = delay; *whennext = delay; return &s->fr; }