home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #31 / NN_1992_31.iso / spool / alt / sources / 2894 < prev    next >
Encoding:
Text File  |  1992-12-29  |  47.8 KB  |  2,119 lines

  1. Newsgroups: alt.sources
  2. Path: sparky!uunet!elroy.jpl.nasa.gov!swrinde!zaphod.mps.ohio-state.edu!magnus.acs.ohio-state.edu!usenet.ins.cwru.edu!eagle!sandman.lerc.nasa.gov!drich
  3. From: drich@sandman.lerc.nasa.gov (Daniel Rich)
  4. Subject: xcdplayer-2.2, Part (3/5) - X11 CD player for Sun and SGI
  5. Message-ID: <1992Dec28.225356.22197@eagle.lerc.nasa.gov>
  6. Sender: news@eagle.lerc.nasa.gov
  7. Nntp-Posting-Host: sandman.lerc.nasa.gov
  8. Organization: NASA Lewis Research Center
  9. Date: Mon, 28 Dec 1992 22:53:56 GMT
  10. Lines: 2107
  11.  
  12. Submitted-by: drich@lerc.nasa.gov
  13. Archive-name: xcdplayer-2.2/part03
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then unpack
  17. # it by saving it into a file and typing "sh file".  To overwrite existing
  18. # files, type "sh file -c".  You can also feed this as standard input via
  19. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  20. # will see the following message at the end:
  21. #        "End of archive 3 (of 5)."
  22. # Contents:  xcdplayer-2.2/cdrom_sun.c xcdplayer-2.2/internals.c
  23. #   xcdplayer-2.2/logo_setup.c
  24. # Wrapped by drich@sandman on Mon Dec 28 17:30:38 1992
  25. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  26. if test -d 'xcdplayer-2.2' ; then
  27. :
  28. else
  29.   mkdir xcdplayer-2.2
  30. fi
  31. if test -f 'xcdplayer-2.2/cdrom_sun.c' -a "${1}" != "-c" ; then 
  32.   echo shar: Will not clobber existing file \"'xcdplayer-2.2/cdrom_sun.c'\"
  33. else
  34. echo shar: Extracting \"'xcdplayer-2.2/cdrom_sun.c'\" \(12913 characters\)
  35. sed "s/^X//" >'xcdplayer-2.2/cdrom_sun.c' <<'END_OF_FILE'
  36. X/*
  37. X * Copyright (C) 1990 Regents of the University of California.
  38. X *
  39. X * Permission to use, copy, modify, distribute, and sell this software and
  40. X * its documentation for any purpose is hereby granted without fee,
  41. X * provided that the above copyright notice appear in all copies and that
  42. X * both that copyright notice and this permission notice appear in
  43. X * supporting documentation, and that the name of the University of
  44. X * California not be used in advertising or publicity pertaining to
  45. X * distribution of the software without specific, written prior
  46. X * permission.  the University of California makes no representations
  47. X * about the suitability of this software for any purpose.  It is provided
  48. X * "as is" without express or implied warranty.
  49. X */
  50. X
  51. Xstatic int c;
  52. X
  53. X# if defined(sun)
  54. X# include <stdio.h>
  55. X
  56. X# include <sys/file.h>
  57. X# include <sys/types.h>
  58. X# include <sys/param.h>
  59. X# include <sys/stat.h>
  60. X
  61. X# include <sun/dkio.h>
  62. X
  63. X# include <mntent.h>
  64. X# include <string.h>
  65. X
  66. X# include <sys/buf.h>
  67. X# ifdef sun4c
  68. X# include <scsi/targets/srdef.h>
  69. X# else
  70. X# include <sundev/srreg.h>
  71. X# endif
  72. X
  73. X# include <sys/time.h>
  74. X
  75. X# include "debug.h"
  76. X# include "cdrom_sun.h"
  77. X
  78. Xextern char    *device;
  79. X# if defined(notdef)
  80. Xextern void    cdrom_print_toc();
  81. X# endif /* defined(notdef) */
  82. X
  83. Xstatic char    cdrom[] =    "/dev/rsr0";
  84. X
  85. Xcdrom_info    cdi;
  86. Xchar        info_filename[256];
  87. XFILE        *disc_info = NULL;
  88. X
  89. Xstatic int    cdrom_fd = -1;
  90. X
  91. Xget_stored_info()
  92. X{
  93. X    int i,n;
  94. X    char    line[100];
  95. X    char    *title;
  96. X
  97. X        if ( cdi.maxtrack == 0) {
  98. X                return(0);
  99. X        }
  100. X    for (i = 0, n = 0; i < cdi.maxtrack; i++)
  101. X        n = n + ((i+1) * cdi.times[i]);
  102. X    n = n / cdi.maxtrack;
  103. X
  104. X        disc_title = NULL;
  105. X    if (cdInfoDir != NULL)
  106. X        sprintf(info_filename, "%s/cd.%d", cdInfoDir, n);
  107. X    else
  108. X        sprintf(info_filename, "cd.%d", n);
  109. X
  110. X    if ((disc_info = fopen(info_filename, "r")) != NULL)
  111. X    {
  112. X        fgets(line, 100, disc_info);
  113. X        title = strchr(line, ':');
  114. X        if (title != NULL)
  115. X        {
  116. X            *(strchr(title, '\n')) = '\0';
  117. X            disc_title = strdup(title + 1);
  118. X        }
  119. X        fgets(line, 100, disc_info);
  120. X        sscanf(line, "Program: %s", program_str);
  121. X    }
  122. X        if (disc_title == NULL) {
  123. X                disc_title = NOTITLESTR;
  124. X        }
  125. X}
  126. X
  127. Xint
  128. Xcdrom_open() {
  129. X    int    n;
  130. X    extern void update_title();
  131. X
  132. X    if (cdrom_fd != -1)
  133. X        return(cdi.curtrack);
  134. X
  135. X    if (device != NULL) {
  136. X        if ((cdrom_fd = open(device, O_RDONLY)) == -1) {
  137. X            debug-printf(stderr, "open: ");
  138. X            return(-1);
  139. X        }
  140. X    } else {
  141. X        if ((cdrom_fd = open(cdrom, O_RDONLY)) == -1) {
  142. X            debug-printf(stderr, "open: ");
  143. X            return(-1);
  144. X        }
  145. X    }
  146. X
  147. X    if (cdrom_get_times() == -1) {
  148. X        cdrom_close();
  149. X        return(-1);
  150. X    }
  151. X
  152. X    if ((n = cdrom_get_curtrack()) == -1)
  153. X        return(-1);
  154. X
  155. X    get_stored_info();
  156. X
  157. X    update_title();
  158. X
  159. X    if (cdi.state & CDROM_STATE_PLAY)
  160. X        cdi.curtrack = n;
  161. X
  162. X    if (cdi.state & CDROM_STATE_SHUFFLE)
  163. X        shuffle_setup();
  164. X
  165. X    return(cdi.curtrack);
  166. X}
  167. X
  168. Xvoid
  169. Xcdrom_close() {
  170. X    if (cdrom_fd == -1)
  171. X        return;
  172. X
  173. X    if (cdi.times != NULL) {
  174. X        free((char *) cdi.times);
  175. X        free((char *) cdi.addrs);
  176. X        cdi.times = NULL;
  177. X        cdi.addrs = NULL;
  178. X    }
  179. X
  180. X    (void) close(cdrom_fd);
  181. X    cdrom_fd = -1;
  182. X}
  183. X
  184. X
  185. Xint
  186. Xcdrom_start() {
  187. X    if (cdrom_fd == -1)
  188. X        return(-1);
  189. X
  190. X    if (ioctl(cdrom_fd, CDROMSTART) == -1) {
  191. X        perror("ioctl(cdromstart)");
  192. X        return(-1);
  193. X    }
  194. X
  195. X    return(0);
  196. X}
  197. X
  198. Xint
  199. Xcdrom_stop() {
  200. X    if (cdrom_fd == -1)
  201. X        return(-1);
  202. X
  203. X    if (ioctl(cdrom_fd, CDROMSTOP) == -1) {
  204. X        perror("ioctl(cdromstop)");
  205. X        return(-1);
  206. X    }
  207. X
  208. X    return(0);
  209. X}
  210. X
  211. Xint
  212. Xcdrom_eject() {
  213. X    if (cdrom_fd == -1)
  214. X        return(-1);
  215. X
  216. X    if (ioctl(cdrom_fd, CDROMEJECT) == -1) {
  217. X        perror("ioctl(cdromeject)");
  218. X        return(-1);
  219. X    }
  220. X
  221. X    return(0);
  222. X}
  223. X
  224. Xint
  225. Xcdrom_pause() {
  226. X    if (cdrom_fd == -1)
  227. X        return(-1);
  228. X
  229. X    if (ioctl(cdrom_fd, CDROMPAUSE) == -1) {
  230. X        perror("ioctl(cdrompause)");
  231. X        return(-1);
  232. X    }
  233. X
  234. X    return(0);
  235. X}
  236. X
  237. Xint
  238. Xcdrom_resume() {
  239. X    if (cdrom_fd == -1)
  240. X        return(-1);
  241. X
  242. X    if (ioctl(cdrom_fd, CDROMRESUME) == -1) {
  243. X        perror("ioctl(cdromresume)");
  244. X        return(-1);
  245. X    }
  246. X
  247. X    return(0);
  248. X}
  249. X
  250. Xint
  251. Xcdrom_volume(left_vol, right_vol)
  252. X    int            left_vol;
  253. X    int            right_vol;
  254. X{
  255. X    struct cdrom_volctrl    vol;
  256. X
  257. X    if (cdrom_fd == -1)
  258. X        return(-1);
  259. X
  260. X    vol.channel0 = left_vol;
  261. X    vol.channel1 = right_vol;
  262. X
  263. X    if (ioctl(cdrom_fd, CDROMVOLCTRL, &vol) == -1) {
  264. X        perror("ioctl(cdromvolctrl)");
  265. X        return(-1);
  266. X    }
  267. X
  268. X    return(0);
  269. X}
  270. X
  271. Xint
  272. Xcdrom_get_times() {
  273. X    struct cdrom_tochdr    tochdr;
  274. X    extern unsigned short    *ushort_malloc();
  275. X    extern struct msf    *msf_malloc();
  276. X    unsigned long        trk, trk_total, otime;
  277. X    struct msf        msf;
  278. X
  279. X    if (cdrom_read_tochdr(&tochdr) == -1)
  280. X        return(-1);
  281. X
  282. X    cdi.mintrack = tochdr.cdth_trk0;
  283. X    cdi.maxtrack = tochdr.cdth_trk1;
  284. X
  285. X    if (cdi.times != NULL)
  286. X    {
  287. X        free((char *) cdi.times);
  288. X        free((char *) cdi.addrs);
  289. X        cdi.times = NULL;
  290. X        cdi.addrs = NULL;
  291. X    }
  292. X
  293. X    cdi.times = ushort_malloc(cdi.maxtrack - cdi.mintrack + 1);
  294. X    cdi.addrs = msf_malloc(cdi.maxtrack - cdi.mintrack + 2);
  295. X
  296. X    otime = 0;
  297. X
  298. X    for (trk = cdi.mintrack; trk <= cdi.maxtrack; trk++) {
  299. X        if (cdrom_get_msf(trk, &msf, &trk_total) == -1)
  300. X            return(-1);
  301. X
  302. X        /* record start address for each track (track 1 starts at 0)*/
  303. X        cdi.addrs[trk - cdi.mintrack] = msf;
  304. X
  305. X        trk_total -= otime;
  306. X
  307. X        /* use start time of next track as length of previous */
  308. X        if (otime != 0) 
  309. X        {
  310. X            cdi.times[trk - cdi.mintrack - 1] = trk_total;
  311. X        }
  312. X
  313. X        otime += trk_total;
  314. X
  315. X    }
  316. X
  317. X    /* find start of  leadout to get length of last track */
  318. X    if (cdrom_get_msf(CDROM_LEADOUT, &msf, &trk_total) == -1)
  319. X        return(-1);
  320. X
  321. X    /* recode leadout start address */
  322. X    cdi.addrs[trk - cdi.mintrack] = msf;
  323. X    trk_total -= otime;
  324. X    otime += trk_total;
  325. X
  326. X    cdi.times[trk - cdi.mintrack - 1] = trk_total;
  327. X
  328. X    return(0);
  329. X}
  330. X
  331. X# if defined(notdef)
  332. Xstatic void
  333. Xcdrom_print_toc() {
  334. X    unsigned long        trk, trk_total;
  335. X
  336. X    for (trk = cdi.mintrack; trk <= cdi.maxtrack; trk++) {
  337. X        trk_total = cdi.times[trk - cdi.mintrack];
  338. X        debug_printf(1, "%02u:%02u\n", trk_total/60, trk_total%60);
  339. X    }
  340. X}
  341. X# endif /* defined(notdef) */
  342. X
  343. Xint
  344. Xcdrom_get_curtrack() {
  345. X    struct cdrom_subchnl    subchnl;
  346. X
  347. X    if (cdrom_fd == -1)
  348. X        return(-1);
  349. X
  350. X    if (ioctl(cdrom_fd, CDROMSUBCHNL, (char *) &subchnl) == -1) {
  351. X        fprintf(stderr, "ioctl(cdromsubchnl): ");
  352. X        perror(cdrom);
  353. X        return(-1);
  354. X    }
  355. X
  356. X    switch (subchnl.cdsc_audiostatus) {
  357. X        case CDROM_AUDIO_INVALID:
  358. X        return(-1);
  359. X
  360. X        /* playing track subchnl.cdsc_trk */
  361. X        case CDROM_AUDIO_PLAY:
  362. X        return((int) subchnl.cdsc_trk);
  363. X
  364. X        /* paused on track subchnl.cdsc_trk */
  365. X        case CDROM_AUDIO_PAUSED:
  366. X        return((int) subchnl.cdsc_trk);
  367. X
  368. X        /* punt */
  369. X        case CDROM_AUDIO_COMPLETED:
  370. X        return(0);
  371. X
  372. X        case CDROM_AUDIO_ERROR:
  373. X        return(-1);
  374. X
  375. X        /* punt */
  376. X        case CDROM_AUDIO_NO_STATUS:
  377. X        debug_printf(1, "cdrom_get_curtrack: no status\n");
  378. X        return(0);
  379. X    }
  380. X
  381. X    /* bad value in cdsc_audiostatus */
  382. X    return(-1);
  383. X}
  384. X
  385. Xint
  386. Xcdrom_get_msf(track, msf, length)
  387. X    unsigned long        track;
  388. X    struct msf        *msf;
  389. X    unsigned long        *length;
  390. X{
  391. X    struct cdrom_tocentry    tocentry;
  392. X
  393. X    if (cdrom_read_tocentry(track, &tocentry) == -1)
  394. X        return(-1);
  395. X
  396. X    msf->minute = tocentry.cdte_addr.msf.minute;
  397. X    msf->second = tocentry.cdte_addr.msf.second;
  398. X    msf->frame = tocentry.cdte_addr.msf.frame;
  399. X
  400. X    *length = ((int) tocentry.cdte_addr.msf.minute * 60) +
  401. X        (int) tocentry.cdte_addr.msf.second;
  402. X
  403. X    return(0);
  404. X}
  405. X
  406. Xint
  407. Xcdrom_get_curmsf(msf)
  408. X    struct msf *msf;
  409. X{
  410. X    struct cdrom_subchnl    subchnl;
  411. X
  412. X    if (cdrom_fd == -1)
  413. X        return(-1);
  414. X
  415. X    subchnl.cdsc_format = CDROM_MSF;
  416. X
  417. X    if (ioctl(cdrom_fd, CDROMSUBCHNL, (char *) &subchnl) == -1) {
  418. X        perror("ioctl(cdromsubchnl)");
  419. X        return(-1);
  420. X    }
  421. X
  422. X    msf->minute = subchnl.cdsc_absaddr.msf.minute;
  423. X    msf->second = subchnl.cdsc_absaddr.msf.second;
  424. X    msf->frame = subchnl.cdsc_absaddr.msf.frame;
  425. X
  426. X    return (0);
  427. X
  428. X}
  429. X
  430. Xint
  431. Xcdrom_play_track(start_track, end_track)
  432. X    unsigned char        start_track;
  433. X    unsigned char        end_track;
  434. X{
  435. X    struct    cdrom_ti    ti;
  436. X
  437. X    if (cdrom_fd == -1)
  438. X        return(-1);
  439. X
  440. X    ti.cdti_trk0 = start_track;
  441. X    ti.cdti_ind0 = 1;
  442. X    ti.cdti_trk1 = end_track;
  443. X    ti.cdti_ind1 = 1;
  444. X
  445. X    if (ioctl(cdrom_fd, CDROMPLAYTRKIND, &ti) == -1) {
  446. X        perror("ioctl(cdromplaytrkind)");
  447. X        return(-1);
  448. X    }
  449. X
  450. X    return(0);
  451. X}
  452. X
  453. Xint
  454. Xcdrom_play_msf(start_msf, end_msf)
  455. X    struct msf    *start_msf;
  456. X    struct msf    *end_msf;
  457. X{
  458. X    struct    cdrom_msf    play_addr;
  459. X
  460. X    if (cdrom_fd == -1)
  461. X        return(-1);
  462. X
  463. X    play_addr.cdmsf_min0 = start_msf->minute;
  464. X    play_addr.cdmsf_sec0 = start_msf->second;
  465. X    play_addr.cdmsf_frame0 = start_msf->frame;
  466. X    play_addr.cdmsf_min1 = end_msf->minute;
  467. X    play_addr.cdmsf_sec1 = end_msf->second;
  468. X    play_addr.cdmsf_frame1 = end_msf->frame;
  469. X
  470. X    if (ioctl(cdrom_fd, CDROMPLAYMSF, &play_addr) == -1) {
  471. X        perror("ioctl(cdromplaymsf)");
  472. X        return(-1);
  473. X    }
  474. X
  475. X    return(0);
  476. X}
  477. Xint
  478. Xcdrom_read_tocentry(track, tocentry)
  479. X    unsigned int        track;
  480. X    struct cdrom_tocentry    *tocentry;
  481. X{
  482. X    if (cdrom_fd == -1)
  483. X        return(-1);
  484. X
  485. X    tocentry->cdte_track = track;
  486. X    tocentry->cdte_format = CDROM_MSF;
  487. X
  488. X    if (ioctl(cdrom_fd, CDROMREADTOCENTRY, (char *) tocentry) == -1) {
  489. X        perror("ioctl(cdromreadtocentry)");
  490. X        return(-1);
  491. X    }
  492. X
  493. X    return(0);
  494. X}
  495. X
  496. Xint
  497. Xcdrom_read_tochdr(tochdr)
  498. X    struct cdrom_tochdr    *tochdr;
  499. X{
  500. X    if (cdrom_fd == -1)
  501. X        return(-1);
  502. X
  503. X    if (ioctl(cdrom_fd, CDROMREADTOCHDR, (char *) tochdr) == -1) {
  504. X        debug-printf(stderr,"ioctl(cdromreadtochdr): ");
  505. X        /* perror("ioctl(cdromreadtochdr)"); */
  506. X        return(-1);
  507. X    }
  508. X
  509. X    return(0);
  510. X}
  511. X
  512. Xint
  513. Xcdrom_status() {
  514. X    struct cdrom_subchnl    subchnl;
  515. X
  516. X    if (cdrom_fd == -1)
  517. X        return(-1);
  518. X
  519. X    if (ioctl(cdrom_fd, CDROMSUBCHNL, (char *) &subchnl) == -1) {
  520. X        fprintf(stderr, "ioctl(cdromsubchnl): ");
  521. X        perror(cdrom);
  522. X        exit(1);
  523. X    }
  524. X
  525. X    switch (subchnl.cdsc_audiostatus) {
  526. X        case CDROM_AUDIO_INVALID:
  527. X        return(CDROM_INVALID);
  528. X
  529. X        case CDROM_AUDIO_PLAY:
  530. X        return(CDROM_PLAYING);
  531. X
  532. X        case CDROM_AUDIO_PAUSED:
  533. X        return(CDROM_PAUSED);
  534. X
  535. X        case CDROM_AUDIO_COMPLETED:
  536. X        return(CDROM_COMPLETED);
  537. X
  538. X        case CDROM_AUDIO_ERROR:
  539. X        return(CDROM_ERROR);
  540. X
  541. X        case CDROM_AUDIO_NO_STATUS:
  542. X        return(CDROM_NO_STATUS);
  543. X    }
  544. X
  545. X    return(-1);
  546. X}
  547. X
  548. X# if defined(notused)
  549. Xint
  550. Xcdrom_playing(track)
  551. X    int            *track;
  552. X{
  553. X    struct cdrom_subchnl    sc;
  554. X
  555. X    if (cdrom_fd == -1)
  556. X        return(-1);
  557. X
  558. X    sc.cdsc_format = CDROM_MSF;
  559. X    if (ioctl(cdrom_fd, CDROMSUBCHNL, &sc) == -1) {
  560. X        perror("ioctl(cdromsubchnl)");
  561. X        return(-1);
  562. X    }
  563. X
  564. X    *track = sc.cdsc_trk;
  565. X
  566. X    if (sc.cdsc_audiostatus == CDROM_AUDIO_PLAY)
  567. X        return(1);
  568. X
  569. X    return(0);
  570. X}
  571. X# endif /* defined(notused) */
  572. X
  573. X# if defined(notused)
  574. Xint
  575. Xcdrom_paused(track)
  576. X    int            *track;
  577. X{
  578. X    struct cdrom_subchnl    sc;
  579. X
  580. X    if (cdrom_fd == -1)
  581. X        return(-1);
  582. X
  583. X    sc.cdsc_format = CDROM_MSF;
  584. X    if (ioctl(cdrom_fd, CDROMSUBCHNL, &sc) == -1) {
  585. X        perror("ioctl(cdromsubchnl)");
  586. X        return(-1);
  587. X    }
  588. X
  589. X    *track = sc.cdsc_trk;
  590. X
  591. X    if (sc.cdsc_audiostatus == CDROM_AUDIO_PAUSED)
  592. X        return(1);
  593. X
  594. X    return(0);
  595. X}
  596. X# endif /* defined(notused) */
  597. X
  598. X# if defined(notused)
  599. Xint
  600. Xmounted(name)
  601. X    char        *name;
  602. X{
  603. X    char        buf[MAXPATHLEN], *cp;
  604. X    struct stat    st;
  605. X    dev_t        bdevno;
  606. X    FILE        *fp;
  607. X    struct mntent    *mnt;
  608. X
  609. X    /*
  610. X     * Get the block device corresponding to the raw device opened,
  611. X     * and find its device number.
  612. X     */
  613. X    if (stat(name, &st) != 0) {
  614. X        (void) fprintf(stderr, "stat: ");
  615. X        perror(name);
  616. X        return(UNMOUNTED);
  617. X    }
  618. X
  619. X    /*
  620. X     * If this is a raw device, we have to build the block device name.
  621. X     */
  622. X    if ((st.st_mode & S_IFMT) == S_IFCHR) {
  623. X        if ((cp = strchr(name, 'r')) != NULL)
  624. X            cp++;
  625. X
  626. X        (void) sprintf(buf, "/dev/%s", cp);
  627. X        if (stat(buf, &st) != 0) {
  628. X            (void) fprintf(stderr, "stat: ");
  629. X            perror(buf);
  630. X            return(UNMOUNTED);
  631. X        }
  632. X    }
  633. X
  634. X    if ((st.st_mode & S_IFMT) != S_IFBLK)
  635. X        return(UNMOUNTED);
  636. X
  637. X    bdevno = st.st_rdev & (dev_t)(~0x07);    /* Mask out partition. */
  638. X
  639. X    /*
  640. X     * Now go through the mtab, looking at all hsfs filesystems.
  641. X     * Compare the device mounted with our bdevno.
  642. X     */
  643. X    if ((fp = setmntent(MOUNTED, "r")) == NULL) {
  644. X        (void) fprintf(stderr, "couldn't open %s\n", MOUNTED);
  645. X        return(UNMOUNTED);
  646. X    }
  647. X
  648. X    while ((mnt = getmntent(fp)) != NULL) {
  649. X        /* avoid obvious excess stat(2)'s */
  650. X        if (strcmp(mnt->mnt_type, "hsfs") != 0)
  651. X            continue;
  652. X
  653. X        if (stat(mnt->mnt_fsname, &st) != 0)
  654. X            continue;
  655. X
  656. X        if (((st.st_mode & S_IFMT) == S_IFBLK) &&
  657. X            ((st.st_rdev & (dev_t)(~0x07)) == bdevno)) {
  658. X            (void) endmntent(fp);
  659. X            return(STILL_MOUNTED);
  660. X        }
  661. X    }
  662. X
  663. X    (void) endmntent(fp);
  664. X
  665. X    return(UNMOUNTED);
  666. X}
  667. X# endif /* defined(notused) */
  668. X
  669. Xunsigned short *
  670. Xushort_malloc(n)
  671. X    int        n;
  672. X{
  673. X    extern char    *calloc();
  674. X    unsigned short    *ptr;
  675. X
  676. X    ptr = (unsigned short *) calloc(n, sizeof(unsigned short));
  677. X    if (ptr == NULL) {
  678. X        perror("calloc");
  679. X        exit(1);
  680. X    }
  681. X
  682. X    return(ptr);
  683. X}
  684. X
  685. Xstruct msf *
  686. Xmsf_malloc(n)
  687. X    int        n;
  688. X{
  689. X    extern char    *calloc();
  690. X    struct msf    *ptr;
  691. X
  692. X    ptr = (struct msf *) calloc(n, sizeof(struct msf));
  693. X    if (ptr == NULL) {
  694. X        perror("calloc");
  695. X        exit(1);
  696. X    }
  697. X
  698. X    return(ptr);
  699. X}
  700. X
  701. Xint
  702. Xcdrom_disp_cdi() {
  703. X    int trk;
  704. X
  705. X    fprintf(stderr,"CDI structure:\n");
  706. X    fprintf(stderr,"\tcurtrack: %d\n",cdi.curtrack);
  707. X    fprintf(stderr,"\tmin: %d  max: %d  total: %d\n",
  708. X        cdi.mintrack, cdi.maxtrack, cdi.ntracks);
  709. X    fprintf(stderr,"\tdur: %d  state: %2x\n",cdi.duration, cdi.state);
  710. X    fprintf(stderr,"\tcurrand: %d  lastprog: %d\n",
  711. X        cdi.currand, cdi.lastprog);
  712. X    fprintf(stderr,"\n\tTracklist:\n");
  713. X    if (cdi.maxtrack != cdi.mintrack) {
  714. X        for (trk=cdi.mintrack; trk<=cdi.maxtrack; trk++) {
  715. X            fprintf(stderr,"\t%3d: %d %02d:%02d %d\n",trk,cdi.times[trk],
  716. X                cdi.addrs[trk].minute,cdi.addrs[trk].second,
  717. X                cdi.addrs[trk].frame);
  718. X        }
  719. X    }
  720. X}
  721. X
  722. X# endif /* defined(sun) */
  723. END_OF_FILE
  724. if test 12913 -ne `wc -c <'xcdplayer-2.2/cdrom_sun.c'`; then
  725.     echo shar: \"'xcdplayer-2.2/cdrom_sun.c'\" unpacked with wrong size!
  726. fi
  727. # end of 'xcdplayer-2.2/cdrom_sun.c'
  728. fi
  729. if test -f 'xcdplayer-2.2/internals.c' -a "${1}" != "-c" ; then 
  730.   echo shar: Will not clobber existing file \"'xcdplayer-2.2/internals.c'\"
  731. else
  732. echo shar: Extracting \"'xcdplayer-2.2/internals.c'\" \(15296 characters\)
  733. sed "s/^X//" >'xcdplayer-2.2/internals.c' <<'END_OF_FILE'
  734. X/*
  735. X * Copyright (C) 1990 Regents of the University of California.
  736. X *
  737. X * Permission to use, copy, modify, distribute, and sell this software and
  738. X * its documentation for any purpose is hereby granted without fee,
  739. X * provided that the above copyright notice appear in all copies and that
  740. X * both that copyright notice and this permission notice appear in
  741. X * supporting documentation, and that the name of the University of
  742. X * California not be used in advertising or publicity pertaining to
  743. X * distribution of the software without specific, written prior
  744. X * permission.  the University of California makes no representations
  745. X * about the suitability of this software for any purpose.  It is provided
  746. X * "as is" without express or implied warranty.
  747. X */
  748. X
  749. X# include <X11/Intrinsic.h>
  750. X# include <X11/StringDefs.h>
  751. X# include <X11/Xaw/Form.h>
  752. X# include <X11/Xaw/Toggle.h>
  753. X
  754. X# include <stdio.h>
  755. X
  756. X# include "debug.h"
  757. X# include "cdrom_globs.h"
  758. X#ifdef sun
  759. X# include "cdrom_sun.h"
  760. X#endif
  761. X#ifdef sgi
  762. X# include "cdrom_sgi.h"
  763. X#endif
  764. X
  765. X
  766. Xstatic XtIntervalId    ivid            = -1;
  767. Xstatic XtIntervalId    scanivid        = -1;
  768. Xstatic XtIntervalId    stativid        = -1;
  769. Xstatic unsigned int    timer_mod        = 1000 / TIMER_PERIOD;
  770. Xunsigned int        timer_fsecs;
  771. X
  772. X
  773. Xint
  774. Xcdrom_get_curtime() {
  775. X
  776. X    int curtime;
  777. X    int curtrack;
  778. X    struct msf curmsf, track_start;
  779. X
  780. X    if (cdrom_open() == -1) {
  781. X        debug_printf(1, "cdrom_get_curtime: error from cdrom_open\n");
  782. X        return;
  783. X    }
  784. X
  785. X    switch (cdrom_status()) {
  786. X    case CDROM_PAUSED:
  787. X    case CDROM_PLAYING:
  788. X        if (cdrom_get_curmsf(&curmsf) == -1) {
  789. X        debug_printf(1, "get_curtime: error reading location\n");
  790. X        return;
  791. X        }
  792. X
  793. X        if (((curtrack = cdrom_get_curtrack()) == -1) ||
  794. X        (curtrack != cdi.curtrack))
  795. X        {
  796. X        return(0);
  797. X        }
  798. X        else
  799. X        {
  800. X            track_start = cdi.addrs[cdi.curtrack - 1];
  801. X            curtime = (curmsf.minute - track_start.minute) * 60 +
  802. X            (curmsf.second - track_start.second) + 1;
  803. X
  804. X            return (curtime);
  805. X        }
  806. X        break;
  807. X    default:
  808. X        return(0);
  809. X    }
  810. X}
  811. X
  812. X
  813. X/*
  814. X * we poll the cd-rom drive every TIMER_PERIOD milliseconds to see where 
  815. X * it is and if it's on a new track, and update the label widget.
  816. X */
  817. Xvoid
  818. Xcdrom_timer_on() {
  819. X    static void    update_track();
  820. X
  821. X    if (cdi.state & CDROM_STATE_PLAY)
  822. X        ivid = XtAppAddTimeOut(appc, TIMER_PERIOD, update_track, NULL);
  823. X}
  824. X
  825. X
  826. X/*
  827. X * cdrom_timer_off turns off the X timeout.
  828. X */
  829. Xvoid
  830. Xcdrom_timer_off() {
  831. X    if (ivid != -1) {
  832. X        XtRemoveTimeOut(ivid);
  833. X        ivid = -1;
  834. X    }
  835. X}
  836. X
  837. X/*
  838. X * activates player by track/index: 
  839. X */
  840. Xint
  841. Xcdrom_play() {
  842. X    int    ret;
  843. X
  844. X    debug_printf(1, "cdrom_play: starting track %d\n", (int) cdi.curtrack);
  845. X
  846. X    track_button_update();
  847. X
  848. X    if ((cdi.state & CDROM_STATE_SHUFFLE) ||
  849. X        (cdi.state & CDROM_STATE_PROGRAM))
  850. X        ret = cdrom_play_track(cdi.curtrack, cdi.curtrack);
  851. X    else
  852. X        ret = cdrom_play_track(cdi.curtrack, cdi.maxtrack);
  853. X
  854. X    cdrom_timer_on();
  855. X
  856. X    return(ret);
  857. X}
  858. X
  859. X
  860. X/*
  861. X * resets player to disc origin and turns off all modes:
  862. X */
  863. Xvoid
  864. Xcdrom_reset() {
  865. X
  866. X    cdrom_timer_off();
  867. X
  868. X    if (cdi.curtrack != 0)
  869. X    {
  870. X        cdi.curtrack = 1;
  871. X        (void) cdrom_play(); /* force disk to beginning */
  872. X
  873. X        /* 
  874. X         * "pause disk" immediately; doesn't appear that you can truly
  875. X         * stop the disk at origin; just stop at current location...
  876. X         */
  877. X        cdrom_stop();
  878. X        cdi.state |= CDROM_STATE_STOP;
  879. X        debug_printf(1, "cdrom_reset: forcing immediate stop\n");
  880. X        leds_stop();
  881. X        cdrom_timer_off();
  882. X        cdi.curtrack = 0;
  883. X    }
  884. X
  885. X    cdi.state &= ~(CDROM_STATE_PLAY | CDROM_STATE_PAUSE | 
  886. X                CDROM_STATE_EJECTED);
  887. X
  888. X    update_title();
  889. X
  890. X    play_button_reset();
  891. X    pause_button_reset();
  892. X    timer_button_reset();
  893. X
  894. X    track_button_update();
  895. X    timer_button_update();
  896. X}
  897. X
  898. X/*
  899. X * rewinds the player through minute/second/frames:
  900. X */
  901. Xvoid
  902. Xcdrom_rewind () {
  903. X    struct msf    track_start;
  904. X        struct msf    start_addr, end_addr;
  905. X    int        curtrack;
  906. X    extern void     scan_update();
  907. X
  908. X    if (cdrom_get_curmsf(&start_addr) == -1) {
  909. X        debug_printf(1, "rew: error reading location\n");
  910. X        return;
  911. X    }    
  912. X
  913. X    curtrack = cdrom_get_curtrack();
  914. X
  915. X    if (curtrack != cdi.curtrack) 
  916. X        track_button_update();
  917. X
  918. X    /* find start of current track: */
  919. X    track_start = cdi.addrs[curtrack - 1];
  920. X
  921. X    /* 
  922. X     * deal with cases where we can't back up beyond the current track: 
  923. X     */
  924. X    if ((curtrack == cdi.mintrack)  || 
  925. X        (cdi.state & CDROM_STATE_SHUFFLE) ||
  926. X        (cdi.state & CDROM_STATE_PROGRAM))
  927. X    {
  928. X        /* Ugh, this is ugly... (drich) */
  929. X        if (((cdi.state & CDROM_STATE_PLAY) && 
  930. X         ((track_start.minute * 60) + track_start.second) >=
  931. X         ((start_addr.minute * 60) + start_addr.second - 
  932. X          scanSkipInterval)) ||
  933. X        ((cdi.state & CDROM_STATE_PAUSE) &&
  934. X         ((track_start.minute * 60) + track_start.second) >=
  935. X         ((start_addr.minute * 60) + start_addr.second -
  936. X          pauseSkipInterval)))
  937. X        {
  938. X            start_addr = track_start;
  939. X            start_addr.second++; /* guarantee we never back up too far */
  940. X        }
  941. X        else
  942. X        {
  943. X        if (cdi.state & CDROM_STATE_PAUSE) {
  944. X            start_addr.second -= pauseSkipInterval; 
  945. X        } else if (cdi.state & CDROM_STATE_PLAY) {
  946. X            start_addr.second -= scanSkipInterval; 
  947. X        }
  948. X            if ((char) start_addr.second < 0)
  949. X            {
  950. X            start_addr.minute--;
  951. X            start_addr.second = 60 + (char) start_addr.second; 
  952. X            }
  953. X        }
  954. X
  955. X    }
  956. X    else /* normal case */
  957. X    {
  958. X        if (cdi.state & CDROM_STATE_PAUSE) {
  959. X            start_addr.second -= pauseSkipInterval; 
  960. X        } else if (cdi.state & CDROM_STATE_PLAY) {
  961. X            start_addr.second -= scanSkipInterval; 
  962. X        }
  963. X        if ((char) start_addr.second < 0)
  964. X        {
  965. X            start_addr.minute--;
  966. X            start_addr.second = 60 + (char) start_addr.second; 
  967. X        }
  968. X    }
  969. X        
  970. X    if ((cdi.state & CDROM_STATE_PROGRAM) || 
  971. X        (cdi.state & CDROM_STATE_SHUFFLE))
  972. X    {
  973. X
  974. X        /* then to end of current selection (start of next track - 1 sec) */
  975. X        end_addr = cdi.addrs[cdi.curtrack]; 
  976. X        end_addr.second--;         
  977. X        if ((char) end_addr.second < 0)
  978. X        {
  979. X        end_addr.minute--;
  980. X        end_addr.second = 59;
  981. X        }
  982. X    }
  983. X    else
  984. X    {
  985. X
  986. X        /*
  987. X         * to end of last track; array 0-based, so really index for 
  988. X         * leadout addr:
  989. X         */
  990. X        end_addr = cdi.addrs[cdi.maxtrack];
  991. X        end_addr.second--; /* go to last second */
  992. X        if ((char) end_addr.second < 0)
  993. X        {
  994. X        end_addr.minute--;
  995. X        end_addr.second = 59;
  996. X        }
  997. X    }
  998. X
  999. X    if ((start_addr.minute == end_addr.minute) && 
  1000. X        (start_addr.second == end_addr.second))
  1001. X        end_addr.frame = start_addr.frame;
  1002. X
  1003. X    cdrom_play_msf (&start_addr, &end_addr);
  1004. X
  1005. X    timer_fsecs = 0;
  1006. X    if (cdi.state & CDROM_STATE_PAUSE)
  1007. X    {
  1008. X        if (scanivid == -1)
  1009. X        scanivid = XtAppAddTimeOut(appc, 
  1010. X            (int)(pausePauseInterval * 1000.0), 
  1011. X            scan_update, NULL);
  1012. X
  1013. X        cdi.state &= ~CDROM_STATE_PAUSE;    /* allow timer to change */
  1014. X        timer_button_update();
  1015. X        cdi.state |= CDROM_STATE_PAUSE;    /* restore true state */
  1016. X
  1017. X        if (cdrom_pause() != -1)        /* re-pause */
  1018. X           cdi.state &= ~CDROM_STATE_STOP;
  1019. X
  1020. X    }
  1021. X    else
  1022. X    {
  1023. X        if (scanivid != -1) {
  1024. X        XtRemoveTimeOut(scanivid);
  1025. X        ivid = -1;
  1026. X        }
  1027. X        timer_button_update();
  1028. X    }
  1029. X
  1030. X}
  1031. X
  1032. X/*
  1033. X * fast-forwards the player through minute/second/frames:
  1034. X */
  1035. Xvoid
  1036. Xcdrom_ff () {
  1037. X        struct msf    start_addr, end_addr,  next_start;
  1038. X    char        t;
  1039. X    int        curtrack;
  1040. X    extern void     scan_update();
  1041. X
  1042. X    if (cdrom_get_curmsf(&start_addr) == -1) {
  1043. X        debug_printf(1, "ff: error reading location\n");
  1044. X        return;
  1045. X    }    
  1046. X
  1047. X    curtrack = cdrom_get_curtrack();
  1048. X
  1049. X    if (curtrack != cdi.curtrack) 
  1050. X        track_button_update();
  1051. X
  1052. X    /* find start of next track */
  1053. X    next_start = cdi.addrs[curtrack];
  1054. X        
  1055. X    /* 
  1056. X     * deal with cases where we can't fast forward beyond the current 
  1057. X     * track: 
  1058. X     */
  1059. X    if ((curtrack == cdi.maxtrack)  || 
  1060. X        (cdi.state & CDROM_STATE_SHUFFLE) ||
  1061. X        (cdi.state & CDROM_STATE_PROGRAM))
  1062. X    {
  1063. X        /* see if skipping ahead will go beyond the current track: */
  1064. X        /* Ugh, this is ugly... (drich) */
  1065. X        if (((cdi.state & CDROM_STATE_PLAY) && 
  1066. X         ((next_start.minute * 60) + next_start.second) <=
  1067. X         ((start_addr.minute * 60) + start_addr.second +
  1068. X          scanSkipInterval)) ||
  1069. X        ((cdi.state & CDROM_STATE_PAUSE) &&
  1070. X         ((next_start.minute * 60) + next_start.second) <=
  1071. X         ((start_addr.minute * 60) + start_addr.second +
  1072. X          pauseSkipInterval)))
  1073. X        {
  1074. X        
  1075. X            /* start at end of current track */
  1076. X            start_addr = next_start;
  1077. X            start_addr.second--;
  1078. X        }
  1079. X        else
  1080. X        {
  1081. X            if (cdi.state & CDROM_STATE_PAUSE) {
  1082. X                start_addr.second += pauseSkipInterval; 
  1083. X            } else if (cdi.state & CDROM_STATE_PLAY) {
  1084. X                start_addr.second += scanSkipInterval; 
  1085. X            }
  1086. X            if (start_addr.second >= 60)
  1087. X            {
  1088. X                start_addr.minute++;
  1089. X                start_addr.second = start_addr.second - 60;
  1090. X            }
  1091. X        }
  1092. X    }
  1093. X    else
  1094. X    {
  1095. X        if (cdi.state & CDROM_STATE_PAUSE) {
  1096. X        start_addr.second += pauseSkipInterval; 
  1097. X        } else if (cdi.state & CDROM_STATE_PLAY) {
  1098. X        start_addr.second += scanSkipInterval; 
  1099. X        }
  1100. X        if (start_addr.second >= 60)
  1101. X        {
  1102. X        start_addr.minute++;
  1103. X        start_addr.second = start_addr.second - 60;
  1104. X        }
  1105. X    }
  1106. X
  1107. X    if ((cdi.state & CDROM_STATE_PROGRAM) || 
  1108. X        (cdi.state & CDROM_STATE_SHUFFLE))
  1109. X    {
  1110. X
  1111. X        /* then to end of current selection */
  1112. X        end_addr = next_start;    /* use start of next */
  1113. X        end_addr.second--;         /* and back off 1 second */
  1114. X        if ((char) end_addr.second < 0)
  1115. X        {
  1116. X        end_addr.minute--;
  1117. X        end_addr.second = 59;
  1118. X        }
  1119. X    }
  1120. X    else
  1121. X    {
  1122. X        /* 
  1123. X         * "to end of last track"; array 0-based, so really index for 
  1124. X         * leadout addr 
  1125. X         */
  1126. X        end_addr = cdi.addrs[cdi.maxtrack];
  1127. X
  1128. X        end_addr.second--; /* (you can't play the leadout) */
  1129. X        if ((char) end_addr.second < 0)
  1130. X        {
  1131. X        end_addr.minute--;
  1132. X        end_addr.second = 59;
  1133. X        }
  1134. X    }
  1135. X
  1136. X    if ((start_addr.minute == end_addr.minute) && 
  1137. X        (start_addr.second == end_addr.second))
  1138. X    {
  1139. X        start_addr.frame = end_addr.frame = 0;
  1140. X    }
  1141. X
  1142. X    cdrom_play_msf (&start_addr, &end_addr);
  1143. X
  1144. X    timer_fsecs = 0;
  1145. X    if (cdi.state & CDROM_STATE_PAUSE)
  1146. X    {
  1147. X        if (scanivid == -1)
  1148. X        scanivid = XtAppAddTimeOut(appc, 
  1149. X            (int)(pausePauseInterval * 1000.0), 
  1150. X            scan_update, NULL);
  1151. X
  1152. X        cdi.state &= ~CDROM_STATE_PAUSE;    /* allow timer to change */
  1153. X        timer_button_update();
  1154. X        cdi.state |= CDROM_STATE_PAUSE;    /* restore true state */
  1155. X
  1156. X        if (cdrom_pause() != -1)        /* re-pause */
  1157. X           cdi.state &= ~CDROM_STATE_STOP;
  1158. X    }
  1159. X    else
  1160. X    {
  1161. X        if (scanivid != -1) {
  1162. X        XtRemoveTimeOut(scanivid);
  1163. X        ivid = -1;
  1164. X        }
  1165. X        timer_button_update();
  1166. X    }
  1167. X}
  1168. X
  1169. X
  1170. X/*
  1171. X * called by update_track when the cd has hit
  1172. X * the end of the track or the disc.
  1173. X */
  1174. Xstatic void
  1175. Xcdrom_atend() {
  1176. X    cdrom_timer_off();
  1177. X    leds_stop();
  1178. X    debug_printf(1, "cdrom_atend: at end\n");
  1179. X
  1180. X#ifdef sgi
  1181. X    /* Force a stop to kill the child (if any).
  1182. X     * This is due to some sort of weirdness when the SGI runs off the 
  1183. X     * disc during a CDreadda().
  1184. X     */
  1185. X    if (cdi.scsi_audio) {
  1186. X        cdrom_stop();
  1187. X    }
  1188. X#endif
  1189. X    if (cdi.state & CDROM_STATE_SHUFFLE) {
  1190. X
  1191. X        if (cdi.currand == cdi.ntracks) {
  1192. X            if ((cdi.state & CDROM_STATE_CYCLE) == 0) {
  1193. X                debug_printf(1, "cdrom_atend: shuffle done\n");
  1194. X
  1195. X                cdrom_reset();
  1196. X                return;
  1197. X            }
  1198. X
  1199. X            debug_printf(1, "cdrom_atend: shuffle cycling\n");
  1200. X            shuffle_setup();
  1201. X        }
  1202. X
  1203. X        cdi.curtrack = shuffle_next_track();
  1204. X    }
  1205. X    else if (cdi.state & CDROM_STATE_PROGRAM) {
  1206. X        if ((cdi.curtrack = program_goto_next_track()) == 0)
  1207. X        {
  1208. X            if (cdi.state & CDROM_STATE_CYCLE)
  1209. X            {
  1210. X                debug_printf(1, "cdrom_atend: cycling program\n");
  1211. X            cdi.curtrack = program_resume();
  1212. X            timer_fsecs = 0;
  1213. X            cdi.duration = 0;
  1214. X            timer_button_update();
  1215. X
  1216. X            (void) cdrom_play();
  1217. X            }
  1218. X            else
  1219. X            {
  1220. X                debug_printf(1, "cdrom_atend: all done\n");
  1221. X                cdrom_reset();
  1222. X            }
  1223. X            return;
  1224. X        }
  1225. X    }
  1226. X            
  1227. X    else if ((cdi.curtrack < cdi.maxtrack) && (cdi.curtrack != 0)) {
  1228. X        debug_printf(1, "cdrom_atend: continuing\n");
  1229. X        cdi.curtrack++;
  1230. X    }
  1231. X    else if (cdi.state & CDROM_STATE_CYCLE) {
  1232. X        debug_printf(1, "cdrom_atend: cycling\n");
  1233. X        cdi.curtrack = cdi.mintrack;
  1234. X    }
  1235. X    else {
  1236. X        debug_printf(1, "cdrom_atend: all done\n");
  1237. X        buttons_reset();
  1238. X        cdrom_reset();
  1239. X        return;
  1240. X    }
  1241. X
  1242. X    timer_fsecs = 0;
  1243. X    cdi.duration = 0;
  1244. X    timer_button_update();
  1245. X
  1246. X    (void) cdrom_play();
  1247. X}
  1248. X
  1249. X/*
  1250. X * scan_update is called when the scan timeout fires; it updates the timer 
  1251. X * and calls the label update routine.
  1252. X */
  1253. X/*ARGSUSED*/
  1254. Xstatic void
  1255. Xscan_update(data, id)
  1256. X    XtPointer    *data;
  1257. X    XtIntervalId    *id;
  1258. X{
  1259. X    unsigned int    curtrack;
  1260. X    Arg    args[1];
  1261. X    Boolean    state;
  1262. X
  1263. X    extern Widget    rew_button_widget;
  1264. X    extern Widget    ff_button_widget;
  1265. X
  1266. X    if ((curtrack = cdrom_get_curtrack()) != cdi.curtrack) {
  1267. X        if (curtrack == 0) {
  1268. X            cdrom_atend();
  1269. X
  1270. X            return;
  1271. X        }
  1272. X
  1273. X        timer_fsecs = 0;
  1274. X        cdi.duration = 0;
  1275. X        timer_button_update();
  1276. X
  1277. X        cdi.curtrack = curtrack;
  1278. X        track_button_update();
  1279. X    }
  1280. X
  1281. X
  1282. X    XtSetArg(args[0], XtNstate, &state);
  1283. X    XtGetValues(rew_button_widget, args, 1);
  1284. X    if (state == True)
  1285. X    {
  1286. X        cdrom_rewind();
  1287. X        leds_update(BACKWARDS);
  1288. X        if (cdi.state & CDROM_STATE_PAUSE) {
  1289. X            if (cdrom_pause() != -1)
  1290. X                 cdi.state &= ~CDROM_STATE_STOP;
  1291. X        }
  1292. X            ivid = XtAppAddTimeOut(appc, 
  1293. X            (int)(scanPauseInterval * 1000.0), 
  1294. X            scan_update, NULL);
  1295. X    }
  1296. X    else
  1297. X    {
  1298. X        leds_update(FORWARDS);
  1299. X        XtSetArg(args[0], XtNstate, &state);
  1300. X        XtGetValues(ff_button_widget, args, 1);
  1301. X        if (state == True)
  1302. X        {
  1303. X            cdrom_ff();
  1304. X            if (cdi.state & CDROM_STATE_PAUSE) {
  1305. X                if (cdrom_pause() != -1)
  1306. X                     cdi.state &= ~CDROM_STATE_STOP;
  1307. X            }
  1308. X
  1309. X            ivid = XtAppAddTimeOut(appc,
  1310. X                (int)(scanPauseInterval * 1000.0),
  1311. X                scan_update, NULL);
  1312. X        }
  1313. X        else if (scanivid != -1) {
  1314. X            XtRemoveTimeOut(scanivid);
  1315. X            scanivid = -1;
  1316. X        }
  1317. X    }
  1318. X}
  1319. X
  1320. X
  1321. X/*
  1322. X * update_status is called when the status timeout fires;  it maintains
  1323. X * the disc status, and will detect when a new disc has been inserted.
  1324. X */
  1325. X/*ARGSUSED*/
  1326. Xvoid
  1327. Xupdate_status(data, id)
  1328. X    XtPointer    *data;
  1329. X    XtIntervalId    *id;
  1330. X{
  1331. X    if (cdi.state & CDROM_STATE_EJECTED) {
  1332. X        if (cdrom_open() == -1) {
  1333. X            debug_printf(1, "cdrom_open: cdrom not ready\n");
  1334. X        } else {
  1335. X            cdi.state &= ~CDROM_STATE_EJECTED;
  1336. X            buttons_reset();
  1337. X        }
  1338. X    }
  1339. X    
  1340. X    /* Reset timer */
  1341. X    stativid = XtAppAddTimeOut(appc, 1000, update_status, NULL);
  1342. X}
  1343. X
  1344. X/*
  1345. X * update_track is called when the timeout fires; it updates curtrack and 
  1346. X * calls the label update routine.
  1347. X */
  1348. X/*ARGSUSED*/
  1349. Xstatic void
  1350. Xupdate_track(data, id)
  1351. X    XtPointer    *data;
  1352. X    XtIntervalId    *id;
  1353. X{
  1354. X    unsigned int    curtrack;
  1355. X    Arg    args[1];
  1356. X    Boolean    state;
  1357. X
  1358. X    extern Widget    rew_button_widget;
  1359. X    extern Widget    ff_button_widget;
  1360. X#ifdef sgi
  1361. X
  1362. X    int    vol;
  1363. X#endif
  1364. X
  1365. X    if ((curtrack = cdrom_get_curtrack()) != cdi.curtrack) {
  1366. X        if (curtrack == 0) {
  1367. X            cdrom_atend();
  1368. X
  1369. X            return;
  1370. X        }
  1371. X
  1372. X        timer_fsecs = 0;
  1373. X        cdi.duration = 0;
  1374. X        timer_button_update();
  1375. X
  1376. X        cdi.curtrack = curtrack;
  1377. X        track_button_update();
  1378. X    }
  1379. X
  1380. X#ifdef sgi
  1381. X    /* Update the volume control */
  1382. X    if ((vol = cdrom_get_volume()) != 0) {
  1383. X        set_volume(vol);
  1384. X    }
  1385. X#endif
  1386. X
  1387. X    XtSetArg(args[0], XtNstate, &state);
  1388. X    XtGetValues(rew_button_widget, args, 1);
  1389. X    if (state == True)
  1390. X    {
  1391. X        cdrom_rewind();
  1392. X        leds_update(BACKWARDS);
  1393. X        if (cdi.state & CDROM_STATE_PAUSE) {
  1394. X            if (cdrom_pause() != -1)
  1395. X                 cdi.state &= ~CDROM_STATE_STOP;
  1396. X        }
  1397. X            ivid = XtAppAddTimeOut(appc, 
  1398. X            (int)(scanPauseInterval * 1000.0), 
  1399. X            update_track, NULL);
  1400. X    }
  1401. X    else
  1402. X    {
  1403. X        leds_update(FORWARDS);
  1404. X        XtSetArg(args[0], XtNstate, &state);
  1405. X        XtGetValues(ff_button_widget, args, 1);
  1406. X        if (state == True)
  1407. X        {
  1408. X            cdrom_ff();
  1409. X            if (cdi.state & CDROM_STATE_PAUSE) {
  1410. X                if (cdrom_pause() != -1)
  1411. X                     cdi.state &= ~CDROM_STATE_STOP;
  1412. X            }
  1413. X
  1414. X            ivid = XtAppAddTimeOut(appc,
  1415. X                (int)(scanPauseInterval * 1000.0),
  1416. X                update_track, NULL);
  1417. X        }
  1418. X        else
  1419. X        {
  1420. X            if ((timer_fsecs++ % timer_mod) == 0) {
  1421. X                timer_button_update();
  1422. X            }
  1423. X            ivid = XtAppAddTimeOut(appc, TIMER_PERIOD, 
  1424. X                update_track, NULL);
  1425. X        }
  1426. X    }
  1427. X}
  1428. X
  1429. END_OF_FILE
  1430. if test 15296 -ne `wc -c <'xcdplayer-2.2/internals.c'`; then
  1431.     echo shar: \"'xcdplayer-2.2/internals.c'\" unpacked with wrong size!
  1432. fi
  1433. # end of 'xcdplayer-2.2/internals.c'
  1434. fi
  1435. if test -f 'xcdplayer-2.2/logo_setup.c' -a "${1}" != "-c" ; then 
  1436.   echo shar: Will not clobber existing file \"'xcdplayer-2.2/logo_setup.c'\"
  1437. else
  1438. echo shar: Extracting \"'xcdplayer-2.2/logo_setup.c'\" \(15407 characters\)
  1439. sed "s/^X//" >'xcdplayer-2.2/logo_setup.c' <<'END_OF_FILE'
  1440. X/*
  1441. X * Copyright (C) 1990 Regents of the University of California.
  1442. X *
  1443. X * Permission to use, copy, modify, distribute, and sell this software and
  1444. X * its documentation for any purpose is hereby granted without fee,
  1445. X * provided that the above copyright notice appear in all copies and that
  1446. X * both that copyright notice and this permission notice appear in
  1447. X * supporting documentation, and that the name of the University of
  1448. X * California not be used in advertising or publicity pertaining to
  1449. X * distribution of the software without specific, written prior
  1450. X * permission.  the University of California makes no representations
  1451. X * about the suitability of this software for any purpose.  It is provided
  1452. X * "as is" without express or implied warranty.
  1453. X */
  1454. X
  1455. X# include <X11/Intrinsic.h>
  1456. X# include <X11/StringDefs.h>
  1457. X# include <X11/Shell.h>
  1458. X# include <X11/Xaw/Form.h>
  1459. X# include <X11/Xaw/Label.h>
  1460. X# include <X11/Xaw/Command.h>
  1461. X# include <X11/Xaw/Toggle.h>
  1462. X# include <X11/Xaw/Scrollbar.h>
  1463. X# include <X11/Xaw/Dialog.h>
  1464. X# include <X11/Xaw/Viewport.h>
  1465. X
  1466. X# include <math.h>
  1467. X# include <stdio.h>
  1468. X
  1469. X# include "cdrom_globs.h"
  1470. X#ifdef sun
  1471. X# include "cdrom_sun.h"
  1472. X#endif
  1473. X#ifdef sgi
  1474. X# include "cdrom_sgi.h"
  1475. X#endif
  1476. X
  1477. X# include "logo.xbm"
  1478. X# include "thumb.xbm"
  1479. X# include <X11/bitmaps/gray>
  1480. X
  1481. X# define MAXVOL        0xff
  1482. X
  1483. Xvoid    Done();
  1484. X
  1485. Xstatic Widget    track_button_widget;
  1486. Xstatic Widget    timer_button_widget;
  1487. Xstatic Widget    volume_scroll_widget;
  1488. X
  1489. XWidget        title_viewport;
  1490. XWidget        title_form;
  1491. XWidget        title_button;
  1492. XWidget        title_dialog_shell;
  1493. XWidget        title_dialog_widget;
  1494. XWidget        title_done_widget;
  1495. X
  1496. Xstatic int    vol;
  1497. X
  1498. Xvoid
  1499. Xlogo_setup(parent_widget)
  1500. X    Widget        parent_widget;
  1501. X{
  1502. X    extern void    leds_label_setup();
  1503. X    extern void    cb_track_button();
  1504. X    extern void    cb_timer_button();
  1505. X    extern void    volume_jump_proc();
  1506. X    extern void    volume_scroll_proc();
  1507. X    extern void    popup_title_dialog();
  1508. X    extern void    popdown_title_dialog();
  1509. X
  1510. X    Widget        version_label_widget;
  1511. X    char        version_string[80];
  1512. X
  1513. X    Widget        logo_form_widget;
  1514. X    Widget        logo_label_widget;
  1515. X    Pixmap        logo_label_pixmap;
  1516. X    Pixmap        thumb_pixmap;
  1517. X    Pixmap        gray;
  1518. X    int            depth;
  1519. X    int        length;
  1520. X    
  1521. X
  1522. X    Arg        args[4];
  1523. X    static XtActionsRec    done[] = {
  1524. X        {"done", Done},
  1525. X    };
  1526. X
  1527. X
  1528. X    logo_form_widget = XtCreateManagedWidget("logoForm", formWidgetClass,
  1529. X                         parent_widget,
  1530. X                         (ArgList) NULL, 0);
  1531. X
  1532. X    logo_label_widget = XtCreateManagedWidget("logoLabel",
  1533. X                          labelWidgetClass,
  1534. X                          logo_form_widget,
  1535. X                          (ArgList) NULL, 0);
  1536. X
  1537. X    logo_label_pixmap = XCreateBitmapFromData(XtDisplay(logo_label_widget),
  1538. X                          rootwin(logo_label_widget),
  1539. X                          logo_bits,
  1540. X                          logo_width, logo_height);
  1541. X
  1542. X    sprintf(version_string,"XCdplayer %s%d",VERSION,PATCHLEVEL);
  1543. X    if (BETA != 0) {
  1544. X        sprintf(version_string,"%s beta %d",version_string,BETA);
  1545. X    }
  1546. X    XtSetArg(args[0], XtNjustify, XtJustifyRight);
  1547. X    XtSetArg(args[1], XtNlabel, version_string);
  1548. X    version_label_widget = XtCreateManagedWidget("versionLabel",
  1549. X                             labelWidgetClass,
  1550. X                             logo_form_widget,
  1551. X                             (ArgList) args, 2);
  1552. X
  1553. X    XtSetArg(args[0], XtNbitmap, logo_label_pixmap);
  1554. X    XtSetValues(logo_label_widget, args, 1);
  1555. X
  1556. X    leds_label_setup(logo_form_widget);
  1557. X
  1558. X
  1559. X    track_button_widget = XtCreateManagedWidget("trackButton",
  1560. X                            toggleWidgetClass,
  1561. X                            logo_form_widget,
  1562. X                            (ArgList) NULL, 0);
  1563. X
  1564. X    XtAddCallback(track_button_widget, XtNcallback, cb_track_button, 0);
  1565. X
  1566. X    track_button_update();
  1567. X
  1568. X    if (display_timer == True)
  1569. X        timer_button_widget = XtCreateManagedWidget("timerButton",
  1570. X                                   toggleWidgetClass,
  1571. X                               logo_form_widget,
  1572. X                               (ArgList) NULL, 0);
  1573. X
  1574. X    XtAddCallback(timer_button_widget, XtNcallback, cb_timer_button, 0);
  1575. X
  1576. X    timer_button_update();
  1577. X    thumb_pixmap = XCreateBitmapFromData(XtDisplay(logo_form_widget),
  1578. X                          rootwin(logo_form_widget),
  1579. X                          thumb_bits,
  1580. X                          thumb_width, thumb_height);
  1581. X
  1582. X    XtSetArg (args[0], XtNdepth, &depth);
  1583. X    XtGetValues (logo_form_widget, args, 1);
  1584. X
  1585. X    if (depth == 1) {
  1586. X        gray = XCreateBitmapFromData(XtDisplay(logo_form_widget),
  1587. X                          rootwin(logo_form_widget),
  1588. X                          gray_bits,
  1589. X                          gray_width, gray_height);
  1590. X
  1591. X        XtSetArg(args[0], XtNbackgroundPixmap, gray);
  1592. X        XtSetArg(args[1], XtNthumb, thumb_pixmap);
  1593. X        volume_scroll_widget = XtCreateManagedWidget("volumeScrollbar",
  1594. X                             scrollbarWidgetClass,
  1595. X                             logo_form_widget,
  1596. X                             (ArgList) args, 2);
  1597. X    }
  1598. X    else
  1599. X    {
  1600. X         /*XtSetArg(args[0], XtNthumb, thumb_pixmap);*/
  1601. X
  1602. X         volume_scroll_widget = XtCreateManagedWidget("volumeScrollbar",
  1603. X                             scrollbarWidgetClass,
  1604. X                             logo_form_widget,
  1605. X                             (ArgList) args, 0);
  1606. X    }
  1607. X
  1608. X    XtAddCallback(volume_scroll_widget, XtNjumpProc, volume_jump_proc, 0);
  1609. X    XtAddCallback(volume_scroll_widget, XtNscrollProc, volume_scroll_proc, 0);
  1610. X
  1611. X#ifdef sgi
  1612. X    if ((vol = cdrom_get_volume()) == 0) {
  1613. X        vol = (int) ((MAXVOL - volbase) * 0.75) + volbase;
  1614. X    }
  1615. X#else
  1616. X    vol = (int) ((MAXVOL - volbase) * 0.75) + volbase;
  1617. X#endif
  1618. X    cdrom_volume(vol, vol); 
  1619. X#ifdef sgi
  1620. X    XawScrollbarSetThumb(volume_scroll_widget, 
  1621. X                 (float) (VAL2PCT(vol)),
  1622. X                 (float) 1.0);
  1623. X#else
  1624. X    XawScrollbarSetThumb(volume_scroll_widget, (float) 0.75, (float) 1.0);
  1625. X#endif
  1626. X
  1627. X    title_viewport = XtCreateManagedWidget ("titleBarViewport",
  1628. X                viewportWidgetClass,
  1629. X                logo_form_widget,
  1630. X                (ArgList) NULL, 0);
  1631. X
  1632. X    title_form = XtCreateManagedWidget ("titleForm",
  1633. X                formWidgetClass,
  1634. X                title_viewport,
  1635. X                (ArgList) NULL, 0);
  1636. X
  1637. X    if (disc_title != NULL) 
  1638. X            XtSetArg(args[0], XtNlabel, disc_title);
  1639. X    else
  1640. X#ifdef sgi
  1641. X        if (cdrom_status() == CDROM_NO_STATUS) {
  1642. X            XtSetArg(args[0], XtNlabel, NODISCSTR);
  1643. X        } else {
  1644. X            XtSetArg(args[0], XtNlabel, NOTITLESTR);
  1645. X        }
  1646. X#else
  1647. X        XtSetArg(args[0], XtNlabel, NOTITLESTR);
  1648. X#endif
  1649. X
  1650. X    title_button = XtCreateManagedWidget ("titleBar",
  1651. X                commandWidgetClass,
  1652. X                title_form,
  1653. X                (ArgList) args, 1);
  1654. X
  1655. X    title_dialog_shell = XtCreatePopupShell("titleShell", 
  1656. X                transientShellWidgetClass,
  1657. X                title_button,
  1658. X                (ArgList) NULL, 0);
  1659. X
  1660. X        XtSetArg(args[0], XtNlabel, "Title: ");
  1661. X        title_dialog_widget = XtCreateManagedWidget("titleDialog",
  1662. X                                    dialogWidgetClass,
  1663. X                                    title_dialog_shell,
  1664. X                                    (ArgList) args, 1);
  1665. X
  1666. X    title_done_widget = XtCreateManagedWidget("Done",
  1667. X                    commandWidgetClass,
  1668. X                    title_dialog_widget,
  1669. X                    (ArgList) NULL, 0);
  1670. X    
  1671. X    XtAppAddActions(appc, done, XtNumber(done));
  1672. X
  1673. X    XtAddCallback(title_button, XtNcallback, popup_title_dialog,
  1674. X            (XtPointer) logo_form_widget);
  1675. X    XtAddCallback(title_done_widget, XtNcallback, popdown_title_dialog,
  1676. X            (XtPointer) title_dialog_widget);
  1677. X
  1678. X
  1679. X}
  1680. X
  1681. X/*ARGSUSED*/
  1682. Xstatic void
  1683. Xcb_track_button(widget, client_data, call_data)
  1684. X    Widget        widget;
  1685. X    XtPointer    client_data;
  1686. X    XtPointer    call_data;
  1687. X{
  1688. X    char        track_buf[40];
  1689. X    Arg        args[1];
  1690. X    Boolean        state;
  1691. X
  1692. X    XtSetArg(args[0], XtNstate, &state);
  1693. X    XtGetValues(widget, args, 1);
  1694. X
  1695. X#ifdef sgi
  1696. X    if (cdrom_status() == CDROM_NO_STATUS) {
  1697. X        cdi.state |= CDROM_STATE_EJECTED;
  1698. X        buttons_reset();
  1699. X        return;
  1700. X    }
  1701. X#endif
  1702. X
  1703. X    if (cdi.state & CDROM_STATE_EJECTED) {
  1704. X        cdrom_new_disc();
  1705. X    }
  1706. X
  1707. X    if (state == True)
  1708. X        sprintf(track_buf, "%d\n", cdi.maxtrack);
  1709. X    else
  1710. X        sprintf(track_buf, "%d\n", cdi.curtrack);
  1711. X
  1712. X    XtSetArg(args[0], XtNlabel, track_buf);
  1713. X    XtSetValues(widget, args, 1);
  1714. X}
  1715. X
  1716. Xvoid
  1717. Xtrack_button_update() {
  1718. X    char        track_buf[40];
  1719. X    Arg        args[1];
  1720. X
  1721. X    sprintf(track_buf, "%d\n", cdi.curtrack);
  1722. X
  1723. X    XtSetArg(args[0], XtNlabel, track_buf);
  1724. X    XtSetValues(track_button_widget, args, 1);
  1725. X}
  1726. X
  1727. Xstatic void
  1728. Xcb_timer_button(widget, client_data, call_data)
  1729. X    Widget        widget;
  1730. X    XtPointer    client_data;
  1731. X    XtPointer    call_data;
  1732. X{
  1733. X    char        timer_buf[40];
  1734. X    int        time_remaining;
  1735. X    Arg        args[1];
  1736. X    Boolean        state;
  1737. X
  1738. X    if (cdi.state & CDROM_STATE_EJECTED) {
  1739. X        cdrom_new_disc();
  1740. X    }
  1741. X
  1742. X#ifdef sgi
  1743. X    if (cdrom_status() == CDROM_NO_STATUS) {
  1744. X        cdi.state |= CDROM_STATE_EJECTED;
  1745. X        buttons_reset();
  1746. X        return;
  1747. X    }
  1748. X#endif
  1749. X
  1750. X    cdi.duration = cdrom_get_curtime();
  1751. X
  1752. X    XtSetArg(args[0], XtNstate, &state);
  1753. X    XtGetValues(widget, args, 1);
  1754. X
  1755. X    if ((state == True) && (cdi.curtrack != 0))
  1756. X    {
  1757. X        if (((cdi.state & CDROM_STATE_PAUSE) == 0) &&
  1758. X            (cdi.state & CDROM_STATE_PROGRAM))
  1759. X        {
  1760. X            time_remaining = program_time_remaining();
  1761. X        }
  1762. X        else
  1763. X            time_remaining = cdi.times[cdi.curtrack - 1] - cdi.duration;
  1764. X
  1765. X        if (time_remaining < 0)
  1766. X            sprintf(timer_buf, "-%02u:%02u\n",abs(time_remaining) / 60, 
  1767. X            abs(time_remaining) % 60);
  1768. X        else
  1769. X            sprintf(timer_buf, "-%02d:%02d\n", time_remaining / 60, 
  1770. X            time_remaining % 60);
  1771. X    } else if (cdi.curtrack != 0) {
  1772. X        if (cdi.duration < 0) 
  1773. X            sprintf(timer_buf, "-%02u:%02u\n", cdi.duration / 60, 
  1774. X                abs(cdi.duration) % 60);
  1775. X        else
  1776. X            sprintf(timer_buf, "%02u:%02u\n", cdi.duration / 60, 
  1777. X                cdi.duration % 60);
  1778. X    } else {
  1779. X        if ((state == True) && (cdrom_status() != CDROM_NO_STATUS))
  1780. X            sprintf(timer_buf, "-%02u:%02u\n", 
  1781. X                cdi.addrs[cdi.maxtrack].minute, 
  1782. X                cdi.addrs[cdi.maxtrack].second);
  1783. X        else
  1784. X            sprintf(timer_buf, "--:--\n");
  1785. X    }
  1786. X
  1787. X    XtSetArg(args[0], XtNlabel, timer_buf);
  1788. X    XtSetValues(widget, args, 1);
  1789. X}
  1790. X
  1791. Xvoid
  1792. Xtimer_button_update() {
  1793. X    char        timer_buf[40];
  1794. X    int        time_remaining;
  1795. X    Arg        args[1];
  1796. X    Boolean        state;
  1797. X
  1798. X    if (display_timer == False)
  1799. X        return;
  1800. X
  1801. X        if ((cdi.state & CDROM_STATE_PAUSE) == 0)
  1802. X            cdi.duration = cdrom_get_curtime();
  1803. X
  1804. X        XtSetArg(args[0], XtNstate, &state);
  1805. X        XtGetValues(timer_button_widget, args, 1);
  1806. X
  1807. X        if ((state == True) && (cdi.curtrack != 0))
  1808. X        {
  1809. X        if (((cdi.state & CDROM_STATE_PAUSE) == 0) &&
  1810. X            (cdi.state & CDROM_STATE_PROGRAM))
  1811. X        {
  1812. X                time_remaining = program_time_remaining();
  1813. X        }
  1814. X        else
  1815. X                time_remaining = cdi.times[cdi.curtrack - 1] - cdi.duration;
  1816. X            if (time_remaining < 0)
  1817. X                sprintf(timer_buf, "-%02u:%02u\n",abs(time_remaining) / 60, 
  1818. X                abs(time_remaining) % 60);
  1819. X            else
  1820. X                sprintf(timer_buf, "-%02d:%02d\n", time_remaining / 60, 
  1821. X                time_remaining % 60);
  1822. X        }
  1823. X        else if (cdi.state & CDROM_STATE_PLAY)
  1824. X        {
  1825. X            if (cdi.duration < 0)
  1826. X                sprintf(timer_buf, "-%02u:%02u\n", cdi.duration / 60, 
  1827. X                abs(cdi.duration) % 60);
  1828. X            else
  1829. X                sprintf(timer_buf, "%02u:%02u\n", cdi.duration / 60, 
  1830. X                cdi.duration % 60);
  1831. X        }
  1832. X        else
  1833. X        if ((state == True) && (cdrom_status() != CDROM_NO_STATUS))
  1834. X            sprintf(timer_buf, "-%02u:%02u\n", 
  1835. X                cdi.addrs[cdi.maxtrack].minute, 
  1836. X                cdi.addrs[cdi.maxtrack].second);
  1837. X        else
  1838. X            sprintf(timer_buf, "--:--\n");
  1839. X
  1840. X    XtSetArg(args[0], XtNlabel, timer_buf);
  1841. X    XtSetValues(timer_button_widget, args, 1);
  1842. X}
  1843. X
  1844. Xstatic void
  1845. Xvolume_jump_proc(scroll_widget, client_data, percent)
  1846. X    Widget        scroll_widget;
  1847. X    XtPointer    client_data;
  1848. X    XtPointer    percent;
  1849. X{
  1850. X#ifdef sgi
  1851. X    /* The volume control on SGI is not linear, but is exponential */
  1852. X    vol = PCT2VAL(*(float *)percent);
  1853. X#else
  1854. X    vol = (*(float *) percent) * MAXVOL;
  1855. X    vol = (vol * volpcent) + volbase;
  1856. X#endif
  1857. X
  1858. X    if (vol > MAXVOL)
  1859. X        vol = MAXVOL;
  1860. X    if (vol <= 0)
  1861. X        vol = 1;
  1862. X
  1863. X    debug_printf(1, "volume=%u\n", (unsigned int) vol);
  1864. X
  1865. X    cdrom_volume(vol, vol);
  1866. X}
  1867. X
  1868. Xstatic void
  1869. Xvolume_scroll_proc(scroll_widget, client_data, position)
  1870. X    Widget        scroll_widget;
  1871. X    XtPointer    client_data;
  1872. X    XtPointer    position;
  1873. X{
  1874. X    Arg        args[1];
  1875. X    Dimension    length;
  1876. X    float        top;
  1877. X    double        abspos;
  1878. X    double        percent;
  1879. X    double        vdelta;
  1880. X
  1881. X    if ((abspos = (int) position) < 0)
  1882. X        abspos = -abspos;
  1883. X
  1884. X    XtSetArg(args[0], XtNlength, &length);
  1885. X    XtGetValues(scroll_widget, args, 1);
  1886. X
  1887. X    if (length <= 0)
  1888. X        length = 1;
  1889. X
  1890. X    percent = abspos / (float) length;
  1891. X
  1892. X#ifdef sgi
  1893. X    /* The volume control on SGI is not linear, but is exponential */
  1894. X    if ((vdelta = ((VAL2PCT(vol)) * percent)) < (VAL2PCT(1))) {
  1895. X        vdelta = (VAL2PCT(1));
  1896. X    }
  1897. X    if ((int) position < 0)
  1898. X        vol = (PCT2VAL((VAL2PCT(vol)) - vdelta));
  1899. X    else
  1900. X        vol = (PCT2VAL((VAL2PCT(vol)) + vdelta));
  1901. X#else
  1902. X    if ((vdelta = (vol * percent)) < 1.0)
  1903. X        vdelta = 1.0;
  1904. X
  1905. X    if ((int) position < 0)
  1906. X        vol += vdelta;
  1907. X    else
  1908. X        vol -= vdelta;
  1909. X#endif
  1910. X
  1911. X    if (vol > MAXVOL)
  1912. X        vol = MAXVOL;
  1913. X    if (vol <= 0)
  1914. X        vol = 1;
  1915. X
  1916. X    debug_printf(1, "volume=%u\n", (unsigned int) vol);
  1917. X
  1918. X    cdrom_volume(vol, vol);
  1919. X
  1920. X#ifdef sgi
  1921. X    XtSetArg (args[0], XtNlength, &length);
  1922. X    XtGetValues (volume_scroll_widget, args, 1);
  1923. X    XawScrollbarSetThumb(volume_scroll_widget, 
  1924. X                 (float) (VAL2PCT(vol)),
  1925. X                 (float) -1.0);
  1926. X#endif
  1927. X    top = (double) vol / (double) MAXVOL;
  1928. X
  1929. X    XawScrollbarSetThumb(volume_scroll_widget, (float) top, (float) -1.0);
  1930. X}
  1931. X
  1932. Xvoid
  1933. Xtrack_button_set() {
  1934. X    Arg             args[1];
  1935. X
  1936. X    XtSetArg(args[0], XtNstate, True);
  1937. X    XtSetValues(track_button_widget, args, 1);
  1938. X}
  1939. X
  1940. Xvoid
  1941. Xtrack_button_reset() {
  1942. X    Arg             args[1];
  1943. X
  1944. X    XtSetArg(args[0], XtNstate, False);
  1945. X    XtSetValues(track_button_widget, args, 1);
  1946. X}
  1947. X
  1948. Xvoid
  1949. Xtimer_button_set() {
  1950. X    Arg             args[1];
  1951. X
  1952. X    XtSetArg(args[0], XtNstate, True);
  1953. X    XtSetValues(timer_button_widget, args, 1);
  1954. X}
  1955. X
  1956. Xvoid
  1957. Xtimer_button_reset() {
  1958. X    Arg             args[1];
  1959. X
  1960. X    XtSetArg(args[0], XtNstate, False);
  1961. X    XtSetValues(timer_button_widget, args, 1);
  1962. X}
  1963. X
  1964. X
  1965. X/*ARGSUSED*/
  1966. Xvoid
  1967. Xpopup_title_dialog(widget, parent, call_data)
  1968. XWidget        widget;
  1969. XWidget        parent;
  1970. XXtPointer    call_data;
  1971. X{
  1972. X    Position x, y;
  1973. X    Dimension width, height;
  1974. X    Arg    args[2];
  1975. X    Widget    value;
  1976. X    char    non_null[256];
  1977. X
  1978. X
  1979. X
  1980. X    if (disc_title != NULL) {
  1981. X        sscanf(disc_title, "%s", non_null);
  1982. X
  1983. X        if (strcmp ("", non_null) != 0)
  1984. X                XtSetArg(args[0], XtNvalue, disc_title);
  1985. X        else
  1986. X                XtSetArg(args[0], XtNvalue, "");
  1987. X    }
  1988. X    else
  1989. X            XtSetArg(args[0], XtNvalue, "");
  1990. X
  1991. X    XtSetValues(title_dialog_widget, args, 1);    
  1992. X
  1993. X    XtTranslateCoords (widget, 
  1994. X        (Position) 14,
  1995. X        (Position) 14,
  1996. X        &x, &y);
  1997. X    
  1998. X    XtSetArg(args[0], XtNx, x);
  1999. X    XtSetArg(args[1], XtNy, y);
  2000. X    XtSetValues(title_dialog_shell, args, 2);
  2001. X
  2002. X    if ((value = XtNameToWidget(title_dialog_widget, "value")) != 0) {
  2003. X        XtSetArg(args[0], XtNwidth, &width);
  2004. X        XtGetValues(title_button, args, 1);
  2005. X        XtSetArg(args[0], XtNwidth, width);
  2006. X        XtSetValues(value, args, 1);
  2007. X    }
  2008. X
  2009. X    /*XtSetSensitive (widget, FALSE); */
  2010. X    XtPopup (title_dialog_shell, XtGrabNone);
  2011. X
  2012. X}
  2013. X
  2014. Xvoid
  2015. XDone(widget, event, params, num_params)
  2016. X    Widget        widget;
  2017. X    XButtonEvent    *event;
  2018. X    String        *params;
  2019. X    Cardinal    *num_params;
  2020. X{
  2021. X    Arg    args[2];
  2022. X
  2023. X    if (disc_title != NULL)
  2024. X        free(disc_title);
  2025. X    disc_title = XawDialogGetValueString(title_dialog_widget);
  2026. X    XtSetArg(args[0], XtNlabel, disc_title);
  2027. X    XtSetValues(title_button, args, 1);
  2028. X
  2029. X    XtPopdown(title_dialog_shell);
  2030. X    XtSetSensitive(title_button, TRUE);
  2031. X}
  2032. X
  2033. Xvoid
  2034. Xpopdown_title_dialog(widget, dialog, call_data)
  2035. XWidget    widget;
  2036. XWidget    dialog;
  2037. XXtPointer call_data;
  2038. X{
  2039. X    Arg    args[2];
  2040. X
  2041. X    if (disc_title != NULL)
  2042. X        free(disc_title);
  2043. X    disc_title = XawDialogGetValueString(dialog);
  2044. X    XtSetArg(args[0], XtNlabel, disc_title);
  2045. X    XtSetValues(title_button, args, 1);
  2046. X
  2047. X    XtPopdown(title_dialog_shell);
  2048. X    XtSetSensitive(title_button, TRUE);
  2049. X}
  2050. X
  2051. Xvoid
  2052. Xupdate_title () {
  2053. X    Arg        args[1];
  2054. X    char    non_null[256];
  2055. X
  2056. X    if (title_button != NULL) {
  2057. X#if 0
  2058. X        if (disc_title != NULL) {
  2059. X            sscanf(disc_title, "%s", non_null);
  2060. X            if (strcmp ("", non_null) != 0)
  2061. X                XtSetArg(args[0], XtNvalue, disc_title);
  2062. X            else
  2063. X                XtSetArg(args[0], XtNvalue, "");
  2064. X        else
  2065. X            XtSetArg(args[0], XtNvalue, "");
  2066. X        }
  2067. X
  2068. X        XtSetArg(args[0], XtNvalue, disc_title);
  2069. X        XtSetValues(title_button, args, 1);
  2070. X        XtSetArg(args[0], XtNvalue, disc_title);
  2071. X        XtSetValues(title_dialog_widget, args, 1);
  2072. X#endif
  2073. X        XtSetArg(args[0], XtNvalue, disc_title);
  2074. X        XtSetValues(title_dialog_widget, args, 1);
  2075. X        XtSetArg(args[0], XtNlabel, disc_title);
  2076. X        XtSetValues(title_button, args, 1);
  2077. X
  2078. X    }
  2079. X}
  2080. X
  2081. X#ifdef sgi
  2082. Xset_volume(vol) 
  2083. X    int    vol;
  2084. X{
  2085. X    XawScrollbarSetThumb(volume_scroll_widget, 
  2086. X                 (float) (VAL2PCT(vol)),
  2087. X                 (float) 1.0);
  2088. X}
  2089. X#endif
  2090. END_OF_FILE
  2091. if test 15407 -ne `wc -c <'xcdplayer-2.2/logo_setup.c'`; then
  2092.     echo shar: \"'xcdplayer-2.2/logo_setup.c'\" unpacked with wrong size!
  2093. fi
  2094. # end of 'xcdplayer-2.2/logo_setup.c'
  2095. fi
  2096. echo shar: End of archive 3 \(of 5\).
  2097. cp /dev/null ark3isdone
  2098. MISSING=""
  2099. for I in 1 2 3 4 5 ; do
  2100.     if test ! -f ark${I}isdone ; then
  2101.     MISSING="${MISSING} ${I}"
  2102.     fi
  2103. done
  2104. if test "${MISSING}" = "" ; then
  2105.     echo You have unpacked all 5 archives.
  2106.     rm -f ark[1-9]isdone
  2107. else
  2108.     echo You still need to unpack the following archives:
  2109.     echo "        " ${MISSING}
  2110. fi
  2111. ##  End of shell archive.
  2112. exit 0
  2113. -- 
  2114. Dan Rich                    | drich@lerc.nasa.gov   |  (216) 433-4000
  2115. Sr. Systems Engineer        | "Danger, you haven't seen the last of me!"
  2116. RMS Technologies, Inc.      |    "No, but the first of you turns my stomach!"
  2117. NASA Lewis Research Center  | -- The Firesign Theatre's Nick Danger
  2118.  
  2119.