~ubuntu-branches/ubuntu/edgy/cdparanoia/edgy

« back to all changes in this revision

Viewing changes to interface/toc.c

  • Committer: Bazaar Package Importer
  • Author(s): Dale E Martin
  • Date: 2002-03-15 11:23:27 UTC
  • Revision ID: james.westby@ubuntu.com-20020315112327-7e08i0np6duvv5ep
Tags: upstream-3a9.8
ImportĀ upstreamĀ versionĀ 3a9.8

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/******************************************************************
 
2
 * CopyPolicy: GNU Public License 2 applies
 
3
 * Copyright (C) 1998 Monty xiphmont@mit.edu
 
4
 * derived from code (C) 1994-1996 Heiko Eissfeldt
 
5
 * 
 
6
 * Table of contents convenience functions
 
7
 *
 
8
 ******************************************************************/
 
9
 
 
10
#include "low_interface.h"
 
11
#include "utils.h"
 
12
 
 
13
long cdda_track_firstsector(cdrom_drive *d,int track){
 
14
  if(!d->opened){
 
15
    cderror(d,"400: Device not open\n");
 
16
    return(-1);
 
17
  }
 
18
 
 
19
  if (track == 0) {
 
20
    if (d->disc_toc[0].dwStartSector == 0) {
 
21
      /* first track starts at lba 0 -> no pre-gap */
 
22
      cderror(d,"401: Invalid track number\n");
 
23
      return(-1);
 
24
    }
 
25
    else {
 
26
      return 0; /* pre-gap of first track always starts at lba 0 */
 
27
    }
 
28
  }
 
29
 
 
30
  if(track<0 || track>d->tracks){
 
31
    cderror(d,"401: Invalid track number\n");
 
32
    return(-1);
 
33
  }
 
34
  return(d->disc_toc[track-1].dwStartSector);
 
35
}
 
36
 
 
37
long cdda_disc_firstsector(cdrom_drive *d){
 
38
  int i;
 
39
  if(!d->opened){
 
40
    cderror(d,"400: Device not open\n");
 
41
    return(-1);
 
42
  }
 
43
 
 
44
  /* look for an audio track */
 
45
  for(i=0;i<d->tracks;i++)
 
46
    if(cdda_track_audiop(d,i+1)==1) {
 
47
      if (i == 0) /* disc starts at lba 0 if first track is an audio track */
 
48
       return 0;
 
49
      else
 
50
       return(cdda_track_firstsector(d,i+1));
 
51
    }
 
52
 
 
53
  cderror(d,"403: No audio tracks on disc\n");  
 
54
  return(-1);
 
55
}
 
56
 
 
57
long cdda_track_lastsector(cdrom_drive *d,int track){
 
58
  if(!d->opened){
 
59
    cderror(d,"400: Device not open\n");
 
60
    return(-1);
 
61
  }
 
62
 
 
63
  if (track == 0) {
 
64
    if (d->disc_toc[0].dwStartSector == 0) {
 
65
      /* first track starts at lba 0 -> no pre-gap */
 
66
      cderror(d,"401: Invalid track number\n");
 
67
      return(-1);
 
68
    }
 
69
    else {
 
70
      return d->disc_toc[0].dwStartSector-1;
 
71
    }
 
72
  }
 
73
 
 
74
  if(track<1 || track>d->tracks){
 
75
    cderror(d,"401: Invalid track number\n");
 
76
    return(-1);
 
77
  }
 
78
  /* Safe, we've always the leadout at disc_toc[tracks] */
 
79
  return(d->disc_toc[track].dwStartSector-1);
 
80
}
 
81
 
 
82
long cdda_disc_lastsector(cdrom_drive *d){
 
83
  int i;
 
84
  if(!d->opened){
 
85
    cderror(d,"400: Device not open\n");
 
86
    return(-1);
 
87
  }
 
88
 
 
89
  /* look for an audio track */
 
90
  for(i=d->tracks-1;i>=0;i--)
 
91
    if(cdda_track_audiop(d,i+1)==1)
 
92
      return(cdda_track_lastsector(d,i+1));
 
93
 
 
94
  cderror(d,"403: No audio tracks on disc\n");  
 
95
  return(-1);
 
96
}
 
97
 
 
98
long cdda_tracks(cdrom_drive *d){
 
99
  if(!d->opened){
 
100
    cderror(d,"400: Device not open\n");
 
101
    return(-1);
 
102
  }
 
103
  return(d->tracks);
 
104
}
 
105
 
 
106
int cdda_sector_gettrack(cdrom_drive *d,long sector){
 
107
  if(!d->opened){
 
108
    cderror(d,"400: Device not open\n");
 
109
    return(-1);
 
110
  }else{
 
111
    int i;
 
112
 
 
113
    if (sector < d->disc_toc[0].dwStartSector)
 
114
      return 0; /* We're in the pre-gap of first track */
 
115
 
 
116
    for(i=0;i<d->tracks;i++){
 
117
      if(d->disc_toc[i].dwStartSector<=sector &&
 
118
         d->disc_toc[i+1].dwStartSector>sector)
 
119
        return (i+1);
 
120
    }
 
121
 
 
122
    cderror(d,"401: Invalid track number\n");
 
123
    return -1;
 
124
  }
 
125
}
 
126
 
 
127
int cdda_track_bitmap(cdrom_drive *d,int track,int bit,int set,int clear){
 
128
  if(!d->opened){
 
129
    cderror(d,"400: Device not open\n");
 
130
    return(-1);
 
131
  }
 
132
 
 
133
  if (track == 0)
 
134
    track = 1; /* map to first track number */
 
135
 
 
136
  if(track<1 || track>d->tracks){
 
137
    cderror(d,"401: Invalid track number\n");
 
138
    return(-1);
 
139
  }
 
140
  if ((d->disc_toc[track-1].bFlags & bit))
 
141
    return(set);
 
142
  else
 
143
    return(clear);
 
144
}
 
145
 
 
146
 
 
147
int cdda_track_channels(cdrom_drive *d,int track){
 
148
  return(cdda_track_bitmap(d,track,8,4,2));
 
149
}
 
150
 
 
151
int cdda_track_audiop(cdrom_drive *d,int track){
 
152
  return(cdda_track_bitmap(d,track,4,0,1));
 
153
}
 
154
 
 
155
int cdda_track_copyp(cdrom_drive *d,int track){
 
156
  return(cdda_track_bitmap(d,track,2,1,0));
 
157
}
 
158
 
 
159
int cdda_track_preemp(cdrom_drive *d,int track){
 
160
  return(cdda_track_bitmap(d,track,1,1,0));
 
161
}
 
162