Mercurial > vixm
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 |
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() |