| # Window interface to (some of) the CD player's vital audio functions |
| |
| import cd |
| import CD |
| import stdwin |
| from stdwinevents import * |
| import mainloop |
| |
| def main(): |
| player = cd.open() |
| stdwin.setdefscrollbars(0, 0) |
| win = stdwin.open('CD') |
| win.player = player |
| win.dispatch = cddispatch |
| mainloop.register(win) |
| win.settimer(10) |
| mainloop.mainloop() |
| |
| def cddispatch(type, win, detail): |
| if type == WE_NULL: |
| pass |
| elif type == WE_CLOSE: |
| mainloop.unregister(win) |
| win.close() |
| elif type == WE_DRAW: |
| draw(win) |
| elif type == WE_TIMER: |
| update(win) |
| elif type == WE_MOUSE_UP: |
| left, top, right, bottom, v1, v2 = getgeo(win) |
| h, v = detail[0] |
| if left < h < right: |
| if top < v < v1: |
| but1(win) |
| elif v1 < v < v2: |
| but2(win) |
| elif v2 < v < bottom: |
| but3(win) |
| else: |
| stdwin.fleep() |
| |
| def but1(win): |
| update(win) |
| |
| def but2(win): |
| state = win.player.getstatus()[0] |
| if state == CD.READY: |
| win.player.play(1, 1) |
| elif state in (CD.PLAYING, CD.PAUSED): |
| win.player.togglepause() |
| else: |
| stdwin.fleep() |
| update(win) |
| |
| def but3(win): |
| win.player.stop() |
| update(win) |
| |
| def update(win): |
| d = win.begindrawing() |
| drawstatus(win, d) |
| d.enddrawing() |
| win.settimer(10) |
| |
| statedict = ['ERROR', 'NODISK', 'READY', 'PLAYING', 'PAUSED', 'STILL'] |
| |
| def draw(win): |
| left, top, right, bottom, v1, v2 = getgeo(win) |
| d = win.begindrawing() |
| drawstatus(win, d) |
| box(d, left, v1, right, v2, 'Play/Pause') |
| box(d, left, v2, right, bottom, 'Stop') |
| d.enddrawing() |
| |
| def drawstatus(win, d): |
| left, top, right, bottom, v1, v2 = getgeo(win) |
| state, track, curtime, abstime, totaltime, first, last, \ |
| scsi_audio, cur_block, dummy = win.player.getstatus() |
| if 0 <= state < len(statedict): |
| message = statedict[state] |
| else: |
| message = `status` |
| message = message + ' track ' + `track` + ' of ' + `last` |
| d.erase((left, top), (right, v1)) |
| box(d, left, top, right, v1, message) |
| |
| def box(d, left, top, right, bottom, label): |
| R = (left+1, top+1), (right-1, bottom-1) |
| width = d.textwidth(label) |
| height = d.lineheight() |
| h = (left + right - width) / 2 |
| v = (top + bottom - height) / 2 |
| d.box(R) |
| d.cliprect(R) |
| d.text((h, v), label) |
| d.noclip() |
| |
| def getgeo(win): |
| (left, top), (right, bottom) = (0, 0), win.getwinsize() |
| v1 = top + (bottom - top) / 3 |
| v2 = top + (bottom - top) * 2 / 3 |
| return left, top, right, bottom, v1, v2 |
| |
| main() |