/* This does not (fully) work for non-seekable streams... You have to check for that flag, pal! */ static void stream_rewind(mpg123_handle *fr) { if(fr->rdat.flags & READER_SEEKABLE) fr->rdat.buffer.fileoff = fr->rdat.filepos = stream_lseek(fr,0,SEEK_SET); if(fr->rdat.flags & READER_BUFFERED) { fr->rdat.buffer.pos = 0; fr->rdat.buffer.firstpos = 0; fr->rdat.filepos = fr->rdat.buffer.fileoff; } }
/* This does not (fully) work for non-seekable streams... You have to check for that flag, pal! */ static void stream_rewind(mpg123_handle *fr) { if(fr->rdat.flags & READER_SEEKABLE) { fr->rdat.filepos = stream_lseek(fr,0,SEEK_SET); #ifndef NO_FEEDER fr->rdat.buffer.fileoff = fr->rdat.filepos; #endif } #ifndef NO_FEEDER if(fr->rdat.flags & READER_BUFFERED) { fr->rdat.buffer.pos = 0; fr->rdat.buffer.firstpos = 0; fr->rdat.filepos = fr->rdat.buffer.fileoff; } #endif }
// returns reached position... negative ones are bad... static mpg_off_t stream_skip_bytes( mpg123_handle_t *fr, mpg_off_t len ) { if( fr->rdat.flags & READER_SEEKABLE ) { mpg_off_t ret = stream_lseek( fr, len, SEEK_CUR ); return (ret < 0) ? MPG123_ERR : ret; } else if( len >= 0 ) { byte buf[1024]; // ThOr: Compaq cxx complained and it makes sense to me... or should one do a cast? What for? mpg_ssize_t ret; while( len > 0 ) { mpg_ssize_t num = len < (mpg_off_t)sizeof( buf ) ? (mpg_ssize_t)len : (mpg_ssize_t)sizeof( buf ); ret = fr->rd->fullread( fr, buf, num ); if( ret < 0 ) return ret; else if( ret == 0 ) break; // EOF... an error? interface defined to tell the actual position... len -= ret; } return fr->rd->tell( fr ); } else if( fr->rdat.flags & READER_BUFFERED ) { // perhaps we _can_ go a bit back. if( fr->rdat.buffer.pos >= -len ) { fr->rdat.buffer.pos += len; return fr->rd->tell( fr ); } else { fr->err = MPG123_NO_SEEK; return MPG123_ERR; } } else { fr->err = MPG123_NO_SEEK; return MPG123_ERR; } }
/* returns reached position... negative ones are bad... */ static off_t stream_skip_bytes(mpg123_handle *fr,off_t len) { if(fr->rdat.flags & READER_SEEKABLE) { off_t ret = stream_lseek(fr, len, SEEK_CUR); return (ret < 0) ? READER_ERROR : ret; } else if(len >= 0) { unsigned char buf[1024]; /* ThOr: Compaq cxx complained and it makes sense to me... or should one do a cast? What for? */ ssize_t ret; while (len > 0) { ssize_t num = len < (off_t)sizeof(buf) ? (ssize_t)len : (ssize_t)sizeof(buf); ret = fr->rd->fullread(fr, buf, num); if (ret < 0) return ret; else if(ret == 0) break; /* EOF... an error? interface defined to tell the actual position... */ len -= ret; } return fr->rd->tell(fr); } #ifndef NO_FEEDER else if(fr->rdat.flags & READER_BUFFERED) { /* Perhaps we _can_ go a bit back. */ if(fr->rdat.buffer.pos >= -len) { fr->rdat.buffer.pos += len; return fr->rd->tell(fr); } else { fr->err = MPG123_NO_SEEK; return READER_ERROR; } } #endif else { fr->err = MPG123_NO_SEEK; return READER_ERROR; } }