1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import gst
23 import gst.interfaces
24
25 from twisted.internet import defer
26
27 from flumotion.component import feedcomponent
28 from flumotion.component.effects.volume import volume
29 from flumotion.common import messages
30 from flumotion.common.messages import N_
31 T_ = messages.gettexter('flumotion')
32
33 -class Soundcard(feedcomponent.ParseLaunchComponent):
42
47
49 element = properties.get('source-element', 'alsasrc')
50 device = properties.get('device', 'hw:0')
51 rate = properties.get('rate', 44100)
52 depth = properties.get('depth', 16)
53 channels = properties.get('channels', 2)
54 self.inputTrackLabel = properties.get('input-track', None)
55 d = self._change_monitor.add(gst.STATE_CHANGE_NULL_TO_READY)
56 d.addCallback(self._set_input_track, self.inputTrackLabel)
57
58
59
60
61 caps = 'audio/x-raw-int,rate=(int)%d,depth=%d,channels=%d' % (
62 rate, depth, channels)
63 pipeline = "%s device=%s name=src ! %s ! " \
64 "level name=volumelevel message=true" % (
65 element, device, caps)
66 self._srcelement = None
67 return pipeline
68
85
97
99 if gst.pygst_version < (0, 10, 7):
100 self.warning(
101 "Cannot set volume on soundcards with gst-python < 0.10.7")
102 return
103 self.debug("Volume set to: %f", value)
104 if self.inputTrackLabel and self._srcelement:
105 element = self._srcelement
106 volumeSet = False
107 for track in element.list_tracks():
108 if track.get_property("label") == self.inputTrackLabel:
109 volumeVals = tuple(int(value/1.0 *
110 track.get_property("max-volume"))
111 for _ in xrange(0, track.get_property("num-channels")))
112 element.set_volume(track, volumeVals)
113 volumeSet = True
114 break
115 if not volumeSet:
116 self.warning("could not find track %s", self.inputTrackLabel)
117 else:
118 self.warning("no input track selected, cannot set volume")
119
121 if gst.pygst_version < (0, 10, 7):
122 self.warning(
123 "Cannot query volume on soundcards with gst-python < 0.10.7")
124 return 1.0
125 if self.inputTrackLabel and self._srcelement:
126 element = self._srcelement
127 for track in element.list_tracks():
128 if track.get_property("label") == self.inputTrackLabel:
129 volumeVals = element.get_volume(track)
130 vol = 0
131 nchannels = track.get_property("num-channels")
132 for k in range(0, track.get_property("num-channels")):
133 vol = vol + (volumeVals[k] / nchannels)
134 self.debug("vol: %f max vol: %d", vol, track.get_property("max-volume"))
135 v = vol / float(track.get_property("max-volume"))
136 self.debug("v: %f", v)
137 return v
138 self.warning("could not find track %s", self.inputTrackLabel)
139 else:
140 self.warning("no input track selected, cannot set volume")
141 return 1.0
142