119304Speter/* { dg-do compile } */ 219304Speter/* { dg-require-effective-target ilp32 } */ 319304Speter/* { dg-options "-O1 -march=core2" } */ 419304Speter 519304Spetertypedef long long ogg_int64_t; 619304Speter 719304Spetertypedef struct vorbis_info 819304Speter{ 919304Speter long rate; 1019304Speter} vorbis_info; 1119304Speter 1219304Spetertypedef struct OggVorbis_File 13254225Speter{ 1419304Speter int seekable; 1519304Speter int links; 1619304Speter ogg_int64_t *pcmlengths; 1719304Speter vorbis_info *vi; 1819304Speter int ready_state; 1919304Speter} OggVorbis_File; 2019304Speter 2119304Speterextern double ov_time_total (OggVorbis_File * vf, int i); 2219304Speterextern int ov_pcm_seek_page (OggVorbis_File * vf, ogg_int64_t pos); 2319304Speter 2419304Speterint 2519304Speterov_time_seek_page (OggVorbis_File * vf, double seconds) 2619304Speter{ 2719304Speter int link = -1; 2819304Speter ogg_int64_t pcm_total = 0; 2919304Speter double time_total = 0.; 3019304Speter 3119304Speter if (vf->ready_state < 2) 3219304Speter return (-131); 3319304Speter if (!vf->seekable) 34281373Sbapt return (-138); 3519304Speter if (seconds < 0) 3619304Speter return (-131); 37281373Sbapt 38281373Sbapt for (link = 0; link < vf->links; link++) 39281373Sbapt { 40281373Sbapt double addsec = ov_time_total (vf, link); 41281373Sbapt if (seconds < time_total + addsec) 4219304Speter break; 4319304Speter time_total += addsec; 4419304Speter pcm_total += vf->pcmlengths[link * 2 + 1]; 4519304Speter } 4619304Speter 47281373Sbapt if (link == vf->links) 4819304Speter return (-131); 4919304Speter 50254225Speter { 5119304Speter ogg_int64_t target = 5219304Speter pcm_total + (seconds - time_total) * vf->vi[link].rate; 5319304Speter return (ov_pcm_seek_page (vf, target)); 5419304Speter } 5519304Speter} 5619304Speter