aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--audio/xcdplayer/Makefile14
-rw-r--r--audio/xcdplayer/files/cdrom_freebsd.c593
-rw-r--r--audio/xcdplayer/files/cdrom_freebsd.h95
-rw-r--r--audio/xcdplayer/files/patch-aa171
-rw-r--r--audio/xcdplayer/files/patch-ab266
-rw-r--r--audio/xcdplayer/pkg-comment1
-rw-r--r--audio/xcdplayer/pkg-descr8
-rw-r--r--audio/xcdplayer/pkg-plist4
8 files changed, 1152 insertions, 0 deletions
diff --git a/audio/xcdplayer/Makefile b/audio/xcdplayer/Makefile
new file mode 100644
index 000000000000..2c675c4bbae8
--- /dev/null
+++ b/audio/xcdplayer/Makefile
@@ -0,0 +1,14 @@
+# New ports collection makefile for: xcdplayer
+# Version required: 2.2
+# Date created: 30 Sep 1994
+# Whom: swallace
+#
+# $Id: Makefile,v 1.1.1.1 1994/09/28 07:27:40 swallace Exp $
+#
+
+DISTNAME= xcdplayer-2.2
+MASTER_SITES= ftp://sunsite.unc.edu/pub/X11/contrib/
+USE_IMAKE= yes
+MAN1= xcdplayer.1
+
+.include <bsd.port.mk>
diff --git a/audio/xcdplayer/files/cdrom_freebsd.c b/audio/xcdplayer/files/cdrom_freebsd.c
new file mode 100644
index 000000000000..c65d2571b18c
--- /dev/null
+++ b/audio/xcdplayer/files/cdrom_freebsd.c
@@ -0,0 +1,593 @@
+/*
+ * Copyright (C) 1990 Regents of the University of California.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of the University of
+ * California not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior
+ * permission. the University of California makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
+ */
+
+static int c;
+
+# include <stdio.h>
+# include <sys/file.h>
+# include <sys/types.h>
+# include <sys/param.h>
+# include <sys/stat.h>
+# include <string.h>
+# include <sys/buf.h>
+# include <sys/time.h>
+
+#include <sys/ioctl.h>
+#include <sys/disklabel.h>
+#include <sys/cdio.h>
+
+# include "debug.h"
+# include "cdrom_freebsd.h"
+
+extern char *device;
+static char cdrom[] = "/dev/rcd0a";
+
+cdrom_info cdi;
+char info_filename[256];
+FILE *disc_info = NULL;
+
+static int cdrom_fd = -1;
+
+get_stored_info()
+{
+ int i,n;
+ char line[100];
+ char *title;
+
+ if(disc_info) {
+ fclose(disc_info);
+ disc_info = NULL;
+ }
+
+ if ( cdi.maxtrack == 0) {
+ return(0);
+ }
+ for (i = 0, n = 0; i < cdi.maxtrack; i++)
+ n = n + ((i+1) * cdi.times[i]);
+ n = n / cdi.maxtrack;
+
+ disc_title = NULL;
+ if (cdInfoDir != NULL)
+ sprintf(info_filename, "%s/cd.%d", cdInfoDir, n);
+ else
+ sprintf(info_filename, "cd.%d", n);
+
+ if ((disc_info = fopen(info_filename, "r")) != NULL)
+ {
+ fgets(line, 100, disc_info);
+ title = strchr(line, ':');
+ if (title != NULL)
+ {
+ *(strchr(title, '\n')) = '\0';
+ disc_title = strdup(title + 1);
+ }
+ fgets(line, 100, disc_info);
+ sscanf(line, "Program: %s", program_str);
+ }
+ else {
+ disc_title = strdup(NOTITLESTR);
+ program_str[0] = 0;
+ }
+ if (disc_title == NULL) {
+ disc_title = strdup(NOTITLESTR);
+ }
+}
+
+int
+cdrom_open() {
+ int n;
+ extern void update_title();
+
+ if (cdrom_fd != -1)
+ return(cdi.curtrack);
+
+ if (device != NULL) {
+ if ((cdrom_fd = open(device, O_RDONLY)) == -1) {
+ perror("open: ");
+ return(-1);
+ }
+ } else {
+ if ((cdrom_fd = open(cdrom, O_RDONLY)) == -1) {
+ perror("open: ");
+ return(-1);
+ }
+ }
+
+ if (cdrom_get_times() == -1) {
+ cdrom_close();
+ return(-1);
+ }
+
+ if ((n = cdrom_get_curtrack()) == -1)
+ return(-1);
+
+ get_stored_info();
+
+ update_title();
+
+ if (cdi.state & CDROM_STATE_PLAY)
+ cdi.curtrack = n;
+
+ if (cdi.state & CDROM_STATE_SHUFFLE)
+ shuffle_setup();
+
+ return(cdi.curtrack);
+}
+
+void
+cdrom_close() {
+ if (cdrom_fd == -1)
+ return;
+
+ if (cdi.times != NULL) {
+ free((char *) cdi.times);
+ free((char *) cdi.addrs);
+ cdi.times = NULL;
+ cdi.addrs = NULL;
+ }
+
+ (void) close(cdrom_fd);
+ cdrom_fd = -1;
+}
+
+
+int
+cdrom_start() {
+ if (cdrom_fd == -1)
+ return(-1);
+
+ if (ioctl(cdrom_fd, CDIOCSTART) == -1) {
+ perror("ioctl(cdromstart)");
+ return(-1);
+ }
+
+ return(0);
+}
+
+int
+cdrom_stop() {
+ if (cdrom_fd == -1)
+ return(-1);
+
+ if (ioctl(cdrom_fd, CDIOCSTOP) == -1) {
+ perror("ioctl(cdromstop)");
+ return(-1);
+ }
+
+ return(0);
+}
+
+int
+cdrom_eject() {
+ if (cdrom_fd == -1)
+ return(-1);
+
+ if (ioctl(cdrom_fd, CDIOCEJECT) == -1) {
+ perror("ioctl(cdromeject)");
+ return(-1);
+ }
+
+ return(0);
+}
+
+int
+cdrom_pause() {
+ if (cdrom_fd == -1)
+ return(-1);
+
+ if (ioctl(cdrom_fd, CDIOCPAUSE) == -1) {
+ perror("ioctl(cdrompause)");
+ return(-1);
+ }
+
+ return(0);
+}
+
+int
+cdrom_resume() {
+ if (cdrom_fd == -1)
+ return(-1);
+
+ if (ioctl(cdrom_fd, CDIOCRESUME) == -1) {
+ perror("ioctl(cdromresume)");
+ return(-1);
+ }
+
+ return(0);
+}
+
+int
+cdrom_volume(left_vol, right_vol)
+ int left_vol;
+ int right_vol;
+{
+ struct ioc_vol vol;
+
+ if (cdrom_fd == -1)
+ return(-1);
+
+ vol.vol[0] = left_vol;
+ vol.vol[1] = right_vol;
+ vol.vol[2] = 0;
+ vol.vol[3] = 0;
+
+ if (ioctl(cdrom_fd, CDIOCSETVOL, &vol) == -1) {
+ perror("ioctl(cdromvolctrl)");
+ return(-1);
+ }
+
+ return(0);
+}
+
+int
+cdrom_get_times() {
+ struct ioc_toc_header tochdr;
+ extern unsigned short *ushort_malloc();
+ extern struct msf *msf_malloc();
+ unsigned long trk, trk_total, otime;
+ struct msf msf;
+
+ if (cdrom_read_tochdr(&tochdr) == -1)
+ return(-1);
+
+ cdi.mintrack = tochdr.starting_track;
+ cdi.maxtrack = tochdr.ending_track;
+
+ if (cdi.times != NULL)
+ {
+ free((char *) cdi.times);
+ free((char *) cdi.addrs);
+ cdi.times = NULL;
+ cdi.addrs = NULL;
+ }
+
+ cdi.times = ushort_malloc(cdi.maxtrack - cdi.mintrack + 1);
+ cdi.addrs = msf_malloc(cdi.maxtrack - cdi.mintrack + 2);
+
+ otime = 0;
+
+ for (trk = cdi.mintrack; trk <= cdi.maxtrack; trk++) {
+ if (cdrom_get_msf(trk, &msf, &trk_total) == -1)
+ return(-1);
+
+ /* record start address for each track (track 1 starts at 0)*/
+ cdi.addrs[trk - cdi.mintrack] = msf;
+
+ trk_total -= otime;
+
+ /* use start time of next track as length of previous */
+ if (otime != 0)
+ {
+ cdi.times[trk - cdi.mintrack - 1] = trk_total;
+ }
+
+ otime += trk_total;
+
+ }
+
+ /* find start of leadout to get length of last track */
+ if (cdrom_get_msf(CDROM_LEADOUT, &msf, &trk_total) == -1)
+ return(-1);
+
+ /* recode leadout start address */
+ cdi.addrs[trk - cdi.mintrack] = msf;
+ trk_total -= otime;
+ otime += trk_total;
+
+ cdi.times[trk - cdi.mintrack - 1] = trk_total;
+ return(0);
+}
+
+int
+cdrom_get_curtrack() {
+ struct cd_sub_channel_info data;
+
+ if (cdrom_read_subchannel(&data) == -1)
+ return(-1);
+
+ switch (data.header.audio_status) {
+ case CD_AS_AUDIO_INVALID:
+ return(-1);
+
+ /* playing track subchnl.cdsc_trk */
+ case CD_AS_PLAY_IN_PROGRESS:
+ return((int) data.what.position.track_number);
+
+ /* paused on track subchnl.cdsc_trk */
+ case CD_AS_PLAY_PAUSED:
+ return((int) data.what.position.track_number);
+
+ /* punt */
+ case CD_AS_PLAY_COMPLETED:
+ return(0);
+
+ case CD_AS_PLAY_ERROR:
+ return(-1);
+
+ /* punt */
+ case CD_AS_NO_STATUS:
+ debug_printf(1, "cdrom_get_curtrack: no status\n");
+ return(0);
+ }
+
+ /* bad value in cdsc_audiostatus */
+ return(-1);
+}
+
+int
+cdrom_get_msf(track, msf, length)
+ unsigned long track;
+ struct msf *msf;
+ unsigned long *length;
+{
+ struct cd_toc_entry data;
+
+ if (cdrom_read_tocentry(track, &data, sizeof(data)) == -1)
+ return(-1);
+
+ msf->minute = data.addr.msf.minute;
+ msf->second = data.addr.msf.second;
+ msf->frame = data.addr.msf.frame;
+ *length = (((unsigned int) msf->minute) * 60) + (unsigned int) msf->second;
+ return(0);
+}
+
+int
+cdrom_get_curmsf(msf)
+ struct msf *msf;
+{
+ struct cd_sub_channel_info data;
+
+ if (cdrom_read_subchannel(&data) == -1)
+ return(-1);
+
+ msf->minute = data.what.position.absaddr.msf.minute;
+ msf->second = data.what.position.absaddr.msf.second;
+ msf->frame = data.what.position.absaddr.msf.frame;
+ return (0);
+}
+
+int
+cdrom_play_track(start_track, end_track)
+ unsigned char start_track;
+ unsigned char end_track;
+{
+ struct ioc_play_track ti;
+ struct ioc_play_msf play_addr;
+ char *addr;
+
+ if (cdrom_fd == -1)
+ return(-1);
+
+ play_addr.start_m = cdi.addrs[start_track - cdi.mintrack].minute;
+ play_addr.start_s = cdi.addrs[start_track - cdi.mintrack].second;
+ play_addr.start_f = cdi.addrs[start_track - cdi.mintrack].frame;
+ play_addr.end_m = cdi.addrs[end_track - cdi.mintrack + 1].minute;
+ play_addr.end_s = cdi.addrs[end_track - cdi.mintrack + 1].second;
+ play_addr.end_f = cdi.addrs[end_track - cdi.mintrack + 1].frame - 1;
+
+ if(play_addr.end_f >= 75) {
+ play_addr.end_f = 74;
+ play_addr.end_s--;
+ }
+ if(play_addr.end_s >= 60) {
+ play_addr.end_s = 59;
+ play_addr.end_m--;
+ }
+ addr = (char *)&play_addr;
+ if (ioctl(cdrom_fd, CDIOCPLAYMSF, &play_addr) == -1) {
+ perror("ioctl(cdromplaymsftrk)");
+ return(-1);
+ }
+
+ return(0);
+}
+
+int
+cdrom_play_msf(start_msf, end_msf)
+ struct msf *start_msf;
+ struct msf *end_msf;
+{
+ struct ioc_play_msf play_addr;
+
+ if (cdrom_fd == -1)
+ return(-1);
+
+ play_addr.start_m = start_msf->minute;
+ play_addr.start_s = start_msf->second;
+ play_addr.start_f = start_msf->frame;
+ play_addr.end_m = end_msf->minute;
+ play_addr.end_s = end_msf->second;
+ play_addr.end_f = end_msf->frame;
+
+ if (ioctl(cdrom_fd, CDIOCPLAYMSF, &play_addr) == -1) {
+ perror("ioctl(cdromplaymsf)");
+ return(-1);
+ }
+
+ return(0);
+}
+
+
+int
+cdrom_read_subchannel(data)
+ struct cd_sub_channel_info *data;
+{
+ struct ioc_read_subchannel subchnl;
+
+ if (cdrom_fd == -1)
+ return(-1);
+
+ subchnl.address_format = CD_MSF_FORMAT;
+ subchnl.data_format = CD_CURRENT_POSITION;
+ subchnl.data_len = /* sizeof(struct cd_sub_channel_info)*/ 16;
+ subchnl.track = 0;
+ subchnl.data = data;
+
+ if (ioctl(cdrom_fd, CDIOCREADSUBCHANNEL, (char *) &subchnl) == -1) {
+ fprintf(stderr, "ioctl(cdromsubchnl): ");
+ perror(cdrom);
+ return(-1);
+ }
+
+ return(0);
+}
+
+int
+cdrom_read_track(track, data)
+ unsigned int track;
+ struct cd_sub_channel_info *data;
+{
+ struct ioc_read_subchannel subchnl;
+
+ if (cdrom_fd == -1)
+ return(-1);
+
+ subchnl.address_format = CD_MSF_FORMAT;
+ subchnl.data_format = CD_TRACK_INFO;
+ subchnl.data_len = /* sizeof(struct cd_sub_channel_info)*/ 24;
+ subchnl.track = track;
+ subchnl.data = data;
+
+ if (ioctl(cdrom_fd, CDIOCREADSUBCHANNEL, (char *) &subchnl) == -1) {
+ fprintf(stderr, "ioctl(cdromsubchnltrk): ");
+ perror(cdrom);
+ return(-1);
+ }
+
+ return(0);
+}
+
+int
+cdrom_read_tocentry(track, data, size)
+ unsigned int track;
+ struct cd_toc_entry *data;
+ int size;
+{
+ struct ioc_read_toc_entry tocentry;
+
+ if (cdrom_fd == -1)
+ return(-1);
+
+ tocentry.starting_track = (unsigned char)track;
+ tocentry.address_format = CD_MSF_FORMAT;
+ tocentry.data_len = /* sizeof(struct cd_toc_entry)*/ size;
+ tocentry.data = data;
+
+ if (ioctl(cdrom_fd, CDIOREADTOCENTRYS, (char *) &tocentry) == -1) {
+ perror("ioctl(cdromreadtocentry)");
+ return(-1);
+ }
+
+ return(0);
+}
+
+int
+cdrom_read_tochdr(tochdr)
+ struct ioc_toc_header *tochdr;
+{
+ if (cdrom_fd == -1)
+ return(-1);
+
+ if (ioctl(cdrom_fd, CDIOREADTOCHEADER, (char *) tochdr) == -1) {
+ perror("ioctl(cdromreadtochdr): ");
+ return(-1);
+ }
+
+ return(0);
+}
+
+int
+cdrom_status() {
+ struct cd_sub_channel_info data;
+
+ if (cdrom_read_subchannel(&data) == -1)
+ return(-1);
+
+ switch (data.header.audio_status) {
+ case CD_AS_AUDIO_INVALID:
+ return(CDROM_INVALID);
+
+ case CD_AS_PLAY_IN_PROGRESS:
+ return(CDROM_PLAYING);
+
+ case CD_AS_PLAY_PAUSED:
+ return(CDROM_PAUSED);
+
+ case CD_AS_PLAY_COMPLETED:
+ return(CDROM_COMPLETED);
+
+ case CD_AS_PLAY_ERROR:
+ return(CDROM_ERROR);
+
+ case CD_AS_NO_STATUS:
+ return(CDROM_NO_STATUS);
+ }
+
+ return(-1);
+}
+
+unsigned short *
+ushort_malloc(n)
+ int n;
+{
+ extern char *calloc();
+ unsigned short *ptr;
+
+ ptr = (unsigned short *) calloc(n, sizeof(unsigned short));
+ if (ptr == NULL) {
+ perror("calloc");
+ exit(1);
+ }
+
+ return(ptr);
+}
+
+struct msf *
+msf_malloc(n)
+ int n;
+{
+ extern char *calloc();
+ struct msf *ptr;
+
+ ptr = (struct msf *) calloc(n, sizeof(struct msf));
+ if (ptr == NULL) {
+ perror("calloc");
+ exit(1);
+ }
+
+ return(ptr);
+}
+
+int
+cdrom_disp_cdi() {
+ int trk;
+
+ fprintf(stderr,"CDI structure:\n");
+ fprintf(stderr,"\tcurtrack: %d\n",cdi.curtrack);
+ fprintf(stderr,"\tmin: %d max: %d total: %d\n",
+ cdi.mintrack, cdi.maxtrack, cdi.ntracks);
+ fprintf(stderr,"\tdur: %d state: %2x\n",cdi.duration, cdi.state);
+ fprintf(stderr,"\tcurrand: %d lastprog: %d\n",
+ cdi.currand, cdi.lastprog);
+ fprintf(stderr,"\n\tTracklist:\n");
+ if (cdi.maxtrack != cdi.mintrack) {
+ for (trk=0; trk<=cdi.maxtrack-cdi.mintrack+1; trk++) {
+ fprintf(stderr,"\t%3d: %d %02d:%02d %d\n",trk,cdi.times[trk],
+ cdi.addrs[trk].minute,cdi.addrs[trk].second,
+ cdi.addrs[trk].frame);
+ }
+ }
+}
diff --git a/audio/xcdplayer/files/cdrom_freebsd.h b/audio/xcdplayer/files/cdrom_freebsd.h
new file mode 100644
index 000000000000..f65872bcf536
--- /dev/null
+++ b/audio/xcdplayer/files/cdrom_freebsd.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 1990 Regents of the University of California.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of the University of
+ * California not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior
+ * permission. the University of California makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
+ */
+
+# include <X11/Intrinsic.h>
+
+# define NOTITLESTR "No Title"
+# define NODISCSTR "No Disc"
+
+# define bit(n) (1 << (n))
+
+/* bits for cdrom_state */
+# define CDROM_STATE_PLAY bit(0)
+# define CDROM_STATE_PAUSE bit(1)
+# define CDROM_STATE_STOP bit(2)
+# define CDROM_STATE_EJECTED bit(3)
+# define CDROM_STATE_CYCLE bit(4)
+# define CDROM_STATE_SHUFFLE bit(5)
+# define CDROM_STATE_PROGRAM bit(6)
+
+/* return codes from cdrom_status() */
+# define CDROM_INVALID 1
+# define CDROM_PLAYING 2
+# define CDROM_PAUSED 3
+# define CDROM_COMPLETED 4
+# define CDROM_ERROR 5
+# define CDROM_NO_STATUS 6
+
+#define STILL_MOUNTED 1
+#define UNMOUNTED 0
+#define CDROM_LEADOUT 0xAA
+#define CDROM_MSF 0x02
+
+struct msf {
+ unsigned char minute;
+ unsigned char second;
+ unsigned char frame;
+};
+
+struct prognode {
+ unsigned char track;
+ Widget button;
+ struct prognode *next;
+ struct prognode *prev;
+};
+
+typedef struct _cdrom_info {
+ unsigned char curtrack; /* current track playing */
+ unsigned char mintrack; /* first audio track */
+ unsigned char maxtrack; /* last audio track */
+ unsigned char ntracks; /* size of random track list */
+ int duration; /* seconds played so far */
+ int state; /* state of cd-rom drive */
+ short currand; /* index into random track list */
+ short lastprog; /* number of selections in prog.*/
+ unsigned short *times; /* duration of each track */
+ struct msf *addrs; /* starting minute/second/frames*/
+ struct prognode *selection; /* currently selected prog. trk */
+ struct prognode *program; /* list of programmed tracks */
+} cdrom_info;
+
+extern int cdrom_open();
+extern void cdrom_close();
+extern int cdrom_start();
+extern int cdrom_stop();
+extern int cdrom_eject();
+extern int cdrom_pause();
+extern int cdrom_resume();
+extern int cdrom_volume();
+extern int cdrom_get_times();
+extern int cdrom_get_curtrack();
+extern int cdrom_get_msf();
+extern int cdrom_get_curmsf();
+extern int cdrom_play_track();
+extern int cdrom_play_msf();
+extern int cdrom_read_tocentry();
+extern int cdrom_read_tochdr();
+extern int cdrom_status();
+
+extern cdrom_info cdi;
+extern char *disc_title;
+extern char program_str[];
+extern char *cdInfoDir;
+
diff --git a/audio/xcdplayer/files/patch-aa b/audio/xcdplayer/files/patch-aa
new file mode 100644
index 000000000000..dd840196aee8
--- /dev/null
+++ b/audio/xcdplayer/files/patch-aa
@@ -0,0 +1,171 @@
+*** XCdplayer.ad Tue Jan 12 10:59:41 1993
+--- /users/swallace/work/xcdplayer/XCdplayer.ad Wed Feb 23 07:36:31 1994
+***************
+*** 19,29 ****
+
+ XCdplayer*logoLabel.foreground: Gold
+ XCdplayer*logoLabel.background: Black
+- XCdplayer*icon*foreground: Gold
+
+ XCdplayer*versionLabel.Font: -misc-fixed-medium-r-normal--8-*
+ XCdplayer*versionLabel.foreground: Black
+! XCdplayer*versionLabel.width: 130
+ XCdplayer*versionLabel.fromHoriz: logoLabel
+
+ ! replayThreshold is the number of seconds that must be played before the
+--- 19,28 ----
+
+ XCdplayer*logoLabel.foreground: Gold
+ XCdplayer*logoLabel.background: Black
+
+ XCdplayer*versionLabel.Font: -misc-fixed-medium-r-normal--8-*
+ XCdplayer*versionLabel.foreground: Black
+! XCdplayer*versionLabel.width: 110
+ XCdplayer*versionLabel.fromHoriz: logoLabel
+
+ ! replayThreshold is the number of seconds that must be played before the
+***************
+*** 33,48 ****
+
+ ! scanSkipInterval is the number of seconds skipped at each fast-forward or
+ ! reverse.
+! XCdplayer*scanSkipInterval: 3
+ ! pauseSkipInterval is the number of seconds skipped at each fast-forward or
+ ! reverse if the CD is paused.
+! XCdplayer*pauseSkipInterval: 15
+
+ ! scanPauseInterval is the number of seconds between each fast_forward or
+ ! reverse while holding down the buttons. (Sun CDs have a dreadfully long
+ ! start-up time for the audio to actually become audible, so "hearing the
+ ! track" while scanning isn't very feasible.)
+! XCdplayer*scanPauseInterval: 0.062
+ ! pausePauseInterval does the same thing when the disc is paused.
+ XCdplayer*pausePauseInterval: 0.5
+
+--- 32,47 ----
+
+ ! scanSkipInterval is the number of seconds skipped at each fast-forward or
+ ! reverse.
+! XCdplayer*scanSkipInterval: 5
+ ! pauseSkipInterval is the number of seconds skipped at each fast-forward or
+ ! reverse if the CD is paused.
+! XCdplayer*pauseSkipInterval: 20
+
+ ! scanPauseInterval is the number of seconds between each fast_forward or
+ ! reverse while holding down the buttons. (Sun CDs have a dreadfully long
+ ! start-up time for the audio to actually become audible, so "hearing the
+ ! track" while scanning isn't very feasible.)
+! XCdplayer*scanPauseInterval: 0.25
+ ! pausePauseInterval does the same thing when the disc is paused.
+ XCdplayer*pausePauseInterval: 0.5
+
+***************
+*** 56,62 ****
+ XCdplayer*Viewport.allowHoriz: True
+ XCdplayer*Viewport.useBottom: True
+ XCdplayer*Viewport.forceBars: False
+! XCdplayer*Viewport.width: 188
+ XCdplayer*Viewport.height: 30
+ XCdplayer*Viewport*thickness: 8
+ XCdplayer*Viewport.resizable: False
+--- 55,61 ----
+ XCdplayer*Viewport.allowHoriz: True
+ XCdplayer*Viewport.useBottom: True
+ XCdplayer*Viewport.forceBars: False
+! XCdplayer*Viewport.width: 160
+ XCdplayer*Viewport.height: 30
+ XCdplayer*Viewport*thickness: 8
+ XCdplayer*Viewport.resizable: False
+***************
+*** 88,98 ****
+ XCdplayer*Toggle.right: ChainLeft
+ XCdplayer*Toggle.background: Ivory
+
+! XCdplayer*ledsLabel.horizDistance: 20
+ XCdplayer*ledsLabel.fromVert: versionLabel
+ XCdplayer*ledsLabel.fromHoriz: logoLabel
+
+! XCdplayer*trackButton.horizDistance: 8
+ XCdplayer*trackButton.fromVert: versionLabel
+ XCdplayer*trackButton.fromHoriz: ledsLabel
+ XCdplayer*trackButton.borderWidth: 2
+--- 87,97 ----
+ XCdplayer*Toggle.right: ChainLeft
+ XCdplayer*Toggle.background: Ivory
+
+! XCdplayer*ledsLabel.horizDistance: 4
+ XCdplayer*ledsLabel.fromVert: versionLabel
+ XCdplayer*ledsLabel.fromHoriz: logoLabel
+
+! XCdplayer*trackButton.horizDistance: 4
+ XCdplayer*trackButton.fromVert: versionLabel
+ XCdplayer*trackButton.fromHoriz: ledsLabel
+ XCdplayer*trackButton.borderWidth: 2
+***************
+*** 108,134 ****
+ XCdplayer*timerButton.left: ChainRight
+ XCdplayer*timerButton.right: ChainRight
+
+! XCdplayer*volumeScrollbar.horizDistance:8
+ XCdplayer*volumeScrollbar.fromHoriz: logoLabel
+ XCdplayer*volumeScrollbar.fromVert: trackButton
+ XCdplayer*volumeScrollbar.orientation: horizontal
+! XCdplayer*volumeScrollbar.length: 120
+ XCdplayer*volumeScrollbar.right: ChainRight
+ XCdplayer*volumeScrollbar.left: ChainRight
+ XCdplayer*volumeScrollbar.background: green
+ XCdplayer*volumeScrollbar.foreground: white
+! XCdplayer*volumeScrollbar.thumb: black
+
+ XCdplayer*titleBarViewport.fromVert: volumeScrollbar
+- XCdplayer*titleBarViewport.forceBars: true
+ XCdplayer*titleBar.borderwidth: 0
+ XCdplayer*titleBar.highlightThickness: 1
+ XCdplayer*titleBar.foreground: Red
+ XCdplayer*titleBar.background: Ivory
+-
+- XCdplayer*titleDialog.Text.translations:#override\
+- <Key>Return: done()
+-
+ XCdplayer*buttonsForm.fromVert: logoForm
+ XCdplayer*buttonsForm.borderWidth: 1
+
+--- 107,128 ----
+ XCdplayer*timerButton.left: ChainRight
+ XCdplayer*timerButton.right: ChainRight
+
+! XCdplayer*volumeScrollbar.horizDistance:4
+ XCdplayer*volumeScrollbar.fromHoriz: logoLabel
+ XCdplayer*volumeScrollbar.fromVert: trackButton
+ XCdplayer*volumeScrollbar.orientation: horizontal
+! XCdplayer*volumeScrollbar.length: 93
+ XCdplayer*volumeScrollbar.right: ChainRight
+ XCdplayer*volumeScrollbar.left: ChainRight
+ XCdplayer*volumeScrollbar.background: green
+ XCdplayer*volumeScrollbar.foreground: white
+! XCdplayer*volumeScrollbar.thumb: black
+
+ XCdplayer*titleBarViewport.fromVert: volumeScrollbar
+ XCdplayer*titleBar.borderwidth: 0
+ XCdplayer*titleBar.highlightThickness: 1
+ XCdplayer*titleBar.foreground: Red
+ XCdplayer*titleBar.background: Ivory
+ XCdplayer*buttonsForm.fromVert: logoForm
+ XCdplayer*buttonsForm.borderWidth: 1
+
+*** Imakefile Tue Jan 12 10:59:29 1993
+--- /users/swallace/work/xcdplayer/Imakefile Fri Sep 30 17:09:19 1994
+***************
+*** 15,20 ****
+--- 15,25 ----
+
+ LOCAL_LIBRARIES = XawClientLibs
+ LINTLIBS = -lXaw -lXt -lX11
++ SRCS = main.c top_setup.c logo_setup.c button_setup.c cdrom_callb.c\
++ cdrom_freebsd.c internals.c shuffle.c program.c leds.c debug.c
++
++ OBJS = main.o top_setup.o logo_setup.o button_setup.o cdrom_callb.o\
++ cdrom_freebsd.o internals.o shuffle.o program.o leds.o debug.o
+ #ifdef SunArchitecture
+ SRCS = main.c top_setup.c logo_setup.c button_setup.c cdrom_callb.c\
+ cdrom_sun.c internals.c shuffle.c program.c leds.c debug.c
diff --git a/audio/xcdplayer/files/patch-ab b/audio/xcdplayer/files/patch-ab
new file mode 100644
index 000000000000..645eedd96d6b
--- /dev/null
+++ b/audio/xcdplayer/files/patch-ab
@@ -0,0 +1,266 @@
+*** button_setup.c Tue Jan 12 10:59:47 1993
+--- /users/swallace/work/xcdplayer/button_setup.c Wed Feb 23 07:36:36 1994
+***************
+*** 20,25 ****
+--- 20,28 ----
+ # include <X11/Xaw/Toggle.h>
+
+ # include "cdrom_globs.h"
++ #ifdef __FreeBSD__
++ # include "cdrom_freebsd.h"
++ #endif
+ #ifdef sun
+ # include "cdrom_sun.h"
+ #endif
+***************
+*** 44,49 ****
+--- 47,69 ----
+ # include "ff.xbm"
+ # include "pgm.xbm"
+
++ void title_dialog_setup();
++ static void play_button_setup();
++ static void stop_button_setup();
++ static void pause_button_setup();
++ static void prev_button_setup();
++ static void next_button_setup();
++ static void eject_button_setup();
++ #ifdef sgi
++ void audio_button_setup();
++ #endif
++ static void quit_button_setup();
++ static void cycle_button_setup();
++ static void shuffle_button_setup();
++ static void rew_button_setup();
++ static void ff_button_setup();
++ static void pgm_button_setup();
++ void buttons_reset();
+
+ static Widget buttons_form_widget;
+ static Widget play_button_widget;
+***************
+*** 71,95 ****
+ Widget parent_widget;
+ {
+ Arg args[1];
+-
+- extern void title_dialog_setup();
+- extern void play_button_setup();
+- extern void stop_button_setup();
+- extern void pause_button_setup();
+- extern void prev_button_setup();
+- extern void next_button_setup();
+- extern void eject_button_setup();
+- #ifdef sgi
+- extern void audio_button_setup();
+- #endif
+- extern void quit_button_setup();
+- extern void cycle_button_setup();
+- extern void shuffle_button_setup();
+- extern void rew_button_setup();
+- extern void ff_button_setup();
+- extern void pgm_button_setup();
+- extern void buttons_reset();
+-
+
+ buttons_form_widget = XtCreateManagedWidget("buttonsForm",
+ formWidgetClass,
+--- 91,96 ----
+*** cdrom_callb.c Tue Jan 12 10:59:48 1993
+--- /users/swallace/work/xcdplayer/cdrom_callb.c Wed Feb 23 07:36:41 1994
+***************
+*** 22,27 ****
+--- 22,30 ----
+
+ # include "debug.h"
+ # include "cdrom_globs.h"
++ #ifdef __FreeBSD__
++ # include "cdrom_freebsd.h"
++ #endif
+ #ifdef sun
+ # include "cdrom_sun.h"
+ #endif
+*** internals.c Tue Jan 12 10:59:45 1993
+--- /users/swallace/work/xcdplayer/internals.c Wed Feb 23 07:36:47 1994
+***************
+*** 22,27 ****
+--- 22,30 ----
+
+ # include "debug.h"
+ # include "cdrom_globs.h"
++ #ifdef __FreeBSD__
++ # include "cdrom_freebsd.h"
++ #endif
+ #ifdef sun
+ # include "cdrom_sun.h"
+ #endif
+***************
+*** 29,35 ****
+ # include "cdrom_sgi.h"
+ #endif
+
+!
+ static XtIntervalId ivid = -1;
+ static XtIntervalId scanivid = -1;
+ static XtIntervalId stativid = -1;
+--- 32,38 ----
+ # include "cdrom_sgi.h"
+ #endif
+
+! static void scan_update();
+ static XtIntervalId ivid = -1;
+ static XtIntervalId scanivid = -1;
+ static XtIntervalId stativid = -1;
+***************
+*** 170,176 ****
+ struct msf track_start;
+ struct msf start_addr, end_addr;
+ int curtrack;
+- extern void scan_update();
+
+ if (cdrom_get_curmsf(&start_addr) == -1) {
+ debug_printf(1, "rew: error reading location\n");
+--- 173,178 ----
+***************
+*** 304,310 ****
+ struct msf start_addr, end_addr, next_start;
+ char t;
+ int curtrack;
+- extern void scan_update();
+
+ if (cdrom_get_curmsf(&start_addr) == -1) {
+ debug_printf(1, "ff: error reading location\n");
+--- 306,311 ----
+*** logo_setup.c Tue Jan 12 10:59:46 1993
+--- /users/swallace/work/xcdplayer/logo_setup.c Wed Feb 23 07:36:52 1994
+***************
+*** 28,33 ****
+--- 28,36 ----
+ # include <stdio.h>
+
+ # include "cdrom_globs.h"
++ #ifdef __FreeBSD__
++ # include "cdrom_freebsd.h"
++ #endif
+ #ifdef sun
+ # include "cdrom_sun.h"
+ #endif
+***************
+*** 55,73 ****
+ Widget title_done_widget;
+
+ static int vol;
+
+ void
+ logo_setup(parent_widget)
+ Widget parent_widget;
+ {
+- extern void leds_label_setup();
+- extern void cb_track_button();
+- extern void cb_timer_button();
+- extern void volume_jump_proc();
+- extern void volume_scroll_proc();
+- extern void popup_title_dialog();
+- extern void popdown_title_dialog();
+-
+ Widget version_label_widget;
+ char version_string[80];
+
+--- 58,76 ----
+ Widget title_done_widget;
+
+ static int vol;
++ extern void leds_label_setup();
++ static void cb_track_button();
++ static void cb_timer_button();
++ static void volume_jump_proc();
++ static void volume_scroll_proc();
++ static void popup_title_dialog();
++ static void popdown_title_dialog();
++
+
+ void
+ logo_setup(parent_widget)
+ Widget parent_widget;
+ {
+ Widget version_label_widget;
+ char version_string[80];
+
+*** program.c Tue Jan 12 10:59:49 1993
+--- /users/swallace/work/xcdplayer/program.c Wed Feb 23 07:36:55 1994
+***************
+*** 27,36 ****
+
+ # include <stdio.h>
+ # include <string.h>
+! # include <malloc.h>
+
+ # include "debug.h"
+ # include "cdrom_globs.h"
+ #ifdef sun
+ # include "cdrom_sun.h"
+ #endif
+--- 27,39 ----
+
+ # include <stdio.h>
+ # include <string.h>
+! # include <sys/malloc.h>
+
+ # include "debug.h"
+ # include "cdrom_globs.h"
++ #ifdef __FreeBSD__
++ # include "cdrom_freebsd.h"
++ #endif
+ #ifdef sun
+ # include "cdrom_sun.h"
+ #endif
+***************
+*** 52,57 ****
+--- 55,69 ----
+ static Boolean adding_to_new_track = False;
+ static struct prognode *current_node = NULL;
+
++ static void cb_move_program_ptr();
++ static void cb_clear_program();
++ static void cb_cancel_program();
++ static void cb_save_program();
++ static void cb_trackbuttons();
++ static void cb_add_10();
++ static void cb_new_track();
++ static void cb_program_all();
++
+ void
+ program_form_setup (parent_widget)
+ Widget parent_widget;
+***************
+*** 66,80 ****
+ Widget cancel_button;
+ Widget save_button;
+ Widget all_button;
+-
+- extern void cb_move_program_ptr();
+- extern void cb_clear_program();
+- extern void cb_cancel_program();
+- extern void cb_save_program();
+- extern void cb_trackbuttons();
+- extern void cb_add_10();
+- extern void cb_new_track();
+- extern void cb_program_all();
+
+ /*
+ * create program form as a non-managed widget, because this
+--- 78,83 ----
+*** shuffle.c Tue Jan 12 10:59:38 1993
+--- /users/swallace/work/xcdplayer/shuffle.c Wed Feb 23 07:36:59 1994
+***************
+*** 18,23 ****
+--- 18,26 ----
+
+ # include "debug.h"
+ # include "cdrom_globs.h"
++ #ifdef __FreeBSD__
++ # include "cdrom_freebsd.h"
++ #endif
+ #ifdef sun
+ # include "cdrom_sun.h"
+ #endif
diff --git a/audio/xcdplayer/pkg-comment b/audio/xcdplayer/pkg-comment
new file mode 100644
index 000000000000..ad020692ec95
--- /dev/null
+++ b/audio/xcdplayer/pkg-comment
@@ -0,0 +1 @@
+XCdplayer 2.2
diff --git a/audio/xcdplayer/pkg-descr b/audio/xcdplayer/pkg-descr
new file mode 100644
index 000000000000..c2dc089d5cf4
--- /dev/null
+++ b/audio/xcdplayer/pkg-descr
@@ -0,0 +1,8 @@
+XCdplayer 2.2
+
+XCdplayer is a graphical user interface for controlling the CD-ROM
+drive under the X Window System. It provides visual feedback and
+gives the user facilities for mode selection, device control,
+scanning, and programming.
+
+Ported to FreeBSD by Steven Wallace, swallace@ece.uci.edu
diff --git a/audio/xcdplayer/pkg-plist b/audio/xcdplayer/pkg-plist
new file mode 100644
index 000000000000..7b57b66c5d03
--- /dev/null
+++ b/audio/xcdplayer/pkg-plist
@@ -0,0 +1,4 @@
+@cwd /usr/X11R6
+bin/xcdplayer
+lib/X11/app-defaults/XCdplayer
+man/man1/xcdplayer.1x