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