diff --exclude=*.o|*.~ -b -B -u workman-1.2.2a/cdrom.c workman-1.2.2b/cdrom.c --- workman-1.2.2a/cdrom.c Mon Apr 11 18:05:42 1994 +++ workman-1.2.2b/cdrom.c Thu Jun 22 20:37:59 1995 @@ -60,6 +60,11 @@ extern enum cd_modes cur_cdmode; extern char *cur_artist, *cur_cdname, *cur_trackname; extern char cur_contd, cur_avoid; +extern int old_pos_rel; +extern int old_track; + +void play_chunk(int start, int end); + struct wm_drive drive = { -1, NULL, NULL, NULL, NULL }; @@ -184,6 +189,42 @@ return (&thiscd); } +/* + * play_cd(starttrack, pos, endtrack) + * + * Start playing the CD or jump to a new position. "pos" is in seconds, + * relative to start of track. + */ +void +play_cd(start, pos, end) +int start, pos, end; +{ + if (cur_cdmode == EJECTED || cd == NULL) + return; + + cur_firsttrack = start; + start--; + end--; + cur_lasttrack = end; + + play_chunk(cd->trk[start].start + pos * 75, end >= cur_ntracks ? + cur_cdlen * 75 : cd->trk[end].start - 1); +} + +/* + * Set the offset into the current track and play. -1 means end of track + * (i.e., go to next track.) + */ +void +play_from_pos(pos) + int pos; +{ + if (pos == -1) + if (cd) + pos = cd->trk[cur_track - 1].length - 1; + if (cur_cdmode == PLAYING) + play_cd(cur_track, pos, playlist[cur_listno-1].end); +} /* * cd_status() @@ -240,6 +281,7 @@ if (cur_cdmode == EJECTED) { cur_pos_rel = cur_pos_abs = 0; + old_pos_rel = -10; if ((cd = read_toc()) == NULL) if (exit_on_eject) @@ -316,6 +358,15 @@ cur_cdmode = mode; break; } + if((mode == PLAYING) && (cur_track==old_track) + && (cur_track>0) && (old_pos_rel>0)) + { + if(abs(old_pos_rel- cur_pos_rel)>1) + { + play_from_pos(old_pos_rel); + cur_pos_rel = old_pos_rel; + } + } return (ret); } @@ -379,6 +430,7 @@ case PAUSED: /* paused */ cur_cdmode = PLAYING; (drive.resume)(&drive); + play_from_pos(cur_pos_rel); } } @@ -421,42 +473,6 @@ (drive.play)(&drive, start, end); } -/* - * play_cd(starttrack, pos, endtrack) - * - * Start playing the CD or jump to a new position. "pos" is in seconds, - * relative to start of track. - */ -void -play_cd(start, pos, end) -int start, pos, end; -{ - if (cur_cdmode == EJECTED || cd == NULL) - return; - - cur_firsttrack = start; - start--; - end--; - cur_lasttrack = end; - - play_chunk(cd->trk[start].start + pos * 75, end >= cur_ntracks ? - cur_cdlen * 75 : cd->trk[end].start - 1); -} - -/* - * Set the offset into the current track and play. -1 means end of track - * (i.e., go to next track.) - */ -void -play_from_pos(pos) - int pos; -{ - if (pos == -1) - if (cd) - pos = cd->trk[cur_track - 1].length - 1; - if (cur_cdmode == PLAYING) - play_cd(cur_track, pos, playlist[cur_listno-1].end); -} /* * Eject the current CD, if there is one, and set the mode to 5. diff --exclude=*.o|*.~ -b -B -u workman-1.2.2a/plat_linux.c workman-1.2.2b/plat_linux.c --- workman-1.2.2a/plat_linux.c Sat May 14 21:22:57 1994 +++ workman-1.2.2b/plat_linux.c Sun Jun 18 18:38:25 1995 @@ -18,7 +18,7 @@ #include "struct.h" -#define DEFAULT_CD_DEVICE "/dev/sr0" +#define DEFAULT_CD_DEVICE "/dev/cdrom" #define max(a,b) ((a) > (b) ? (a) : (b)) @@ -252,7 +252,7 @@ gen_stop(d) struct wm_drive *d; { - return (ioctl(d->fd, CDROMSTOP)); + return (ioctl(d->fd, CDROMPAUSE)); } /* diff --exclude=*.o|*.~ -b -B -u workman-1.2.2a/workman_stubs.c workman-1.2.2b/workman_stubs.c --- workman-1.2.2a/workman_stubs.c Sat Apr 9 02:51:37 1994 +++ workman-1.2.2b/workman_stubs.c Thu Jun 22 20:24:49 1995 @@ -106,6 +106,8 @@ #else int dismiss_button = 0; #endif +int old_pos_rel =-10; +int old_track = -1; Attr_attribute INSTANCE; @@ -430,7 +432,10 @@ static int new_image = 0, initted_volume = 0; static enum cd_modes old_cdmode; Xv_opaque old_image; - +/* + old_pos_rel = cur_pos_rel; + old_track = cur_track; + */ if (xv_get(ip->mode, PANEL_VALUE) != 5 || ! dont_retry) switch (cd_status()) { case 0: /* No CD in drive */ @@ -462,6 +467,8 @@ } old_cdmode = cur_cdmode; + old_pos_rel = cur_pos_rel; + old_track = cur_track; if (window_is_open && xv_get(Workman_about->about, XV_SHOW)) { @@ -491,11 +498,15 @@ donewithcd: if (xv_get(Workman_goodies->abrepeat, PANEL_VALUE)) { + old_pos_rel = -10; + play_chunk(mark_a, mark_b); return (1); } if (was_repeating) { + old_pos_rel = -10; + was_repeating = 0; play_chunk(mark_b, cur_lasttrack >= cur_ntracks ? (cd->length - 1) * 75 : @@ -560,6 +571,8 @@ { play_from_pos(time_wanted); time_wanted = -2; + old_pos_rel = -10; + return (1); } if (time_wanted == -2) @@ -705,6 +718,9 @@ window1_objects *ip = Workman_window1; int track, playmode; + old_pos_rel = -10; + old_track = cur_track; + if (cur_cdmode == EJECTED && dont_retry) handle_timer(NULL, NULL); if (cur_cdmode == EJECTED || (cur_track == -1 && (value == 0 || value == 2))) @@ -863,6 +879,9 @@ break; } + old_pos_rel = -10; + old_track = cur_track; + } /* @@ -948,6 +967,8 @@ { window1_objects *ip = Workman_window1; + old_pos_rel = -10; + old_track = cur_track; if (cur_cdlen > 0 && cur_cdmode != EJECTED) { if (value == -1) @@ -976,6 +997,8 @@ } new_track(ip); } + old_pos_rel = -10; + old_track = cur_track; } /* @@ -1014,6 +1037,8 @@ if (xv_get(Workman_goodies->abrepeat, PANEL_VALUE)) xv_set(Workman_goodies->abrepeat, PANEL_VALUE, FALSE, NULL); + old_pos_rel = cur_pos_rel; + old_track = cur_track; } /* @@ -1284,6 +1309,9 @@ int value; Event *event; { + old_pos_rel = -10; + old_track = -1; + cur_firsttrack = cur_lasttrack = -1; play_chunk(mark_a, mark_b); }