From 7c6b7a0ac761efc88412309d3660529975b87453 Mon Sep 17 00:00:00 2001 From: marcus Date: Sat, 17 Apr 2010 03:06:16 +0000 Subject: Port back to using hal instead of gudev. git-svn-id: svn://creme-brulee.marcuscom.com/ports/trunk@14046 df743ca5-7f9a-e211-a948-0013205c9059 --- multimedia/cheese/Makefile | 3 +- multimedia/cheese/files/patch-configure | 225 +++++++++++ .../patch-libcheese_cheese-camera-device-monitor.c | 429 +++++++++++++++++++++ 3 files changed, 656 insertions(+), 1 deletion(-) create mode 100644 multimedia/cheese/files/patch-configure create mode 100644 multimedia/cheese/files/patch-libcheese_cheese-camera-device-monitor.c diff --git a/multimedia/cheese/Makefile b/multimedia/cheese/Makefile index e653f0733..df2d9b5c2 100644 --- a/multimedia/cheese/Makefile +++ b/multimedia/cheese/Makefile @@ -3,11 +3,12 @@ # Whom: FreeBSD GNOME Team # # $FreeBSD$ -# $MCom: ports/multimedia/cheese/Makefile,v 1.51 2010/03/14 16:20:30 kwm Exp $ +# $MCom: ports/multimedia/cheese/Makefile,v 1.52 2010/04/05 02:34:02 marcus Exp $ # PORTNAME= cheese PORTVERSION= 2.30.0 +PORTREVISION= 1 CATEGORIES= multimedia gnome MASTER_SITES= GNOME DIST_SUBDIR= gnome2 diff --git a/multimedia/cheese/files/patch-configure b/multimedia/cheese/files/patch-configure new file mode 100644 index 000000000..f0bc10f97 --- /dev/null +++ b/multimedia/cheese/files/patch-configure @@ -0,0 +1,225 @@ +--- configure.orig 2010-04-16 22:54:43.000000000 -0400 ++++ configure 2010-04-16 22:56:36.000000000 -0400 +@@ -800,8 +800,8 @@ HAVE_XTEST_FALSE + HAVE_XTEST_TRUE + XTEST_LIBS + OS_LINUX +-UDEV_LIBS +-UDEV_CFLAGS ++HAL_LIBS ++HAL_CFLAGS + HAVE_GNOME_DOC_UTILS_FALSE + HAVE_GNOME_DOC_UTILS_TRUE + DISTCHECK_CONFIGURE_FLAGS +@@ -1008,8 +1008,8 @@ LIBS + CPPFLAGS + CPP + PKG_CONFIG +-UDEV_CFLAGS +-UDEV_LIBS ++HAL_CFLAGS ++HAL_LIBS + CHEESE_CFLAGS + CHEESE_LIBS' + +@@ -1688,8 +1688,8 @@ Some influential environment variables: + you have headers in a nonstandard directory + CPP C preprocessor + PKG_CONFIG path to pkg-config utility +- UDEV_CFLAGS C compiler flags for UDEV, overriding pkg-config +- UDEV_LIBS linker flags for UDEV, overriding pkg-config ++ HAL_CFLAGS C compiler flags for HAL, overriding pkg-config ++ HAL_LIBS linker flags for HAL, overriding pkg-config + CHEESE_CFLAGS + C compiler flags for CHEESE, overriding pkg-config + CHEESE_LIBS linker flags for CHEESE, overriding pkg-config +@@ -15729,38 +15729,38 @@ LIBRSVG_REQUIRED=2.18.0 + # Check for udev + #******************************************************************************* + +-UDEV_PKG= ++HAL_PKG= + + pkg_failed=no +-{ $as_echo "$as_me:$LINENO: checking for UDEV" >&5 +-$as_echo_n "checking for UDEV... " >&6; } ++{ $as_echo "$as_me:$LINENO: checking for HAL" >&5 ++$as_echo_n "checking for HAL... " >&6; } + +-if test -n "$UDEV_CFLAGS"; then +- pkg_cv_UDEV_CFLAGS="$UDEV_CFLAGS" ++if test -n "$HAL_CFLAGS"; then ++ pkg_cv_HAL_CFLAGS="$HAL_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ +- { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gudev-1.0\"") >&5 +- ($PKG_CONFIG --exists --print-errors "gudev-1.0") 2>&5 ++ { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"hal\"") >&5 ++ ($PKG_CONFIG --exists --print-errors "hal") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then +- pkg_cv_UDEV_CFLAGS=`$PKG_CONFIG --cflags "gudev-1.0" 2>/dev/null` ++ pkg_cv_HAL_CFLAGS=`$PKG_CONFIG --cflags "hal" 2>/dev/null` + else + pkg_failed=yes + fi + else + pkg_failed=untried + fi +-if test -n "$UDEV_LIBS"; then +- pkg_cv_UDEV_LIBS="$UDEV_LIBS" ++if test -n "$HAL_LIBS"; then ++ pkg_cv_HAL_LIBS="$HAL_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ +- { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gudev-1.0\"") >&5 +- ($PKG_CONFIG --exists --print-errors "gudev-1.0") 2>&5 ++ { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"hal\"") >&5 ++ ($PKG_CONFIG --exists --print-errors "hal") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then +- pkg_cv_UDEV_LIBS=`$PKG_CONFIG --libs "gudev-1.0" 2>/dev/null` ++ pkg_cv_HAL_LIBS=`$PKG_CONFIG --libs "hal" 2>/dev/null` + else + pkg_failed=yes + fi +@@ -15778,29 +15778,29 @@ else + _pkg_short_errors_supported=no + fi + if test $_pkg_short_errors_supported = yes; then +- UDEV_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "gudev-1.0" 2>&1` ++ HAL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "hal" 2>&1` + else +- UDEV_PKG_ERRORS=`$PKG_CONFIG --print-errors "gudev-1.0" 2>&1` ++ HAL_PKG_ERRORS=`$PKG_CONFIG --print-errors "hal" 2>&1` + fi + # Put the nasty error message in config.log where it belongs +- echo "$UDEV_PKG_ERRORS" >&5 ++ echo "$HAL_PKG_ERRORS" >&5 + + { $as_echo "$as_me:$LINENO: result: no" >&5 + $as_echo "no" >&6; } +- UDEV_PKG= ++ HAL_PKG= + elif test $pkg_failed = untried; then +- UDEV_PKG= ++ HAL_PKG= + else +- UDEV_CFLAGS=$pkg_cv_UDEV_CFLAGS +- UDEV_LIBS=$pkg_cv_UDEV_LIBS ++ HAL_CFLAGS=$pkg_cv_HAL_CFLAGS ++ HAL_LIBS=$pkg_cv_HAL_LIBS + { $as_echo "$as_me:$LINENO: result: yes" >&5 + $as_echo "yes" >&6; } + + cat >>confdefs.h <<\_ACEOF +-#define HAVE_UDEV 1 ++#define HAVE_HAL 1 + _ACEOF + +- UDEV_PKG=gudev-1.0 ++ HAL_PKG=hal + fi + + { $as_echo "$as_me:$LINENO: checking operating system" >&5 +@@ -15815,7 +15815,7 @@ _ACEOF + + { $as_echo "$as_me:$LINENO: result: Linux" >&5 + $as_echo "Linux" >&6; } +- if test x$UDEV_PKG = "x" ; then ++ if test x$HAL_PKG = "x" ; then + { { $as_echo "$as_me:$LINENO: error: libgudev is required under Linux and not installed" >&5 + $as_echo "$as_me: error: libgudev is required under Linux and not installed" >&2;} + { (exit 1); exit 1; }; } +@@ -16213,7 +16213,7 @@ if test -n "$CHEESE_CFLAGS"; then + dbus-glib-1 >= \$DBUS_GLIB_REQUIRED \\ + pangocairo >= \$PANGOCAIRO_REQUIRED \\ + librsvg-2.0 >= \$LIBRSVG_REQUIRED +- libcanberra-gtk \$UDEV_PKG\"") >&5 ++ libcanberra-gtk \$HAL_PKG\"") >&5 + ($PKG_CONFIG --exists --print-errors "\ + glib-2.0 >= $GLIB_REQUIRED \ + gobject-2.0 >= $GOBJECT_REQUIRED \ +@@ -16229,7 +16229,7 @@ if test -n "$CHEESE_CFLAGS"; then + dbus-glib-1 >= $DBUS_GLIB_REQUIRED \ + pangocairo >= $PANGOCAIRO_REQUIRED \ + librsvg-2.0 >= $LIBRSVG_REQUIRED +- libcanberra-gtk $UDEV_PKG") 2>&5 ++ libcanberra-gtk $HAL_PKG") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then +@@ -16248,7 +16248,7 @@ if test -n "$CHEESE_CFLAGS"; then + dbus-glib-1 >= $DBUS_GLIB_REQUIRED \ + pangocairo >= $PANGOCAIRO_REQUIRED \ + librsvg-2.0 >= $LIBRSVG_REQUIRED +- libcanberra-gtk $UDEV_PKG" 2>/dev/null` ++ libcanberra-gtk $HAL_PKG" 2>/dev/null` + else + pkg_failed=yes + fi +@@ -16274,7 +16274,7 @@ if test -n "$CHEESE_LIBS"; then + dbus-glib-1 >= \$DBUS_GLIB_REQUIRED \\ + pangocairo >= \$PANGOCAIRO_REQUIRED \\ + librsvg-2.0 >= \$LIBRSVG_REQUIRED +- libcanberra-gtk \$UDEV_PKG\"") >&5 ++ libcanberra-gtk \$HAL_PKG\"") >&5 + ($PKG_CONFIG --exists --print-errors "\ + glib-2.0 >= $GLIB_REQUIRED \ + gobject-2.0 >= $GOBJECT_REQUIRED \ +@@ -16290,7 +16290,7 @@ if test -n "$CHEESE_LIBS"; then + dbus-glib-1 >= $DBUS_GLIB_REQUIRED \ + pangocairo >= $PANGOCAIRO_REQUIRED \ + librsvg-2.0 >= $LIBRSVG_REQUIRED +- libcanberra-gtk $UDEV_PKG") 2>&5 ++ libcanberra-gtk $HAL_PKG") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then +@@ -16309,7 +16309,7 @@ if test -n "$CHEESE_LIBS"; then + dbus-glib-1 >= $DBUS_GLIB_REQUIRED \ + pangocairo >= $PANGOCAIRO_REQUIRED \ + librsvg-2.0 >= $LIBRSVG_REQUIRED +- libcanberra-gtk $UDEV_PKG" 2>/dev/null` ++ libcanberra-gtk $HAL_PKG" 2>/dev/null` + else + pkg_failed=yes + fi +@@ -16342,7 +16342,7 @@ fi + dbus-glib-1 >= $DBUS_GLIB_REQUIRED \ + pangocairo >= $PANGOCAIRO_REQUIRED \ + librsvg-2.0 >= $LIBRSVG_REQUIRED +- libcanberra-gtk $UDEV_PKG" 2>&1` ++ libcanberra-gtk $HAL_PKG" 2>&1` + else + CHEESE_PKG_ERRORS=`$PKG_CONFIG --print-errors "\ + glib-2.0 >= $GLIB_REQUIRED \ +@@ -16359,7 +16359,7 @@ fi + dbus-glib-1 >= $DBUS_GLIB_REQUIRED \ + pangocairo >= $PANGOCAIRO_REQUIRED \ + librsvg-2.0 >= $LIBRSVG_REQUIRED +- libcanberra-gtk $UDEV_PKG" 2>&1` ++ libcanberra-gtk $HAL_PKG" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$CHEESE_PKG_ERRORS" >&5 +@@ -16379,7 +16379,7 @@ fi + dbus-glib-1 >= $DBUS_GLIB_REQUIRED \ + pangocairo >= $PANGOCAIRO_REQUIRED \ + librsvg-2.0 >= $LIBRSVG_REQUIRED +- libcanberra-gtk $UDEV_PKG) were not met: ++ libcanberra-gtk $HAL_PKG) were not met: + + $CHEESE_PKG_ERRORS + +@@ -16405,7 +16405,7 @@ $as_echo "$as_me: error: Package require + dbus-glib-1 >= $DBUS_GLIB_REQUIRED \ + pangocairo >= $PANGOCAIRO_REQUIRED \ + librsvg-2.0 >= $LIBRSVG_REQUIRED +- libcanberra-gtk $UDEV_PKG) were not met: ++ libcanberra-gtk $HAL_PKG) were not met: + + $CHEESE_PKG_ERRORS + diff --git a/multimedia/cheese/files/patch-libcheese_cheese-camera-device-monitor.c b/multimedia/cheese/files/patch-libcheese_cheese-camera-device-monitor.c new file mode 100644 index 000000000..f3f604a25 --- /dev/null +++ b/multimedia/cheese/files/patch-libcheese_cheese-camera-device-monitor.c @@ -0,0 +1,429 @@ +--- cheese-camera-device-monitor.c.orig 2010-04-16 22:08:31.000000000 -0400 ++++ cheese-camera-device-monitor.c 2010-04-16 23:01:33.000000000 -0400 +@@ -25,24 +25,9 @@ + + #include + #include ++#include + #include + +-#ifdef HAVE_UDEV +- #define G_UDEV_API_IS_SUBJECT_TO_CHANGE 1 +- #include +-#else +- #include +- #include +- #include +- #if USE_SYS_VIDEOIO_H > 0 +- #include +- #include +- #elif defined (__sun) +- #include +- #include +- #endif /* USE_SYS_VIDEOIO_H */ +-#endif +- + #include "cheese-camera-device-monitor.h" + #include "cheese-marshal.h" + +@@ -54,9 +39,9 @@ + * #CheeseCameraDeviceMonitor provides a basic interface for + * video4linux device enumeration and hotplugging. + * +- * It uses either GUdev or some platform specific code to list video ++ * It uses either HAL or some platform specific code to list video + * devices. It is also capable (right now in linux only, with the +- * udev backend) to monitor device plugging and emit a ++ * hal backend) to monitor device plugging and emit a + * CheeseCameraDeviceMonitor::added or + * CheeseCameraDeviceMonitor::removed signal when an event happens. + */ +@@ -80,11 +65,9 @@ enum CheeseCameraDeviceMonitorError + + typedef struct + { +-#ifdef HAVE_UDEV +- GUdevClient *client; +-#else ++ DBusConnection *connection; ++ LibHalContext *hal_ctx; + guint filler; +-#endif /* HAVE_UDEV */ + } CheeseCameraDeviceMonitorPrivate; + + enum +@@ -102,111 +85,71 @@ cheese_camera_device_monitor_error_quark + return g_quark_from_static_string ("cheese-camera-error-quark"); + } + +-#ifdef HAVE_UDEV + static void +-cheese_camera_device_monitor_added (CheeseCameraDeviceMonitor *monitor, +- GUdevDevice *udevice) ++cheese_camera_device_monitor_handle_udi (CheeseCameraDeviceMonitor *monitor, ++ const char *udi) + { +- const char *device_file; +- const char *product_name; +- const char *vendor; +- const char *product; +- const char *bus; +- gint vendor_id = 0; +- gint product_id = 0; ++ CheeseCameraDeviceMonitorPrivate *priv = CHEESE_CAMERA_DEVICE_MONITOR_GET_PRIVATE (monitor); ++ char *device_file; ++ char *product_name; ++ char *capstr; + gint v4l_version = 0; ++ DBusError error; + +- const gchar *devpath = g_udev_device_get_property (udevice, "DEVPATH"); ++ GST_INFO ("Checking hal device '%s'", udi); + +- GST_INFO ("Checking udev device '%s'", devpath); ++ dbus_error_init (&error); + +- bus = g_udev_device_get_property (udevice, "ID_BUS"); +- if (g_strcmp0 (bus, "usb") == 0) +- { +- vendor = g_udev_device_get_property (udevice, "ID_VENDOR_ID"); +- if (vendor != NULL) +- vendor_id = g_ascii_strtoll (vendor, NULL, 16); +- product = g_udev_device_get_property (udevice, "ID_MODEL_ID"); +- if (product != NULL) +- product_id = g_ascii_strtoll (vendor, NULL, 16); +- if (vendor_id == 0 || product_id == 0) +- { +- GST_WARNING ("Error getting vendor and product id"); +- } +- else +- { +- GST_INFO ("Found device %04x:%04x, getting capabilities...", vendor_id, product_id); +- } +- } +- else ++ product_name = libhal_device_get_property_string (priv->hal_ctx, udi, "info.product", &error); ++ if (dbus_error_is_set (&error)) + { +- GST_INFO ("Not an usb device, skipping vendor and model id retrieval"); +- } +- +- device_file = g_udev_device_get_device_file (udevice); +- if (device_file == NULL) +- { +- GST_WARNING ("Error getting V4L device"); ++ GST_WARNING ("error getting product name: %s: %s", error.name, error.message); ++ dbus_error_free (&error); + return; + } + +- /* vbi devices support capture capability too, but cannot be used, +- * so detect them by device name */ +- if (strstr (device_file, "vbi")) ++ device_file = libhal_device_get_property_string (priv->hal_ctx, udi, "video4linux.device", &error); ++ if (dbus_error_is_set (&error)) + { +- GST_INFO ("Skipping vbi device: %s", device_file); ++ GST_WARNING ("error getting V4L device for %s: %s: %s", udi, error.name, error.message); ++ dbus_error_free (&error); ++ libhal_free_string (product_name); + return; + } + +- v4l_version = g_udev_device_get_property_as_int (udevice, "ID_V4L_VERSION"); +- if (v4l_version == 2 || v4l_version == 1) ++ capstr = libhal_device_get_property_string (priv->hal_ctx, udi, "video4linux.version", &error); ++ if (dbus_error_is_set (&error)) + { +- const char *caps; +- +- caps = g_udev_device_get_property (udevice, "ID_V4L_CAPABILITIES"); +- if (caps == NULL || strstr (caps, ":capture:") == NULL) +- { +- GST_WARNING ("Device %s seems to not have the capture capability, (radio tuner?)" +- "Removing it from device list.", device_file); +- return; +- } +- product_name = g_udev_device_get_property (udevice, "ID_V4L_PRODUCT"); +- } +- else if (v4l_version == 0) +- { +- GST_ERROR ("Fix your udev installation to include v4l_id, ignoring %s", device_file); ++ GST_WARNING ("error getting V4L version for %s: %s: %s", udi, error.name, error.message); ++ dbus_error_free (&error); ++ libhal_free_string (product_name); ++ libhal_free_string (device_file); + return; + } +- else +- { +- g_assert_not_reached (); +- } ++ ++ v4l_version = atoi (capstr); ++ libhal_free_string (capstr); + + g_signal_emit (monitor, monitor_signals[ADDED], 0, +- devpath, ++ udi, + device_file, + product_name, + v4l_version); + } + + static void +-cheese_camera_device_monitor_removed (CheeseCameraDeviceMonitor *monitor, +- GUdevDevice *udevice) ++cheese_camera_device_monitor_removed (LibHalContext *ctx, ++ const char *udi) + { +- g_signal_emit (monitor, monitor_signals[REMOVED], 0, +- g_udev_device_get_property (udevice, "DEVPATH")); +-} ++ CheeseCameraDeviceMonitor *monitor; ++ void *data; + +-static void +-cheese_camera_device_monitor_uevent_cb (GUdevClient *client, +- const gchar *action, +- GUdevDevice *udevice, +- CheeseCameraDeviceMonitor *monitor) +-{ +- if (g_str_equal (action, "remove")) +- cheese_camera_device_monitor_removed (monitor, udevice); +- else if (g_str_equal (action, "add")) +- cheese_camera_device_monitor_added (monitor, udevice); ++ data = libhal_ctx_get_user_data (ctx); ++ g_assert (data); ++ ++ monitor = CHEESE_CAMERA_DEVICE_MONITOR (data); ++ ++ g_signal_emit (monitor, monitor_signals[REMOVED], 0, udi); + } + + /** +@@ -222,115 +165,85 @@ void + cheese_camera_device_monitor_coldplug (CheeseCameraDeviceMonitor *monitor) + { + CheeseCameraDeviceMonitorPrivate *priv = CHEESE_CAMERA_DEVICE_MONITOR_GET_PRIVATE (monitor); +- GList *devices, *l; +- gint i = 0; ++ int i; ++ int num_udis = 0; ++ char **udis; ++ DBusError error; + +- if (priv->client == NULL) ++ GST_INFO ("Probing devices with HAL..."); ++ ++ if (priv->hal_ctx == NULL) + return; + +- GST_INFO ("Probing devices with udev..."); ++ dbus_error_init (&error); + +- devices = g_udev_client_query_by_subsystem (priv->client, "video4linux"); ++ udis = libhal_find_device_by_capability (priv->hal_ctx, "video4linux", &num_udis, &error); + +- /* Initialize camera structures */ +- for (l = devices; l != NULL; l = l->next) ++ if (dbus_error_is_set (&error)) + { +- cheese_camera_device_monitor_added (monitor, l->data); +- g_object_unref (l->data); +- i++; ++ GST_WARNING ("libhal_find_device_by_capability: %s: %s", error.name, error.message); ++ dbus_error_free (&error); ++ return; + } +- g_list_free (devices); ++ ++ /* Initialize camera structures */ ++ for (i = 0; i < num_udis; i++) ++ cheese_camera_device_monitor_handle_udi (monitor, udis[i]); ++ libhal_free_string_array (udis); + + if (i == 0) GST_WARNING ("No device found"); + } + +-#else /* HAVE_UDEV */ +-void +-cheese_camera_device_monitor_coldplug (CheeseCameraDeviceMonitor *monitor) ++static void ++cheese_camera_device_monitor_added (LibHalContext *ctx, const char *udi) + { +- #if 0 +- CheeseCameraDeviceMonitorPrivate *priv = CHEESE_CAMERA_DEVICE_MONITOR_GET_PRIVATE (monitor); +- struct v4l2_capability v2cap; +- struct video_capability v1cap; +- int fd, ok; +- +- if ((fd = open (device_path, O_RDONLY | O_NONBLOCK)) < 0) +- { +- g_warning ("Failed to open %s: %s", device_path, strerror (errno)); +- return; +- } +- ok = ioctl (fd, VIDIOC_QUERYCAP, &v2cap); +- if (ok < 0) +- { +- ok = ioctl (fd, VIDIOCGCAP, &v1cap); +- if (ok < 0) +- { +- g_warning ("Error while probing v4l capabilities for %s: %s", +- device_path, strerror (errno)); +- close (fd); +- return; +- } +- g_print ("Detected v4l device: %s\n", v1cap.name); +- g_print ("Device type: %d\n", v1cap.type); +- gstreamer_src = "v4lsrc"; +- product_name = v1cap.name; +- } +- else +- { +- guint cap = v2cap.capabilities; +- g_print ("Detected v4l2 device: %s\n", v2cap.card); +- g_print ("Driver: %s, version: %d\n", v2cap.driver, v2cap.version); +- +- /* g_print ("Bus info: %s\n", v2cap.bus_info); */ /* Doesn't seem anything useful */ +- g_print ("Capabilities: 0x%08X\n", v2cap.capabilities); +- if (!(cap & V4L2_CAP_VIDEO_CAPTURE)) +- { +- g_print ("Device %s seems to not have the capture capability, (radio tuner?)\n" +- "Removing it from device list.\n", device_path); +- close (fd); +- return; +- } +- gstreamer_src = "v4l2src"; +- product_name = (char *) v2cap.card; +- } +- close (fd); ++ CheeseCameraDeviceMonitor *monitor; ++ char **caps; ++ guint i; ++ void *data; + +- GList *devices, *l; ++ data = libhal_ctx_get_user_data (ctx); ++ g_assert (data); + +- g_print ("Probing devices with udev...\n"); ++ monitor = CHEESE_CAMERA_DEVICE_MONITOR (data); + +- if (priv->client == NULL) ++ caps = libhal_device_get_property_strlist (ctx, udi, "info.capabilities", NULL); ++ if (caps == NULL) + return; + +- devices = g_udev_client_query_by_subsystem (priv->client, "video4linux"); +- +- /* Initialize camera structures */ +- for (l = devices; l != NULL; l = l->next) ++ for (i = 0; caps[i] != NULL; i++) + { +- cheese_camera_device_monitor_added (monitor, l->data); +- g_object_unref (l->data); ++ if (g_strcmp0 (caps[i], "video4linux") == 0) ++ { ++ cheese_camera_device_monitor_handle_udi (monitor, udi); ++ break; ++ } + } +- g_list_free (devices); +- #endif +-} + +-#endif /* HAVE_UDEV */ ++ libhal_free_string_array (caps); ++} + + static void + cheese_camera_device_monitor_finalize (GObject *object) + { +-#ifdef HAVE_UDEV + CheeseCameraDeviceMonitor *monitor; + + monitor = CHEESE_CAMERA_DEVICE_MONITOR (object); + CheeseCameraDeviceMonitorPrivate *priv = CHEESE_CAMERA_DEVICE_MONITOR_GET_PRIVATE (monitor); + +- if (priv->client != NULL) ++ if (priv->connection != NULL) + { +- g_object_unref (priv->client); +- priv->client = NULL; ++ dbus_connection_unref (priv->connection); ++ priv->connection = NULL; + } +-#endif /* HAVE_UDEV */ ++ if (priv->hal_ctx != NULL) ++ { ++ libhal_ctx_set_device_added (priv->hal_ctx, NULL); ++ libhal_ctx_set_device_removed (priv->hal_ctx, NULL); ++ libhal_ctx_free (priv->hal_ctx); ++ priv->hal_ctx = NULL; ++ } ++ + G_OBJECT_CLASS (cheese_camera_device_monitor_parent_class)->finalize (object); + } + +@@ -385,14 +298,52 @@ cheese_camera_device_monitor_class_init + static void + cheese_camera_device_monitor_init (CheeseCameraDeviceMonitor *monitor) + { +-#ifdef HAVE_UDEV +- CheeseCameraDeviceMonitorPrivate *priv = CHEESE_CAMERA_DEVICE_MONITOR_GET_PRIVATE (monitor); +- const gchar *const subsystems[] = {"video4linux", NULL}; +- +- priv->client = g_udev_client_new (subsystems); +- g_signal_connect (G_OBJECT (priv->client), "uevent", +- G_CALLBACK (cheese_camera_device_monitor_uevent_cb), monitor); +-#endif /* HAVE_UDEV */ ++ CheeseCameraDeviceMonitorPrivate *priv = CHEESE_CAMERA_DEVICE_MONITOR_GET_PRIVATE (monitor); ++ LibHalContext *hal_ctx; ++ DBusError error; ++ ++ dbus_error_init (&error); ++ ++ priv->connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error); ++ dbus_connection_set_exit_on_disconnect (priv->connection, FALSE); ++ ++ hal_ctx = libhal_ctx_new (); ++ if (hal_ctx == NULL) ++ { ++ GST_WARNING ("Could not create libhal context"); ++ dbus_error_free (&error); ++ return; ++ } ++ ++ if (!libhal_ctx_set_dbus_connection (hal_ctx, priv->connection)) ++ { ++ GST_WARNING ("libhal_ctx_set_dbus_connection: %s: %s", error.name, error.message); ++ dbus_error_free (&error); ++ return; ++ } ++ ++ if (!libhal_ctx_init (hal_ctx, &error)) ++ { ++ if (dbus_error_is_set (&error)) ++ { ++ GST_WARNING ("libhal_ctx_init: %s: %s", error.name, error.message); ++ dbus_error_free (&error); ++ } ++ GST_WARNING ("Could not initialise connection to hald.\n" ++ "Normally this means the HAL daemon (hald) is not running or not ready"); ++ return; ++ } ++ ++ dbus_connection_setup_with_g_main (priv->connection, NULL); ++ ++ if (!libhal_ctx_set_user_data (hal_ctx, monitor)) ++ GST_WARNING ("Failed to set user data on HAL context"); ++ if (!libhal_ctx_set_device_added (hal_ctx, cheese_camera_device_monitor_added)) ++ GST_WARNING ("Failed to connect to device added signal from HAL"); ++ if (!libhal_ctx_set_device_removed (hal_ctx, cheese_camera_device_monitor_removed)) ++ GST_WARNING ("Failed to connect to device removed signal from HAL"); ++ ++ priv->hal_ctx = hal_ctx; + } + + /** -- cgit v1.2.3