cdcontrol.c (13985) | cdcontrol.c (13989) |
---|---|
1/* 2 * Compact Disc Control Utility by Serge V. Vakulenko <vak@cronyx.ru>. 3 * Based on the non-X based CD player by Jean-Marc Zucconi and 4 * Andrey A. Chernov. 5 * 6 * Fixed and further modified on 5-Sep-1995 by Jukka Ukkonen <jau@funet.fi>. 7 * 8 * 11-Sep-1995: Jukka A. Ukkonen <jau@funet.fi> 9 * A couple of further fixes to my own earlier "fixes". 10 * 11 * 18-Sep-1995: Jukka A. Ukkonen <jau@funet.fi> 12 * Added an ability to specify addresses relative to the 13 * beginning of a track. This is in fact a variation of 14 * doing the simple play_msf() call. 15 * 16 * 11-Oct-1995: Serge V.Vakulenko <vak@cronyx.ru> 17 * New eject algorithm. 18 * Some code style reformatting. 19 * | 1/* 2 * Compact Disc Control Utility by Serge V. Vakulenko <vak@cronyx.ru>. 3 * Based on the non-X based CD player by Jean-Marc Zucconi and 4 * Andrey A. Chernov. 5 * 6 * Fixed and further modified on 5-Sep-1995 by Jukka Ukkonen <jau@funet.fi>. 7 * 8 * 11-Sep-1995: Jukka A. Ukkonen <jau@funet.fi> 9 * A couple of further fixes to my own earlier "fixes". 10 * 11 * 18-Sep-1995: Jukka A. Ukkonen <jau@funet.fi> 12 * Added an ability to specify addresses relative to the 13 * beginning of a track. This is in fact a variation of 14 * doing the simple play_msf() call. 15 * 16 * 11-Oct-1995: Serge V.Vakulenko <vak@cronyx.ru> 17 * New eject algorithm. 18 * Some code style reformatting. 19 * |
20 * $Id: cdcontrol.c,v 1.10 1996/02/03 15:21:30 ache Exp $ | 20 * $Id: cdcontrol.c,v 1.11 1996/02/09 00:22:17 ache Exp $ |
21 */ 22 23#include <ctype.h> 24#include <stdio.h> 25#include <stdlib.h> 26#include <string.h> 27#include <unistd.h> 28#include <errno.h> --- 364 unchanged lines hidden (view full) --- 393 return (rc); 394 395 n = h.ending_track - h.starting_track + 1; 396 rc = read_toc_entrys ((n + 1) * sizeof (struct cd_toc_entry)); 397 398 if (rc < 0) 399 return (rc); 400 | 21 */ 22 23#include <ctype.h> 24#include <stdio.h> 25#include <stdlib.h> 26#include <string.h> 27#include <unistd.h> 28#include <errno.h> --- 364 unchanged lines hidden (view full) --- 393 return (rc); 394 395 n = h.ending_track - h.starting_track + 1; 396 rc = read_toc_entrys ((n + 1) * sizeof (struct cd_toc_entry)); 397 398 if (rc < 0) 399 return (rc); 400 |
401 if (! arg || ! *arg) | 401 if (! arg || ! *arg) { |
402 /* Play the whole disc */ | 402 /* Play the whole disc */ |
403 return play_blocks (0, msf2lba (toc_buffer[n].addr.msf.minute, 404 toc_buffer[n].addr.msf.second, 405 toc_buffer[n].addr.msf.frame)); | 403 if (msf) 404 return play_blocks (0, msf2lba (toc_buffer[n].addr.msf.minute, 405 toc_buffer[n].addr.msf.second, 406 toc_buffer[n].addr.msf.frame)); 407 else 408 return play_blocks (0, ntohl(toc_buffer[n].addr.lba)); 409 } |
406 407 if (strchr (arg, '#')) { 408 /* Play block #blk [ len ] */ 409 int blk, len = 0; 410 411 if (2 != sscanf (arg, "#%d%d", &blk, &len) && 412 1 != sscanf (arg, "#%d", &blk)) 413 goto Clean_up; 414 | 410 411 if (strchr (arg, '#')) { 412 /* Play block #blk [ len ] */ 413 int blk, len = 0; 414 415 if (2 != sscanf (arg, "#%d%d", &blk, &len) && 416 1 != sscanf (arg, "#%d", &blk)) 417 goto Clean_up; 418 |
415 if (len == 0) 416 len = msf2lba (toc_buffer[n].addr.msf.minute, 417 toc_buffer[n].addr.msf.second, 418 toc_buffer[n].addr.msf.frame) - blk; | 419 if (len == 0) { 420 if (msf) 421 len = msf2lba (toc_buffer[n].addr.msf.minute, 422 toc_buffer[n].addr.msf.second, 423 toc_buffer[n].addr.msf.frame) - blk; 424 else 425 len = ntohl(toc_buffer[n].addr.lba) - blk; 426 } |
419 return play_blocks (blk, len); 420 } 421 422 if (strchr (arg, ':')) { 423 /* 424 * Play MSF m1:s1 [ .f1 ] [ m2:s2 [ .f2 ] ] 425 * 426 * Will now also undestand timed addresses relative 427 * to the beginning of a track in the form... 428 * 429 * tr1 m1:s1[.f1] [[tr2] [m2:s2[.f2]]] 430 */ 431 unsigned tr1, tr2; 432 unsigned m1, m2, s1, s2, f1, f2; | 427 return play_blocks (blk, len); 428 } 429 430 if (strchr (arg, ':')) { 431 /* 432 * Play MSF m1:s1 [ .f1 ] [ m2:s2 [ .f2 ] ] 433 * 434 * Will now also undestand timed addresses relative 435 * to the beginning of a track in the form... 436 * 437 * tr1 m1:s1[.f1] [[tr2] [m2:s2[.f2]]] 438 */ 439 unsigned tr1, tr2; 440 unsigned m1, m2, s1, s2, f1, f2; |
441 unsigned char tm, ts, tf; |
|
433 434 tr2 = m2 = s2 = f2 = f1 = 0; 435 if (8 == sscanf (arg, "%d %d:%d.%d %d %d:%d.%d", 436 &tr1, &m1, &s1, &f1, &tr2, &m2, &s2, &f2)) 437 goto Play_Relative_Addresses; 438 439 tr2 = m2 = s2 = f2 = f1 = 0; 440 if (7 == sscanf (arg, "%d %d:%d %d %d:%d.%d", --- 55 unchanged lines hidden (view full) --- 496 goto Try_Absolute_Timed_Addresses; 497 498Play_Relative_Addresses: 499 if (! tr1) 500 tr1 = 1; 501 else if (tr1 > n) 502 tr1 = n; 503 | 442 443 tr2 = m2 = s2 = f2 = f1 = 0; 444 if (8 == sscanf (arg, "%d %d:%d.%d %d %d:%d.%d", 445 &tr1, &m1, &s1, &f1, &tr2, &m2, &s2, &f2)) 446 goto Play_Relative_Addresses; 447 448 tr2 = m2 = s2 = f2 = f1 = 0; 449 if (7 == sscanf (arg, "%d %d:%d %d %d:%d.%d", --- 55 unchanged lines hidden (view full) --- 505 goto Try_Absolute_Timed_Addresses; 506 507Play_Relative_Addresses: 508 if (! tr1) 509 tr1 = 1; 510 else if (tr1 > n) 511 tr1 = n; 512 |
504 if ((m1 > toc_buffer[tr1].addr.msf.minute) 505 || ((m1 == toc_buffer[tr1].addr.msf.minute) 506 && ((s1 > toc_buffer[tr1].addr.msf.second) 507 || ((s1 == toc_buffer[tr1].addr.msf.second) 508 && (f1 > toc_buffer[tr1].addr.msf.frame))))) { | 513 if (msf) { 514 tm = toc_buffer[tr1].addr.msf.minute; 515 ts = toc_buffer[tr1].addr.msf.second; 516 tf = toc_buffer[tr1].addr.msf.frame; 517 } else 518 lba2msf(ntohl(toc_buffer[tr1].addr.lba), 519 &tm, &ts, &tf); 520 if ((m1 > tm) 521 || ((m1 == tm) 522 && ((s1 > ts) 523 || ((s1 == ts) 524 && (f1 > tf))))) { |
509 printf ("Track %d is not that long.\n", tr1); 510 return (0); 511 } 512 513 tr1--; 514 | 525 printf ("Track %d is not that long.\n", tr1); 526 return (0); 527 } 528 529 tr1--; 530 |
515 f1 += toc_buffer[tr1].addr.msf.frame; | 531 f1 += tf; |
516 if (f1 >= 75) { 517 s1 += f1 / 75; 518 f1 %= 75; 519 } 520 | 532 if (f1 >= 75) { 533 s1 += f1 / 75; 534 f1 %= 75; 535 } 536 |
521 s1 += toc_buffer[tr1].addr.msf.second; | 537 s1 += ts; |
522 if (s1 >= 60) { 523 m1 += s1 / 60; 524 s1 %= 60; 525 } 526 | 538 if (s1 >= 60) { 539 m1 += s1 / 60; 540 s1 %= 60; 541 } 542 |
527 m1 += toc_buffer[tr1].addr.msf.minute; | 543 m1 += tm; |
528 529 if (! tr2) { 530 if (m2 || s2 || f2) { 531 tr2 = tr1; 532 f2 += f1; 533 if (f2 >= 75) { 534 s2 += f2 / 75; 535 f2 %= 75; 536 } 537 538 s2 += s1; 539 if (s2 > 60) { 540 m2 += s2 / 60; 541 s2 %= 60; 542 } 543 544 m2 += m1; 545 } else { 546 tr2 = n; | 544 545 if (! tr2) { 546 if (m2 || s2 || f2) { 547 tr2 = tr1; 548 f2 += f1; 549 if (f2 >= 75) { 550 s2 += f2 / 75; 551 f2 %= 75; 552 } 553 554 s2 += s1; 555 if (s2 > 60) { 556 m2 += s2 / 60; 557 s2 %= 60; 558 } 559 560 m2 += m1; 561 } else { 562 tr2 = n; |
547 m2 = toc_buffer[n].addr.msf.minute; 548 s2 = toc_buffer[n].addr.msf.second; 549 f2 = toc_buffer[n].addr.msf.frame; | 563 if (msf) { 564 m2 = toc_buffer[n].addr.msf.minute; 565 s2 = toc_buffer[n].addr.msf.second; 566 f2 = toc_buffer[n].addr.msf.frame; 567 } else { 568 lba2msf(ntohl(toc_buffer[n].addr.lba), 569 &tm, &ts, &tf); 570 m2 = tm; 571 s2 = ts; 572 f2 = tf; 573 } |
550 } 551 } else if (tr2 > n) { 552 tr2 = n; 553 m2 = s2 = f2 = 0; 554 } else { 555 if (m2 || s2 || f2) 556 tr2--; | 574 } 575 } else if (tr2 > n) { 576 tr2 = n; 577 m2 = s2 = f2 = 0; 578 } else { 579 if (m2 || s2 || f2) 580 tr2--; |
557 f2 += toc_buffer[tr2].addr.msf.frame; | 581 if (msf) { 582 tm = toc_buffer[tr2].addr.msf.minute; 583 ts = toc_buffer[tr2].addr.msf.second; 584 tf = toc_buffer[tr2].addr.msf.frame; 585 } else 586 lba2msf(ntohl(toc_buffer[tr2].addr.lba), 587 &tm, &ts, &tf); 588 f2 += tf; |
558 if (f2 >= 75) { 559 s2 += f2 / 75; 560 f2 %= 75; 561 } 562 | 589 if (f2 >= 75) { 590 s2 += f2 / 75; 591 f2 %= 75; 592 } 593 |
563 s2 += toc_buffer[tr2].addr.msf.second; | 594 s2 += ts; |
564 if (s2 > 60) { 565 m2 += s2 / 60; 566 s2 %= 60; 567 } 568 | 595 if (s2 > 60) { 596 m2 += s2 / 60; 597 s2 %= 60; 598 } 599 |
569 m2 += toc_buffer[tr2].addr.msf.minute; | 600 m2 += tm; |
570 } 571 | 601 } 602 |
603 if (msf) { 604 tm = toc_buffer[n].addr.msf.minute; 605 ts = toc_buffer[n].addr.msf.second; 606 tf = toc_buffer[n].addr.msf.frame; 607 } else 608 lba2msf(ntohl(toc_buffer[n].addr.lba), 609 &tm, &ts, &tf); |
|
572 if ((tr2 < n) | 610 if ((tr2 < n) |
573 && ((m2 > toc_buffer[n].addr.msf.minute) 574 || ((m2 == toc_buffer[n].addr.msf.minute) 575 && ((s2 > toc_buffer[n].addr.msf.second) 576 || ((s2 == toc_buffer[n].addr.msf.second) 577 && (f2 > toc_buffer[n].addr.msf.frame)))))) { | 611 && ((m2 > tm) 612 || ((m2 == tm) 613 && ((s2 > ts) 614 || ((s2 == ts) 615 && (f2 > tf)))))) { |
578 printf ("The playing time of the disc is not that long.\n"); 579 return (0); 580 } 581 return (play_msf (m1, s1, f1, m2, s2, f2)); 582 583Try_Absolute_Timed_Addresses: 584 if (6 != sscanf (arg, "%d:%d.%d%d:%d.%d", 585 &m1, &s1, &f1, &m2, &s2, &f2) && 586 5 != sscanf (arg, "%d:%d.%d%d:%d", &m1, &s1, &f1, &m2, &s2) && 587 5 != sscanf (arg, "%d:%d%d:%d.%d", &m1, &s1, &m2, &s2, &f2) && 588 3 != sscanf (arg, "%d:%d.%d", &m1, &s1, &f1) && 589 4 != sscanf (arg, "%d:%d%d:%d", &m1, &s1, &m2, &s2) && 590 2 != sscanf (arg, "%d:%d", &m1, &s1)) 591 goto Clean_up; 592 593 if (m2 == 0) { | 616 printf ("The playing time of the disc is not that long.\n"); 617 return (0); 618 } 619 return (play_msf (m1, s1, f1, m2, s2, f2)); 620 621Try_Absolute_Timed_Addresses: 622 if (6 != sscanf (arg, "%d:%d.%d%d:%d.%d", 623 &m1, &s1, &f1, &m2, &s2, &f2) && 624 5 != sscanf (arg, "%d:%d.%d%d:%d", &m1, &s1, &f1, &m2, &s2) && 625 5 != sscanf (arg, "%d:%d%d:%d.%d", &m1, &s1, &m2, &s2, &f2) && 626 3 != sscanf (arg, "%d:%d.%d", &m1, &s1, &f1) && 627 4 != sscanf (arg, "%d:%d%d:%d", &m1, &s1, &m2, &s2) && 628 2 != sscanf (arg, "%d:%d", &m1, &s1)) 629 goto Clean_up; 630 631 if (m2 == 0) { |
594 m2 = toc_buffer[n].addr.msf.minute; 595 s2 = toc_buffer[n].addr.msf.second; 596 f2 = toc_buffer[n].addr.msf.frame; | 632 if (msf) { 633 m2 = toc_buffer[n].addr.msf.minute; 634 s2 = toc_buffer[n].addr.msf.second; 635 f2 = toc_buffer[n].addr.msf.frame; 636 } else { 637 lba2msf(ntohl(toc_buffer[n].addr.lba), 638 &tm, &ts, &tf); 639 m2 = tm; 640 s2 = ts; 641 f2 = tf; 642 } |
597 } 598 return play_msf (m1, s1, f1, m2, s2, f2); 599 } 600 601 /* 602 * Play track trk1 [ .idx1 ] [ trk2 [ .idx2 ] ] 603 */ 604 if (4 != sscanf (arg, "%d.%d%d.%d", &start, &istart, &end, &iend) && --- 366 unchanged lines hidden --- | 643 } 644 return play_msf (m1, s1, f1, m2, s2, f2); 645 } 646 647 /* 648 * Play track trk1 [ .idx1 ] [ trk2 [ .idx2 ] ] 649 */ 650 if (4 != sscanf (arg, "%d.%d%d.%d", &start, &istart, &end, &iend) && --- 366 unchanged lines hidden --- |