annotate src/libvorbis-1.3.3/examples/seeking_example.c @ 56:af97cad61ff0

Add updated build of PortAudio for OSX
author Chris Cannam <cannam@all-day-breakfast.com>
date Tue, 03 Jan 2017 15:10:52 +0000
parents 05aa0afa9217
children
rev   line source
Chris@1 1 /********************************************************************
Chris@1 2 * *
Chris@1 3 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
Chris@1 4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
Chris@1 5 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
Chris@1 6 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
Chris@1 7 * *
Chris@1 8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 *
Chris@1 9 * by the Xiph.Org Foundation http://www.xiph.org/ *
Chris@1 10 * *
Chris@1 11 ********************************************************************
Chris@1 12
Chris@1 13 function: illustrate seeking, and test it too
Chris@1 14 last mod: $Id: seeking_example.c 17561 2010-10-23 10:34:24Z xiphmont $
Chris@1 15
Chris@1 16 ********************************************************************/
Chris@1 17
Chris@1 18 #include <stdlib.h>
Chris@1 19 #include <stdio.h>
Chris@1 20 #include "vorbis/codec.h"
Chris@1 21 #include "vorbis/vorbisfile.h"
Chris@1 22
Chris@1 23 #ifdef _WIN32 /* We need the following two to set stdin/stdout to binary */
Chris@1 24 # include <io.h>
Chris@1 25 # include <fcntl.h>
Chris@1 26 #endif
Chris@1 27
Chris@1 28 void _verify(OggVorbis_File *ov,
Chris@1 29 ogg_int64_t val,ogg_int64_t pcmval,double timeval,
Chris@1 30 ogg_int64_t pcmlength,
Chris@1 31 char *bigassbuffer){
Chris@1 32 off_t i;
Chris@1 33 int j;
Chris@1 34 long bread;
Chris@1 35 char buffer[4096];
Chris@1 36 int dummy;
Chris@1 37 ogg_int64_t pos;
Chris@1 38 int hs = ov_halfrate_p(ov);
Chris@1 39
Chris@1 40 /* verify the raw position, the pcm position and position decode */
Chris@1 41 if(val!=-1 && ov_raw_tell(ov)<val){
Chris@1 42 fprintf(stderr,"raw position out of tolerance: requested %ld, got %ld\n",
Chris@1 43 (long)val,(long)ov_raw_tell(ov));
Chris@1 44 exit(1);
Chris@1 45 }
Chris@1 46 if(pcmval!=-1 && ov_pcm_tell(ov)>pcmval){
Chris@1 47 fprintf(stderr,"pcm position out of tolerance: requested %ld, got %ld\n",
Chris@1 48 (long)pcmval,(long)ov_pcm_tell(ov));
Chris@1 49 exit(1);
Chris@1 50 }
Chris@1 51 if(timeval!=-1 && ov_time_tell(ov)>timeval){
Chris@1 52 fprintf(stderr,"time position out of tolerance: requested %f, got %f\n",
Chris@1 53 timeval,ov_time_tell(ov));
Chris@1 54 exit(1);
Chris@1 55 }
Chris@1 56 pos=ov_pcm_tell(ov);
Chris@1 57 if(pos<0 || pos>pcmlength){
Chris@1 58 fprintf(stderr,"pcm position out of bounds: got %ld\n",(long)pos);
Chris@1 59 exit(1);
Chris@1 60 }
Chris@1 61 bread=ov_read(ov,buffer,4096,1,1,1,&dummy);
Chris@1 62 for(j=0;j<bread;j++){
Chris@1 63 if(buffer[j]!=bigassbuffer[j+((pos>>hs)*2)]){
Chris@1 64 fprintf(stderr,"data after seek doesn't match declared pcm position %ld\n",(long)pos);
Chris@1 65
Chris@1 66 for(i=0;i<(pcmlength>>hs)*2-bread;i++){
Chris@1 67 for(j=0;j<bread;j++)
Chris@1 68 if(buffer[j] != bigassbuffer[i+j])break;
Chris@1 69 if(j==bread){
Chris@1 70 fprintf(stderr,"data after seek appears to match position %ld\n",(long)((i/2)<<hs));
Chris@1 71 }
Chris@1 72 }
Chris@1 73 {
Chris@1 74 FILE *f=fopen("a.m","w");
Chris@1 75 for(j=0;j<bread;j++)fprintf(f,"%d %d\n",j,(int)buffer[j]);
Chris@1 76 fclose(f);
Chris@1 77 f=fopen("b.m","w");
Chris@1 78 for(j=-4096;j<bread+4096;j++)
Chris@1 79 if(j+((pos*2)>>hs)>=0 && (j+((pos*2)>>hs))<(pcmlength>>hs)*2)
Chris@1 80 fprintf(f,"%d %d\n",j,(int)bigassbuffer[j+((pos*2)>>hs)]);
Chris@1 81 fclose(f);
Chris@1 82 }
Chris@1 83
Chris@1 84 exit(1);
Chris@1 85 }
Chris@1 86 }
Chris@1 87 }
Chris@1 88
Chris@1 89 int main(){
Chris@1 90 OggVorbis_File ov;
Chris@1 91 int i,ret;
Chris@1 92 ogg_int64_t pcmlength;
Chris@1 93 double timelength;
Chris@1 94 char *bigassbuffer;
Chris@1 95 int dummy;
Chris@1 96 int hs=0;
Chris@1 97
Chris@1 98 #ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */
Chris@1 99 _setmode( _fileno( stdin ), _O_BINARY );
Chris@1 100 #endif
Chris@1 101
Chris@1 102
Chris@1 103 /* open the file/pipe on stdin */
Chris@1 104 if(ov_open_callbacks(stdin,&ov,NULL,-1,OV_CALLBACKS_NOCLOSE)<0){
Chris@1 105 fprintf(stderr,"Could not open input as an OggVorbis file.\n\n");
Chris@1 106 exit(1);
Chris@1 107 }
Chris@1 108
Chris@1 109 #if 0 /*enable this code to test seeking with halfrate decode */
Chris@1 110 if(ov_halfrate(&ov,1)){
Chris@1 111 fprintf(stderr,"Sorry; unable to set half-rate decode.\n\n");
Chris@1 112 exit(1);
Chris@1 113 }else
Chris@1 114 hs=1;
Chris@1 115 #endif
Chris@1 116
Chris@1 117 if(ov_seekable(&ov)){
Chris@1 118
Chris@1 119 /* to simplify our own lives, we want to assume the whole file is
Chris@1 120 stereo. Verify this to avoid potentially mystifying users
Chris@1 121 (pissing them off is OK, just don't confuse them) */
Chris@1 122 for(i=0;i<ov.links;i++){
Chris@1 123 vorbis_info *vi=ov_info(&ov,i);
Chris@1 124 if(vi->channels!=2){
Chris@1 125 fprintf(stderr,"Sorry; right now seeking_test can only use Vorbis files\n"
Chris@1 126 "that are entirely stereo.\n\n");
Chris@1 127 exit(1);
Chris@1 128 }
Chris@1 129 }
Chris@1 130
Chris@1 131 /* because we want to do sample-level verification that the seek
Chris@1 132 does what it claimed, decode the entire file into memory */
Chris@1 133 pcmlength=ov_pcm_total(&ov,-1);
Chris@1 134 timelength=ov_time_total(&ov,-1);
Chris@1 135 bigassbuffer=malloc((pcmlength>>hs)*2); /* w00t */
Chris@1 136 i=0;
Chris@1 137 while(i<(pcmlength>>hs)*2){
Chris@1 138 int ret=ov_read(&ov,bigassbuffer+i,((pcmlength>>hs)*2)-i,1,1,1,&dummy);
Chris@1 139 if(ret<0){
Chris@1 140 fprintf(stderr,"Error reading file.\n");
Chris@1 141 exit(1);
Chris@1 142 }
Chris@1 143 if(ret){
Chris@1 144 i+=ret;
Chris@1 145 }else{
Chris@1 146 pcmlength=(i/2)<<hs;
Chris@1 147 }
Chris@1 148 fprintf(stderr,"\rloading.... [%ld left] ",
Chris@1 149 (long)((pcmlength>>hs)*2-i));
Chris@1 150 }
Chris@1 151
Chris@1 152 {
Chris@1 153 ogg_int64_t length=ov.end;
Chris@1 154 fprintf(stderr,"\rtesting raw seeking to random places in %ld bytes....\n",
Chris@1 155 (long)length);
Chris@1 156
Chris@1 157 for(i=0;i<1000;i++){
Chris@1 158 ogg_int64_t val=(double)rand()/RAND_MAX*length;
Chris@1 159 fprintf(stderr,"\r\t%d [raw position %ld]... ",i,(long)val);
Chris@1 160 ret=ov_raw_seek(&ov,val);
Chris@1 161 if(ret<0){
Chris@1 162 fprintf(stderr,"seek failed: %d\n",ret);
Chris@1 163 exit(1);
Chris@1 164 }
Chris@1 165
Chris@1 166 _verify(&ov,val,-1,-1.,pcmlength,bigassbuffer);
Chris@1 167
Chris@1 168 }
Chris@1 169 }
Chris@1 170
Chris@1 171 fprintf(stderr,"\r");
Chris@1 172 {
Chris@1 173 fprintf(stderr,"testing pcm page seeking to random places in %ld samples....\n",
Chris@1 174 (long)pcmlength);
Chris@1 175
Chris@1 176 for(i=0;i<1000;i++){
Chris@1 177 ogg_int64_t val=(double)rand()/RAND_MAX*pcmlength;
Chris@1 178 fprintf(stderr,"\r\t%d [pcm position %ld]... ",i,(long)val);
Chris@1 179 ret=ov_pcm_seek_page(&ov,val);
Chris@1 180 if(ret<0){
Chris@1 181 fprintf(stderr,"seek failed: %d\n",ret);
Chris@1 182 exit(1);
Chris@1 183 }
Chris@1 184
Chris@1 185 _verify(&ov,-1,val,-1.,pcmlength,bigassbuffer);
Chris@1 186
Chris@1 187 }
Chris@1 188 }
Chris@1 189
Chris@1 190 fprintf(stderr,"\r");
Chris@1 191 {
Chris@1 192 fprintf(stderr,"testing pcm exact seeking to random places in %ld samples....\n",
Chris@1 193 (long)pcmlength);
Chris@1 194
Chris@1 195 for(i=0;i<1000;i++){
Chris@1 196 ogg_int64_t val=(double)rand()/RAND_MAX*pcmlength;
Chris@1 197 fprintf(stderr,"\r\t%d [pcm position %ld]... ",i,(long)val);
Chris@1 198 ret=ov_pcm_seek(&ov,val);
Chris@1 199 if(ret<0){
Chris@1 200 fprintf(stderr,"seek failed: %d\n",ret);
Chris@1 201 exit(1);
Chris@1 202 }
Chris@1 203 if(ov_pcm_tell(&ov)!=((val>>hs)<<hs)){
Chris@1 204 fprintf(stderr,"Declared position didn't perfectly match request: %ld != %ld\n",
Chris@1 205 (long)val,(long)ov_pcm_tell(&ov));
Chris@1 206 exit(1);
Chris@1 207 }
Chris@1 208
Chris@1 209 _verify(&ov,-1,val,-1.,pcmlength,bigassbuffer);
Chris@1 210
Chris@1 211 }
Chris@1 212 }
Chris@1 213
Chris@1 214 fprintf(stderr,"\r");
Chris@1 215 {
Chris@1 216 fprintf(stderr,"testing time page seeking to random places in %f seconds....\n",
Chris@1 217 timelength);
Chris@1 218
Chris@1 219 for(i=0;i<1000;i++){
Chris@1 220 double val=(double)rand()/RAND_MAX*timelength;
Chris@1 221 fprintf(stderr,"\r\t%d [time position %f]... ",i,val);
Chris@1 222 ret=ov_time_seek_page(&ov,val);
Chris@1 223 if(ret<0){
Chris@1 224 fprintf(stderr,"seek failed: %d\n",ret);
Chris@1 225 exit(1);
Chris@1 226 }
Chris@1 227
Chris@1 228 _verify(&ov,-1,-1,val,pcmlength,bigassbuffer);
Chris@1 229
Chris@1 230 }
Chris@1 231 }
Chris@1 232
Chris@1 233 fprintf(stderr,"\r");
Chris@1 234 {
Chris@1 235 fprintf(stderr,"testing time exact seeking to random places in %f seconds....\n",
Chris@1 236 timelength);
Chris@1 237
Chris@1 238 for(i=0;i<1000;i++){
Chris@1 239 double val=(double)rand()/RAND_MAX*timelength;
Chris@1 240 fprintf(stderr,"\r\t%d [time position %f]... ",i,val);
Chris@1 241 ret=ov_time_seek(&ov,val);
Chris@1 242 if(ret<0){
Chris@1 243 fprintf(stderr,"seek failed: %d\n",ret);
Chris@1 244 exit(1);
Chris@1 245 }
Chris@1 246 if(ov_time_tell(&ov)<val-1 || ov_time_tell(&ov)>val+1){
Chris@1 247 fprintf(stderr,"Declared position didn't perfectly match request: %f != %f\n",
Chris@1 248 val,ov_time_tell(&ov));
Chris@1 249 exit(1);
Chris@1 250 }
Chris@1 251
Chris@1 252 _verify(&ov,-1,-1,val,pcmlength,bigassbuffer);
Chris@1 253
Chris@1 254 }
Chris@1 255 }
Chris@1 256
Chris@1 257 fprintf(stderr,"\r \nOK.\n\n");
Chris@1 258
Chris@1 259
Chris@1 260 }else{
Chris@1 261 fprintf(stderr,"Standard input was not seekable.\n");
Chris@1 262 }
Chris@1 263
Chris@1 264 ov_clear(&ov);
Chris@1 265 return 0;
Chris@1 266 }
Chris@1 267
Chris@1 268
Chris@1 269
Chris@1 270
Chris@1 271
Chris@1 272
Chris@1 273
Chris@1 274
Chris@1 275
Chris@1 276
Chris@1 277
Chris@1 278
Chris@1 279