~ubuntu-branches/ubuntu/quantal/pitivi/quantal

« back to all changes in this revision

Viewing changes to pitivi/ui/webcam_managerdialog.py

  • Committer: Bazaar Package Importer
  • Author(s): Sebastian Dröge
  • Date: 2008-12-12 10:22:29 UTC
  • mfrom: (1.1.6 upstream)
  • mto: (3.2.2 jaunty) (1.2.2 upstream)
  • mto: This revision was merged to the branch mainline in revision 6.
  • Revision ID: james.westby@ubuntu.com-20081212102229-7c3etvaoy9ys0x28
Tags: upstream-0.11.3
Import upstream version 0.11.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# PiTiVi , Non-linear video editor
 
2
#
 
3
#       pitivi/ui/webcam_managerdialog.py
 
4
#
 
5
# Copyright (c) 2008, Sarath Lakshman <sarathlakshman@slynux.org>
 
6
#
 
7
# This program is free software; you can redistribute it and/or
 
8
# modify it under the terms of the GNU Lesser General Public
 
9
# License as published by the Free Software Foundation; either
 
10
# version 2.1 of the License, or (at your option) any later version.
 
11
#
 
12
# This program is distributed in the hope that it will be useful,
 
13
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
15
# Lesser General Public License for more details.
 
16
#
 
17
# You should have received a copy of the GNU Lesser General Public
 
18
# License along with this program; if not, write to the
 
19
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 
20
# Boston, MA 02111-1307, USA.
 
21
 
 
22
import gtk
 
23
import os
 
24
import gst
 
25
import tempfile
 
26
from pitivi.settings import ExportSettings
 
27
from sourcelist import SourceList
 
28
from pitivi.bin import SmartCaptureBin, SinkBin
 
29
from pitivi.threads import CallbackThread
 
30
from glade import GladeWindow
 
31
 
 
32
class WebcamManagerDialog(GladeWindow):
 
33
    """
 
34
    Webcan capture dialog box
 
35
    """
 
36
    glade_file = "cam_capture.glade"
 
37
 
 
38
    def __init__(self, pitivi):
 
39
        gst.log("Creating new WebcamManager Dialog")
 
40
        self.pitivi = pitivi
 
41
        GladeWindow.__init__(self)
 
42
 
 
43
        # Create gtk widget using glade model
 
44
        self.draw_window = self.widgets["draw_window"]
 
45
        self.draw_window.unset_flags(gtk.DOUBLE_BUFFERED)
 
46
        self.draw_window.unset_flags(gtk.SENSITIVE)
 
47
        self.record_btn = self.widgets["record_btn"]
 
48
        self.close_btn = self.widgets["close_btn"]
 
49
 
 
50
        self.close_btn.connect("clicked", self.close)
 
51
        self.record_btn.connect("clicked", self.threaded_recording)
 
52
        self.window.connect("destroy", self.close)
 
53
 
 
54
        self.record_btn = self.record_btn.get_children()[0]
 
55
        self.record_btn = self.record_btn.get_children()[0].get_children()[1]
 
56
        self.record_btn.set_label("Start Recording")
 
57
 
 
58
        self.sourcefactories = SourceList()
 
59
 
 
60
        self._audiodev = None
 
61
        self._videodev = None
 
62
 
 
63
        self._vdevcombo = self.widgets["videodev_combo"]
 
64
        self._vdevcombo.set_active(0)
 
65
        self._vdevcombo.set_model(gtk.ListStore(str, object))
 
66
        self._vdevcombo.set_attributes(self._vdevcombo.child.get_cell_renderers()[0],
 
67
                                       text=0)
 
68
        self._adevcombo = self.widgets["audiodev_combo"]
 
69
        self._adevcombo.set_active(0)
 
70
        self._adevcombo.set_model(gtk.ListStore(str, object))
 
71
        self._adevcombo.set_attributes(self._adevcombo.child.get_cell_renderers()[0],
 
72
                                       text=0)
 
73
        self.__updateVideoCombo()
 
74
        self.__updateAudioCombo()
 
