udev: handle "change" action properly, fix disc ejection/insertion
[vlc.git] / modules / services_discovery / udev.c
index 1bde9c9..93e0857 100644 (file)
@@ -71,6 +71,7 @@ struct subsys
     char * (*get_mrl) (struct udev_device *dev);
     char * (*get_name) (struct udev_device *dev);
     char * (*get_cat) (struct udev_device *dev);
+    int item_type;
 };
 
 struct services_discovery_sys_t
@@ -117,7 +118,8 @@ static int AddDevice (services_discovery_t *sd, struct udev_device *dev)
     char *name = p_sys->subsys->get_name (dev);
     input_item_t *item = input_item_NewWithType (VLC_OBJECT (sd), mrl,
                                                  name ? name : mrl,
-                                                 0, NULL, 0, -1, ITEM_TYPE_CARD);
+                                                 0, NULL, 0, -1,
+                                                 p_sys->subsys->item_type);
     msg_Dbg (sd, "adding %s (%s)", mrl, name);
     free (name);
     free (mrl);
@@ -170,15 +172,6 @@ static void RemoveDevice (services_discovery_t *sd, struct udev_device *dev)
     DestroyDevice (d);
 }
 
-static void HandleDevice (services_discovery_t *sd, struct udev_device *dev,
-                          bool add)
-{
-    if (!add)
-        RemoveDevice (sd, dev);
-    else
-        AddDevice (sd, dev);
-}
-
 static void *Run (void *);
 
 /**
@@ -228,7 +221,7 @@ static int Open (vlc_object_t *obj, const struct subsys *subsys)
     {
         const char *path = udev_list_entry_get_name (deventry);
         struct udev_device *dev = udev_device_new_from_syspath (udev, path);
-        HandleDevice (sd, dev, true);
+        AddDevice (sd, dev);
         udev_device_unref (dev);
     }
     udev_enumerate_unref (devenum);
@@ -291,13 +284,16 @@ static void *Run (void *data)
         if (dev == NULL)
             continue;
 
-        /* FIXME: handle change, offline, online */
         const char *action = udev_device_get_action (dev);
         if (!strcmp (action, "add"))
-            HandleDevice (sd, dev, true);
+            AddDevice (sd, dev);
         else if (!strcmp (action, "remove"))
-            HandleDevice (sd, dev, false);
-
+            RemoveDevice (sd, dev);
+        else if (!strcmp (action, "change"))
+        {
+            RemoveDevice (sd, dev);
+            AddDevice (sd, dev);
+        }
         udev_device_unref (dev);
     }
     return NULL;
@@ -390,7 +386,7 @@ static char *v4l_get_cat (struct udev_device *dev)
 int OpenV4L (vlc_object_t *obj)
 {
     static const struct subsys subsys = {
-        "video4linux", v4l_get_mrl, v4l_get_name, v4l_get_cat,
+        "video4linux", v4l_get_mrl, v4l_get_name, v4l_get_cat, ITEM_TYPE_CARD,
     };
 
     return Open (obj, &subsys);
@@ -465,7 +461,7 @@ static char *disc_get_cat (struct udev_device *dev)
 int OpenDisc (vlc_object_t *obj)
 {
     static const struct subsys subsys = {
-        "block", disc_get_mrl, disc_get_name, disc_get_cat,
+        "block", disc_get_mrl, disc_get_name, disc_get_cat, ITEM_TYPE_DISC,
     };
 
     return Open (obj, &subsys);