summaryrefslogtreecommitdiff
path: root/audio/cdplay/files/patch-cd.c
diff options
context:
space:
mode:
Diffstat (limited to 'audio/cdplay/files/patch-cd.c')
-rw-r--r--audio/cdplay/files/patch-cd.c143
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;
+ }
+
+