resindvd: Make the next/prev angle switching cycle at the ends
authorJan Schmidt <thaytan@noraisin.net>
Tue, 5 May 2009 10:34:26 +0000 (11:34 +0100)
committerJan Schmidt <thaytan@noraisin.net>
Wed, 6 May 2009 19:19:48 +0000 (20:19 +0100)
When the current angle is 1 and prev_angle is requested, loop to the
maximum angle and vice versa for next_angle

ext/resindvd/resindvdsrc.c

index a2f3161..ab0fdef 100644 (file)
@@ -1172,6 +1172,7 @@ static RsnNavResult
 rsn_dvdsrc_do_command (resinDvdSrc * src, GstNavigationCommand command)
 {
   RsnNavResult result = RSN_NAV_RESULT_NONE;
+  gint new_angle = 0;
 
   switch (command) {
     case GST_NAVIGATION_COMMAND_DVD_MENU:
@@ -1212,25 +1213,40 @@ rsn_dvdsrc_do_command (resinDvdSrc * src, GstNavigationCommand command)
 
     case GST_NAVIGATION_COMMAND_PREV_ANGLE:{
       gint32 cur, agls;
-      if (dvdnav_get_angle_info (src->dvdnav, &cur, &agls) == DVDNAV_STATUS_OK
-          && cur > 0
-          && dvdnav_angle_change (src->dvdnav, cur - 1) == DVDNAV_STATUS_OK)
-        GST_INFO_OBJECT (src, "Switched to angle %d", cur - 1);
-      /* Angle switches are seamless and involve no branching */
+      if (dvdnav_get_angle_info (src->dvdnav, &cur, &agls) == DVDNAV_STATUS_OK) {
+        if (cur > 0 &&
+            dvdnav_angle_change (src->dvdnav, cur - 1) == DVDNAV_STATUS_OK) {
+          new_angle = cur - 1;
+        } else if (cur == 1 &&
+            dvdnav_angle_change (src->dvdnav, agls) == DVDNAV_STATUS_OK) {
+          new_angle = agls;
+        }
+        /* Angle switches are seamless and involve no branching */
+      }
       break;
     }
     case GST_NAVIGATION_COMMAND_NEXT_ANGLE:{
       gint32 cur, agls;
-      if (dvdnav_get_angle_info (src->dvdnav, &cur, &agls) == DVDNAV_STATUS_OK
-          && dvdnav_angle_change (src->dvdnav, cur + 1) == DVDNAV_STATUS_OK)
-        GST_INFO_OBJECT (src, "Switched to angle %d", cur + 1);
-      /* Angle switches are seamless and involve no branching */
+      if (dvdnav_get_angle_info (src->dvdnav, &cur, &agls) == DVDNAV_STATUS_OK) {
+        if (cur < agls
+            && dvdnav_angle_change (src->dvdnav, cur + 1) == DVDNAV_STATUS_OK) {
+          new_angle = cur + 1;
+        } else if (cur == agls
+            && dvdnav_angle_change (src->dvdnav, 1) == DVDNAV_STATUS_OK) {
+          new_angle = 1;
+        }
+        /* Angle switches are seamless and involve no branching */
+      }
       break;
     }
     default:
       break;
   }
 
+  if (new_angle) {
+    GST_INFO_OBJECT (src, "Switched to angle %d", new_angle);
+  }
+
   return result;
 }