$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); - } - } -} -