Package elisa :: Package plugins :: Package base :: Package controllers :: Module player_controller
[hide private]
[frames] | no frames]

Source Code for Module elisa.plugins.base.controllers.player_controller

  1  # -*- coding: utf-8 -*- 
  2  # Elisa - Home multimedia server 
  3  # Copyright (C) 2006-2008 Fluendo Embedded S.L. (www.fluendo.com). 
  4  # All rights reserved. 
  5  # 
  6  # This file is available under one of two license agreements. 
  7  # 
  8  # This file is licensed under the GPL version 3. 
  9  # See "LICENSE.GPL" in the root of this distribution including a special 
 10  # exception to use Elisa with Fluendo's plugins. 
 11  # 
 12  # The GPL part of Elisa is also available under a commercial licensing 
 13  # agreement from Fluendo. 
 14  # See "LICENSE.Elisa" in the root directory of this distribution package 
 15  # for details on that license. 
 16   
 17   
 18  __maintainer__ = 'Lionel Martin <lionel@fluendo.com>' 
 19   
 20   
 21  from elisa.base_components.controller import Controller 
 22  from elisa.core import player 
 23  from elisa.core import common 
 24  from elisa.core.input_event import * 
 25  from elisa.core import plugin_registry 
 26   
 27  ListModelClass = plugin_registry.get_component_class('base:list_model') 
 28   
