changeset 102:3e6970dbe8d6 src

- allow seeking to offset 0 (pressing '0' in xine won't work otherwise) - add a forgotten break - lock the vm on the program jumps - jump to the end of the last cell when trying to jump to next program on last program - disable stills when doing program jumps
author mroi
date Fri, 27 Sep 2002 13:18:02 +0000
parents f885a4cb7bce
children 8905d8de7e91
files searching.c
diffstat 1 files changed, 15 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/searching.c	Sun Sep 22 11:53:32 2002 +0000
+++ b/searching.c	Fri Sep 27 13:18:02 2002 +0000
@@ -112,16 +112,13 @@
   dvd_state_t *state;
   dvdnav_status_t result;
 
-  if((!this) || (!this->vm) )
+  if((!this) || (!this->vm) || (!this->started))
     return -1;
   
   state = &(this->vm->state);
   if((!state) || (!state->pgc) )
     return -1;
    
-  if(offset == 0) 
-    return -1;
-
   if(this->position_current.still != 0)
     /* Cannot do seeking in a still frame. */
     return -1;
@@ -158,6 +155,7 @@
       return -1;
     }
     target = length - offset;
+    break;
    default:
     /* Error occured */
     pthread_mutex_unlock(&this->vm_lock);
@@ -238,15 +236,19 @@
   if((!state) || (!state->pgc) )
     return S_ERR;
 
+  pthread_mutex_lock(&this->vm_lock);
   /* Make sure this is not the first chapter */
   if(state->pgN <= 1 ) {
     fprintf(MSG_OUT, "libdvdnav: at first chapter. prev chapter failed.\n");
+    pthread_mutex_unlock(&this->vm_lock);
     return S_ERR;
   }
   fprintf(MSG_OUT, "libdvdnav: previous chapter\n");
   vm_jump_prog(this->vm, state->pgN - 1);
+  this->position_current.still = 0;
   this->vm->hop_channel++;
   fprintf(MSG_OUT, "libdvdnav: previous chapter done\n");
+  pthread_mutex_unlock(&this->vm_lock);
 
   return S_OK;
 }
@@ -271,15 +273,20 @@
   if((!state) || (!state->pgc) )
     return S_ERR;
 
+  pthread_mutex_lock(&this->vm_lock);
   /* Make sure this is not the last chapter */
   if(state->pgN >= state->pgc->nr_of_programs) {
-    fprintf(MSG_OUT, "libdvdnav: at last chapter. next chapter failed.\n");
-    return S_ERR;
+    fprintf(MSG_OUT, "libdvdnav: at last chapter. jumping to end of last cell.\n");
+    this->vm->state.cellN = this->vm->state.pgc->nr_of_cells;
+    vm_get_next_cell(this->vm);
+  } else {
+    fprintf(MSG_OUT, "libdvdnav: next chapter\n");
+    vm_jump_prog(this->vm, state->pgN + 1);
   }
-  fprintf(MSG_OUT, "libdvdnav: next chapter\n");
-  vm_jump_prog(this->vm, state->pgN + 1);
+  this->position_current.still = 0;
   this->vm->hop_channel++;
   fprintf(MSG_OUT, "libdvdnav: next chapter done\n");
+  pthread_mutex_unlock(&this->vm_lock);
 
   return S_OK;
 }