pkgsrc/audio/xcdplayer/patches/patch-ah

537 lines
13 KiB
Text

$NetBSD: patch-ah,v 1.6 2011/09/12 06:50:00 dholland Exp $
- support cdrom access on BSDs
- get function decls out of function bodies, which gcc dislikes
- fix mismatched return statements, which clang dislikes
- ...more (?)
--- internals.c.orig 1993-01-12 18:59:45.000000000 +0000
+++ internals.c
@@ -22,6 +22,9 @@
# include "debug.h"
# include "cdrom_globs.h"
+#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__)
+# include "cdrom_freebsd.h"
+#endif
#ifdef sun
# include "cdrom_sun.h"
#endif
@@ -29,13 +32,14 @@
# include "cdrom_sgi.h"
#endif
-
+static void scan_update();
static XtIntervalId ivid = -1;
static XtIntervalId scanivid = -1;
static XtIntervalId stativid = -1;
static unsigned int timer_mod = 1000 / TIMER_PERIOD;
unsigned int timer_fsecs;
+extern AppData app_data;
int
cdrom_get_curtime() {
@@ -46,7 +50,7 @@ cdrom_get_curtime() {
if (cdrom_open() == -1) {
debug_printf(1, "cdrom_get_curtime: error from cdrom_open\n");
- return;
+ return 0;
}
switch (cdrom_status()) {
@@ -54,7 +58,7 @@ cdrom_get_curtime() {
case CDROM_PLAYING:
if (cdrom_get_curmsf(&curmsf) == -1) {
debug_printf(1, "get_curtime: error reading location\n");
- return;
+ return 0;
}
if (((curtrack = cdrom_get_curtrack()) == -1) ||
@@ -76,6 +80,170 @@ cdrom_get_curtime() {
}
}
+/*
+ * called by update_track when the cd has hit
+ * the end of the track or the disc.
+ */
+static void
+cdrom_atend() {
+ cdrom_timer_off();
+ leds_stop();
+ debug_printf(1, "cdrom_atend: at end\n");
+
+#ifdef sgi
+ /* Force a stop to kill the child (if any).
+ * This is due to some sort of weirdness when the SGI runs off the
+ * disc during a CDreadda().
+ */
+ if (cdi.scsi_audio) {
+ cdrom_stop();
+ }
+#endif
+ if (cdi.state & CDROM_STATE_SHUFFLE) {
+
+ if (cdi.currand == cdi.ntracks) {
+ if ((cdi.state & CDROM_STATE_CYCLE) == 0) {
+ debug_printf(1, "cdrom_atend: shuffle done\n");
+
+ cdrom_reset();
+ return;
+ }
+
+ debug_printf(1, "cdrom_atend: shuffle cycling\n");
+ shuffle_setup();
+ }
+
+ cdi.curtrack = shuffle_next_track();
+ }
+ else if (cdi.state & CDROM_STATE_PROGRAM) {
+ if ((cdi.curtrack = program_goto_next_track()) == 0)
+ {
+ if (cdi.state & CDROM_STATE_CYCLE)
+ {
+ debug_printf(1, "cdrom_atend: cycling program\n");
+ cdi.curtrack = program_resume();
+ timer_fsecs = 0;
+ cdi.duration = 0;
+ timer_button_update();
+
+ (void) cdrom_play();
+ }
+ else
+ {
+ debug_printf(1, "cdrom_atend: all done\n");
+ cdrom_reset();
+ }
+ return;
+ }
+ }
+
+ else if ((cdi.curtrack < cdi.maxtrack) && (cdi.curtrack != 0)) {
+ debug_printf(1, "cdrom_atend: continuing\n");
+ cdi.curtrack++;
+ }
+ else if (cdi.state & CDROM_STATE_CYCLE) {
+ debug_printf(1, "cdrom_atend: cycling\n");
+ cdi.curtrack = cdi.mintrack;
+ }
+ else {
+ debug_printf(1, "cdrom_atend: all done\n");
+ buttons_reset();
+ cdrom_reset();
+ return;
+ }
+
+ timer_fsecs = 0;
+ cdi.duration = 0;
+ timer_button_update();
+
+ (void) cdrom_play();
+}
+
+/*
+ * update_track is called when the timeout fires; it updates curtrack and
+ * calls the label update routine.
+ */
+/*ARGSUSED*/
+static void
+update_track(data, id)
+ XtPointer *data;
+ XtIntervalId *id;
+{
+ unsigned int curtrack;
+ Arg args[1];
+ Boolean state;
+
+ extern Widget rew_button_widget;
+ extern Widget ff_button_widget;
+#ifdef sgi
+
+ int vol;
+#endif
+
+ if ((curtrack = cdrom_get_curtrack()) != cdi.curtrack) {
+ if (curtrack == 0) {
+ cdrom_atend();
+
+ return;
+ }
+
+ timer_fsecs = 0;
+ cdi.duration = 0;
+ timer_button_update();
+
+ cdi.curtrack = curtrack;
+ track_button_update();
+ }
+
+#ifdef sgi
+ /* Update the volume control */
+ if ((vol = cdrom_get_volume()) != 0) {
+ set_volume(vol);
+ }
+#endif
+
+ XtSetArg(args[0], XtNstate, &state);
+ XtGetValues(rew_button_widget, args, 1);
+ if (state == True)
+ {
+ cdrom_rewind();
+ leds_update(BACKWARDS);
+ if (cdi.state & CDROM_STATE_PAUSE) {
+ if (cdrom_pause() != -1)
+ cdi.state &= ~CDROM_STATE_STOP;
+ }
+ ivid = XtAppAddTimeOut(appc,
+ (int)(app_data.scanPauseInterval * 1000.0),
+ update_track, NULL);
+ }
+ else
+ {
+ leds_update(FORWARDS);
+ XtSetArg(args[0], XtNstate, &state);
+ XtGetValues(ff_button_widget, args, 1);
+ if (state == True)
+ {
+ cdrom_ff();
+ if (cdi.state & CDROM_STATE_PAUSE) {
+ if (cdrom_pause() != -1)
+ cdi.state &= ~CDROM_STATE_STOP;
+ }
+
+ ivid = XtAppAddTimeOut(appc,
+ (int)(app_data.scanPauseInterval * 1000.0),
+ update_track, NULL);
+ }
+ else
+ {
+ if ((timer_fsecs++ % timer_mod) == 0) {
+ timer_button_update();
+ }
+ ivid = XtAppAddTimeOut(appc, TIMER_PERIOD,
+ update_track, NULL);
+ }
+ }
+}
+
/*
* we poll the cd-rom drive every TIMER_PERIOD milliseconds to see where
@@ -83,8 +251,6 @@ cdrom_get_curtime() {
*/
void
cdrom_timer_on() {
- static void update_track();
-
if (cdi.state & CDROM_STATE_PLAY)
ivid = XtAppAddTimeOut(appc, TIMER_PERIOD, update_track, NULL);
}
@@ -170,7 +336,6 @@ cdrom_rewind () {
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");
@@ -196,11 +361,11 @@ cdrom_rewind () {
if (((cdi.state & CDROM_STATE_PLAY) &&
((track_start.minute * 60) + track_start.second) >=
((start_addr.minute * 60) + start_addr.second -
- scanSkipInterval)) ||
+ app_data.scanSkipInterval)) ||
((cdi.state & CDROM_STATE_PAUSE) &&
((track_start.minute * 60) + track_start.second) >=
((start_addr.minute * 60) + start_addr.second -
- pauseSkipInterval)))
+ app_data.pauseSkipInterval)))
{
start_addr = track_start;
start_addr.second++; /* guarantee we never back up too far */
@@ -208,9 +373,9 @@ cdrom_rewind () {
else
{
if (cdi.state & CDROM_STATE_PAUSE) {
- start_addr.second -= pauseSkipInterval;
+ start_addr.second -= app_data.pauseSkipInterval;
} else if (cdi.state & CDROM_STATE_PLAY) {
- start_addr.second -= scanSkipInterval;
+ start_addr.second -= app_data.scanSkipInterval;
}
if ((char) start_addr.second < 0)
{
@@ -223,9 +388,9 @@ cdrom_rewind () {
else /* normal case */
{
if (cdi.state & CDROM_STATE_PAUSE) {
- start_addr.second -= pauseSkipInterval;
+ start_addr.second -= app_data.pauseSkipInterval;
} else if (cdi.state & CDROM_STATE_PLAY) {
- start_addr.second -= scanSkipInterval;
+ start_addr.second -= app_data.scanSkipInterval;
}
if ((char) start_addr.second < 0)
{
@@ -274,7 +439,7 @@ cdrom_rewind () {
{
if (scanivid == -1)
scanivid = XtAppAddTimeOut(appc,
- (int)(pausePauseInterval * 1000.0),
+ (int)(app_data.pausePauseInterval * 1000.0),
scan_update, NULL);
cdi.state &= ~CDROM_STATE_PAUSE; /* allow timer to change */
@@ -304,7 +469,6 @@ cdrom_ff () {
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");
@@ -332,11 +496,11 @@ cdrom_ff () {
if (((cdi.state & CDROM_STATE_PLAY) &&
((next_start.minute * 60) + next_start.second) <=
((start_addr.minute * 60) + start_addr.second +
- scanSkipInterval)) ||
+ app_data.scanSkipInterval)) ||
((cdi.state & CDROM_STATE_PAUSE) &&
((next_start.minute * 60) + next_start.second) <=
((start_addr.minute * 60) + start_addr.second +
- pauseSkipInterval)))
+ app_data.pauseSkipInterval)))
{
/* start at end of current track */
@@ -346,9 +510,9 @@ cdrom_ff () {
else
{
if (cdi.state & CDROM_STATE_PAUSE) {
- start_addr.second += pauseSkipInterval;
+ start_addr.second += app_data.pauseSkipInterval;
} else if (cdi.state & CDROM_STATE_PLAY) {
- start_addr.second += scanSkipInterval;
+ start_addr.second += app_data.scanSkipInterval;
}
if (start_addr.second >= 60)
{
@@ -360,9 +524,9 @@ cdrom_ff () {
else
{
if (cdi.state & CDROM_STATE_PAUSE) {
- start_addr.second += pauseSkipInterval;
+ start_addr.second += app_data.pauseSkipInterval;
} else if (cdi.state & CDROM_STATE_PLAY) {
- start_addr.second += scanSkipInterval;
+ start_addr.second += app_data.scanSkipInterval;
}
if (start_addr.second >= 60)
{
@@ -413,7 +577,7 @@ cdrom_ff () {
{
if (scanivid == -1)
scanivid = XtAppAddTimeOut(appc,
- (int)(pausePauseInterval * 1000.0),
+ (int)(app_data.pausePauseInterval * 1000.0),
scan_update, NULL);
cdi.state &= ~CDROM_STATE_PAUSE; /* allow timer to change */
@@ -435,85 +599,6 @@ cdrom_ff () {
/*
- * called by update_track when the cd has hit
- * the end of the track or the disc.
- */
-static void
-cdrom_atend() {
- cdrom_timer_off();
- leds_stop();
- debug_printf(1, "cdrom_atend: at end\n");
-
-#ifdef sgi
- /* Force a stop to kill the child (if any).
- * This is due to some sort of weirdness when the SGI runs off the
- * disc during a CDreadda().
- */
- if (cdi.scsi_audio) {
- cdrom_stop();
- }
-#endif
- if (cdi.state & CDROM_STATE_SHUFFLE) {
-
- if (cdi.currand == cdi.ntracks) {
- if ((cdi.state & CDROM_STATE_CYCLE) == 0) {
- debug_printf(1, "cdrom_atend: shuffle done\n");
-
- cdrom_reset();
- return;
- }
-
- debug_printf(1, "cdrom_atend: shuffle cycling\n");
- shuffle_setup();
- }
-
- cdi.curtrack = shuffle_next_track();
- }
- else if (cdi.state & CDROM_STATE_PROGRAM) {
- if ((cdi.curtrack = program_goto_next_track()) == 0)
- {
- if (cdi.state & CDROM_STATE_CYCLE)
- {
- debug_printf(1, "cdrom_atend: cycling program\n");
- cdi.curtrack = program_resume();
- timer_fsecs = 0;
- cdi.duration = 0;
- timer_button_update();
-
- (void) cdrom_play();
- }
- else
- {
- debug_printf(1, "cdrom_atend: all done\n");
- cdrom_reset();
- }
- return;
- }
- }
-
- else if ((cdi.curtrack < cdi.maxtrack) && (cdi.curtrack != 0)) {
- debug_printf(1, "cdrom_atend: continuing\n");
- cdi.curtrack++;
- }
- else if (cdi.state & CDROM_STATE_CYCLE) {
- debug_printf(1, "cdrom_atend: cycling\n");
- cdi.curtrack = cdi.mintrack;
- }
- else {
- debug_printf(1, "cdrom_atend: all done\n");
- buttons_reset();
- cdrom_reset();
- return;
- }
-
- timer_fsecs = 0;
- cdi.duration = 0;
- timer_button_update();
-
- (void) cdrom_play();
-}
-
-/*
* scan_update is called when the scan timeout fires; it updates the timer
* and calls the label update routine.
*/
@@ -557,7 +642,7 @@ scan_update(data, id)
cdi.state &= ~CDROM_STATE_STOP;
}
ivid = XtAppAddTimeOut(appc,
- (int)(scanPauseInterval * 1000.0),
+ (int)(app_data.scanPauseInterval * 1000.0),
scan_update, NULL);
}
else
@@ -574,7 +659,7 @@ scan_update(data, id)
}
ivid = XtAppAddTimeOut(appc,
- (int)(scanPauseInterval * 1000.0),
+ (int)(app_data.scanPauseInterval * 1000.0),
scan_update, NULL);
}
else if (scanivid != -1) {
@@ -607,89 +692,3 @@ update_status(data, id)
/* Reset timer */
stativid = XtAppAddTimeOut(appc, 1000, update_status, NULL);
}
-
-/*
- * update_track is called when the timeout fires; it updates curtrack and
- * calls the label update routine.
- */
-/*ARGSUSED*/
-static void
-update_track(data, id)
- XtPointer *data;
- XtIntervalId *id;
-{
- unsigned int curtrack;
- Arg args[1];
- Boolean state;
-
- extern Widget rew_button_widget;
- extern Widget ff_button_widget;
-#ifdef sgi
-
- int vol;
-#endif
-
- if ((curtrack = cdrom_get_curtrack()) != cdi.curtrack) {
- if (curtrack == 0) {
- cdrom_atend();
-
- return;
- }
-
- timer_fsecs = 0;
- cdi.duration = 0;
- timer_button_update();
-
- cdi.curtrack = curtrack;
- track_button_update();
- }
-
-#ifdef sgi
- /* Update the volume control */
- if ((vol = cdrom_get_volume()) != 0) {
- set_volume(vol);
- }
-#endif
-
- XtSetArg(args[0], XtNstate, &state);
- XtGetValues(rew_button_widget, args, 1);
- if (state == True)
- {
- cdrom_rewind();
- leds_update(BACKWARDS);
- if (cdi.state & CDROM_STATE_PAUSE) {
- if (cdrom_pause() != -1)
- cdi.state &= ~CDROM_STATE_STOP;
- }
- ivid = XtAppAddTimeOut(appc,
- (int)(scanPauseInterval * 1000.0),
- update_track, NULL);
- }
- else
- {
- leds_update(FORWARDS);
- XtSetArg(args[0], XtNstate, &state);
- XtGetValues(ff_button_widget, args, 1);
- if (state == True)
- {
- cdrom_ff();
- if (cdi.state & CDROM_STATE_PAUSE) {
- if (cdrom_pause() != -1)
- cdi.state &= ~CDROM_STATE_STOP;
- }
-
- ivid = XtAppAddTimeOut(appc,
- (int)(scanPauseInterval * 1000.0),
- update_track, NULL);
- }
- else
- {
- if ((timer_fsecs++ % timer_mod) == 0) {
- timer_button_update();
- }
- ivid = XtAppAddTimeOut(appc, TIMER_PERIOD,
- update_track, NULL);
- }
- }
-}
-