1 # Class interface to the CD module.
8 def _doatime(self
, cb_type
, data
):
9 if ((data
[0] * 60) + data
[1]) * 75 + data
[2] > self
.end
:
10 ## print 'done with list entry',`self.listindex`
12 func
, arg
= self
.callbacks
[cb_type
]
14 func(arg
, cb_type
, data
)
16 def _dopnum(self
, cb_type
, data
):
18 ## print 'done with list entry',`self.listindex`
20 func
, arg
= self
.callbacks
[cb_type
]
22 func(arg
, cb_type
, data
)
25 def __init__(self
, *arg
):
27 self
.player
= cd
.open()
29 self
.player
= cd
.open(arg
[0])
31 self
.player
= cd
.open(arg
[0], arg
[1])
33 raise Error
, 'bad __init__ call'
35 self
.callbacks
= [(None, None)] * 8
36 self
.parser
= cd
.createparser()
50 ## print 'stop playing from eject'
53 def pmsf2msf(self
, track
, min, sec
, frame
):
56 if track
< self
.status
[5] or track
> self
.status
[6]:
57 raise Error
, 'track number out of range'
58 if not self
.trackinfo
:
60 start
, total
= self
.trackinfo
[track
]
61 start
= ((start
[0] * 60) + start
[1]) * 75 + start
[2]
62 total
= ((total
[0] * 60) + total
[1]) * 75 + total
[2]
63 block
= ((min * 60) + sec
) * 75 + frame
65 raise Error
, 'out of range'
67 min, block
= divmod(block
, 75*60)
68 sec
, frame
= divmod(block
, 75)
69 return min, sec
, frame
74 def appendtrack(self
, track
):
75 self
.appendstretch(track
, track
)
77 def appendstretch(self
, start
, end
):
84 if type(end
) == type(0):
85 if end
< self
.status
[5] or end
> self
.status
[6]:
86 raise Error
, 'range error'
90 prog
, min, sec
, frame
= end
91 if prog
< self
.status
[5] or prog
> self
.status
[6]:
92 raise Error
, 'range error'
93 end
= self
.pmsf2msf(prog
, min, sec
, frame
)
95 raise Error
, 'syntax error'
96 if type(start
) == type(0):
97 if start
< self
.status
[5] or start
> self
.status
[6]:
98 raise Error
, 'range error'
99 if len(self
.list) > 0:
101 if type(e
) == type(0):
108 prog
, min, sec
, frame
= start
109 if prog
< self
.status
[5] or prog
> self
.status
[6]:
110 raise Error
, 'range error'
111 start
= self
.pmsf2msf(prog
, min, sec
, frame
)
113 raise Error
, 'syntax error'
114 self
.list.append((start
, end
))
116 def settracks(self
, list):
119 self
.appendtrack(track
)
121 def setcallback(self
, cb_type
, func
, arg
):
122 if cb_type
< 0 or cb_type
>= 8:
123 raise Error
, 'type out of range'
124 self
.callbacks
[cb_type
] = (func
, arg
)
126 start
, end
= self
.list[self
.listindex
]
127 if type(end
) == type(0):
128 if cb_type
<> CD
.PNUM
:
129 self
.parser
.setcallback(cb_type
, func
, arg
)
131 if cb_type
<> CD
.ATIME
:
132 self
.parser
.setcallback(cb_type
, func
, arg
)
134 def removecallback(self
, cb_type
):
135 if cb_type
< 0 or cb_type
>= 8:
136 raise Error
, 'type out of range'
137 self
.callbacks
[cb_type
] = (None, None)
139 start
, end
= self
.list[self
.listindex
]
140 if type(end
) == type(0):
141 if cb_type
<> CD
.PNUM
:
142 self
.parser
.removecallback(cb_type
)
144 if cb_type
<> CD
.ATIME
:
145 self
.parser
.removecallback(cb_type
)
147 def gettrackinfo(self
, *arg
):
150 if not self
.trackinfo
:
153 return self
.trackinfo
[self
.status
[5]:self
.status
[6]+1]
156 if i
< self
.status
[5] or i
> self
.status
[6]:
157 raise Error
, 'range error'
158 result
.append(self
.trackinfo
[i
])
165 for i
in range(self
.status
[5]):
166 self
.trackinfo
.append(None)
167 for i
in range(self
.status
[5], self
.status
[6]+1):
168 self
.trackinfo
.append(self
.player
.gettrackinfo(i
))
170 def cachestatus(self
):
171 self
.status
= self
.player
.getstatus()
172 if self
.status
[0] == CD
.NODISC
:
174 raise Error
, 'no disc in player'
177 return self
.player
.getstatus()
182 size
= self
.player
.bestreadsize()
186 func
, arg
= self
.callbacks
[i
]
188 self
.parser
.setcallback(i
, func
, arg
)
190 self
.parser
.removecallback(i
)
191 if len(self
.list) == 0:
192 for i
in range(self
.status
[5], self
.status
[6]+1):
197 if self
.listindex
>= len(self
.list):
199 start
, end
= self
.list[self
.listindex
]
200 if type(start
) == type(0):
201 dummy
= self
.player
.seektrack(
204 min, sec
, frame
= start
205 dummy
= self
.player
.seek(
207 if type(end
) == type(0):
208 self
.parser
.setcallback(
209 CD
.PNUM
, _dopnum
, self
)
212 self
.callbacks
[CD
.ATIME
]
214 self
.parser
.setcallback(CD
.ATIME
, func
, arg
)
216 self
.parser
.removecallback(CD
.ATIME
)
218 min, sec
, frame
= end
219 self
.parser
.setcallback(
222 self
.end
= (min * 60 + sec
) * \
225 self
.callbacks
[CD
.PNUM
]
227 self
.parser
.setcallback(CD
.PNUM
, func
, arg
)
229 self
.parser
.removecallback(CD
.PNUM
)
231 data
= self
.player
.readda(size
)
234 self
.listindex
= self
.listindex
+ 1
237 self
.parser
.parseframe(data
)
240 self
.listindex
= self
.listindex
+ 1