75
 
 
76
        self.filepath = None
 
77
 
 
78
        self.sink = SinkBin()
 
79
        CallbackThread(self.__setupPlayer).start()
 
80
 
 
81
    def show_all(self):
 
82
        self.window.show_all()
 
83
 
 
84
    # Perform record in a seperate thread
 
85
    def threaded_recording(self, w):
 
86
        CallbackThread(self.do_recording, w).start()
 
87
 
 
88
 
 
89
    # Record button action callback
 
90
    def do_recording(self, w):
 
91
        if self.record_btn.get_label() == "Start Recording":
 
92
            gst.debug("recording started")
 
93
            self.filepath = 'file://'+tempfile.mktemp(suffix=".ogg",
 
94
                                                      prefix="pitivi-webcam-capture-")
 
95
            self.player.record(self.filepath, ExportSettings())
 
96
            self.record_btn.set_label("Stop Recording")
 
97
            self.player.set_state(gst.STATE_PLAYING)
 
98
 
 
99
 
 
100
 
 
101
        else:
 
102
            gst.debug("recording stopped")
 
103
            self.player.stopRecording()
 
104
            # FIXME : use the generic way for adding a file
 
105
            self.sourcefactories.addFiles([self.filepath])
 
106
            self.player.set_state(gst.STATE_PLAYING)
 
107
            self.record_btn.set_label("Start Recording")
 
108
 
 
109
    # For Setting up audio,video sinks
 
110
    def setSinks(self):
 
111
        self.sink.connectSink(self.player, True, True)
 
112
        bus = self.player.get_bus()
 
113
        bus.add_signal_watch()
 
114
        bus.enable_sync_message_emission()
 
115
        bus.connect('sync-message::element', self.on_sync_message)
 
116
 
 
117
    # Close the Webcamdialog
 
118
    def close(self, w):
 
119
        self.window.hide()
 
120
        self.player.set_state(gst.STATE_NULL)
 
121
        self.window.destroy()
 
122
 
 
123
    # For draw_window syncs
 
124
    def on_sync_message(self, bus, message):
 
125
        if message.structure is None:
 
126
            return
 
127
        message_name = message.structure.get_name()
 
128
        if message_name == 'prepare-xwindow-id':
 
129
            # Assign the viewport
 
130
            imagesink = message.src
 
131
            imagesink.set_property('force-aspect-ratio', True)
 
132
            try:
 
133
                imagesink.set_xwindow_id(self.draw_window.window.xid)
 
134
            except:
 
135
                gst.warning("Couldn't set the XID on our video sink !")
 
136
 
 
137
    def __setupPlayer(self):
 
138
        gst.debug("Creating initial SmartCaptureBin")
 
139
        # figure out adev
 
140
        probe = self.pitivi.deviceprobe
 
141
        if len(probe.getAudioSourceDevices()):
 
142
            adev = probe.getAudioSourceDevices()[0]
 
143
        else:
 
144
            adev = None
 
145
        self.__changeSelectedAudio(adev)
 
146
 
 
147
        if len(probe.getVideoSourceDevices()):
 
148
            vdev = probe.getVideoSourceDevices()[0]
 
149
        else:
 
150
            vdev = None
 
151
        self.__changeSelectedVideo(vdev)
 
152
 
 
153
        probe.connect("device-added", self.__deviceAddedCb)
 
154
        probe.connect("device-removed", self.__deviceRemovedCb)
 
155
 
 
156
        if hasattr(self, "player"):
 
157
            self.player.set_state(gst.STATE_NULL)
 
158
        self.player = SmartCaptureBin(audiodevice=adev,
 
159
                                      videodevice=vdev)
 
160
        self.setSinks()
 
161
        # FIXME : check for state change failures
 
162
        self.player.set_state(gst.STATE_PLAYING)
 
163
 
 
164
    def __resetPlayer(self):
 
165
        ## call me in another thread !
 
166
        gst.debug("Setting previous to NULL")
 
167
        self.player.set_state(gst.STATE_NULL)
 
168
        gst.debug("Creating new SmartCaptureBin(%r,%r)" % (self._audiodev, self._videodev))
 
