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