1/* { dg-do compile } */
2/* { dg-require-effective-target ilp32 } */
3/* { dg-options "-O1 -march=core2" } */
4
5typedef long long ogg_int64_t;
6
7typedef struct vorbis_info
8{
9  long rate;
10} vorbis_info;
11
12typedef struct OggVorbis_File
13{
14  int seekable;
15  int links;
16  ogg_int64_t *pcmlengths;
17  vorbis_info *vi;
18  int ready_state;
19} OggVorbis_File;
20
21extern double ov_time_total (OggVorbis_File * vf, int i);
22extern int ov_pcm_seek_page (OggVorbis_File * vf, ogg_int64_t pos);
23
24int
25ov_time_seek_page (OggVorbis_File * vf, double seconds)
26{
27  int link = -1;
28  ogg_int64_t pcm_total = 0;
29  double time_total = 0.;
30
31  if (vf->ready_state < 2)
32    return (-131);
33  if (!vf->seekable)
34    return (-138);
35  if (seconds < 0)
36    return (-131);
37
38  for (link = 0; link < vf->links; link++)
39    {
40      double addsec = ov_time_total (vf, link);
41      if (seconds < time_total + addsec)
42	break;
43      time_total += addsec;
44      pcm_total += vf->pcmlengths[link * 2 + 1];
45    }
46
47  if (link == vf->links)
48    return (-131);
49
50  {
51    ogg_int64_t target =
52      pcm_total + (seconds - time_total) * vf->vi[link].rate;
53    return (ov_pcm_seek_page (vf, target));
54  }
55}
56