/* { dg-do compile } */ /* { dg-require-effective-target ilp32 } */ /* { dg-options "-O1 -march=core2" } */ typedef long long ogg_int64_t; typedef struct vorbis_info { long rate; } vorbis_info; typedef struct OggVorbis_File { int seekable; int links; ogg_int64_t *pcmlengths; vorbis_info *vi; int ready_state; } OggVorbis_File; extern double ov_time_total (OggVorbis_File * vf, int i); extern int ov_pcm_seek_page (OggVorbis_File * vf, ogg_int64_t pos); int ov_time_seek_page (OggVorbis_File * vf, double seconds) { int link = -1; ogg_int64_t pcm_total = 0; double time_total = 0.; if (vf->ready_state < 2) return (-131); if (!vf->seekable) return (-138); if (seconds < 0) return (-131); for (link = 0; link < vf->links; link++) { double addsec = ov_time_total (vf, link); if (seconds < time_total + addsec) break; time_total += addsec; pcm_total += vf->pcmlengths[link * 2 + 1]; } if (link == vf->links) return (-131); { ogg_int64_t target = pcm_total + (seconds - time_total) * vf->vi[link].rate; return (ov_pcm_seek_page (vf, target)); } }