Merge lp:~samuel-buffet/entertainer/volume_management into lp:entertainer
- volume_management
- Merge into trunk
Status: | Merged |
---|---|
Approved by: | Paul Hummer |
Approved revision: | 404 |
Merged at revision: | not available |
Proposed branch: | lp:~samuel-buffet/entertainer/volume_management |
Merge into: | lp:entertainer |
Diff against target: | None lines |
To merge this branch: | bzr merge lp:~samuel-buffet/entertainer/volume_management |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Paul Hummer | Approve | ||
Review via email: mp+7992@code.launchpad.net |
Commit message
It's now possible to change the player's volume level.
Description of the change
Samuel Buffet (samuel-buffet) wrote : | # |
- 402. By Samuel Buffet
-
Merged with trunk 389.
- 403. By Samuel Buffet
-
Fixes after Paul's comments.
- 404. By Samuel Buffet
-
Merged with trunk 393.
Samuel Buffet (samuel-buffet) wrote : | # |
Devs,
I've pushed some modifications after Paul's comments.
new diff :
=== added file 'cfg/themes/
Binary files cfg/themes/
=== added file 'cfg/themes/
Binary files cfg/themes/
=== added file 'cfg/themes/
Binary files cfg/themes/
=== added file 'cfg/themes/
Binary files cfg/themes/
=== added file 'cfg/themes/
Binary files cfg/themes/
=== added file 'cfg/themes/
Binary files cfg/themes/
=== modified file 'entertainerlib
--- entertainerlib/
+++ entertainerlib/
@@ -18,6 +18,8 @@
PLAYER_
PLAYER_
PLAYER_
+ PLAYER_VOLUME_UP = 6
+ PLAYER_VOLUME_DOWN = 7
# Navigation events
NAVIGATE_UP = 20
=== modified file 'entertainerlib
--- entertainerlib/
+++ entertainerlib/
@@ -20,6 +20,7 @@
from entertainerlib.
from entertainerlib.
from entertainerlib.
+from entertainerlib.
from entertainerlib.
from entertainerlib.
@@ -92,6 +93,7 @@
+ self.player.
# Initialize menu overlay texture
@@ -101,6 +103,15 @@
+ self.volume_
+ self.stage.
+ self.volume_
+ self._on_
+ self.fade_
+ alpha = clutter.
+ clutter.
Paul Hummer (rockstar) : | # |
Preview Diff
1 | === added file 'cfg/themes/Black/images/volume.png' | |||
2 | 0 | Binary files cfg/themes/Black/images/volume.png 1970-01-01 00:00:00 +0000 and cfg/themes/Black/images/volume.png 2009-06-01 19:59:57 +0000 differ | 0 | Binary files cfg/themes/Black/images/volume.png 1970-01-01 00:00:00 +0000 and cfg/themes/Black/images/volume.png 2009-06-01 19:59:57 +0000 differ |
3 | === added file 'cfg/themes/Black/images/volume_filled.png' | |||
4 | 1 | Binary files cfg/themes/Black/images/volume_filled.png 1970-01-01 00:00:00 +0000 and cfg/themes/Black/images/volume_filled.png 2009-06-01 19:25:27 +0000 differ | 1 | Binary files cfg/themes/Black/images/volume_filled.png 1970-01-01 00:00:00 +0000 and cfg/themes/Black/images/volume_filled.png 2009-06-01 19:25:27 +0000 differ |
5 | === added file 'cfg/themes/Black/images/volume_unfilled.png' | |||
6 | 2 | Binary files cfg/themes/Black/images/volume_unfilled.png 1970-01-01 00:00:00 +0000 and cfg/themes/Black/images/volume_unfilled.png 2009-06-01 19:25:27 +0000 differ | 2 | Binary files cfg/themes/Black/images/volume_unfilled.png 1970-01-01 00:00:00 +0000 and cfg/themes/Black/images/volume_unfilled.png 2009-06-01 19:25:27 +0000 differ |
7 | === added file 'cfg/themes/Default/images/volume.png' | |||
8 | 3 | Binary files cfg/themes/Default/images/volume.png 1970-01-01 00:00:00 +0000 and cfg/themes/Default/images/volume.png 2009-06-01 19:59:57 +0000 differ | 3 | Binary files cfg/themes/Default/images/volume.png 1970-01-01 00:00:00 +0000 and cfg/themes/Default/images/volume.png 2009-06-01 19:59:57 +0000 differ |
9 | === added file 'cfg/themes/Default/images/volume_filled.png' | |||
10 | 4 | Binary files cfg/themes/Default/images/volume_filled.png 1970-01-01 00:00:00 +0000 and cfg/themes/Default/images/volume_filled.png 2009-06-01 19:25:27 +0000 differ | 4 | Binary files cfg/themes/Default/images/volume_filled.png 1970-01-01 00:00:00 +0000 and cfg/themes/Default/images/volume_filled.png 2009-06-01 19:25:27 +0000 differ |
11 | === added file 'cfg/themes/Default/images/volume_unfilled.png' | |||
12 | 5 | Binary files cfg/themes/Default/images/volume_unfilled.png 1970-01-01 00:00:00 +0000 and cfg/themes/Default/images/volume_unfilled.png 2009-06-01 19:25:27 +0000 differ | 5 | Binary files cfg/themes/Default/images/volume_unfilled.png 1970-01-01 00:00:00 +0000 and cfg/themes/Default/images/volume_unfilled.png 2009-06-01 19:25:27 +0000 differ |
13 | === modified file 'entertainerlib/frontend/gui/user_event.py' | |||
14 | --- entertainerlib/frontend/gui/user_event.py 2009-05-06 03:40:22 +0000 | |||
15 | +++ entertainerlib/frontend/gui/user_event.py 2009-05-29 10:33:32 +0000 | |||
16 | @@ -18,6 +18,8 @@ | |||
17 | 18 | PLAYER_PREVIOUS = 3 | 18 | PLAYER_PREVIOUS = 3 |
18 | 19 | PLAYER_SKIP_FORWARD = 4 | 19 | PLAYER_SKIP_FORWARD = 4 |
19 | 20 | PLAYER_SKIP_BACKWARD = 5 | 20 | PLAYER_SKIP_BACKWARD = 5 |
20 | 21 | PLAYER_VOLUME_UP = 6 | ||
21 | 22 | PLAYER_VOLUME_DOWN = 7 | ||
22 | 21 | 23 | ||
23 | 22 | # Navigation events | 24 | # Navigation events |
24 | 23 | NAVIGATE_UP = 20 | 25 | NAVIGATE_UP = 20 |
25 | 24 | 26 | ||
26 | === modified file 'entertainerlib/frontend/gui/user_interface.py' | |||
27 | --- entertainerlib/frontend/gui/user_interface.py 2009-06-03 01:54:03 +0000 | |||
28 | +++ entertainerlib/frontend/gui/user_interface.py 2009-06-27 10:51:35 +0000 | |||
29 | @@ -20,6 +20,7 @@ | |||
30 | 20 | from entertainerlib.frontend.gui.user_event import UserEvent | 20 | from entertainerlib.frontend.gui.user_event import UserEvent |
31 | 21 | from entertainerlib.frontend.gui.widgets.menu_overlay import MenuOverlay | 21 | from entertainerlib.frontend.gui.widgets.menu_overlay import MenuOverlay |
32 | 22 | from entertainerlib.frontend.media_player import MediaPlayer | 22 | from entertainerlib.frontend.media_player import MediaPlayer |
33 | 23 | from entertainerlib.frontend.gui.widgets.volume_indicator import VolumeIndicator | ||
34 | 23 | from entertainerlib.utils.configuration import Configuration | 24 | from entertainerlib.utils.configuration import Configuration |
35 | 24 | from entertainerlib.utils.logger import Logger | 25 | from entertainerlib.utils.logger import Logger |
36 | 25 | 26 | ||
37 | @@ -92,6 +93,7 @@ | |||
38 | 92 | 93 | ||
39 | 93 | self.player = MediaPlayer(self.stage, | 94 | self.player = MediaPlayer(self.stage, |
40 | 94 | self.config.get_stage_width(), self.config.get_stage_height()) | 95 | self.config.get_stage_width(), self.config.get_stage_height()) |
41 | 96 | self.player.connect("volume-changed", self._on_volume_changed) | ||
42 | 95 | 97 | ||
43 | 96 | # Initialize menu overlay texture | 98 | # Initialize menu overlay texture |
44 | 97 | self.overlay_status = False | 99 | self.overlay_status = False |
45 | @@ -102,6 +104,15 @@ | |||
46 | 102 | self.config.get_stage_width(), self.config.get_stage_height()) | 104 | self.config.get_stage_width(), self.config.get_stage_height()) |
47 | 103 | self.stage.add(self.menu_overlay) | 105 | self.stage.add(self.menu_overlay) |
48 | 104 | 106 | ||
49 | 107 | self.volume_indicator = VolumeIndicator() | ||
50 | 108 | self.stage.add(self.volume_indicator) | ||
51 | 109 | self.volume_indicator.connect("hidening", | ||
52 | 110 | self._on_volume_indicator_hidening) | ||
53 | 111 | self.fade_screen_timeline = clutter.Timeline(13, 26) | ||
54 | 112 | alpha = clutter.Alpha(self.fade_screen_timeline, | ||
55 | 113 | clutter.smoothstep_inc_func) | ||
56 | 114 | self.fade_screen_behaviour = clutter.BehaviourOpacity(255, 0, alpha) | ||
57 | 115 | |||
58 | 105 | # Transition object. Handles effects between screen changes. | 116 | # Transition object. Handles effects between screen changes. |
59 | 106 | transition_factory = TransitionFactory(self._remove_from_stage) | 117 | transition_factory = TransitionFactory(self._remove_from_stage) |
60 | 107 | self.transition = transition_factory.generate_transition() | 118 | self.transition = transition_factory.generate_transition() |
61 | @@ -140,6 +151,8 @@ | |||
62 | 140 | clutter.keysyms.c : UserEvent.PLAYER_SKIP_FORWARD, | 151 | clutter.keysyms.c : UserEvent.PLAYER_SKIP_FORWARD, |
63 | 141 | clutter.keysyms.z : UserEvent.PLAYER_PREVIOUS, | 152 | clutter.keysyms.z : UserEvent.PLAYER_PREVIOUS, |
64 | 142 | clutter.keysyms.v : UserEvent.PLAYER_NEXT, | 153 | clutter.keysyms.v : UserEvent.PLAYER_NEXT, |
65 | 154 | clutter.keysyms.m : UserEvent.PLAYER_VOLUME_UP, | ||
66 | 155 | clutter.keysyms.l : UserEvent.PLAYER_VOLUME_DOWN, | ||
67 | 143 | clutter.keysyms.q : UserEvent.QUIT_FRONTEND, | 156 | clutter.keysyms.q : UserEvent.QUIT_FRONTEND, |
68 | 144 | clutter.keysyms.Escape : UserEvent.QUIT_FRONTEND | 157 | clutter.keysyms.Escape : UserEvent.QUIT_FRONTEND |
69 | 145 | }) | 158 | }) |
70 | @@ -168,6 +181,8 @@ | |||
71 | 168 | UserEvent.PLAYER_SKIP_FORWARD : self._handle_player_skip_forward, | 181 | UserEvent.PLAYER_SKIP_FORWARD : self._handle_player_skip_forward, |
72 | 169 | UserEvent.PLAYER_PREVIOUS : self._handle_player_previous, | 182 | UserEvent.PLAYER_PREVIOUS : self._handle_player_previous, |
73 | 170 | UserEvent.PLAYER_NEXT : self._handle_player_next, | 183 | UserEvent.PLAYER_NEXT : self._handle_player_next, |
74 | 184 | UserEvent.PLAYER_VOLUME_UP : self._handle_player_volume_up, | ||
75 | 185 | UserEvent.PLAYER_VOLUME_DOWN : self._handle_player_volume_down, | ||
76 | 171 | UserEvent.QUIT_FRONTEND : self._handle_quit_frontend | 186 | UserEvent.QUIT_FRONTEND : self._handle_quit_frontend |
77 | 172 | } | 187 | } |
78 | 173 | 188 | ||
79 | @@ -394,6 +409,14 @@ | |||
80 | 394 | self.player.stop() | 409 | self.player.stop() |
81 | 395 | self.current.handle_user_event(event) | 410 | self.current.handle_user_event(event) |
82 | 396 | 411 | ||
83 | 412 | def _handle_player_volume_up(self, event): | ||
84 | 413 | '''Handle UserEvent.PLAYER_VOLUME_UP.''' | ||
85 | 414 | self.player.volume_up() | ||
86 | 415 | |||
87 | 416 | def _handle_player_volume_down(self, event): | ||
88 | 417 | '''Handle UserEvent.PLAYER_VOLUME_DOWN.''' | ||
89 | 418 | self.player.volume_down() | ||
90 | 419 | |||
91 | 397 | def _handle_toggle_fullscreen(self, event): | 420 | def _handle_toggle_fullscreen(self, event): |
92 | 398 | '''Handle UserEvent.TOGGLE_FULLSCREEN.''' | 421 | '''Handle UserEvent.TOGGLE_FULLSCREEN.''' |
93 | 399 | self._toggle_fullscreen() | 422 | self._toggle_fullscreen() |
94 | @@ -402,3 +425,18 @@ | |||
95 | 402 | '''Handle UserEvent.QUIT_FRONTEND.''' | 425 | '''Handle UserEvent.QUIT_FRONTEND.''' |
96 | 403 | self.confirm_exit() | 426 | self.confirm_exit() |
97 | 404 | 427 | ||
98 | 428 | def _on_volume_changed(self, event): | ||
99 | 429 | """Show volume indicator and fade out the screen (if needed).""" | ||
100 | 430 | if not self.volume_indicator.visible: | ||
101 | 431 | if not self.fade_screen_behaviour.is_applied(self.current): | ||
102 | 432 | self.fade_screen_behaviour.apply(self.current) | ||
103 | 433 | self.fade_screen_behaviour.set_bounds(255, 50) | ||
104 | 434 | self.fade_screen_timeline.start() | ||
105 | 435 | |||
106 | 436 | self.volume_indicator.show_volume(self.player.volume) | ||
107 | 437 | |||
108 | 438 | def _on_volume_indicator_hidening(self, event): | ||
109 | 439 | """Restore previous screen opacity.""" | ||
110 | 440 | self.fade_screen_behaviour.set_bounds(50, 255) | ||
111 | 441 | self.fade_screen_timeline.start() | ||
112 | 442 | |||
113 | 405 | 443 | ||
114 | === added file 'entertainerlib/frontend/gui/widgets/volume_indicator.py' | |||
115 | --- entertainerlib/frontend/gui/widgets/volume_indicator.py 1970-01-01 00:00:00 +0000 | |||
116 | +++ entertainerlib/frontend/gui/widgets/volume_indicator.py 2009-06-28 09:12:14 +0000 | |||
117 | @@ -0,0 +1,80 @@ | |||
118 | 1 | # Copyright (c) 2009 Entertainer Developers - See COPYING - GPLv2 | ||
119 | 2 | """A volume indicator widgets.""" | ||
120 | 3 | |||
121 | 4 | import clutter | ||
122 | 5 | import gobject | ||
123 | 6 | |||
124 | 7 | from entertainerlib.frontend.gui.widgets.base import Base | ||
125 | 8 | |||
126 | 9 | class VolumeIndicator(Base, clutter.Group): | ||
127 | 10 | """Volume Indicator displaying player's volume level.""" | ||
128 | 11 | __gsignals__ = { | ||
129 | 12 | 'hidening' : ( gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, () ), | ||
130 | 13 | } | ||
131 | 14 | |||
132 | 15 | def __init__(self): | ||
133 | 16 | Base.__init__(self) | ||
134 | 17 | clutter.Group.__init__(self) | ||
135 | 18 | |||
136 | 19 | theme = self.config.theme | ||
137 | 20 | filled = clutter.Texture(theme.getImage("volume_filled")) | ||
138 | 21 | unfilled = clutter.Texture(theme.getImage("volume_unfilled")) | ||
139 | 22 | volume = clutter.Texture(theme.getImage("volume")) | ||
140 | 23 | self.add(volume) | ||
141 | 24 | |||
142 | 25 | self._pokes = [] | ||
143 | 26 | |||
144 | 27 | poke_width = filled.get_width() | ||
145 | 28 | |||
146 | 29 | for i in range(20): | ||
147 | 30 | poke_filled = clutter.CloneTexture(filled) | ||
148 | 31 | poke_unfilled = clutter.CloneTexture(unfilled) | ||
149 | 32 | poke_filled.set_position(volume.get_width() + i * poke_width, 0) | ||
150 | 33 | poke_unfilled.set_position(volume.get_width() + i * poke_width, 0) | ||
151 | 34 | self.add(poke_filled) | ||
152 | 35 | self.add(poke_unfilled) | ||
153 | 36 | self._pokes.append([poke_filled, poke_unfilled]) | ||
154 | 37 | |||
155 | 38 | self._hide_timeout_key = None | ||
156 | 39 | self.visible = False | ||
157 | 40 | self.set_opacity(0) | ||
158 | 41 | |||
159 | 42 | self.timeline = clutter.Timeline(13, 26) | ||
160 | 43 | self.alpha = clutter.Alpha(self.timeline, clutter.smoothstep_inc_func) | ||
161 | 44 | self.behaviour = clutter.BehaviourOpacity(255, 0, self.alpha) | ||
162 | 45 | self.behaviour.apply(self) | ||
163 | 46 | |||
164 | 47 | self.set_position(self.get_abs_x(0.35), self.get_abs_y(0.1)) | ||
165 | 48 | |||
166 | 49 | def show_volume(self, volume): | ||
167 | 50 | """Displays volume level using filled and unfilled pokes.""" | ||
168 | 51 | self.raise_top() | ||
169 | 52 | |||
170 | 53 | if self._hide_timeout_key is not None: | ||
171 | 54 | gobject.source_remove(self._hide_timeout_key) | ||
172 | 55 | self._hide_timeout_key = gobject.timeout_add(2000, | ||
173 | 56 | self.animate_out) | ||
174 | 57 | |||
175 | 58 | for index, pokes in enumerate(self._pokes): | ||
176 | 59 | if index >= volume: | ||
177 | 60 | pokes[0].set_opacity(0) | ||
178 | 61 | pokes[1].set_opacity(255) | ||
179 | 62 | else: | ||
180 | 63 | pokes[0].set_opacity(255) | ||
181 | 64 | pokes[1].set_opacity(0) | ||
182 | 65 | |||
183 | 66 | if self.visible == True: | ||
184 | 67 | return | ||
185 | 68 | |||
186 | 69 | self.visible = True | ||
187 | 70 | self.behaviour.set_bounds(0, 255) | ||
188 | 71 | self.timeline.start() | ||
189 | 72 | |||
190 | 73 | def animate_out(self): | ||
191 | 74 | """Fades out.""" | ||
192 | 75 | self.behaviour.set_bounds(255, 0) | ||
193 | 76 | self.timeline.start() | ||
194 | 77 | self.visible = False | ||
195 | 78 | self.emit("hidening") | ||
196 | 79 | return False | ||
197 | 80 | |||
198 | 0 | 81 | ||
199 | === modified file 'entertainerlib/frontend/media_player.py' | |||
200 | --- entertainerlib/frontend/media_player.py 2009-05-26 17:32:56 +0000 | |||
201 | +++ entertainerlib/frontend/media_player.py 2009-06-27 11:00:55 +0000 | |||
202 | @@ -32,6 +32,7 @@ | |||
203 | 32 | 'skip-forward' : ( gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, () ), | 32 | 'skip-forward' : ( gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, () ), |
204 | 33 | 'skip-backward' : ( gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, () ), | 33 | 'skip-backward' : ( gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, () ), |
205 | 34 | 'position_changed' : ( gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, () ), | 34 | 'position_changed' : ( gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, () ), |
206 | 35 | 'volume_changed' : ( gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, () ), | ||
207 | 35 | } | 36 | } |
208 | 36 | 37 | ||
209 | 37 | # Ratio constants | 38 | # Ratio constants |
210 | @@ -64,6 +65,8 @@ | |||
211 | 64 | 65 | ||
212 | 65 | self.video_texture = cluttergst.VideoTexture() | 66 | self.video_texture = cluttergst.VideoTexture() |
213 | 66 | self.playbin = self.video_texture.get_playbin() | 67 | self.playbin = self.video_texture.get_playbin() |
214 | 68 | self.playbin.set_property("volume", 0.5) | ||
215 | 69 | self._volume = 10 | ||
216 | 67 | self.bus = self.playbin.get_bus() | 70 | self.bus = self.playbin.get_bus() |
217 | 68 | self.bus.add_signal_watch() | 71 | self.bus.add_signal_watch() |
218 | 69 | self.bus.connect('message', self._on_gst_message) | 72 | self.bus.connect('message', self._on_gst_message) |
219 | @@ -91,6 +94,30 @@ | |||
220 | 91 | self.logger.error("Error: %(err)s, %(debug)s" % \ | 94 | self.logger.error("Error: %(err)s, %(debug)s" % \ |
221 | 92 | {'err': err, 'debug': debug}) | 95 | {'err': err, 'debug': debug}) |
222 | 93 | 96 | ||
223 | 97 | def _get_volume(self): | ||
224 | 98 | """volume property getter.""" | ||
225 | 99 | return self._volume | ||
226 | 100 | |||
227 | 101 | def _set_volume(self, volume): | ||
228 | 102 | """volume property setter.""" | ||
229 | 103 | self._volume = volume | ||
230 | 104 | if self._volume > 20: | ||
231 | 105 | self._volume = 20 | ||
232 | 106 | if self._volume < 0: | ||
233 | 107 | self._volume = 0 | ||
234 | 108 | self.playbin.set_property("volume", self._volume / 20.0) | ||
235 | 109 | self.emit("volume-changed") | ||
236 | 110 | |||
237 | 111 | volume = property(_get_volume, _set_volume) | ||
238 | 112 | |||
239 | 113 | def volume_up(self): | ||
240 | 114 | """Increase player's volume level.""" | ||
241 | 115 | self.volume = self._volume + 1 | ||
242 | 116 | |||
243 | 117 | def volume_down(self): | ||
244 | 118 | """Decrease player's volume level.""" | ||
245 | 119 | self.volume = self._volume - 1 | ||
246 | 120 | |||
247 | 94 | def set_playlist(self, playlist): | 121 | def set_playlist(self, playlist): |
248 | 95 | '''Set new playlist to MediaPlayer.''' | 122 | '''Set new playlist to MediaPlayer.''' |
249 | 96 | if len(playlist) == 0: | 123 | if len(playlist) == 0: |
250 | 97 | 124 | ||
251 | === modified file 'entertainerlib/tests/mock.py' | |||
252 | --- entertainerlib/tests/mock.py 2009-06-15 03:19:46 +0000 | |||
253 | +++ entertainerlib/tests/mock.py 2009-06-28 12:19:08 +0000 | |||
254 | @@ -1,6 +1,7 @@ | |||
255 | 1 | # Copyright (c) 2009 Entertainer Developers - See COPYING - GPLv2 | 1 | # Copyright (c) 2009 Entertainer Developers - See COPYING - GPLv2 |
256 | 2 | '''Test mock objects''' | 2 | '''Test mock objects''' |
257 | 3 | # pylint: disable-msg=W0231 | 3 | # pylint: disable-msg=W0231 |
258 | 4 | import clutter | ||
259 | 4 | import gobject | 5 | import gobject |
260 | 5 | 6 | ||
261 | 6 | from entertainerlib.frontend.backend_connection import BackendConnection | 7 | from entertainerlib.frontend.backend_connection import BackendConnection |
262 | @@ -328,3 +329,10 @@ | |||
263 | 328 | self.y = 0 | 329 | self.y = 0 |
264 | 329 | self.time = 0 | 330 | self.time = 0 |
265 | 330 | 331 | ||
266 | 332 | |||
267 | 333 | class MockStage(clutter.Stage): | ||
268 | 334 | '''Mock a clutter Stage.''' | ||
269 | 335 | |||
270 | 336 | def __init__(self): | ||
271 | 337 | clutter.Stage.__init__(self) | ||
272 | 338 | |||
273 | 331 | 339 | ||
274 | === added file 'entertainerlib/tests/test_mediaplayer.py' | |||
275 | --- entertainerlib/tests/test_mediaplayer.py 1970-01-01 00:00:00 +0000 | |||
276 | +++ entertainerlib/tests/test_mediaplayer.py 2009-06-28 12:19:08 +0000 | |||
277 | @@ -0,0 +1,85 @@ | |||
278 | 1 | # Copyright (c) 2009 Entertainer Developers - See COPYING - GPLv2 | ||
279 | 2 | """Tests MediaPlayer""" | ||
280 | 3 | |||
281 | 4 | import os | ||
282 | 5 | |||
283 | 6 | from entertainerlib.frontend.media_player import MediaPlayer | ||
284 | 7 | from entertainerlib.frontend.medialibrary.videos import VideoItem | ||
285 | 8 | from entertainerlib.tests import EntertainerTest | ||
286 | 9 | from entertainerlib.tests.mock import MockStage | ||
287 | 10 | |||
288 | 11 | THIS_DIR = os.path.dirname(__file__) | ||
289 | 12 | |||
290 | 13 | class MediaPlayerTest(EntertainerTest): | ||
291 | 14 | """Test for entertainerlib.frontend.gui.widgets.volume_indicator""" | ||
292 | 15 | |||
293 | 16 | def setUp(self): | ||
294 | 17 | '''Set up the test.''' | ||
295 | 18 | EntertainerTest.setUp(self) | ||
296 | 19 | |||
297 | 20 | self.stage = MockStage() | ||
298 | 21 | self.player = MediaPlayer(self.stage, 100, 100) | ||
299 | 22 | self.video_item = VideoItem() | ||
300 | 23 | self.video_item.set_filename( | ||
301 | 24 | THIS_DIR + '/data/VideoThumbnailer/test.avi') | ||
302 | 25 | self.player.set_media(self.video_item) | ||
303 | 26 | |||
304 | 27 | def test_create(self): | ||
305 | 28 | '''Test correct MediaPlayer initialization.''' | ||
306 | 29 | self.assertTrue(isinstance(self.player, MediaPlayer)) | ||
307 | 30 | |||
308 | 31 | def test_volume(self): | ||
309 | 32 | '''Test the use of the volume property.''' | ||
310 | 33 | self.player.volume = 10 | ||
311 | 34 | self.assertEqual(self.player.volume, 10) | ||
312 | 35 | self.player.volume = 99 | ||
313 | 36 | self.assertEqual(self.player.volume, 20) | ||
314 | 37 | self.player.volume = -10 | ||
315 | 38 | self.assertEqual(self.player.volume, 0) | ||
316 | 39 | |||
317 | 40 | def test_volumedown(self): | ||
318 | 41 | '''Test the use of the volume_down method.''' | ||
319 | 42 | self.player.volume = 10 | ||
320 | 43 | self.player.volume_down() | ||
321 | 44 | self.assertEqual(self.player.volume, 9) | ||
322 | 45 | |||
323 | 46 | def test_volumeup(self): | ||
324 | 47 | '''Test the use of the volume_up method.''' | ||
325 | 48 | self.player.volume = 10 | ||
326 | 49 | self.player.volume_up() | ||
327 | 50 | self.assertEqual(self.player.volume, 11) | ||
328 | 51 | |||
329 | 52 | def test_setmedia(self): | ||
330 | 53 | '''Test the use of the set_media method.''' | ||
331 | 54 | # The method is called during setUp. | ||
332 | 55 | self.assertTrue(self.player.media is not None) | ||
333 | 56 | |||
334 | 57 | def test_getmedia(self): | ||
335 | 58 | '''Test the use of the get_media method.''' | ||
336 | 59 | self.assertEqual(self.player.get_media(), self.video_item) | ||
337 | 60 | |||
338 | 61 | def test_hasmedia(self): | ||
339 | 62 | '''Test the use of the has_media method.''' | ||
340 | 63 | self.assertTrue(self.player.has_media()) | ||
341 | 64 | |||
342 | 65 | def test_getmediatype(self): | ||
343 | 66 | '''Test the use of the get_media_type method.''' | ||
344 | 67 | self.assertEqual(self.player.get_media_type(), | ||
345 | 68 | self.video_item.get_type()) | ||
346 | 69 | |||
347 | 70 | def test_playstop(self): | ||
348 | 71 | '''Test the use of the play and stop methods.''' | ||
349 | 72 | self.player.play() | ||
350 | 73 | self.assertTrue(self.player.playing) | ||
351 | 74 | self.player.stop() | ||
352 | 75 | self.assertFalse(self.player.playing) | ||
353 | 76 | |||
354 | 77 | def test_getmediatitle(self): | ||
355 | 78 | '''Test the use of the get_media_title method.''' | ||
356 | 79 | self.assertEqual(self.player.get_media_title(), | ||
357 | 80 | THIS_DIR + '/data/VideoThumbnailer/test.avi') | ||
358 | 81 | |||
359 | 82 | def test_getmediadurationstring(self): | ||
360 | 83 | '''Test the use of the get_media_title method.''' | ||
361 | 84 | self.assertEqual(self.player.get_media_duration_string(), "00:00") | ||
362 | 85 | |||
363 | 0 | 86 | ||
364 | === added file 'entertainerlib/tests/test_volumeindicator.py' | |||
365 | --- entertainerlib/tests/test_volumeindicator.py 1970-01-01 00:00:00 +0000 | |||
366 | +++ entertainerlib/tests/test_volumeindicator.py 2009-06-28 12:19:08 +0000 | |||
367 | @@ -0,0 +1,24 @@ | |||
368 | 1 | # Copyright (c) 2009 Entertainer Developers - See COPYING - GPLv2 | ||
369 | 2 | """Tests VolumeIndicator""" | ||
370 | 3 | |||
371 | 4 | from entertainerlib.frontend.gui.widgets.volume_indicator import VolumeIndicator | ||
372 | 5 | from entertainerlib.tests import EntertainerTest | ||
373 | 6 | |||
374 | 7 | class VolumeIndicatorTest(EntertainerTest): | ||
375 | 8 | """Test for entertainerlib.frontend.gui.widgets.volume_indicator""" | ||
376 | 9 | |||
377 | 10 | def setUp(self): | ||
378 | 11 | '''Set up the test.''' | ||
379 | 12 | EntertainerTest.setUp(self) | ||
380 | 13 | |||
381 | 14 | self.indicator = VolumeIndicator() | ||
382 | 15 | |||
383 | 16 | def test_create(self): | ||
384 | 17 | '''Test correct VolumeIndicator initialization.''' | ||
385 | 18 | self.assertTrue(isinstance(self.indicator, VolumeIndicator)) | ||
386 | 19 | |||
387 | 20 | def test_show_volume(self): | ||
388 | 21 | '''Test the use of the show_volume method.''' | ||
389 | 22 | self.indicator.show_volume(5) | ||
390 | 23 | self.assertTrue(self.indicator.visible) | ||
391 | 24 |
Devs,
With this branch it is now possible to change the volume level when playing a media. This is something important that was missing (I think).
To reach that goal, a "volume" property has been added to the media player.
A VolumeIndicator has also been created. It's themable and is displayed when we change the volume with a fade in effect while the screen is faded out at the same time.
The keys I've chosen to change the volume are l = volume down and m = volume up. If you prefer other keys just let me know.
The VolumeIndicator widget is not reactive right now (I'l do that in an other branch)
Samuel-