1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 from math import frexp
23 from flumotion.component import feedcomponent
24
25
26
27 -class Volume(feedcomponent.Effect):
28 """
29 I am an effect that can be added to any component that has a level
30 element and a volume element.
31
32 My component should implement setVolume() and getVolume()
33 """
34 logCategory = "volume"
35
36 - def __init__(self, name, element, pipeline):
37 """
38 @param element: the level element
39 @param pipeline: the pipeline
40 """
41 feedcomponent.Effect.__init__(self, name)
42 self._element = element
43
44
45 element.set_property('interval', 200000000)
46 bus = pipeline.get_bus()
47 bus.add_signal_watch()
48 bus.connect('message::element', self._bus_message_received_cb)
49
56
58 """
59 @param bus: the message bus sending the message
60 @param message: the message received
61 """
62 if message.structure.get_name() == 'level':
63 s = message.structure
64 peak = list(s['peak'])
65 decay = list(s['decay'])
66 rms = list(s['rms'])
67 for l in peak, decay, rms:
68 for v in l:
69 try:
70 v = frexp(v)
71 except (SystemError, OverflowError, ValueError):
72
73 v = -100.0
74 if not self.uiState:
75 self.warning("effect %s doesn't have a uiState" %
76 self.name)
77 else:
78 for k, v in ('peak', peak), ('decay', decay), ('rms', rms):
79 self.uiState.set('volume-%s' % k, v)
80
81
83 """
84 Sets volume
85
86 @param value: what value to set volume to (float between 0.0 and 4.0)
87
88 Returns: the actual value it was set to
89 """
90 self.component.setVolume(value)
91
92 self.uiState.set('volume-volume', value)
93
94 return value
95
97 """
98 Gets current volume setting.
99
100 @return: what value the volume is set to
101 @rtype: float (between 0.0 and 4.0)
102 """
103 return self.component.getVolume()
104