source: server/lib/gutenbach/server/player.py @ eee389a

no-cups
Last change on this file since eee389a was eee389a, checked in by Jessica B. Hamrick <jhamrick@…>, 12 years ago

Better threading model

  • Property mode set to 100644
File size: 2.2 KB
Line 
1import logging
2import threading
3import subprocess
4import time
5
6# initialize logger
7logger = logging.getLogger(__name__)
8
9class Player(threading.Thread):
10
11    def __init__(self, fh, *args, **kwargs):
12        self.lock = threading.RLock()
13
14        with self.lock:
15            super(Player, self).__init__(*args, **kwargs)
16            self.fh = fh
17            self.player = None
18            self._callback = None
19
20    @property
21    def is_playing(self):
22        with self.lock:
23            playing = self.player and self.player.poll() is None
24        return playing
25
26    @property
27    def callback(self):
28        return self._callback
29    @callback.setter
30    def callback(self, val):
31        with self.lock:
32            self._callback = val
33
34    def run(self):
35        if self.fh is None:
36            raise ValueError, "file handler is None"
37       
38        self.mplayer_play()
39        with self.lock:
40            if self.callback:
41                self.callback()
42
43    def mplayer_play(self):
44        logger.info("playing file '%s'" % self.fh.name)
45       
46        # open mplayer
47        with self.lock:
48            self.player = subprocess.Popen(
49                "/usr/bin/mplayer -really-quiet -slave %s" % self.fh.name,
50                shell=True,
51                stdin=subprocess.PIPE,
52                stderr=subprocess.PIPE,
53                stdout=subprocess.PIPE)
54
55        # wait for mplayer to finish
56        while True:
57            with self.lock:
58                playing = self.is_playing
59            if not playing:
60                break
61            time.sleep(0.1)
62           
63        logger.info("mplayer finished with code %d" % self.player.returncode)
64
65        # get output from mplayer and log it
66        with self.lock:
67            stderr = self.player.stderr.read()
68            stdout = self.player.stdout.read()
69           
70        if stderr.strip() != "":
71            logger.error(stderr)
72        if stdout.strip() != "":
73            logger.debug(stdout)
74
75    def mplayer_pause(self):
76        with self.lock:
77            if self.is_playing:
78                self.player.stdin.write("pause\n")
79               
80    def mplayer_stop(self):
81        with self.lock:
82            if self.is_playing:
83                self.player.stdin.write("quit\n")
Note: See TracBrowser for help on using the repository browser.