comparison vm/vm.c @ 256:6299ccea8a38 src

killing a lot of asserts and turning them into forced executions of Exit, moving the VM into the STOP domain; also use this condition to report failures right on VM start as problems with the disc (patch heavily inspired by Bastien)
author mroi
date Wed, 15 Dec 2004 21:16:58 +0000
parents f78669338b49
children 97ad00b13609
comparison
equal deleted inserted replaced
255:3e5192f8113f 256:6299ccea8a38
182 } else { 182 } else {
183 fprintf(MSG_OUT, "NAME OPEN FAILED\n"); 183 fprintf(MSG_OUT, "NAME OPEN FAILED\n");
184 } 184 }
185 } 185 }
186 186
187 static void ifoOpenNewVTSI(vm_t *vm, dvd_reader_t *dvd, int vtsN) { 187 static int ifoOpenNewVTSI(vm_t *vm, dvd_reader_t *dvd, int vtsN) {
188 if((vm->state).vtsN == vtsN) { 188 if((vm->state).vtsN == vtsN) {
189 return; /* We alread have it */ 189 return 1; /* We alread have it */
190 } 190 }
191 191
192 if(vm->vtsi != NULL) 192 if(vm->vtsi != NULL)
193 ifoClose(vm->vtsi); 193 ifoClose(vm->vtsi);
194 194
195 vm->vtsi = ifoOpenVTSI(dvd, vtsN); 195 vm->vtsi = ifoOpenVTSI(dvd, vtsN);
196 if(vm->vtsi == NULL) { 196 if(vm->vtsi == NULL) {
197 fprintf(MSG_OUT, "libdvdnav: ifoOpenVTSI failed - CRASHING!!!\n"); 197 fprintf(MSG_OUT, "libdvdnav: ifoOpenVTSI failed\n");
198 assert(0); 198 return 0;
199 } 199 }
200 if(!ifoRead_VTS_PTT_SRPT(vm->vtsi)) { 200 if(!ifoRead_VTS_PTT_SRPT(vm->vtsi)) {
201 fprintf(MSG_OUT, "libdvdnav: ifoRead_VTS_PTT_SRPT failed - CRASHING!!!\n"); 201 fprintf(MSG_OUT, "libdvdnav: ifoRead_VTS_PTT_SRPT failed\n");
202 assert(0); 202 return 0;
203 } 203 }
204 if(!ifoRead_PGCIT(vm->vtsi)) { 204 if(!ifoRead_PGCIT(vm->vtsi)) {
205 fprintf(MSG_OUT, "libdvdnav: ifoRead_PGCIT failed - CRASHING!!!\n"); 205 fprintf(MSG_OUT, "libdvdnav: ifoRead_PGCIT failed\n");
206 assert(0); 206 return 0;
207 } 207 }
208 if(!ifoRead_PGCI_UT(vm->vtsi)) { 208 if(!ifoRead_PGCI_UT(vm->vtsi)) {
209 fprintf(MSG_OUT, "libdvdnav: ifoRead_PGCI_UT failed - CRASHING!!!\n"); 209 fprintf(MSG_OUT, "libdvdnav: ifoRead_PGCI_UT failed\n");
210 assert(0); 210 return 0;
211 } 211 }
212 if(!ifoRead_VOBU_ADMAP(vm->vtsi)) { 212 if(!ifoRead_VOBU_ADMAP(vm->vtsi)) {
213 fprintf(MSG_OUT, "libdvdnav: ifoRead_VOBU_ADMAP vtsi failed - CRASHING\n"); 213 fprintf(MSG_OUT, "libdvdnav: ifoRead_VOBU_ADMAP vtsi failed\n");
214 assert(0); 214 return 0;
215 } 215 }
216 if(!ifoRead_TITLE_VOBU_ADMAP(vm->vtsi)) { 216 if(!ifoRead_TITLE_VOBU_ADMAP(vm->vtsi)) {
217 fprintf(MSG_OUT, "libdvdnav: ifoRead_TITLE_VOBU_ADMAP vtsi failed - CRASHING\n"); 217 fprintf(MSG_OUT, "libdvdnav: ifoRead_TITLE_VOBU_ADMAP vtsi failed\n");
218 assert(0); 218 return 0;
219 } 219 }
220 (vm->state).vtsN = vtsN; 220 (vm->state).vtsN = vtsN;
221
222 return 1;
221 } 223 }
222 224
223 225
224 /* Initialisation & Destruction */ 226 /* Initialisation & Destruction */
225 227
251 } 253 }
252 254
253 255
254 /* Basic Handling */ 256 /* Basic Handling */
255 257
256 void vm_start(vm_t *vm) { 258 int vm_start(vm_t *vm) {
257 /* Set pgc to FP (First Play) pgc */ 259 /* Set pgc to FP (First Play) pgc */
258 set_FP_PGC(vm); 260 set_FP_PGC(vm);
259 process_command(vm, play_PGC(vm)); 261 process_command(vm, play_PGC(vm));
262 return !vm->stopped;
260 } 263 }
261 264
262 void vm_stop(vm_t *vm) { 265 void vm_stop(vm_t *vm) {
263 if(vm->vmgi) { 266 if(vm->vmgi) {
264 ifoClose(vm->vmgi); 267 ifoClose(vm->vmgi);
380 /* open a new vtsi handle, because the copy might switch to another VTS */ 383 /* open a new vtsi handle, because the copy might switch to another VTS */
381 target->vtsi = NULL; 384 target->vtsi = NULL;
382 vtsN = (target->state).vtsN; 385 vtsN = (target->state).vtsN;
383 if (vtsN > 0) { 386 if (vtsN > 0) {
384 (target->state).vtsN = 0; 387 (target->state).vtsN = 0;
385 ifoOpenNewVTSI(target, target->dvd, vtsN); 388 if (!ifoOpenNewVTSI(target, target->dvd, vtsN))
389 assert(0);
386 390
387 /* restore pgc pointer into the new vtsi */ 391 /* restore pgc pointer into the new vtsi */
388 if (!set_PGCN(target, pgcN)) 392 if (!set_PGCN(target, pgcN))
389 assert(0); 393 assert(0);
390 (target->state).pgN = pgN; 394 (target->state).pgN = pgN;
1278 /* Link to Next Program Chain */ 1282 /* Link to Next Program Chain */
1279 /* BUTTON number:data1 */ 1283 /* BUTTON number:data1 */
1280 if(link_values.data1 != 0) 1284 if(link_values.data1 != 0)
1281 (vm->state).HL_BTNN_REG = link_values.data1 << 10; 1285 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
1282 assert((vm->state).pgc->next_pgc_nr != 0); 1286 assert((vm->state).pgc->next_pgc_nr != 0);
1283 if(!set_PGCN(vm, (vm->state).pgc->next_pgc_nr)) 1287 if(set_PGCN(vm, (vm->state).pgc->next_pgc_nr))
1284 assert(0); 1288 link_values = play_PGC(vm);
1285 link_values = play_PGC(vm); 1289 else
1290 link_values.command = Exit;
1286 break; 1291 break;
1287 case LinkPrevPGC: 1292 case LinkPrevPGC:
1288 /* Link to Previous Program Chain */ 1293 /* Link to Previous Program Chain */
1289 /* BUTTON number:data1 */ 1294 /* BUTTON number:data1 */
1290 if(link_values.data1 != 0) 1295 if(link_values.data1 != 0)
1291 (vm->state).HL_BTNN_REG = link_values.data1 << 10; 1296 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
1292 assert((vm->state).pgc->prev_pgc_nr != 0); 1297 assert((vm->state).pgc->prev_pgc_nr != 0);
1293 if(!set_PGCN(vm, (vm->state).pgc->prev_pgc_nr)) 1298 if(set_PGCN(vm, (vm->state).pgc->prev_pgc_nr))
1294 assert(0); 1299 link_values = play_PGC(vm);
1295 link_values = play_PGC(vm); 1300 else
1301 link_values.command = Exit;
1296 break; 1302 break;
1297 case LinkGoUpPGC: 1303 case LinkGoUpPGC:
1298 /* Link to GoUp Program Chain */ 1304 /* Link to GoUp Program Chain */
1299 /* BUTTON number:data1 */ 1305 /* BUTTON number:data1 */
1300 if(link_values.data1 != 0) 1306 if(link_values.data1 != 0)
1301 (vm->state).HL_BTNN_REG = link_values.data1 << 10; 1307 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
1302 assert((vm->state).pgc->goup_pgc_nr != 0); 1308 assert((vm->state).pgc->goup_pgc_nr != 0);
1303 if(!set_PGCN(vm, (vm->state).pgc->goup_pgc_nr)) 1309 if(set_PGCN(vm, (vm->state).pgc->goup_pgc_nr))
1304 assert(0); 1310 link_values = play_PGC(vm);
1305 link_values = play_PGC(vm); 1311 else
1312 link_values.command = Exit;
1306 break; 1313 break;
1307 case LinkTailPGC: 1314 case LinkTailPGC:
1308 /* Link to Tail of Program Chain */ 1315 /* Link to Tail of Program Chain */
1309 /* BUTTON number:data1 */ 1316 /* BUTTON number:data1 */
1310 if(link_values.data1 != 0) 1317 if(link_values.data1 != 0)
1323 link_values.command = Exit; 1330 link_values.command = Exit;
1324 break; 1331 break;
1325 } 1332 }
1326 1333
1327 (vm->state).domain = VTS_DOMAIN; 1334 (vm->state).domain = VTS_DOMAIN;
1328 ifoOpenNewVTSI(vm, vm->dvd, (vm->state).rsm_vtsN); 1335 if (!ifoOpenNewVTSI(vm, vm->dvd, (vm->state).rsm_vtsN))
1336 assert(0);
1329 set_PGCN(vm, (vm->state).rsm_pgcN); 1337 set_PGCN(vm, (vm->state).rsm_pgcN);
1330 1338
1331 /* These should never be set in SystemSpace and/or MenuSpace */ 1339 /* These should never be set in SystemSpace and/or MenuSpace */
1332 /* (vm->state).TTN_REG = rsm_tt; ?? */ 1340 /* (vm->state).TTN_REG = rsm_tt; ?? */
1333 /* (vm->state).TT_PGCN_REG = (vm->state).rsm_pgcN; ?? */ 1341 /* (vm->state).TT_PGCN_REG = (vm->state).rsm_pgcN; ?? */
1402 /* Only allowed from the First Play domain(PGC) */ 1410 /* Only allowed from the First Play domain(PGC) */
1403 /* or the Video Manager domain (VMG) */ 1411 /* or the Video Manager domain (VMG) */
1404 /* Stop SPRM9 Timer */ 1412 /* Stop SPRM9 Timer */
1405 /* Set SPRM1 and SPRM2 */ 1413 /* Set SPRM1 and SPRM2 */
1406 assert((vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */ 1414 assert((vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */
1407 if(!set_TT(vm, link_values.data1)) 1415 if(set_TT(vm, link_values.data1))
1408 assert(0); 1416 link_values = play_PGC(vm);
1409 link_values = play_PGC(vm); 1417 else
1418 link_values.command = Exit;
1410 break; 1419 break;
1411 case JumpVTS_TT: 1420 case JumpVTS_TT:
1412 /* Jump to Title:data1 in same VTS Title Domain */ 1421 /* Jump to Title:data1 in same VTS Title Domain */
1413 /* Only allowed from the VTS Menu Domain(VTSM) */ 1422 /* Only allowed from the VTS Menu Domain(VTSM) */
1414 /* or the Video Title Set Domain(VTS) */ 1423 /* or the Video Title Set Domain(VTS) */
1461 if(link_values.data1 != 0) { 1470 if(link_values.data1 != 0) {
1462 if (link_values.data1 != (vm->state).vtsN) { 1471 if (link_values.data1 != (vm->state).vtsN) {
1463 /* the normal case */ 1472 /* the normal case */
1464 assert((vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */ 1473 assert((vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */
1465 (vm->state).domain = VTSM_DOMAIN; 1474 (vm->state).domain = VTSM_DOMAIN;
1466 ifoOpenNewVTSI(vm, vm->dvd, link_values.data1); /* Also sets (vm->state).vtsN */ 1475 if (!ifoOpenNewVTSI(vm, vm->dvd, link_values.data1)) /* Also sets (vm->state).vtsN */
1476 assert(0);
1467 } else { 1477 } else {
1468 /* This happens on some discs like "Captain Scarlet & the Mysterons" or 1478 /* This happens on some discs like "Captain Scarlet & the Mysterons" or
1469 * the German RC2 of "Anatomie" in VTSM. */ 1479 * the German RC2 of "Anatomie" in VTSM. */
1470 assert((vm->state).domain == VTSM_DOMAIN || 1480 assert((vm->state).domain == VTSM_DOMAIN ||
1471 (vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */ 1481 (vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */
1574 static int set_VTS_PTT(vm_t *vm, int vtsN, int vts_ttn, int part) { 1584 static int set_VTS_PTT(vm_t *vm, int vtsN, int vts_ttn, int part) {
1575 int pgcN, pgN, res; 1585 int pgcN, pgN, res;
1576 1586
1577 (vm->state).domain = VTS_DOMAIN; 1587 (vm->state).domain = VTS_DOMAIN;
1578 1588
1579 if(vtsN != (vm->state).vtsN) 1589 if (vtsN != (vm->state).vtsN)
1580 ifoOpenNewVTSI(vm, vm->dvd, vtsN); /* Also sets (vm->state).vtsN */ 1590 if (!ifoOpenNewVTSI(vm, vm->dvd, vtsN)) /* Also sets (vm->state).vtsN */
1591 return 0;
1581 1592
1582 if ((vts_ttn < 1) || (vts_ttn > vm->vtsi->vts_ptt_srpt->nr_of_srpts) || 1593 if ((vts_ttn < 1) || (vts_ttn > vm->vtsi->vts_ptt_srpt->nr_of_srpts) ||
1583 (part < 1) || (part > vm->vtsi->vts_ptt_srpt->title[vts_ttn - 1].nr_of_ptts) ) { 1594 (part < 1) || (part > vm->vtsi->vts_ptt_srpt->title[vts_ttn - 1].nr_of_ptts) ) {
1584 return 0; 1595 return 0;
1585 } 1596 }