/* 2004.02.01 first released source code for IOMP */ #include #include #include #include #include #include #include #include #include #include "struct.h" #include "workbone.h" void rl_ttyset (int Reset); void strmcpy (char **t, char *s); void help (void); inline void playtime (void); char *cur_trackname; /* Take a guess */ int cur_index = 0; /* Current index mark */ int cur_frame; /* Current frame number */ struct play *playlist = NULL; struct cdinfo thiscd, *cd = &thiscd; int cur_track = -1; /* Current track number, starting at 1 */ char *cur_artist; /* Name of current CD's artist */ char cur_avoid; /* Avoid flag */ char cur_contd; /* Continued flag */ char *cur_cdname; /* Album name */ int cur_nsections; /* Number of sections currently defined */ int exit_on_eject = 0; int cur_balance = 10, info_modified; int cur_track, cur_pos_abs, cur_pos_rel, cur_tracklen, cur_cdlen, cur_cdmode, cur_ntracks, cur_lasttrack, cur_firsttrack, cur_listno; char tmptime[100]; char *tottime; int CDmounted(void); void message(char *); int tmppos; int save_track; int sss; int scmd; int drv_status; /* is the CD drive available? */ #define CDDRV_OK 100 #define CANT_OPEN 101 #define ALREADY_MOUNTED 102 #define MAINWIDTH 322 #define MAINHEIGHT 158 #ifndef ZERO #define ZERO 0 #endif int CDmounted(void) { FILE *fp ; struct mntent *mnt ; /*check if drive is mounted (from Mark Buckaway's cdplayer code) */ if ((fp = setmntent (MOUNTED, "r")) == NULL) { cur_cdmode = 5; return (CANT_OPEN); } while ((mnt = getmntent (fp)) != NULL) { if (strcmp (mnt->mnt_type, "iso9660") == 0) { cur_cdmode = 5; endmntent (fp); return (ALREADY_MOUNTED); } } endmntent (fp); return CDDRV_OK; /* check if drive is mounted (from Mark Buckaway's cdplayer code) */ /* if ((fp = setmntent (MOUNTED, "r")) == NULL) { fprintf (stderr, "Couldn't open %s: %s\n", MOUNTED, strerror (errno)); exit (1); } while ((mnt = getmntent (fp)) != NULL) { if (strcmp (mnt->mnt_type, "iso9660") == 0) { fputs ("CDROM already mounted. Operation aborted.\n", stderr); endmntent (fp); exit (1); } } endmntent (fp); */ } /* takes terminal in and out of raw mode */ void rl_ttyset (int Reset) { static struct termios old; struct termios new; if (Reset == 0) { (void) tcgetattr (0, &old); new = old; new.c_lflag &= ~(ECHO | ICANON); new.c_iflag &= ~(ISTRIP | INPCK); (void) tcsetattr (0, TCSANOW, &new); } else (void) tcsetattr (0, TCSANOW, &old); } /* Copy into a malloced string. */ void strmcpy (char **t, char *s) { if (*t != NULL) free (*t); *t = malloc (strlen (s) + 1); if (*t == NULL) { perror ("strmcpy"); exit (1); } (void) strcpy (*t, s); } /* ansi codes to clear screen */ void cls () { printf ("\033[2J\033[H"); } /* print help screen */ void help () { const char *helplist[] = { "\376\376", "\tstop ", "||", "\tpause/resume", "|\020", "\tplay", "\036\036", "\tre-start current selection", "|\021", "\tprevious selection", "\020|", "\tnext selection", "\021\021", "\tgo backward 15 seconds", "\020\020", "\tgo foreward 15 seconds", "..", "\tabort workbone", "quit", "\texit workbone", "?", "\tdisplay help screen", NULL}; int i = 0; cls (); while (helplist[i] != NULL) { printf ("\t\t\t%s%s%s%s\n", "\033(U", helplist[i], GOF, helplist[i + 1]); i += 2; } } inline void playtime (void) { static int mymin, emin; static int mysec, esec; int tmp = 0; if (cur_pos_rel > 0 && (tmp = cur_pos_rel % 60) == mysec) return; mysec = tmp; mymin = cur_pos_rel / 60; esec = cur_pos_abs % 60; emin = cur_pos_abs / 60; sprintf (tmptime, "%s %02d:%02d %02d:%02d", cur_track > 9 ? " " : " ", mymin, mysec, emin, esec); return; }