29 -class PlayerController(Controller):
30 31 supported_models = ('base:player_model',) 32 bindings = {'playlist': 'playlist', 33 'seek_to': 'seek_to', 34 'volume': 'volume', 35 'muted': 'muted', 36 'pause_requested': 'pause_requested', 37 'uri': 'uri', 38 'media_type': 'media_type', 39 } 40 41 # FIXME: make more extensive use of bindings 42 state = None 43 stopped = False 44 45 # FIXME: add a documentation for the configuration options 46 default_config = {'volume_increment_step': '0.02', 47 'volume_decrement_step': '0.02', 48 'seek_forward_step': '30', 49 'seek_backward_step': '15', 50 'show_status_on_ok': '0' 51 } 52
53 - def __init__(self):
54 Controller.__init__(self) 55 self._position_when_seek = -1 56 self._uri = None 57 self._playlist_index = -1
58
59 - def initialize(self):
60 Controller.initialize(self) 61 config = self.config 62 self._show_status_on_ok = int(config['show_status_on_ok']) 63 self._volume_increment_step = float(config['volume_increment_step']) 64 self._volume_decrement_step = float(config['volume_decrement_step']) 65 forward_step = int(config['seek_forward_step']) 66 backward_step = int(config['seek_backward_step']) 67 self._seek_forward_step = forward_step * 1000000000 68 self._seek_backward_step = backward_step * 1000000000
69
70 - def model_changed(self, old_model, new_model):
71 self.state = self.model.state
72
73 - def uri__set(self, new_uri):
74 self.state = None 75 self._uri = new_uri
76
77 - def uri__get(self):
78 return self._uri
79
80 - def handle_input(self, input_event):
81 self.debug("Handling input event with action %r", input_event.action) 82 83 if input_event.action == EventAction.PLAY: 84 self.stopped = False 85 self.model.state = player.STATES.PLAYING 86 87 elif input_event.action == EventAction.PAUSE: 88 self.stopped = False 89 self.model.state = player.STATES.PAUSED 90 91 elif input_event.action == EventAction.STOP: 92 self.stopped = True 93 self.model.state = player.STATES.STOPPED 94 95 elif input_event.action in (EventAction.GO_UP, EventAction.VOL_UP): 96 self.model.volume = min(2.0, self.model.volume + \ 97 self._volume_increment_step) 98 99 elif input_event.action in (EventAction.GO_DOWN, 100 EventAction.VOL_DOWN): 101 self.model.volume = max(0.0, self.model.volume - \ 102 self._volume_decrement_step) 103 104 elif input_event.action in (EventAction.GO_RIGHT, 105 EventAction.SEEK_FORWARD): 106 if self._position_when_seek > 0 and \ 107 self._position_when_seek == self.model.position: 108 seek_to = self.model.seek_to + self._seek_forward_step 109 else: 110 self._position_when_seek = self.model.position 111 seek_to = self.model.position + (self._seek_forward_step * 2) 112 self.model.seek_to = seek_to 113 elif input_event.action == EventAction.MUTE: 114 self.model.muted = not self.model.muted 115 116 elif input_event.action == EventAction.NEXT: 117 # next track in playlist 118 uri = self.model.uri 119 if uri != None and \ 120 isinstance(self.model.playlist, ListModelClass) and \ 121 self.model.state in (player.STATES.PAUSED, 122 player.STATES.PLAYING): 123 self._next_track() 124 125 elif input_event.action == EventAction.PREVIOUS: 126 # previous track in playlist 127 uri = self.model.uri 128 if uri != None and \ 129 isinstance(self.model.playlist, ListModelClass) and \ 130 self.model.state in (player.STATES.PAUSED, 131 player.STATES.PLAYING): 132 self._previous_track() 133 134 elif input_event.action in (EventAction.GO_LEFT, 135 EventAction.SEEK_BACKWARD): 136 if self._position_when_seek > 0 and \ 137 self._position_when_seek == self.model.position: 138 seek_to = self.model.seek_to - self._seek_backward_step 139 else: 140 self._position_when_seek = self.model.position 141 seek_to = self.model.position - self._seek_backward_step 142 self.model.seek_to = seek_to 143 144 elif input_event.action == EventAction.OK: 145 if self._show_status_on_ok: 146 # First time user presses OK we remember it and next time 147 # we toggle player model's state 148 149 if self.model.state == player.STATES.PLAYING: 150 self.model.pause_requested = True 151 152 elif self.model.state == player.STATES.PAUSED: 153 self.model.state = player.STATES.PLAYING 154 else: 155 if self.model.state == player.STATES.PAUSED: 156 self.model.state = player.STATES.PLAYING 157 else: 158 self.model.state = player.STATES.PAUSED 159 return False
160
161 - def attribute_set(self, origin, key, old_value, new_value):
162 self.debug("Attribute %r set to %r", key, new_value) 163 Controller.attribute_set(self, origin, key, old_value, new_value) 164 if key == 'state': 165 if self.state == new_value: 166 return 167 168 if self.model.volume != self.volume: 169 self.volume = self.model.volume 170 if new_value == player.STATES.PLAYING: 171 self.state_changed(new_value) 172 elif new_value == player.STATES.PAUSED: 173 self.pause_requested = False 174 self.state_changed(new_value) 175 elif new_value == player.STATES.STOPPED: 176 self.pause_requested = False 177 self._position_when_seek = -1 178 self.state_changed(new_value)
179
180 - def _next_track(self):
181 new_idx = self._playlist_index + 1 182 if len(self.model.playlist) > new_idx: 183 self._playlist_index = new_idx 184 self._play_indexed_track() 185 return True 186 return False
187
188 - def _play_indexed_track(self):
189 new_uri = self.model.playlist[self._playlist_index].uri 190 self.model.uri = new_uri 191 self.state = player.STATES.PLAYING 192 self.model.state = player.STATES.PLAYING
193
194 - def _previous_track(self):
195 new_idx = self._playlist_index - 1 196 if len(self.model.playlist) and new_idx > 0: 197 self._playlist_index = new_idx 198 self._play_indexed_track() 199 return True 200 return False
201
202 - def state_changed(self, state):
203 uri = self.model.uri 204 uri_list = [model.uri for model in self.model.playlist] 205 206 if uri in uri_list: 207 self._playlist_index = uri_list.index(uri) 208 209 if uri == None and state == player.STATES.PLAYING: 210 if self._next_track(): 211 self.focus() 212 else: 213 self.state = player.STATES.STOPPED 214 return 215 216 elif state == player.STATES.STOPPED and not self.stopped: 217 if self._next_track(): 218 return 219 elif self.focused: 220 self.parent.focus() 221 222 elif state == player.STATES.PLAYING and not self.focused \ 223 and not self.model.preview_mode: 224 self.focus() 225 226 elif self.focused and state == player.STATES.STOPPED: 227 self.parent.focus() 228 229 self.state = state
230