1 /********************************************************************
3 * THIS FILE IS PART OF THE Ogg Vorbis SOFTWARE CODEC SOURCE CODE. *
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS SOURCE IS GOVERNED BY *
5 * THE GNU PUBLIC LICENSE 2, WHICH IS INCLUDED WITH THIS SOURCE. *
6 * PLEASE READ THESE TERMS DISTRIBUTING. *
8 * THE OggSQUISH SOURCE CODE IS (C) COPYRIGHT 1994-1999 *
9 * by 1999 Monty <monty@xiph.org> and The XIPHOPHORUS Company *
10 * http://www.xiph.org/ *
12 ********************************************************************
14 function: stdio-based convenience library for opening/seeking/decoding
15 author: Monty <xiphmont@mit.edu>
16 modifications by: Monty
17 last modification date: Nov 04 1999
19 ********************************************************************/
25 #include "vorbisfile.h"
27 /* A 'chained bitstream' is a Vorbis bitstream that contains more than
28 one logical bitstream arranged end to end (the only form of Ogg
29 multiplexing allowed in a Vorbis bitstream; grouping [parallel
30 multiplexing] is not allowed in Vorbis) */
32 /* A Vorbis file can be played beginning to end (streamed) without
33 worrying ahead of time about chaining (see decoder_example.c). If
34 we have the whole file, however, and want random access
35 (seeking/scrubbing) or desire to know the total length/time of a
36 file, we need to account for the possibility of chaining. */
38 /* We can handle things a number of ways; we can determine the entire
39 bitstream structure right off the bat, or find pieces on demand.
40 This example determines and caches structure for the entire
41 bitstream, but builds a virtual decoder on the fly when moving
42 between links in the chain. */
44 /* There are also different ways to implement seeking. Enough
45 information exists in an Ogg bitstream to seek to
46 sample-granularity positions in the output. Or, one can seek by
47 picking some portion of the stream roughly in the desired area if
48 we only want course navigation through the stream. */
50 /*************************************************************************
51 * Many, many internal helpers. The intention is not to be confusing;
52 * rampant duplication and monolithic function implementation would be
53 * harder to understand anyway. The high level functions are last. Begin
54 * grokking near the end of the file */
56 /* read a little more data from the file/pipe into the ogg_sync framer */
57 #define CHUNKSIZE 4096
58 static long _get_data(OggVorbis_File *vf){
59 char *buffer=ogg_sync_buffer(&vf->oy,4096);
60 long bytes=fread(buffer,1,4096,vf->f);
61 ogg_sync_wrote(&vf->oy,bytes);
65 /* save a tiny smidge of verbosity to make the code more readable */
66 static void _seek_helper(OggVorbis_File *vf,long offset){
67 fseek(vf->f,offset,SEEK_SET);
69 ogg_sync_reset(&vf->oy);
72 /* The read/seek functions track absolute position within the stream */
74 /* from the head of the stream, get the next page. boundary specifies
75 if the function is allowed to fetch more data from the stream (and
76 how much) or only use internally buffered data.
78 boundary: -1) unbounded search
79 0) read no additional data; use cached only
80 n) search for a new page beginning for n bytes
82 return: -1) did not find a page
83 n) found a page at absolute offset n */
85 static long _get_next_page(OggVorbis_File *vf,ogg_page *og,int boundary){
86 if(boundary>0)boundary+=vf->offset;
90 if(boundary>0 && vf->offset>=boundary)return(-1);
91 more=ogg_sync_pageseek(&vf->oy,og);
98 /* send more paramedics */
99 if(!boundary)return(-1);
100 if(_get_data(vf)<=0)return(-1);
102 /* got a page. Return the offset at the page beginning,
103 advance the internal offset past the page end */
113 /* find the latest page beginning before the current stream cursor
114 position. Much dirtier than the above as Ogg doesn't have any
115 backward search linkage. no 'readp' as it will certainly have to
117 static long _get_prev_page(OggVorbis_File *vf,ogg_page *og){
118 long begin=vf->offset;
124 _seek_helper(vf,begin);
125 while(vf->offset<begin+CHUNKSIZE){
126 ret=_get_next_page(vf,og,begin+CHUNKSIZE-vf->offset);
135 /* we have the offset. Actually snork and hold the page now */
136 _seek_helper(vf,offset);
137 ret=_get_next_page(vf,og,CHUNKSIZE);
139 /* this shouldn't be possible */
140 fprintf(stderr,"Missed page fencepost at end of logical bitstream. "
147 /* finds each bitstream link one at a time using a bisection search
148 (has to begin by knowing the offset of the lb's initial page).
149 Recurses for each link so it can alloc the link storage after
150 finding them all, then unroll and fill the cache at the same time */
151 static void _bisect_forward_serialno(OggVorbis_File *vf,
157 long endsearched=end;
161 /* the below guards against garbage seperating the last and
162 first pages of two links. */
163 while(searched<endsearched){
167 if(endsearched-searched<CHUNKSIZE){
170 bisect=(searched+endsearched)/2;
173 _seek_helper(vf,bisect);
174 ret=_get_next_page(vf,&og,-1);
175 if(ret<0 || ogg_page_serialno(&og)!=currentno){
179 searched=ret+og.header_len+og.body_len;
184 vf->offsets=malloc((m+2)*sizeof(long));
185 vf->offsets[m+1]=searched;
187 _bisect_forward_serialno(vf,next,next,
188 end,ogg_page_serialno(&og),m+1);
191 vf->offsets[m]=begin;
194 /* uses the local ogg_stream storage in vf; this is important for
195 non-streaming input sources */
196 static int _fetch_headers(OggVorbis_File *vf,vorbis_info *vi,long *serialno){
201 ret=_get_next_page(vf,&og,CHUNKSIZE);
203 fprintf(stderr,"Did not find initial header for bitstream.\n");
207 if(serialno)*serialno=ogg_page_serialno(&og);
208 ogg_stream_init(&vf->os,ogg_page_serialno(&og));
210 /* extract the initial header from the first page and verify that the
211 Ogg bitstream is in fact Vorbis data */
213 vorbis_info_init(vi);
217 ogg_stream_pagein(&vf->os,&og);
219 int result=ogg_stream_packetout(&vf->os,&op);
222 fprintf(stderr,"Corrupt header in logical bitstream.\n");
225 if(vorbis_info_headerin(vi,&op)){
226 fprintf(stderr,"Illegal header in logical bitstream.\n");
232 if(_get_next_page(vf,&og,1)<0){
233 fprintf(stderr,"Missing header in logical bitstream.\n");
240 vorbis_info_clear(vi);
241 ogg_stream_clear(&vf->os);
245 /* last step of the OggVorbis_File initialization; get all the
246 vorbis_info structs and PCM positions. Only called by the seekable
247 initialization (local stream storage is hacked slightly; pay
248 attention to how that's done) */
249 static void _prefetch_all_headers(OggVorbis_File *vf,vorbis_info *first){
253 vf->vi=malloc(vf->links*sizeof(vorbis_info));
254 vf->dataoffsets=malloc(vf->links*sizeof(long));
255 vf->pcmlengths=malloc(vf->links*sizeof(size64));
256 vf->serialnos=malloc(vf->links*sizeof(long));
258 for(i=0;i<vf->links;i++){
260 /* we already grabbed the initial header earlier. This just
261 saves the waste of grabbing it again */
262 memcpy(vf->vi+i,first,sizeof(vorbis_info));
263 memset(first,0,sizeof(vorbis_info));
266 /* seek to the location of the initial header */
268 _seek_helper(vf,vf->offsets[i]);
269 if(_fetch_headers(vf,vf->vi+i,NULL)==-1){
270 vorbis_info_clear(vf->vi+i);
271 fprintf(stderr,"Error opening logical bitstream #%d.\n\n",i+1);
273 ogg_stream_clear(&vf->os); /* clear local storage. This is not
274 done in _fetch_headers, as that may
275 be called in a non-seekable stream
276 (in which case, we need to preserve
277 the stream local storage) */
278 vf->dataoffsets[i]=-1;
280 vf->dataoffsets[i]=vf->offset;
283 /* get the serial number and PCM length of this link. To do this,
284 get the last page of the stream */
286 long end=vf->offsets[i+1];
287 _seek_helper(vf,end);
290 ret=_get_prev_page(vf,&og);
292 /* this should not be possible */
293 fprintf(stderr,"Could not find last page of logical "
294 "bitstream #%d\n\n",i);
295 vorbis_info_clear(vf->vi+i);
298 if(ogg_page_frameno(&og)!=-1){
299 vf->serialnos[i]=ogg_page_serialno(&og);
300 vf->pcmlengths[i]=ogg_page_frameno(&og);
308 static int _open_seekable(OggVorbis_File *vf){
314 /* is this even vorbis...? */
315 ret=_fetch_headers(vf,&initial,&serialno);
316 ogg_stream_clear(&vf->os);
317 if(ret==-1)return(-1);
319 /* we can seek, so set out learning all about this file */
321 fseek(vf->f,0,SEEK_END);
322 vf->offset=vf->end=ftell(vf->f);
324 /* We get the offset for the last page of the physical bitstream.
325 Most OggVorbis files will contain a single logical bitstream */
326 end=_get_prev_page(vf,&og);
328 /* moer than one logical bitstream? */
329 if(ogg_page_serialno(&og)!=serialno){
331 /* Chained bitstream. Bisect-search each logical bitstream
332 section. Do so based on serial number only */
333 _bisect_forward_serialno(vf,0,0,end+1,serialno,0);
337 /* Only one logical bitstream */
338 _bisect_forward_serialno(vf,0,end,end+1,serialno,0);
342 _prefetch_all_headers(vf,&initial);
347 static int _open_nonseekable(OggVorbis_File *vf){
348 /* we cannot seek. Set up a 'single' (current) logical bitstream entry */
350 vf->vi=malloc(sizeof(vorbis_info));
352 /* Try to fetch the headers, maintaining all the storage */
353 if(_fetch_headers(vf,vf->vi,&vf->current_serialno)==-1)return(-1);
358 /* clear out the current logical bitstream decoder */
359 static void _decode_clear(OggVorbis_File *vf){
360 ogg_stream_clear(&vf->os);
361 vorbis_dsp_clear(&vf->vd);
362 vorbis_block_clear(&vf->vb);
367 /* fetch and process a packet. Handles the case where we're at a
368 bitstream boundary and dumps the decoding machine. If the decoding
369 machine is unloaded, it loads it. It also keeps pcm_offset up to
370 date (seek and read both use this. seek uses a special hack with
373 return: -1) hole in the data (lost packet)
374 0) need more date (only if readp==0)/eof
378 static int _process_packet(OggVorbis_File *vf,int readp){
381 /* handle one packet. Try to fetch it from current stream state */
382 /* extract packets from page */
385 /* process a packet if we can. If the machine isn't loaded,
387 if(vf->decode_ready){
389 int result=ogg_stream_packetout(&vf->os,&op);
392 if(result==-1)return(-1); /* hole in the data. alert the toplevel */
394 /* got a packet. process it */
396 vorbis_synthesis(&vf->vb,&op);
397 vorbis_synthesis_blockin(&vf->vd,&vf->vb);
399 /* update the pcm offset. */
401 int link=(vf->seekable?vf->current_link:0);
405 /* this packet has a pcm_offset on it (the last packet
406 completed on a page carries the offset) After processing
407 (above), we know the pcm position of the *last* sample
408 ready to be returned. Find the offset of the *first* */
410 samples=vorbis_synthesis_pcmout(&vf->vd,&dummy);
414 frameno+=vf->pcmlengths[i];
415 vf->pcm_offset=frameno;
422 if(_get_next_page(vf,&og,-1)<0)return(0); /* eof. leave unitialized */
424 /* has our decoding just traversed a bitstream boundary? */
425 if(vf->decode_ready){
426 if(vf->current_serialno!=ogg_page_serialno(&og)){
431 /* Do we need to load a new machine before submitting the page? */
432 /* This is different in the seekable and non-seekable cases.
434 In the seekable case, we already have all the header
435 information loaded and cached; we just initialize the machine
436 with it and continue on our merry way.
438 In the non-seekable (streaming) case, we'll only be at a
439 boundary if we just left the previous logical bitstream and
440 we're now nominally at the header of the next bitstream
443 if(!vf->decode_ready){
446 vf->current_serialno=ogg_page_serialno(&og);
448 /* match the serialno to bitstream section. We use this rather than
449 offset positions to avoid problems near logical bitstream
451 for(link=0;link<vf->links;link++)
452 if(vf->serialnos[link]==vf->current_serialno)break;
453 if(link==vf->links)return(-1); /* sign of a bogus stream. error out,
454 leave machine uninitialized */
456 vf->current_link=link;
458 /* we're streaming */
459 /* fetch the three header packets, build the info struct */
461 _fetch_headers(vf,vf->vi,&vf->current_serialno);
467 ogg_stream_init(&vf->os,vf->current_serialno);
468 vorbis_synthesis_init(&vf->vd,vf->vi+link);
469 vorbis_block_init(&vf->vd,&vf->vb);
472 ogg_stream_pagein(&vf->os,&og);
476 /**********************************************************************
477 * The helpers are over; it's all toplevel interface from here on out */
479 /* clear out the OggVorbis_File struct */
480 int ov_clear(OggVorbis_File *vf){
482 vorbis_block_clear(&vf->vb);
483 vorbis_dsp_clear(&vf->vd);
484 ogg_stream_clear(&vf->os);
486 if(vf->vi && vf->links){
488 for(i=0;i<vf->links;i++)
489 vorbis_info_clear(vf->vi+i);
492 if(vf->dataoffsets)free(vf->dataoffsets);
493 if(vf->pcmlengths)free(vf->pcmlengths);
494 if(vf->serialnos)free(vf->serialnos);
495 if(vf->offsets)free(vf->offsets);
496 ogg_sync_clear(&vf->oy);
497 if(vf->f)fclose(vf->f);
498 memset(vf,0,sizeof(OggVorbis_File));
503 /* inspects the OggVorbis file and finds/documents all the logical
504 bitstreams contained in it. Tries to be tolerant of logical
505 bitstream sections that are truncated/woogie.
511 int ov_open(FILE *f,OggVorbis_File *vf,char *initial,long ibytes){
512 long offset=fseek(f,0,SEEK_CUR);
515 memset(vf,0,sizeof(OggVorbis_File));
518 /* init the framing state */
519 ogg_sync_init(&vf->oy);
521 /* perhaps some data was previously read into a buffer for testing
522 against other stream types. Allow initialization from this
523 previously read data (as we may be reading from a non-seekable
526 char *buffer=ogg_sync_buffer(&vf->oy,ibytes);
527 memcpy(buffer,initial,ibytes);
528 ogg_sync_wrote(&vf->oy,ibytes);
531 /* can we seek? Stevens suggests the seek test was portable */
533 ret=_open_seekable(vf);
535 ret=_open_nonseekable(vf);
541 ogg_stream_init(&vf->os,vf->current_serialno);
542 vorbis_synthesis_init(&vf->vd,vf->vi);
543 vorbis_block_init(&vf->vd,&vf->vb);
549 /* How many logical bitstreams in this physical bitstream? */
550 long ov_streams(OggVorbis_File *vf){
554 /* Is the FILE * associated with vf seekable? */
555 long ov_seekable(OggVorbis_File *vf){
559 /* returns the bitrate for a given logical bitstream or the entire
560 physical bitstream. If the file is open for random access, it will
561 find the *actual* average bitrate. If the file is streaming, it
562 returns the nominal bitrate (if set) else the average of the
563 upper/lower bounds (if set) else -1 (unset).
565 If you want the actual bitrate field settings, get them from the
566 vorbis_info structs */
568 long ov_bitrate(OggVorbis_File *vf,int i){
569 if(i>=vf->links)return(-1);
570 if(!vf->seekable)return(ov_bitrate(vf,0));
574 for(i=0;i<vf->links;i++)
575 bits+=vf->offsets[i+1]-vf->dataoffsets[i];
576 return(rint(bits/ov_time_total(vf,-1)));
579 /* return the actual bitrate */
580 return(rint((vf->offsets[i+1]-vf->dataoffsets[i])/ov_time_total(vf,i)));
582 /* return nominal if set */
583 if(vf->vi[i].bitrate_nominal>0){
584 return vf->vi[i].bitrate_nominal;
586 if(vf->vi[i].bitrate_upper>0){
587 if(vf->vi[i].bitrate_lower>0){
588 return (vf->vi[i].bitrate_upper+vf->vi[i].bitrate_lower)/2;
590 return vf->vi[i].bitrate_upper;
600 long ov_serialnumber(OggVorbis_File *vf,int i){
601 if(i>=vf->links)return(-1);
602 if(!vf->seekable && i>=0)return(ov_serialnumber(vf,-1));
604 return(vf->current_serialno);
606 return(vf->serialnos[i]);
610 /* returns: total raw (compressed) length of content if i==-1
611 raw (compressed) length of that logical bitstream for i==0 to n
612 -1 if the stream is not seekable (we can't know the length)
614 long ov_raw_total(OggVorbis_File *vf,int i){
615 if(!vf->seekable || i>=vf->links)return(-1);
619 for(i=0;i<vf->links;i++)
620 acc+=ov_raw_total(vf,i);
623 return(vf->offsets[i+1]-vf->offsets[i]);
627 /* returns: total PCM length (samples) of content if i==-1
628 PCM length (samples) of that logical bitstream for i==0 to n
629 -1 if the stream is not seekable (we can't know the length)
631 size64 ov_pcm_total(OggVorbis_File *vf,int i){
632 if(!vf->seekable || i>=vf->links)return(-1);
636 for(i=0;i<vf->links;i++)
637 acc+=ov_pcm_total(vf,i);
640 return(vf->pcmlengths[i]);
644 /* returns: total seconds of content if i==-1
645 seconds in that logical bitstream for i==0 to n
646 -1 if the stream is not seekable (we can't know the length)
648 double ov_time_total(OggVorbis_File *vf,int i){
649 if(!vf->seekable || i>=vf->links)return(-1);
653 for(i=0;i<vf->links;i++)
654 acc+=ov_time_total(vf,i);
657 return((float)(vf->pcmlengths[i])/vf->vi[i].rate);
661 /* seek to an offset relative to the *compressed* data. This also
662 immediately sucks in and decodes pages to update the PCM cursor. It
663 will cross a logical bitstream boundary, but only if it can't get
664 any packets out of the tail of the bitstream we seek to (so no
667 returns zero on success, nonzero on failure */
669 int ov_raw_seek(OggVorbis_File *vf,long pos){
671 if(!vf->seekable)return(-1); /* don't dump machine if we can't seek */
672 if(pos<0 || pos>vf->offsets[vf->links])goto seek_error;
674 /* clear out decoding machine state */
678 _seek_helper(vf,pos);
680 /* we need to make sure the pcm_offset is set. We use the
681 _fetch_packet helper to process one packet with readp set, then
682 call it until it returns '0' with readp not set (the last packet
683 from a page has the 'frameno' field set, and that's how the
684 helper updates the offset */
686 switch(_process_packet(vf,1)){
688 /* oh, eof. There are no packets remaining. Set the pcm offset to
690 vf->pcm_offset=ov_pcm_total(vf,-1);
693 /* error! missing data or invalid bitstream structure */
701 switch(_process_packet(vf,0)){
703 /* the offset is set. If it's a bogus bitstream with no offset
704 information, it's not but that's not our fault. We still run
705 gracefully, we're just missing the offset */
708 /* error! missing data or invalid bitstream structure */
711 /* continue processing packets */
717 /* dump the machine so we're in a known state */
722 /* seek to a sample offset relative to the decompressed pcm stream
724 returns zero on success, nonzero on failure */
726 int ov_pcm_seek(OggVorbis_File *vf,size64 pos){
728 size64 total=ov_pcm_total(vf,-1);
730 if(!vf->seekable)return(-1); /* don't dump machine if we can't seek */
731 if(pos<0 || pos>total)goto seek_error;
733 /* which bitstream section does this pcm offset occur in? */
734 for(link=vf->links-1;link>=0;link--){
735 total-=vf->pcmlengths[link];
739 /* seach within the logical bitstream for the page with the highest
740 pcm_pos preceeding (or equal to) pos. There is a danger here;
741 missing pages or incorrect frame number information in the
742 bitstream could make our task impossible. Account for that (it
743 would be an error condition) */
745 size64 target=pos-total;
746 long end=vf->offsets[link+1];
747 long begin=vf->offsets[link];
755 if(end-begin<CHUNKSIZE){
758 bisect=(end+begin)/2;
761 _seek_helper(vf,bisect);
765 ret=_get_next_page(vf,&og,-1);
770 size64 frameno=ogg_page_frameno(&og);
772 if(frameno==-1)continue;
774 best=bisect+acc; /* raw offset of packet with frameno */
775 begin=vf->offset; /* raw offset of next packet */
784 /* found our page. seek to it (call raw_seek). */
786 if(ov_raw_seek(vf,best))goto seek_error;
790 if(vf->pcm_offset>=pos)goto seek_error;
791 if(pos>ov_pcm_total(vf,-1))goto seek_error;
793 /* discard samples until we reach the desired position. Crossing a
794 logical bitstream boundary with abandon is OK. */
795 while(vf->pcm_offset<pos){
797 long target=pos-vf->pcm_offset;
798 long samples=vorbis_synthesis_pcmout(&vf->vd,&pcm);
800 if(samples>target)samples=target;
801 vorbis_synthesis_read(&vf->vd,samples);
802 vf->pcm_offset+=samples;
805 if(_process_packet(vf,1)==0)
806 vf->pcm_offset=ov_pcm_total(vf,-1); /* eof */
811 /* dump machine so we're in a known state */
816 /* seek to a playback time relative to the decompressed pcm stream
817 returns zero on success, nonzero on failure */
818 int ov_time_seek(OggVorbis_File *vf,double seconds){
819 /* translate time to PCM position and call ov_pcm_seek */
822 size64 pcm_total=ov_pcm_total(vf,-1);
823 double time_total=ov_time_total(vf,-1);
825 if(!vf->seekable)return(-1); /* don't dump machine if we can't seek */
826 if(seconds<0 || seconds>time_total)goto seek_error;
828 /* which bitstream section does this time offset occur in? */
829 for(link=vf->links-1;link>=0;link--){
830 pcm_total-=vf->pcmlengths[link];
831 time_total-=ov_time_total(vf,link);
832 if(seconds>=time_total)break;
835 /* enough information to convert time offset to pcm offset */
837 size64 target=pcm_total+(seconds-time_total)*vf->vi[link].rate;
838 return(ov_pcm_seek(vf,target));
842 /* dump machine so we're in a known state */
847 /* tell the current stream offset cursor. Note that seek followed by
848 tell will likely not give the set offset due to caching */
849 long ov_raw_tell(OggVorbis_File *vf){
853 /* return PCM offset (sample) of next PCM sample to be read */
854 size64 ov_pcm_tell(OggVorbis_File *vf){
855 return(vf->pcm_offset);
858 /* return time offset (seconds) of next PCM sample to be read */
859 double ov_time_tell(OggVorbis_File *vf){
860 /* translate time to PCM position and call ov_pcm_seek */
864 double time_total=0.;
867 pcm_total=ov_pcm_total(vf,-1);
868 time_total=ov_time_total(vf,-1);
870 /* which bitstream section does this time offset occur in? */
871 for(link=vf->links-1;link>=0;link--){
872 pcm_total-=vf->pcmlengths[link];
873 time_total-=ov_time_total(vf,link);
874 if(vf->pcm_offset>pcm_total)break;
878 return(time_total+(vf->pcm_offset-pcm_total)/vf->vi[link].rate);
881 /* link: -1) return the vorbis_info struct for the bitstream section
882 currently being decoded
883 0-n) to request information for a specific bitstream section
885 In the case of a non-seekable bitstream, any call returns the
886 current bitstream. NULL in the case that the machine is not
889 vorbis_info *ov_info(OggVorbis_File *vf,int link){
893 return vf->vi+vf->current_link;
909 /* up to this point, everything could more or less hide the multiple
910 logical bitstream nature of chaining from the toplevel application
911 if the toplevel application didn't particularly care. However, at
912 the point that we actually read audio back, the multiple-section
913 nature must surface: Multiple bitstream sections do not necessarily
914 have to have the same number of channels or sampling rate.
916 ov_read returns the sequential logical bitstream number currently
917 being decoded along with the PCM data in order that the toplevel
918 application can take action on channel/sample rate changes. This
919 number will be incremented even for streamed (non-seekable) streams
920 (for seekable streams, it represents the actual logical bitstream
921 index within the physical bitstream. Note that the accessor
922 functions above are aware of this dichotomy).
924 input values: buffer) a buffer to hold packed PCM data for return
925 length) the byte length requested to be placed into buffer
926 bigendianp) should the data be packed LSB first (0) or
928 word) word size for output. currently 1 (byte) or
931 return values: -1) error/hole in data
933 n) number of bytes of PCM actually returned. The
934 below works on a packet-by-packet basis, so the
935 return length is not related to the 'length' passed
936 in, just guaranteed to fit.
938 *section) set to the logical bitstream number */
940 long ov_read(OggVorbis_File *vf,char *buffer,int length,
941 int bigendianp,int word,int sgned,int *bitstream){
945 if(vf->decode_ready){
947 long samples=vorbis_synthesis_pcmout(&vf->vd,&pcm);
949 /* yay! proceed to pack data into the byte buffer */
951 long channels=ov_info(vf,-1)->channels;
952 long bytespersample=word * channels;
953 if(samples>length/bytespersample)samples=length/bytespersample;
955 /* a tight loop to pack each size */
958 int off=(sgned?0:128);
959 for(j=0;j<samples;j++)
960 for(i=0;i<channels;i++){
961 int val=rint(pcm[i][j]*128.);
963 if(val<-128)val=-128;
967 int off=(sgned?0:32768);
970 for(j=0;j<samples;j++)
971 for(i=0;i<channels;i++){
972 int val=rint(pcm[i][j]*32768.);
973 if(val>32767)val=32767;
974 if(val<-32768)val=-32768;
977 *buffer++=(val&0xff);
980 for(j=0;j<samples;j++)
981 for(i=0;i<channels;i++){
982 int val=rint(pcm[i][j]*32768.);
983 if(val>32767)val=32767;
984 if(val<-32768)val=-32768;
986 *buffer++=(val&0xff);
994 vorbis_synthesis_read(&vf->vd,samples);
995 vf->pcm_offset+=samples;
996 *bitstream=vf->current_link;
997 return(samples*bytespersample);
1001 /* suck in another packet */
1002 switch(_process_packet(vf,1)){