pitivi r1284 - trunk/pitivi
- From: edwardrv svn gnome org
- To: svn-commits-list gnome org
- Subject: pitivi r1284 - trunk/pitivi
- Date: Fri, 26 Sep 2008 19:43:30 +0000 (UTC)
Author: edwardrv
Date: Fri Sep 26 19:43:30 2008
New Revision: 1284
URL: http://svn.gnome.org/viewvc/pitivi?rev=1284&view=rev
Log:
Device: Implement HAL DeviceProbe
Modified:
trunk/pitivi/device.py
trunk/pitivi/objectfactory.py
Modified: trunk/pitivi/device.py
==============================================================================
--- trunk/pitivi/device.py (original)
+++ trunk/pitivi/device.py Fri Sep 26 19:43:30 2008
@@ -24,15 +24,22 @@
Classes and Methods for Device handling and usage
"""
-from objectfactory import SourceFactory
+from objectfactory import ObjectFactory, SourceFactory
+
+try:
+ import dbus
+ import dbus.glib
+ HAVE_DBUS = True
+except:
+ HAVE_DBUS = False
(AUDIO_DEVICE,
VIDEO_DEVICE,
- UNKNOWN_MEDIA_DEVICE) = range(3)
+ UNKNOWN_DEVICE_MEDIA_TYPE) = range(3)
(SOURCE_DEVICE,
SINK_DEVICE,
- UNKNOWN_DIRECTION_DEVICE) = range(3)
+ UNKNOWN_DEVICE_DIRECTION) = range(3)
# A device can be categorized as follows:
# Media type handled:
@@ -45,6 +52,16 @@
# * sink : consumes data
#
+def get_probe():
+ """
+ Returns the default DeviceProbe for the current system.
+
+ If no suitable DeviceProbe implementation is available, returns None.
+ """
+ if HAVE_DBUS:
+ return HalDeviceProbe()
+ return None
+
class DeviceProbe(object):
"""
Allows listing of the various devices available.
@@ -63,12 +80,25 @@
"""
raise NotImplementedError
+ def getAudioSourceDevices(self):
+ return self.getSourceDevices(media_type=AUDIO_DEVICE)
+
+ def getVideoSourceDevices(self):
+ return self.getSourceDevices(media_type=VIDEO_DEVICE)
+
def getSinkDevices(self, media_type):
""" Returns a list of available SinkDeviceFactory for
the given mediatype
"""
raise NotImplementedError
+ def getAudioSinkDevices(self):
+ return self.getSinkDevices(media_type=AUDIO_DEVICE)
+
+ def getVideoSinkDevices(self):
+ return self.getSinkDevices(media_type=VIDEO_DEVICE)
+
+
class HalDeviceProbe(DeviceProbe):
"""
Probes for devices using HAL
@@ -76,17 +106,95 @@
def __init__(self):
DeviceProbe.__init__(self)
- # install dbus listener
- # FIXME: Finish implementing
+ # UDI : DeviceFactory
+ self.__sources = {}
+ self.__sinks = {}
+
+ self.bus = dbus.SystemBus()
+ self.managerobj = self.bus.get_object('org.freedesktop.Hal',
+ '/org/freedesktop/Hal/Manager')
+ self.manager = dbus.Interface(self.managerobj,
+ 'org.freedesktop.Hal.Manager')
+
+ # we want to be warned when devices are added and removed
+ self.manager.connect_to_signal("DeviceAdded",
+ self.__deviceAddedCb)
+ self.manager.connect_to_signal("DeviceRemoved",
+ self.__deviceRemovedCb)
+
+ # Find v4l ...
+ for dev in self.manager.FindDeviceByCapability("video4linux"):
+ self.__processUDI(dev)
+ # ... and alsa devices
+ for dev in self.manager.FindDeviceByCapability("alsa"):
+ self.__processUDI(dev)
+
+
+ def getSourceDevices(self, media_type):
+ return self.__getDevs(media_type, self.__sources)
+
+ def getSinkDevices(self, media_type):
+ return self.__getDevs(media_type, self.__sinks)
+
+ # PRIVATE
+
+ def __getDevs(self, media_type, sr):
+ if media_type == AUDIO_DEVICE:
+ return [sr[x] for x in sr.keys() if sr[x].is_audio]
+ elif media_type == VIDEO_DEVICE:
+ return [sr[x] for x in sr.keys() if sr[x].is_video]
+
+ def __processUDI(self, device_udi):
+ if device_udi in self.__sources.keys() or device_udi in self.__sinks.keys():
+ # we already have this device
+ return
+
+ # Get the object
+ # FIXME : Notify !
+ dev = self.bus.get_object("org.freedesktop.Hal",
+ device_udi)
+ devobject = dbus.Interface(dev, 'org.freedesktop.Hal.Device')
+ if devobject.QueryCapability("video4linux"):
+ location = devobject.GetProperty("video4linux.device")
+ self.__sources[dev] = V4LSourceDeviceFactory(device=location)
+ elif devobject.QueryCapability("alsa"):
+ alsatype = devobject.GetProperty("alsa.type")
+ if alsatype in ["capture", "playback"]:
+ card = devobject.GetProperty("alsa.card")
+ device = devobject.GetProperty("alsa.device")
+ info = devobject.GetProperty("alsa.card_id")
+ if alsatype == "capture":
+ self.__sources[dev] = AlsaSourceDeviceFactory(card=card,
+ device=device,
+ displayname=info)
+ elif alsatype == "playback":
+ self.__sinks[dev] = AlsaSinkDeviceFactory(card=card,
+ device=device,
+ displayname=info)
+
+ def __deviceAddedCb(self, device_udi, *args):
+ self.__processUDI(device_udi)
+
+ def __deviceRemovedCb(self, device_udi, *args):
+ # FIXME : Notify !
+ if self.__sources.has_key(device_udi):
+ del self.__sources[device_udi]
+ elif self.__sinkss.has_key(device_udi):
+ del self.__sinkss[device_udi]
+
+
class SourceDeviceFactory(SourceFactory):
pass
+class SinkDeviceFactory(ObjectFactory):
+ pass
+
class AlsaSourceDeviceFactory(SourceDeviceFactory):
- def __init__(self, card, device):
- SourceDeviceFactory.__init__(self)
- self.setAudio(True)
+ def __init__(self, card, device, *args, **kwargs):
+ SourceDeviceFactory.__init__(self, *args, **kwargs)
+ self.is_audio = True
self._card = card
self._device = device
@@ -95,26 +203,41 @@
alsa.set_property("device", "hw:%d,%d" % (self._card, self._device))
return alsa
+ def __repr__(self):
+ return "<%s: %s [hw:%s,%s]>" % (self.__class__.__name__,
+ self._displayname or self._name,
+ self._card, self._device)
+
+class AlsaSinkDeviceFactory(SinkDeviceFactory):
+ def __init__(self, card, device, *args, **kwargs):
+ SinkDeviceFactory.__init__(self, *args, **kwargs)
+ self.is_audio = True
+ self._card = card
+ self._device = device
+
+ def makeAudioBin(self):
+ alsa = gst.element_factory_make("alsasink")
+ alsa.set_property("device", "hw:%d,%d" % (self._card, self._device))
+ return alsa
+
+ def __repr__(self):
+ return "<%s: %s [hw:%s,%s]>" % (self.__class__.__name__,
+ self._displayname or self._name,
+ self._card, self._device)
+
+
+
class V4LSourceDeviceFactory(SourceDeviceFactory):
- def __init__(self, device):
- SourceDeviceFactory.__init__(self)
- self.setAudio(True)
+ def __init__(self, device, *args, **kwargs):
+ SourceDeviceFactory.__init__(self, *args, **kwargs)
+ self.is_video = True
self._device = device
def makeVideoBin(self):
+ # FIXME : we need to do some probbing to figure out if we should use
+ # v4l or v4l2
v4l = gst.element_factory_make("v4lsrc")
v4l.set_property("device", self._device)
return v4l
-class V4L2SourceDeviceFactory(SourceDeviceFactory):
-
- def __init__(self, device):
- SourceDeviceFactory.__init__(self)
- self.setAudio(True)
- self._device = device
-
- def makeVideoBin(self):
- v4l2 = gst.element_factory_make("v4l2src")
- v4l2.set_property("device", self._device)
- return v4l2
Modified: trunk/pitivi/objectfactory.py
==============================================================================
--- trunk/pitivi/objectfactory.py (original)
+++ trunk/pitivi/objectfactory.py Fri Sep 26 19:43:30 2008
@@ -122,6 +122,8 @@
""" sets whether the element has video stream """
self.set_property("is-video", is_video)
+ def __repr__(self):
+ return "<%s: %s>" % (self.__class__.__name__, self._displayname or self._name)
def addMediaTags(self, tags=[]):
""" Add the given gst.Tag or gst.TagList to the factory """
gst.debug("tags:%s" % tags)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]