Mercurial > libdvdnav.hg
comparison vm.c @ 88:929f732a0135 src
Implement proper prev/next chapter/part.
I don't know why someone has not noticed the problem until now.
author | jcdutton |
---|---|
date | Mon, 02 Sep 2002 03:20:01 +0000 |
parents | b1cbe3464fb9 |
children | eeabf5a51b2b |
comparison
equal
deleted
inserted
replaced
87:b1cbe3464fb9 | 88:929f732a0135 |
---|---|
436 /* return 0; */ | 436 /* return 0; */ |
437 } | 437 } |
438 return vm_top_pg(vm); | 438 return vm_top_pg(vm); |
439 } | 439 } |
440 | 440 |
441 int vm_prev_part(vm_t *vm) | |
442 { | |
443 link_t link_values; | |
444 vts_ptt_srpt_t *vts_ptt_srpt; | |
445 int title, part=0; | |
446 int found = 0; | |
447 int16_t pgcN, pgN; | |
448 | |
449 if((!vm) || (!vm->vtsi) ) | |
450 return S_ERR; | |
451 | |
452 if(!(vm->state.pgc) ) | |
453 return S_ERR; | |
454 if (vm->state.domain != VTS_DOMAIN) | |
455 return S_ERR; | |
456 vts_ptt_srpt = vm->vtsi->vts_ptt_srpt; | |
457 pgcN = get_PGCN(vm); | |
458 pgN = vm->state.pgN; | |
459 printf("VTS_PTT_SRPT - PGC: %3i PG: %3i\n", | |
460 pgcN, pgN); | |
461 for(title=0;( (title<vts_ptt_srpt->nr_of_srpts) && (found == 0) );title++) { | |
462 for(part=0;((part < vts_ptt_srpt->title[title].nr_of_ptts) && (found == 0));part++) { | |
463 if ( (vts_ptt_srpt->title[title].ptt[part].pgcn == pgcN) && | |
464 (vts_ptt_srpt->title[title].ptt[part].pgn == pgN ) ) { | |
465 found = 1; | |
466 break; | |
467 } | |
468 } | |
469 if (found != 0) break; | |
470 } | |
471 title++; | |
472 part++; | |
473 if (found == 1) { | |
474 fprintf(MSG_OUT, "libdvdnav: ************ this chapter FOUND!\n"); | |
475 printf("VTS_PTT_SRPT - Title %3i part %3i: PGC: %3i PG: %3i\n", | |
476 title, part, | |
477 vts_ptt_srpt->title[title-1].ptt[part-1].pgcn , | |
478 vts_ptt_srpt->title[title-1].ptt[part-1].pgn ); | |
479 } else { | |
480 fprintf(MSG_OUT, "libdvdnav: ************ this chapter NOT FOUND!\n"); | |
481 return S_ERR; | |
482 } | |
483 /* Make sure this is not the first chapter */ | |
484 if(part <= 1 ) { | |
485 fprintf(MSG_OUT, "libdvdnav: at first chapter. prev chapter failed.\n"); | |
486 return S_ERR; | |
487 } | |
488 part--; /* Previous chapter */ | |
489 if(set_VTS_PTT(vm,(vm->state).vtsN, title, part) == -1) | |
490 assert(0); | |
491 link_values = play_PGC_PG( vm, (vm->state).pgN ); | |
492 link_values = process_command(vm,link_values); | |
493 assert(link_values.command == PlayThis); | |
494 (vm->state).blockN = link_values.data1; | |
495 assert( (vm->state).blockN == 0 ); | |
496 vm->hop_channel++; | |
497 | |
498 fprintf(MSG_OUT, "libdvdnav: previous chapter done\n"); | |
499 | |
500 return 1; | |
501 } | |
502 | |
503 | |
504 int vm_next_part(vm_t *vm) | |
505 { | |
506 link_t link_values; | |
507 vts_ptt_srpt_t *vts_ptt_srpt; | |
508 int title, part=0; | |
509 int found = 0; | |
510 int16_t pgcN, pgN; | |
511 | |
512 if((!vm) || (!vm->vtsi) ) | |
513 return S_ERR; | |
514 | |
515 if(!(vm->state.pgc) ) | |
516 return S_ERR; | |
517 if (vm->state.domain != VTS_DOMAIN) | |
518 return S_ERR; | |
519 vts_ptt_srpt = vm->vtsi->vts_ptt_srpt; | |
520 pgcN = get_PGCN(vm); | |
521 pgN = vm->state.pgN; | |
522 printf("VTS_PTT_SRPT - PGC: %3i PG: %3i\n", | |
523 pgcN, pgN); | |
524 for(title=0;( (title<vts_ptt_srpt->nr_of_srpts) && (found == 0) );title++) { | |
525 for(part=0;((part < vts_ptt_srpt->title[title].nr_of_ptts) && (found == 0));part++) { | |
526 if ( (vts_ptt_srpt->title[title].ptt[part].pgcn == pgcN) && | |
527 (vts_ptt_srpt->title[title].ptt[part].pgn == pgN ) ) { | |
528 found = 1; | |
529 break; | |
530 } | |
531 } | |
532 if (found != 0) break; | |
533 } | |
534 title++; | |
535 part++; | |
536 if (found == 1) { | |
537 fprintf(MSG_OUT, "libdvdnav: ************ this chapter FOUND!\n"); | |
538 printf("VTS_PTT_SRPT - Title %3i part %3i: PGC: %3i PG: %3i\n", | |
539 title, part, | |
540 vts_ptt_srpt->title[title-1].ptt[part-1].pgcn , | |
541 vts_ptt_srpt->title[title-1].ptt[part-1].pgn ); | |
542 } else { | |
543 fprintf(MSG_OUT, "libdvdnav: ************ this chapter NOT FOUND!\n"); | |
544 } | |
545 /* Make sure this is not the last chapter */ | |
546 if(part >= vts_ptt_srpt->title[title-1].nr_of_ptts) { | |
547 fprintf(MSG_OUT, "libdvdnav: at last chapter. next chapter failed.\n"); | |
548 return S_ERR; | |
549 } | |
550 part++; /* Next chapter */ | |
551 if(set_VTS_PTT(vm,(vm->state).vtsN, title, part) == -1) | |
552 assert(0); | |
553 link_values = play_PGC_PG( vm, (vm->state).pgN ); | |
554 link_values = process_command(vm,link_values); | |
555 assert(link_values.command == PlayThis); | |
556 (vm->state).blockN = link_values.data1; | |
557 assert( (vm->state).blockN == 0 ); | |
558 vm->hop_channel++; | |
559 | |
560 fprintf(MSG_OUT, "libdvdnav: next chapter done\n"); | |
561 | |
562 return 1; | |
563 } | |
441 | 564 |
442 static domain_t menuid2domain(DVDMenuID_t menuid) | 565 static domain_t menuid2domain(DVDMenuID_t menuid) |
443 { | 566 { |
444 domain_t result = VTSM_DOMAIN; /* Really shouldn't have to.. */ | 567 domain_t result = VTSM_DOMAIN; /* Really shouldn't have to.. */ |
445 | 568 |
1832 return pgcit; | 1955 return pgcit; |
1833 } | 1956 } |
1834 | 1957 |
1835 /* | 1958 /* |
1836 * $Log$ | 1959 * $Log$ |
1960 * Revision 1.33 2002/09/02 03:20:01 jcdutton | |
1961 * Implement proper prev/next chapter/part. | |
1962 * I don't know why someone has not noticed the problem until now. | |
1963 * | |
1837 * Revision 1.32 2002/09/02 00:27:14 jcdutton | 1964 * Revision 1.32 2002/09/02 00:27:14 jcdutton |
1838 * Fix bug in JumpVTS_PTT command. | 1965 * Fix bug in JumpVTS_PTT command. |
1839 * | 1966 * |
1840 * Revision 1.31 2002/09/01 10:57:15 jcdutton | 1967 * Revision 1.31 2002/09/01 10:57:15 jcdutton |
1841 * Add a bit more debug info. Now print PGCN in debug. | 1968 * Add a bit more debug info. Now print PGCN in debug. |