annotate vixm/player.py @ 51:8396cc3816ee pure tip

On shutdown, make sure we tell the dbus clients that we're done
author Josef "Jeff" Sipek <jeffpc@josefsipek.net>
date Mon, 06 Nov 2006 06:16:19 -0500
parents 2d570448aba5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
44
c46d3f8833f9 Move list and stats into ~/.vixm/
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 43
diff changeset
1 import time, os
30
860c891de6bb Remove lots of xmms-related code & get ready to make the whole program a
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
2 from threading import Thread
860c891de6bb Remove lots of xmms-related code & get ready to make the whole program a
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
3
35
a7d370f326df Implement song playing
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 34
diff changeset
4 import mad, ao
a7d370f326df Implement song playing
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 34
diff changeset
5
43
d3ac3a46a294 Abuse the Rhythmbox dbus messages to announce what is being played
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 42
diff changeset
6 import playlist, stats, rb_dbus
40
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
7
30
860c891de6bb Remove lots of xmms-related code & get ready to make the whole program a
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
8 class playerThread(Thread):
35
a7d370f326df Implement song playing
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 34
diff changeset
9 def __init__(self):
30
860c891de6bb Remove lots of xmms-related code & get ready to make the whole program a
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
10 Thread.__init__(self)
860c891de6bb Remove lots of xmms-related code & get ready to make the whole program a
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
11
860c891de6bb Remove lots of xmms-related code & get ready to make the whole program a
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
12 self.shutdown = False
32
f97eb9f0c207 Add random song selection for default queue
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
13 self.playing = False
40
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
14 self.end_current = False
32
f97eb9f0c207 Add random song selection for default queue
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
15
34
8028f2addb00 Destroy all traces of xmms
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 32
diff changeset
16 self.current = None
30
860c891de6bb Remove lots of xmms-related code & get ready to make the whole program a
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
17
37
87aa31e41f4a Play the files in a separate thread
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 36
diff changeset
18 self.blksize = 40960
36
c6a3a4d09a9a Small fix & change output to OSS
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 35
diff changeset
19 self.dev = ao.AudioDevice("oss")
30
860c891de6bb Remove lots of xmms-related code & get ready to make the whole program a
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
20
44
c46d3f8833f9 Move list and stats into ~/.vixm/
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 43
diff changeset
21 self.stats = stats.statsengine(os.path.join(os.environ['HOME'], ".vixm/stats"))
42
bc6db55448e1 statistics engine
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 40
diff changeset
22
43
d3ac3a46a294 Abuse the Rhythmbox dbus messages to announce what is being played
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 42
diff changeset
23 self.rb = rb_dbus.RhythmboxDbusThread(self)
d3ac3a46a294 Abuse the Rhythmbox dbus messages to announce what is being played
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 42
diff changeset
24 self.rb.start()
51
8396cc3816ee On shutdown, make sure we tell the dbus clients that we're done
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 46
diff changeset
25
40
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
26 def play_next(self, lists):
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
27 try:
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
28 # pop song off the PRIO queue
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
29 s = lists[playlist.LIST_PRIO].pop()
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
30 except IndexError:
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
31 # no song to pop
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
32 s = lists[playlist.LIST_DEFAULT].next()
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
33 except ValueError:
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
34 print "WTF is going on?!"
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
35 raise ValueError
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
36
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
37 self.play(s)
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
38
32
f97eb9f0c207 Add random song selection for default queue
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
39 def play(self, s):
40
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
40 if self.playing:
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
41 self.end_current = True
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
42
35
a7d370f326df Implement song playing
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 34
diff changeset
43 self.playing = True
a7d370f326df Implement song playing
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 34
diff changeset
44 self.current = s
46
2d570448aba5 Abstract out the stats code a little bit more
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 44
diff changeset
45 self.stats.playing(s)
35
a7d370f326df Implement song playing
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 34
diff changeset
46
30
860c891de6bb Remove lots of xmms-related code & get ready to make the whole program a
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
47 def run(self):
860c891de6bb Remove lots of xmms-related code & get ready to make the whole program a
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
48 while not self.shutdown:
43
d3ac3a46a294 Abuse the Rhythmbox dbus messages to announce what is being played
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 42
diff changeset
49 c = self.current
d3ac3a46a294 Abuse the Rhythmbox dbus messages to announce what is being played
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 42
diff changeset
50
d3ac3a46a294 Abuse the Rhythmbox dbus messages to announce what is being played
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 42
diff changeset
51 if c and self.playing:
d3ac3a46a294 Abuse the Rhythmbox dbus messages to announce what is being played
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 42
diff changeset
52 # notify everyone
d3ac3a46a294 Abuse the Rhythmbox dbus messages to announce what is being played
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 42
diff changeset
53
d3ac3a46a294 Abuse the Rhythmbox dbus messages to announce what is being played
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 42
diff changeset
54 self.rb.notify("file://" + c["file"], \
d3ac3a46a294 Abuse the Rhythmbox dbus messages to announce what is being played
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 42
diff changeset
55 c["title"], c["artist"])
d3ac3a46a294 Abuse the Rhythmbox dbus messages to announce what is being played
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 42
diff changeset
56
37
87aa31e41f4a Play the files in a separate thread
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 36
diff changeset
57 # play the file
43
d3ac3a46a294 Abuse the Rhythmbox dbus messages to announce what is being played
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 42
diff changeset
58 mf = mad.MadFile(c["file"])
37
87aa31e41f4a Play the files in a separate thread
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 36
diff changeset
59
87aa31e41f4a Play the files in a separate thread
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 36
diff changeset
60 while True:
87aa31e41f4a Play the files in a separate thread
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 36
diff changeset
61 buf = mf.read(self.blksize)
40
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
62 if buf is None or \
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
63 self.shutdown or \
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
64 self.end_current:
37
87aa31e41f4a Play the files in a separate thread
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 36
diff changeset
65 break
87aa31e41f4a Play the files in a separate thread
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 36
diff changeset
66 self.dev.play(buf, len(buf))
40
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
67
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
68 if self.end_current:
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
69 self.end_current = False
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
70 else:
42
bc6db55448e1 statistics engine
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 40
diff changeset
71 self.stats.played()
40
06b5a7db3d19 Some cleanup, got to next song implemented
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 37
diff changeset
72 self.playing = False
37
87aa31e41f4a Play the files in a separate thread
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 36
diff changeset
73 else:
87aa31e41f4a Play the files in a separate thread
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 36
diff changeset
74 # nothing to play, just sleep
87aa31e41f4a Play the files in a separate thread
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 36
diff changeset
75 time.sleep(0.5)
30
860c891de6bb Remove lots of xmms-related code & get ready to make the whole program a
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
76
51
8396cc3816ee On shutdown, make sure we tell the dbus clients that we're done
Josef "Jeff" Sipek <jeffpc@josefsipek.net>
parents: 46
diff changeset
77 self.rb.notify_stop()