169
        self.player = SmartCaptureBin(audiodevice = self._audiodev,
 
170
                                      videodevice = self._videodev)
 
171
        gst.debug("Calling setSinks()")
 
172
        self.setSinks()
 
173
        gst.debug("Finally setting to PLAYING...")
 
174
        res = self.player.set_state(gst.STATE_PLAYING)
 
175
        gst.debug("... which returned %r" % res)
 
176
 
 
177
    def __changeSelectedCombo(self, combo, device):
 
178
        gst.debug("device %r" % device)
 
179
        model = combo.get_model()
 
180
        idx = 0
 
181
        for name, dev in model:
 
182
            if dev == device:
 
183
                break
 
184
            idx += 1
 
185
        combo.set_active(idx)
 
186
 
 
187
    def __changeSelectedAudio(self, device):
 
188
        self._audiodev = device
 
189
        self.__changeSelectedCombo(self._adevcombo, device)
 
190
 
 
191
    def __changeSelectedVideo(self, device):
 
192
        self._videodev = device
 
193
        self.__changeSelectedCombo(self._vdevcombo, device)
 
194
 
 
195
    def __deviceAddedCb(self, probe, device):
 
196
        gst.debug("device %r appeared" % device)
 
197
        self.__updateAudioCombo()
 
198
        self.__updateVideoCombo()
 
199
 
 
200
    def __deviceRemovedCb(self, probe, device):
 
201
        gst.debug("device %r went away" % device)
 
202
        if self._audiodev == device:
 
203
            devs = self.pitivi.deviceprobe.getAudioSourceDevices()
 
204
            if len(devs):
 
205
                self.__changeSelectedAudio(devs[0])
 
206
            else:
 
207
                self._audiodev = None
 
208
        elif self._videodev == device:
 
209
            devs = self.pitivi.deviceprobe.getVideoSourceDevices()
 
210
            if len(devs):
 
211
                self.__changeSelectedVideo(devs[0])
 
212
            else:
 
213
                self._videodev = None
 
214
        self.__updateAudioCombo()
 
215
        self.__updateVideoCombo()
 
216
 
 
217
    def __updateCombo(self, combo, devices):
 
218
        model = combo.get_model()
 
219
        if len(devices) == len(model):
 
220
            # nothing changed
 
221
            return
 
222
        model.clear()
 
223
        for dev in devices:
 
224
            model.append([dev.displayname, dev])
 
225
 
 
226
    def __updateAudioCombo(self):
 
227
        self.__updateCombo(self._adevcombo,
 
228
                           self.pitivi.deviceprobe.getAudioSourceDevices())
 
229
        self.__changeSelectedAudio(self._audiodev)
 
230
 
 
231
    def __updateVideoCombo(self):
 
232
        self.__updateCombo(self._vdevcombo,
 
233
                           self.pitivi.deviceprobe.getVideoSourceDevices())
 
234
        self.__changeSelectedVideo(self._videodev)
 
235
 
 
236
    def _adevComboChangedCb(self, widget):
 
237
        # get the active device
 
238
        row = widget.get_model()[widget.get_active()]
 
239
        if len(row) < 2:
 
240
            return
 
241
        dev = row[1]
 
242
        gst.debug("device %r" % dev)
 
243
        if dev == self._audiodev:
 
244
            return
 
245
        self.__changeSelectedAudio(dev)
 
246
        if not hasattr(self, "player"):
 
247
            return
 
248
        CallbackThread(self.__resetPlayer).start()
 
249
 
 
250
    def _vdevComboChangedCb(self, widget):
 
251
        row = widget.get_model()[widget.get_active()]
 
252
        if len(row) < 2:
 
253
            return
 
254
        dev = row[1]
 
255
        gst.debug("device %r" % dev)
 
256
        if dev == self._videodev:
 
257
            return
 
258
        self.__changeSelectedVideo(dev)
 
259
        if not hasattr(self, "player"):
 
260
            return
 
261
        CallbackThread(self.__resetPlayer).start()
 
262