1 # Class interface to the CD module.
5 class Error(Exception):
7 class _Stop(Exception):
10 def _doatime(self
, cb_type
, data
):
11 if ((data
[0] * 60) + data
[1]) * 75 + data
[2] > self
.end
:
12 ## print 'done with list entry',`self.listindex`
14 func
, arg
= self
.callbacks
[cb_type
]
16 func(arg
, cb_type
, data
)
18 def _dopnum(self
, cb_type
, data
):
20 ## print 'done with list entry',`self.listindex`
22 func
, arg
= self
.callbacks
[cb_type
]
24 func(arg
, cb_type
, data
)
27 def __init__(self
, *arg
):
29 self
.player
= cd
.open()
31 self
.player
= cd
.open(arg
[0])
33 self
.player
= cd
.open(arg
[0], arg
[1])
35 raise Error
, 'bad __init__ call'
37 self
.callbacks
= [(None, None)] * 8
38 self
.parser
= cd
.createparser()
52 ## print 'stop playing from eject'
55 def pmsf2msf(self
, track
, min, sec
, frame
):
58 if track
< self
.status
[5] or track
> self
.status
[6]:
59 raise Error
, 'track number out of range'
60 if not self
.trackinfo
:
62 start
, total
= self
.trackinfo
[track
]
63 start
= ((start
[0] * 60) + start
[1]) * 75 + start
[2]
64 total
= ((total
[0] * 60) + total
[1]) * 75 + total
[2]
65 block
= ((min * 60) + sec
) * 75 + frame
67 raise Error
, 'out of range'
69 min, block
= divmod(block
, 75*60)
70 sec
, frame
= divmod(block
, 75)
71 return min, sec
, frame
76 def appendtrack(self
, track
):
77 self
.appendstretch(track
, track
)
79 def appendstretch(self
, start
, end
):
86 if type(end
) == type(0):
87 if end
< self
.status
[5] or end
> self
.status
[6]:
88 raise Error
, 'range error'
92 prog
, min, sec
, frame
= end
93 if prog
< self
.status
[5] or prog
> self
.status
[6]:
94 raise Error
, 'range error'
95 end
= self
.pmsf2msf(prog
, min, sec
, frame
)
97 raise Error
, 'syntax error'
98 if type(start
) == type(0):
99 if start
< self
.status
[5] or start
> self
.status
[6]:
100 raise Error
, 'range error'
101 if len(self
.list) > 0:
103 if type(e
) == type(0):
110 prog
, min, sec
, frame
= start
111 if prog
< self
.status
[5] or prog
> self
.status
[6]:
112 raise Error
, 'range error'
113 start
= self
.pmsf2msf(prog
, min, sec
, frame
)
115 raise Error
, 'syntax error'
116 self
.list.append((start
, end
))
118 def settracks(self
, list):
121 self
.appendtrack(track
)
123 def setcallback(self
, cb_type
, func
, arg
):
124 if cb_type
< 0 or cb_type
>= 8:
125 raise Error
, 'type out of range'
126 self
.callbacks
[cb_type
] = (func
, arg
)
128 start
, end
= self
.list[self
.listindex
]
129 if type(end
) == type(0):
130 if cb_type
!= CD
.PNUM
:
131 self
.parser
.setcallback(cb_type
, func
, arg
)
133 if cb_type
!= CD
.ATIME
:
134 self
.parser
.setcallback(cb_type
, func
, arg
)
136 def removecallback(self
, cb_type
):
137 if cb_type
< 0 or cb_type
>= 8:
138 raise Error
, 'type out of range'
139 self
.callbacks
[cb_type
] = (None, None)
141 start
, end
= self
.list[self
.listindex
]
142 if type(end
) == type(0):
143 if cb_type
!= CD
.PNUM
:
144 self
.parser
.removecallback(cb_type
)
146 if cb_type
!= CD
.ATIME
:
147 self
.parser
.removecallback(cb_type
)
149 def gettrackinfo(self
, *arg
):
152 if not self
.trackinfo
:
155 return self
.trackinfo
[self
.status
[5]:self
.status
[6]+1]
158 if i
< self
.status
[5] or i
> self
.status
[6]:
159 raise Error
, 'range error'
160 result
.append(self
.trackinfo
[i
])
167 for i
in range(self
.status
[5]):
168 self
.trackinfo
.append(None)
169 for i
in range(self
.status
[5], self
.status
[6]+1):
170 self
.trackinfo
.append(self
.player
.gettrackinfo(i
))
172 def cachestatus(self
):
173 self
.status
= self
.player
.getstatus()
174 if self
.status
[0] == CD
.NODISC
:
176 raise Error
, 'no disc in player'
179 return self
.player
.getstatus()
184 size
= self
.player
.bestreadsize()
188 func
, arg
= self
.callbacks
[i
]
190 self
.parser
.setcallback(i
, func
, arg
)
192 self
.parser
.removecallback(i
)
193 if len(self
.list) == 0:
194 for i
in range(self
.status
[5], self
.status
[6]+1):
199 if self
.listindex
>= len(self
.list):
201 start
, end
= self
.list[self
.listindex
]
202 if type(start
) == type(0):
203 dummy
= self
.player
.seektrack(
206 min, sec
, frame
= start
207 dummy
= self
.player
.seek(
209 if type(end
) == type(0):
210 self
.parser
.setcallback(
211 CD
.PNUM
, _dopnum
, self
)
214 self
.callbacks
[CD
.ATIME
]
216 self
.parser
.setcallback(CD
.ATIME
, func
, arg
)
218 self
.parser
.removecallback(CD
.ATIME
)
220 min, sec
, frame
= end
221 self
.parser
.setcallback(
224 self
.end
= (min * 60 + sec
) * \
227 self
.callbacks
[CD
.PNUM
]
229 self
.parser
.setcallback(CD
.PNUM
, func
, arg
)
231 self
.parser
.removecallback(CD
.PNUM
)
233 data
= self
.player
.readda(size
)
236 self
.listindex
= self
.listindex
+ 1
239 self
.parser
.parseframe(data
)
242 self
.listindex
= self
.listindex
+ 1