home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / internet / freenet / WrkBone001 / Linux / WBone / WorkBone-0.1 / workbone.c < prev    next >
C/C++ Source or Header  |  1993-12-08  |  9KB  |  366 lines

  1. /*   WorkBone CD Rom Player Software
  2.  
  3.      Copyright (C) 1993  Thomas McWilliams
  4.  
  5.      This program is free software; you can redistribute it and/or modify
  6.      it under the terms of the GNU General Public License as published by
  7.      the Free Software Foundation; either version 2, or (at your option)
  8.      any later version.
  9.  
  10.      This program is distributed in the hope that it will be useful,
  11.      but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.      GNU General Public License for more details.
  14.  
  15.      You should have received a copy of the GNU General Public License
  16.      along with this program; if not, write to the Free Software
  17.      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  
  19. */
  20.  
  21. #include <stdlib.h>
  22. #include <stdio.h>
  23. #include <sys/types.h>
  24. #include <sys/time.h>
  25. #include <signal.h>
  26. #include <unistd.h>
  27. #include <termios.h>
  28. #include <mntent.h>
  29. #include <getopt.h>
  30. #include "struct.h"
  31. #include "workbone.h"
  32.  
  33. void control_panel (void);
  34. void rl_ttyset (int Reset);
  35. void strmcpy (char **t, char *s);
  36. void help (void);
  37. inline void playtime (void);
  38.  
  39. char *cur_trackname;        /* Take a guess */
  40. int cur_index = 0;        /* Current index mark */
  41. int cur_frame;            /* Current frame number */
  42. struct play *playlist = NULL;
  43. struct cdinfo thiscd, *cd = &thiscd;
  44. int cur_track = -1;        /* Current track number, starting at 1 */
  45. char *cur_artist;        /* Name of current CD's artist */
  46. char cur_avoid;            /* Avoid flag */
  47. char cur_contd;            /* Continued flag */
  48. char *cur_cdname;        /* Album name */
  49. int cur_nsections;        /* Number of sections currently defined */
  50. int exit_on_eject = 0;
  51.  
  52. int cur_balance = 10, info_modified;
  53. int cur_track, cur_pos_abs, cur_pos_rel, cur_tracklen, cur_cdlen, cur_cdmode,
  54.   cur_ntracks, cur_lasttrack, cur_firsttrack, cur_listno;
  55. char tmptime[100];
  56. char *tottime;
  57.  
  58. int
  59. main (int argc, char *argv[])
  60. {
  61.  
  62.   int sss, sel_stat, dly;
  63.   int fastin = FALSE;
  64.   int scmd = 0, tmppos = 0;
  65.   int save_track = 1;
  66.   fd_set rset;
  67.   struct timeval mydelay;
  68.   struct mntent *mnt ;
  69.   char copt;
  70.   FILE *fp ;
  71.   thiscd.trk = NULL;
  72.   thiscd.lists = NULL;
  73.   mydelay.tv_sec = 0;
  74.   mydelay.tv_usec = 200000;
  75.   tottime = tmptime;
  76.  
  77.   /* get options */
  78.   for (;;)
  79.     {
  80.       if ((copt = getopt (argc, argv, "hqvV")) == EOF)
  81.     break;
  82.       switch (copt)
  83.     {
  84.     case 'q':
  85.       fastin = TRUE;
  86.       break;
  87.     default:
  88.       printf ("\nWorkBone version 0.1 Copyright 1993 (c) Thomas McWilliams\n");
  89.       printf ("Free Software under GNU General Public License.\n\n");
  90.       printf ("Useage:  workbone [ -v | -h | -q ]\n");
  91.       printf ("           -v : version\n");
  92.       printf ("           -h : help\n");
  93.       printf ("           -q : fast start (no wait for init)\n\n");
  94.       printf ("Type 'workbone' to start program.\n\n");
  95.       printf ("Engage the NUM LOCK on your keypad. From inside WorkBone\n");
  96.       printf ("pressing DEL on numeric keypad will display a help menu.\n\n");
  97.       exit (0);
  98.     }
  99.     }
  100.   /* check if drive is mounted (from Mark Buckaway's cdplayer code) */
  101.   if ((fp = setmntent (MOUNTED, "r")) == NULL)
  102.     {
  103.       fprintf (stderr, "Couldn't open %s: %s\n", MOUNTED, strerror (errno));
  104.       exit (1);
  105.     }
  106.   while ((mnt = getmntent (fp)) != NULL)
  107.     {
  108.       if (strcmp (mnt->mnt_type, "iso9660") == 0)
  109.     {
  110.       fputs ("CDROM already mounted. Operation aborted.\n", stderr);
  111.       endmntent (fp);
  112.       exit (1);
  113.     }
  114.     }
  115.   endmntent (fp);
  116.  
  117.   /*  display control panel template */
  118.   control_panel ();
  119.  
  120.   /* delay while CD drive initializes itself */
  121.   if (!fastin)
  122.     for (dly = 6; dly > -1; dly--)
  123.       {
  124.     printf (MTAB3 "wait ... initializing %d\r", dly);
  125.     fflush (stdout);
  126.     sleep (1);
  127.       }
  128.   printf (MTAB3 "                         \r");
  129.   fflush (stdout);
  130.   sss = cd_status ();
  131.   rl_ttyset (0);
  132.   if (sss == 0 || sss == 4)
  133.     goto done;
  134.   cur_track = 1;
  135.  
  136.   do
  137.     {
  138. /*
  139. use select() to update status every 200 millisecs or
  140. sooner if keypad has data
  141. */
  142.  
  143.       FD_ZERO (&rset);
  144.       FD_SET (STDIN_FILENO, &rset);
  145.       sel_stat = select (4, &rset, NULL, NULL, &mydelay);
  146.       sss = cd_status ();
  147.       if (sss == 0 || sss == 4 || cur_cdmode == CDEJECT)
  148.     {
  149.       scmd = '0';
  150.       goto done;
  151.     }
  152.       if (cur_cdmode < 1)
  153.     save_track = 1;
  154.       /* if key was pressed, parse it and do function */
  155.       if (FD_ISSET (STDIN_FILENO, &rset))
  156.     {
  157.       read (0, &scmd, 1);
  158.       switch (scmd & 255)
  159.         {
  160.         case '.':
  161.         case '?':
  162.           help ();
  163.           break;
  164.         case '1':
  165.           if (cur_cdmode == CDPLAY)
  166.         {
  167.           tmppos = cur_pos_rel - 15;
  168.           play_cd (cur_track, tmppos > 0 ? tmppos : 0, cur_ntracks + 1);
  169.         }
  170.           break;
  171.         case '3':
  172.           if (cur_cdmode == CDPLAY)
  173.         {
  174.           tmppos = cur_pos_rel + 15;
  175.           if (tmppos < thiscd.trk[cur_track - 1].length)
  176.             play_cd (cur_track, tmppos, cur_ntracks + 1);
  177.         }
  178.           break;
  179.         case '2':
  180.           stop_cd ();
  181.           eject_cd ();
  182.           break;
  183.         case '4':
  184.           cur_track--;
  185.           if (cur_track < 1)
  186.         cur_track = cur_ntracks;
  187.           play_cd (cur_track, 0, cur_ntracks + 1);
  188.           break;
  189.         case '5':
  190.           if (cur_cdmode == CDPLAY)
  191.         play_cd (cur_track, 0, cur_ntracks + 1);
  192.           break;
  193.         case '6':
  194.           if (cur_track == cur_ntracks)
  195.         cur_track = 0;
  196.           play_cd (cur_track + 1, 0, cur_ntracks + 1);
  197.           break;
  198.         case '7':
  199.           printf (MTAB3 "stop                         \r");
  200.           save_track = cur_track;
  201.           stop_cd ();
  202.           break;
  203.         case '8':
  204.           if (cur_cdmode == CDPLAY || cur_cdmode == CDPAUZ)
  205.         {
  206.           pause_cd ();
  207.         }
  208.           break;
  209.         case '9':
  210.           if (cur_cdmode == CDSTOP || cur_cdmode == CDNULL)
  211.         {
  212.           play_cd (save_track, 0, cur_ntracks + 1);
  213.         }
  214.           break;
  215.         case 0x1b:
  216.           read (0, &scmd, 1);
  217.           read (0, &scmd, 1);
  218.           printf (MTAB3 "Turn ON Num Lock!%c\r", 7);
  219.           fflush (stdout);
  220.           sleep (1);
  221.           break;
  222.         default:
  223.           break;
  224.         }
  225.     }
  226.       /* update display of which track is playing */
  227.       switch (cur_cdmode)
  228.     {
  229.     case 0:        /* CDNULL */
  230.       cur_track = save_track = 1;
  231.       printf (MTAB3 "stopped                    \r");
  232.       break;
  233.     case 1:        /* CDPLAY */
  234.       playtime ();
  235.       printf (MTAB3 "playing #%d%s       \r", cur_track, tottime);
  236.       break;
  237.     case 3:        /* CDPAUZ */
  238.       printf (MTAB3 "pause   #%d  \r", cur_track);
  239.       break;
  240.     case 4:        /* CDSTOP */
  241.       printf (MTAB3 "stopped #%d \r", save_track);
  242.       break;
  243.     case 5:        /* CDEJECT */
  244.       goto done;
  245.     default:
  246.       printf (MTAB3 "cur_cdmode %d       \r", cur_cdmode);
  247.     }
  248.       fflush (stdout);
  249.  
  250.     }
  251.   while (scmd != '0');
  252. done:
  253.   if (thiscd.trk != NULL)
  254.     free (thiscd.trk);
  255.   printf ("\n");
  256.   rl_ttyset (1);
  257.   return(0);
  258. }
  259.  
  260. /* takes terminal in and out of raw mode */
  261. void
  262. rl_ttyset (int Reset)
  263. {
  264.   static struct termios old;
  265.   struct termios new;
  266.  
  267.   if (Reset == 0)
  268.     {
  269.       (void) tcgetattr (0, &old);
  270.       new = old;
  271.       new.c_lflag &= ~(ECHO | ICANON);
  272.       new.c_iflag &= ~(ISTRIP | INPCK);
  273.       (void) tcsetattr (0, TCSANOW, &new);
  274.     }
  275.   else
  276.     (void) tcsetattr (0, TCSANOW, &old);
  277. }
  278.  
  279.  
  280. /* Copy into a malloced string. */
  281. void
  282. strmcpy (char **t, char *s)
  283. {
  284.   if (*t != NULL)
  285.     free (*t);
  286.  
  287.   *t = malloc (strlen (s) + 1);
  288.   if (*t == NULL)
  289.     {
  290.       perror ("strmcpy");
  291.       exit (1);
  292.     }
  293.  
  294.   (void) strcpy (*t, s);
  295. }
  296.  
  297. /* display keypad template on screen */
  298. void
  299. control_panel ()
  300. {
  301.   printf (GON);
  302.   printf (ROWT);
  303.   printf (ROW0);
  304.   printf (ROW1);
  305.   printf (ROW0);
  306.   printf (ROW2);
  307.   printf (ROW0);
  308.   printf (ROW3);
  309.   printf (ROW0);
  310.   printf (ROW4);
  311.   printf (ROW0);
  312.   printf (ROWB);
  313. }
  314.  
  315. /* ansi codes to clear screen */
  316. void
  317. cls ()
  318. {
  319.   printf ("\033[2J\033[H");
  320. }
  321.  
  322. /* print help screen */
  323. void
  324. help ()
  325. {
  326.   const char *helplist[] =
  327.   {
  328.     "\376\376", "\tstop                       ",
  329.     "||", "\tpause/resume",
  330.     "|\020", "\tplay",
  331.     "\036\036", "\tre-start current selection",
  332.     "|\021", "\tprevious selection",
  333.     "\020|", "\tnext selection",
  334.     "\021\021", "\tgo backward 15 seconds",
  335.     "\020\020", "\tgo foreward 15 seconds",
  336.     "..", "\tabort workbone",
  337.     "quit", "\texit workbone",
  338.     "?", "\tdisplay help screen", NULL};
  339.   int i = 0;
  340.   cls ();
  341.   while (helplist[i] != NULL)
  342.     {
  343.       printf ("\t\t\t%s%s%s%s\n", "\033(U", helplist[i], GOF, helplist[i + 1]);
  344.       i += 2;
  345.     }
  346.   control_pa