changeset 29848:c20a30ebbe56

Move dvd_speed and dvd_set_speed to dvd_common and implement -dvd-speed support for dvdnav.
author reimar
date Tue, 10 Nov 2009 23:20:05 +0000
parents e37311e178e1
children 77b9f0557384
files stream/stream_dvd.c stream/stream_dvd_common.c stream/stream_dvd_common.h stream/stream_dvdnav.c
diffstat 4 files changed, 79 insertions(+), 73 deletions(-) [+]
line wrap: on
line diff
--- a/stream/stream_dvd.c	Tue Nov 10 23:15:48 2009 +0000
+++ b/stream/stream_dvd.c	Tue Nov 10 23:20:05 2009 +0000
@@ -43,79 +43,6 @@
 
 static char* dvd_device_current;
 int dvd_angle=1;
-int dvd_speed=0; /* 0 => don't touch speed */
-
-static void dvd_set_speed(char *device, unsigned speed)
-{
-#if defined(__linux__) && defined(SG_IO) && defined(GPCMD_SET_STREAMING)
-  int fd;
-  unsigned char buffer[28];
-  unsigned char cmd[12];
-  struct sg_io_hdr sghdr;
-  struct stat st;
-
-  memset(&st, 0, sizeof(st));
-
-  if (stat(device, &st) == -1) return;
-
-  if (!S_ISBLK(st.st_mode)) return; /* not a block device */
-
-  switch (speed) {
-  case 0: /* don't touch speed setting */
-    return;
-  case -1: /* restore default value */
-    if (dvd_speed == 0) return; /* we haven't touched the speed setting */
-    mp_msg(MSGT_OPEN, MSGL_INFO, MSGTR_DVDrestoreSpeed);
-    break;
-  default: /* limit to <speed> KB/s */
-    // speed < 100 is multiple of DVD single speed (1350KB/s)
-    if (speed < 100)
-      speed *= 1350;
-    mp_msg(MSGT_OPEN, MSGL_INFO, MSGTR_DVDlimitSpeed, speed);
-    break;
-  }
-
-  memset(&sghdr, 0, sizeof(sghdr));
-  sghdr.interface_id = 'S';
-  sghdr.timeout = 5000;
-  sghdr.dxfer_direction = SG_DXFER_TO_DEV;
-  sghdr.dxfer_len = sizeof(buffer);
-  sghdr.dxferp = buffer;
-  sghdr.cmd_len = sizeof(cmd);
-  sghdr.cmdp = cmd;
-
-  memset(cmd, 0, sizeof(cmd));
-  cmd[0] = GPCMD_SET_STREAMING;
-  cmd[10] = sizeof(buffer);
-
-  memset(buffer, 0, sizeof(buffer));
-  /* first sector 0, last sector 0xffffffff */
-  AV_WB32(buffer + 8, 0xffffffff);
-  if (speed == -1)
-    buffer[0] = 4; /* restore default */
-  else {
-    /* <speed> kilobyte */
-    AV_WB32(buffer + 12, speed);
-    AV_WB32(buffer + 20, speed);
-  }
-  /* 1 second */
-  AV_WB16(buffer + 18, 1000);
-  AV_WB16(buffer + 26, 1000);
-
-  fd = open(device, O_RDWR | O_NONBLOCK);
-  if (fd == -1) {
-    mp_msg(MSGT_OPEN, MSGL_INFO, MSGTR_DVDspeedCantOpen);
-    return;
-  }
-
-  if (ioctl(fd, SG_IO, &sghdr) < 0)
-    mp_msg(MSGT_OPEN, MSGL_INFO, MSGTR_DVDlimitFail);
-  else
-    mp_msg(MSGT_OPEN, MSGL_INFO, MSGTR_DVDlimitOk);
-
-  close(fd);
-#endif
-}
 
 #define	LIBDVDREAD_VERSION(maj,min,micro)	((maj)*10000 + (min)*100 + (micro))
 /*
--- a/stream/stream_dvd_common.c	Tue Nov 10 23:15:48 2009 +0000
+++ b/stream/stream_dvd_common.c	Tue Nov 10 23:20:05 2009 +0000
@@ -6,6 +6,80 @@
 const char * const dvd_audio_stream_types[8] = { "ac3","unknown","mpeg1","mpeg2ext","lpcm","unknown","dts" };
 const char * const dvd_audio_stream_channels[6] = { "mono", "stereo", "unknown", "unknown", "5.1/6.1", "5.1" };
 
+int dvd_speed=0; /* 0 => don't touch speed */
+
+void dvd_set_speed(char *device, unsigned speed)
+{
+#if defined(__linux__) && defined(SG_IO) && defined(GPCMD_SET_STREAMING)
+  int fd;
+  unsigned char buffer[28];
+  unsigned char cmd[12];
+  struct sg_io_hdr sghdr;
+  struct stat st;
+
+  memset(&st, 0, sizeof(st));
+
+  if (stat(device, &st) == -1) return;
+
+  if (!S_ISBLK(st.st_mode)) return; /* not a block device */
+
+  switch (speed) {
+  case 0: /* don't touch speed setting */
+    return;
+  case -1: /* restore default value */
+    if (dvd_speed == 0) return; /* we haven't touched the speed setting */
+    mp_msg(MSGT_OPEN, MSGL_INFO, MSGTR_DVDrestoreSpeed);
+    break;
+  default: /* limit to <speed> KB/s */
+    // speed < 100 is multiple of DVD single speed (1350KB/s)
+    if (speed < 100)
+      speed *= 1350;
+    mp_msg(MSGT_OPEN, MSGL_INFO, MSGTR_DVDlimitSpeed, speed);
+    break;
+  }
+
+  memset(&sghdr, 0, sizeof(sghdr));
+  sghdr.interface_id = 'S';
+  sghdr.timeout = 5000;
+  sghdr.dxfer_direction = SG_DXFER_TO_DEV;
+  sghdr.dxfer_len = sizeof(buffer);
+  sghdr.dxferp = buffer;
+  sghdr.cmd_len = sizeof(cmd);
+  sghdr.cmdp = cmd;
+
+  memset(cmd, 0, sizeof(cmd));
+  cmd[0] = GPCMD_SET_STREAMING;
+  cmd[10] = sizeof(buffer);
+
+  memset(buffer, 0, sizeof(buffer));
+  /* first sector 0, last sector 0xffffffff */
+  AV_WB32(buffer + 8, 0xffffffff);
+  if (speed == -1)
+    buffer[0] = 4; /* restore default */
+  else {
+    /* <speed> kilobyte */
+    AV_WB32(buffer + 12, speed);
+    AV_WB32(buffer + 20, speed);
+  }
+  /* 1 second */
+  AV_WB16(buffer + 18, 1000);
+  AV_WB16(buffer + 26, 1000);
+
+  fd = open(device, O_RDWR | O_NONBLOCK);
+  if (fd == -1) {
+    mp_msg(MSGT_OPEN, MSGL_INFO, MSGTR_DVDspeedCantOpen);
+    return;
+  }
+
+  if (ioctl(fd, SG_IO, &sghdr) < 0)
+    mp_msg(MSGT_OPEN, MSGL_INFO, MSGTR_DVDlimitFail);
+  else
+    mp_msg(MSGT_OPEN, MSGL_INFO, MSGTR_DVDlimitOk);
+
+  close(fd);
+#endif
+}
+
 /**
 \brief Converts DVD time structure to milliseconds.
 \param *dev the DVD time structure to convert
--- a/stream/stream_dvd_common.h	Tue Nov 10 23:15:48 2009 +0000
+++ b/stream/stream_dvd_common.h	Tue Nov 10 23:20:05 2009 +0000
@@ -9,6 +9,8 @@
 extern const char * const dvd_audio_stream_channels[6];
 extern const char * const dvd_audio_stream_types[8];
 
+extern int dvd_speed;
+void dvd_set_speed(char *device, unsigned speed);
 int mp_dvdtimetomsec(dvd_time_t *dt);
 
 #endif /* MPLAYER_STREAM_DVD_COMMON_H */
--- a/stream/stream_dvdnav.c	Tue Nov 10 23:15:48 2009 +0000
+++ b/stream/stream_dvdnav.c	Tue Nov 10 23:20:05 2009 +0000
@@ -87,6 +87,8 @@
     return NULL;
   }
 
+  dvd_set_speed(priv->filename, dvd_speed);
+
   if(dvdnav_open(&(priv->dvdnav),priv->filename)!=DVDNAV_STATUS_OK)
   {
     free(priv->filename);
@@ -291,6 +293,7 @@
   dvdnav_priv_t *priv = s->priv;
   dvdnav_close(priv->dvdnav);
   priv->dvdnav = NULL;
+  dvd_set_speed(priv->filename, -1);
   free(priv);
 }