summaryrefslogtreecommitdiffstats
path: root/Demo/sgi/cd/sendcd.py
blob: 10b0fafc553b2286189283fe3e7fa647d077f6f5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# Read CD audio data from the SCSI CD player and send it as UDP
# packets to "readcd.py" on another host.
# Option:
# "-l" lists track info and quits.
# "-s" displays status and quits.

import cd
import sys
from socket import *
import getopt

HOST = 'voorn.cwi.nl' # The host where readcd.py is run
PORT = 50505 # Must match the port in readcd.py

def main():
	try:
		optlist, args = getopt.getopt(sys.argv[1:], 'ls')
	except getopt.error, msg:
		sys.stderr.write(msg + '\n')
		sys.exit(2)

	player = cd.open()
	prstatus(player)
	size = player.bestreadsize()

	if optlist:
		for opt, arg in optlist:
			if opt == '-l':
				prtrackinfo(player)
			elif opt == '-s':
				prstatus(player)
		return

	sys.stdout.write('waiting for socket... ')
	sys.stdout.flush()
	port = socket(AF_INET, SOCK_DGRAM)
	port.connect(HOST, PORT)
	print 'socket connected'

	parser = cd.createparser()
	parser.setcallback(0, audiocallback, port)
	parser.setcallback(1, pnumcallback, player)
	parser.setcallback(2, indexcallback, None)
	## 3 = ptime: too many calls
	## 4 = atime: too many calls
	parser.setcallback(5, catalogcallback, None)
	parser.setcallback(6, identcallback, None)
	parser.setcallback(7, controlcallback, None)

	if len(args) >= 2:
		if len(args) >= 3:
			[min, sec, frame] = args[:3]
		else:
			[min, sec] = args
			frame = 0
		min, sec, frame = eval(min), eval(sec), eval(frame)
		print 'Seek to', triple(min, sec, frame)
		dummy = player.seek(min, sec, frame)
	elif len(args) == 1:
		track = eval(args[0])
		print 'Seek to track', track
		dummy = player.seektrack(track)
	else:
		min, sec, frame = player.getstatus()[5:8]
		print 'Try to seek back to', triple(min, sec, frame)
		try:
			player.seek(min, sec, frame)
		except RuntimeError:
			print 'Seek failed'

	try:
		while 1:
			frames = player.readda(size)
			if frames == '':
				print 'END OF CD'
				break
			parser.parseframe(frames)
	except KeyboardInterrupt:
		print '[Interrupted]'
		pass

def prtrackinfo(player):
	info = []
	while 1:
		try:
			info.append(player.gettrackinfo(len(info) + 1))
		except RuntimeError:
			break
	for i in range(len(info)):
		start_min, start_sec, start_frame, \
			total_min, total_sec, total_frame = info[i]
		print 'Track', zfill(i+1), \
			triple(start_min, start_sec, start_frame), \
			triple(total_min, total_sec, total_frame)

def audiocallback(port, type, data):
##	sys.stdout.write('#')
##	sys.stdout.flush()
	port.send(data)

def pnumcallback(player, type, data):
	print 'pnum =', `data`
	prstatus(player)

def indexcallback(arg, type, data):
	print 'index =', `data`

def catalogcallback(arg, type, data):
	print 'catalog =', `data`

def identcallback(arg, type, data):
	print 'ident =', `data`

def controlcallback(arg, type, data):
	print 'control =', `data`

statedict = ['ERROR', 'NODISK', 'READY', 'PLAYING', 'PAUSED', 'STILL']

def prstatus(player):
	state, track, min, sec, frame, abs_min, abs_sec, abs_frame, \
		total_min, total_sec, total_frame, first, last, scsi_audio, \
		cur_block, dum1, dum2, dum3 = player.getstatus()
	print 'Status:',
	if 0 <= state < len(statedict):
		print statedict[state]
	else:
		print state
	print 'Track: ', track
	print 'Time:  ', triple(min, sec, frame)
	print 'Abs:   ', triple(abs_min, abs_sec, abs_frame)
	print 'Total: ', triple(total_min, total_sec, total_frame)
	print 'First: ', first
	print 'Last:  ', last
	print 'SCSI:  ', scsi_audio
	print 'Block: ', cur_block
	print 'Future:', (dum1, dum2, dum3)

def triple(a, b, c):
	return zfill(a) + ':' + zfill(b) + ':' + zfill(c)

def zfill(n):
	s = `n`
	return '0' * (2 - len(s)) + s