source: server/lib/gutenbach/server/player.py @ 33ea505

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

Keep IPP code in GutenbachPrinter?, not in GutenbachJob?

  • Property mode set to 100644
File size: 2.3 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        self.fh.close()
44        self.fh = None
45
46    def mplayer_play(self):
47        logger.info("playing file '%s'" % self.fh.name)
48       
49        # open mplayer
50        with self.lock:
51            self.player = subprocess.Popen(
52                "/usr/bin/mplayer -really-quiet -slave %s" % self.fh.name,
53                shell=True,
54                stdin=subprocess.PIPE,
55                stderr=subprocess.PIPE,
56                stdout=subprocess.PIPE)
57
58        # wait for mplayer to finish
59        while True:
60            with self.lock:
61                playing = self.is_playing
62            if not playing:
63                break
64            time.sleep(0.1)
65           
66        logger.info("mplayer finished with code %d" % self.player.returncode)
67
68        # get output from mplayer and log it
69        with self.lock:
70            stderr = self.player.stderr.read()
71            stdout = self.player.stdout.read()
72           
73        if stderr.strip() != "":
74            logger.error(stderr)
75        if stdout.strip() != "":
76            logger.debug(stdout)
77
78    def mplayer_pause(self):
79        with self.lock:
80            if self.is_playing:
81                self.player.stdin.write("pause\n")
82               
83    def mplayer_stop(self):
84        with self.lock:
85            if self.is_playing:
86                self.player.stdin.write("quit\n")
Note: See TracBrowser for help on using the repository browser.