diff options
Diffstat (limited to 'audio/cdplay/files/patch-cd.c')
-rw-r--r-- | audio/cdplay/files/patch-cd.c | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/audio/cdplay/files/patch-cd.c b/audio/cdplay/files/patch-cd.c new file mode 100644 index 000000000000..11783cdcd366 --- /dev/null +++ b/audio/cdplay/files/patch-cd.c @@ -0,0 +1,143 @@ + +$FreeBSD$ + +--- cd.c.orig Mon May 19 15:44:40 2003 ++++ cd.c Mon May 19 15:53:44 2003 +@@ -98,8 +98,16 @@ + cd_play.end_s=cdinfo.s_sec[cdinfo.l_track-1]; + cd_play.end_f=cdinfo.s_frame[cdinfo.l_track-1]; + +- if(ioctl (cd_fd, CDIOCPLAYMSF, (char *) &cd_play)<0) +- per(); ++ if(ioctl (cd_fd, CDIOCPLAYMSF, (char *) &cd_play)<0) { ++ /* Hack for IDE CD-ROMs */ ++ if (cd_play.start_s < 2) { ++ cd_play.start_s=2; ++ if(ioctl (cd_fd, CDIOCPLAYMSF, (char *) &cd_play)<0) ++ per(); ++ } else ++ per(); ++ } ++ cdinfo.pause=0; + } + + /* Skips one track forward */ +@@ -111,7 +119,7 @@ + /* Quess */ + void prev(void) + { +- if(cdinfo.c_sec<1) ++ if(cdinfo.c_sec<4) + play_track(cdinfo.c_track-1); + else play_track(cdinfo.c_track); + } +@@ -141,17 +149,59 @@ + } + } + ++/* Softly pauses the cd, or unpauses, as appropriate */ ++void cdsoftpause(void) ++{ ++ struct ioc_vol real_vol, cur_vol; ++ int i; ++ ++ if(ioctl(cd_fd,CDIOCGETVOL,(char *) &real_vol)) per(); ++ cur_vol = real_vol; ++ ++ if(cdinfo.pause){ ++ message="continue"; ++ memset (cur_vol.vol, 0, sizeof(cur_vol.vol)); ++ if(ioctl(cd_fd,CDIOCSETVOL,(char *) &cur_vol)) per(); ++ if(ioctl(cd_fd,CDIOCRESUME)<0) per(); else cdinfo.pause=0; ++ for (i=0; i<20; usleep(21), i++) { ++ cur_vol.vol[0] += (real_vol.vol[0] / 20); ++ cur_vol.vol[1] += (real_vol.vol[1] / 20); ++ cur_vol.vol[2] += (real_vol.vol[2] / 20); ++ cur_vol.vol[3] += (real_vol.vol[3] / 20); ++ if(ioctl(cd_fd,CDIOCSETVOL,(char *) &cur_vol)) per(); ++ } ++ if(ioctl(cd_fd,CDIOCSETVOL,(char *) &real_vol)) per(); ++ } ++ else { ++ message="pause"; ++ for (i=0; i<20; usleep(21), i++) { ++ cur_vol.vol[0] -= (real_vol.vol[0] / 20); ++ cur_vol.vol[1] -= (real_vol.vol[1] / 20); ++ cur_vol.vol[2] -= (real_vol.vol[2] / 20); ++ cur_vol.vol[3] -= (real_vol.vol[3] / 20); ++ if(ioctl(cd_fd,CDIOCSETVOL,(char *) &cur_vol)) per(); ++ } ++ if(ioctl (cd_fd, CDIOCPAUSE)<0) per(); else cdinfo.pause=1; ++ if(ioctl (cd_fd, CDIOCSETVOL,(char *) &real_vol)) per(); ++ } ++} ++ + /* Huge kludge */ +-void ff(void) ++void ff(int n_times) + { ++ int secs; + struct ioc_play_msf cd_play; + +- if(cdinfo.c_seca%60+5>=60){ +- cd_play.start_s=((cdinfo.c_seca%60)+5)%60; ++ secs=4*n_times; ++ ++ if (secs > 59) secs=59; ++ ++ if(cdinfo.c_seca%60+secs>=60){ ++ cd_play.start_s=((cdinfo.c_seca%60)+secs)%60; + cd_play.start_m=cdinfo.c_seca/60+1; + } + else { +- cd_play.start_s=(cdinfo.c_seca%60)+5; ++ cd_play.start_s=(cdinfo.c_seca%60)+secs; + cd_play.start_m=cdinfo.c_seca/60; + } + cd_play.start_f=1; +@@ -160,19 +210,25 @@ + cd_play.end_f=cdinfo.s_frame[cdinfo.l_track-1]; + + if(ioctl(cd_fd,CDIOCPLAYMSF,(char *) &cd_play)<0) per(); ++ cdinfo.pause=0; + } + + /* Hi mom!! */ +-void rew(void) ++void rew(int n_times) + { ++ int secs; + struct ioc_play_msf cd_play; + +- if(cdinfo.c_seca%60-5<0){ +- cd_play.start_s=((cdinfo.c_seca%60)-5)+60; ++ secs=4*n_times; ++ ++ if (secs > 59) secs=59; ++ ++ if(cdinfo.c_seca%60-secs<0){ ++ cd_play.start_s=((cdinfo.c_seca%60)-secs)+60; + cd_play.start_m=cdinfo.c_seca/60-1; + } + else { +- cd_play.start_s=(cdinfo.c_seca%60)-5; ++ cd_play.start_s=(cdinfo.c_seca%60)-secs; + cd_play.start_m=cdinfo.c_seca/60; + } + cd_play.start_f=1; +@@ -181,6 +237,7 @@ + cd_play.end_f=cdinfo.s_frame[cdinfo.l_track-1]; + + if(ioctl(cd_fd,CDIOCPLAYMSF,(char *) &cd_play)<0) per(); ++ cdinfo.pause=0; + } + + /* Spit cd out */ +@@ -192,6 +249,7 @@ + per(); + close(cd_fd); + cdinfo.eject=1; ++ cdinfo.pause=1; + } + + |