summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarren Salt <linux@youmustbejoking.demon.co.uk>2006-08-11 21:40:02 +0000
committerDarren Salt <linux@youmustbejoking.demon.co.uk>2006-08-11 21:40:02 +0000
commitd5bd5710c23300e1ba95ff596556f25317993de7 (patch)
tree297e33ed4c89f4bac4efb8e5516093f4d0f64cd2
parent9b758d13449923d4707c80d4ee4a3cad6a757365 (diff)
downloadxine-lib-d5bd5710c23300e1ba95ff596556f25317993de7.tar.gz
xine-lib-d5bd5710c23300e1ba95ff596556f25317993de7.tar.bz2
Fix up CDDA parsing to cope with an arbitrary number of slashes after the colon.
Adjust xine(5) to make mention of the possibility of naming the device. CVS patchset: 8176 CVS date: 2006/08/11 21:40:02
-rw-r--r--doc/man/en/xine.52
-rw-r--r--src/input/input_cdda.c47
2 files changed, 27 insertions, 22 deletions
diff --git a/doc/man/en/xine.5 b/doc/man/en/xine.5
index 98e6d721d..817ca120b 100644
--- a/doc/man/en/xine.5
+++ b/doc/man/en/xine.5
@@ -37,7 +37,7 @@ to read from. Valid MRLs may be plain file names or one of the following:
.br
.BI vcdo://...
.br
-.BI cdda://<track-number>
+.BI cdda:/[<device>][/<track-number>]
.LP
.TP
\(bu Video devices:
diff --git a/src/input/input_cdda.c b/src/input/input_cdda.c
index 480759de9..f51ffc646 100644
--- a/src/input/input_cdda.c
+++ b/src/input/input_cdda.c
@@ -20,7 +20,7 @@
* Compact Disc Digital Audio (CDDA) Input Plugin
* by Mike Melanson (melanson@pcisys.net)
*
- * $Id: input_cdda.c,v 1.89 2006/07/10 22:08:14 dgp85 Exp $
+ * $Id: input_cdda.c,v 1.90 2006/08/11 21:40:02 dsalt Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -2537,28 +2537,33 @@ static input_plugin_t *cdda_class_get_instance (input_class_t *cls_gen, xine_str
/* fetch the CD track to play */
if (!strncasecmp (mrl, "cdda:/", 6)) {
- if ( strlen(mrl) > 8 && strchr(&mrl[8],'/') ) {
- int i;
-
- cdda_device = strdup(&mrl[6]);
-
- i = strlen(cdda_device)-1;
- while( i && cdda_device[i] != '/' )
- i--;
-
- if( i ) {
- cdda_device[i] = '\0';
- track = atoi(&cdda_device[i+1]);
- } else
- track = -1;
-
+ const char *p, *slash = mrl + 6;
+ while (*slash == '/')
+ ++slash;
+ p = --slash; /* point at a slash */
+ while (*p >= '0' && *p <= '9')
+ ++p;
+ if (*p) {
+ char *lastslash;
+ cdda_device = strdup (slash);
+ p = lastslash = strrchr (cdda_device, '/'); /* guaranteed to return non-NULL */
+ while (*++p >= '0' && *p <= '9')
+ /**/;
+ if (!*p) {
+ track = atoi (lastslash + 1);
+ *lastslash = 0;
+ if (lastslash == cdda_device) {
+ free (cdda_device);
+ cdda_device = NULL;
+ }
+ } else {
+ track = -1;
+ }
} else {
- track = atoi(&mrl[6]);
+ track = atoi (slash + 1);
}
-
- /* CD tracks start at 1, reject illegal tracks */
- if (track <= 0)
- return NULL;
+ if (track < 1)
+ track = 1;
} else
return NULL;