Wanneer er geen disk in de speler zit falen sommige routines.  De
exceptie heeft nu in dat geval als argument "no disc in player", behalve
wanneer de bibliotheek routine errno zet.  In dat laatste geval wordt
(nog steeds) err_errno() gebruikt.

Wanneer een routine uit de bibliotheek faalt wordt nu altijd een IOError
gegenereerd.  Een RuntimeError treedt alleen op bij verkeerde argumenten.
diff --git a/Modules/cdmodule.c b/Modules/cdmodule.c
index 40a12fc..4f11867 100644
--- a/Modules/cdmodule.c
+++ b/Modules/cdmodule.c
@@ -82,47 +82,6 @@
 }
 
 static object *
-CD_getvolume(self, args)
-	cdplayerobject *self;
-	object *args;
-{
-	CDVOLUME vol;
-	int retval;
-
-	CheckPlayer(self);
-
-	if (!getnoarg(args))
-		return NULL;
-
-#if 0
-	if (!CDgetvolume(self->ob_cdplayer, &vol)) {
-		err_setstr(RuntimeError, "getvolume failed");
-		return NULL;
-	}
-#endif
-	retval = CDgetvolume(self->ob_cdplayer, &vol);
-	return mkvalue("(iiiii)", retval,
-		       vol.chan0, vol.chan1, vol.chan2, vol.chan3);
-}
-
-static object *
-CD_setvolume(self, args)
-	cdplayerobject *self;
-	object *args;
-{
-	CDVOLUME vol;
-	int retval;
-
-	CheckPlayer(self);
-
-	if (!getargs(args, "(bbbb)", &vol.chan0, &vol.chan1,
-		     &vol.chan2, &vol.chan3))
-		return NULL;
-
-	return newintobject(CDsetvolume(self->ob_cdplayer, &vol));
-}
-
-static object *
 CD_bestreadsize(self, args)
 	cdplayerobject *self;
 	object *args;
@@ -146,7 +105,7 @@
 		return NULL;
 
 	if (!CDclose(self->ob_cdplayer)) {
-		err_errno(RuntimeError); /* XXX - ??? */
+		err_errno(IOError); /* XXX - ??? */
 		return NULL;
 	}
 	self->ob_cdplayer = NULL;
@@ -160,13 +119,19 @@
 	cdplayerobject *self;
 	object *args;
 {
+	CDSTATUS status;
+
 	CheckPlayer(self);
 
 	if (!getnoarg(args))
 		return NULL;
 
 	if (!CDeject(self->ob_cdplayer)) {
-		err_setstr(RuntimeError, "eject failed");
+		if (CDgetstatus(self->ob_cdplayer, &status) &&
+		    status.state == CD_NODISC)
+			err_setstr(IOError, "no disc in player");
+		else
+			err_setstr(IOError, "eject failed");
 		return NULL;
 	}
 
@@ -187,7 +152,7 @@
 		return NULL;
 
 	if (!CDgetstatus(self->ob_cdplayer, &status)) {
-		err_errno(RuntimeError); /* XXX - ??? */
+		err_errno(IOError); /* XXX - ??? */
 		return NULL;
 	}
 
@@ -207,6 +172,7 @@
 {
 	int track;
 	CDTRACKINFO info;
+	CDSTATUS status;
 
 	CheckPlayer(self);
 
@@ -214,7 +180,11 @@
 		return NULL;
 
 	if (!CDgettrackinfo(self->ob_cdplayer, track, &info)) {
-		err_setstr(RuntimeError, "gettrackinfo failed");
+		if (CDgetstatus(self->ob_cdplayer, &status) &&
+		    status.state == CD_NODISC)
+			err_setstr(IOError, "no disc in player");
+		else
+			err_setstr(IOError, "gettrackinfo failed");
 		return NULL;
 	}
 
@@ -246,6 +216,7 @@
 	object *args;
 {
 	int start, play;
+	CDSTATUS status;
 
 	CheckPlayer(self);
 
@@ -253,7 +224,11 @@
 		return NULL;
 
 	if (!CDplay(self->ob_cdplayer, start, play)) {
-		err_setstr(RuntimeError, "play failed");
+		if (CDgetstatus(self->ob_cdplayer, &status) &&
+		    status.state == CD_NODISC)
+			err_setstr(IOError, "no disc in player");
+		else
+			err_setstr(IOError, "play failed");
 		return NULL;
 	}
 
@@ -267,6 +242,7 @@
 	object *args;
 {
 	int min, sec, frame, play;
+	CDSTATUS status;
 
 	CheckPlayer(self);
 
@@ -274,7 +250,11 @@
 		return NULL;
 
 	if (!CDplayabs(self->ob_cdplayer, min, sec, frame, play)) {
-		err_setstr(RuntimeError, "playabs failed");
+		if (CDgetstatus(self->ob_cdplayer, &status) &&
+		    status.state == CD_NODISC)
+			err_setstr(IOError, "no disc in player");
+		else
+			err_setstr(IOError, "playabs failed");
 		return NULL;
 	}
 
@@ -288,6 +268,7 @@
 	object *args;
 {
 	int start, play;
+	CDSTATUS status;
 
 	CheckPlayer(self);
 
@@ -295,7 +276,11 @@
 		return NULL;
 
 	if (!CDplaytrack(self->ob_cdplayer, start, play)) {
-		err_setstr(RuntimeError, "playtrack failed");
+		if (CDgetstatus(self->ob_cdplayer, &status) &&
+		    status.state == CD_NODISC)
+			err_setstr(IOError, "no disc in player");
+		else
+			err_setstr(IOError, "playtrack failed");
 		return NULL;
 	}
 
@@ -309,6 +294,7 @@
 	object *args;
 {
 	int track, min, sec, frame, play;
+	CDSTATUS status;
 
 	CheckPlayer(self);
 
@@ -316,7 +302,11 @@
 		return NULL;
 
 	if (!CDplaytrackabs(self->ob_cdplayer, track, min, sec, frame, play)) {
-		err_setstr(RuntimeError, "playtrackabs failed");
+		if (CDgetstatus(self->ob_cdplayer, &status) &&
+		    status.state == CD_NODISC)
+			err_setstr(IOError, "no disc in player");
+		else
+			err_setstr(IOError, "playtrackabs failed");
 		return NULL;
 	}
 
@@ -344,7 +334,7 @@
 	n = CDreadda(self->ob_cdplayer, (CDFRAME *) getstringvalue(result), numframes);
 	if (n == -1) {
 		DECREF(result);
-		err_errno(RuntimeError); /* XXX - ??? (seems to work) */
+		err_errno(IOError); /* XXX - ??? (seems to work) */
 		return NULL;
 	}
 	if (n < numframes)
@@ -369,7 +359,7 @@
 
 	block = CDseek(self->ob_cdplayer, min, sec, frame);
 	if (block == -1) {
-		err_errno(RuntimeError);
+		err_errno(IOError);
 		return NULL;
 	}
 
@@ -391,7 +381,7 @@
 
 	block = CDseektrack(self->ob_cdplayer, track);
 	if (block == -1) {
-		err_errno(RuntimeError);
+		err_errno(IOError);
 		return NULL;
 	}
 
@@ -403,13 +393,19 @@
 	cdplayerobject *self;
 	object *args;
 {
+	CDSTATUS status;
+
 	CheckPlayer(self);
 
 	if (!getnoarg(args))
 		return NULL;
 
 	if (!CDstop(self->ob_cdplayer)) {
-		err_setstr(RuntimeError, "stop failed");
+		if (CDgetstatus(self->ob_cdplayer, &status) &&
+		    status.state == CD_NODISC)
+			err_setstr(IOError, "no disc in player");
+		else
+			err_setstr(IOError, "stop failed");
 		return NULL;
 	}
 
@@ -422,13 +418,19 @@
 	cdplayerobject *self;
 	object *args;
 {
+	CDSTATUS status;
+
 	CheckPlayer(self);
 
 	if (!getnoarg(args))
 		return NULL;
 
 	if (!CDtogglepause(self->ob_cdplayer)) {
-		err_setstr(RuntimeError, "togglepause failed");
+		if (CDgetstatus(self->ob_cdplayer, &status) &&
+		    status.state == CD_NODISC)
+			err_setstr(IOError, "no disc in player");
+		else
+			err_setstr(IOError, "togglepause failed");
 		return NULL;
 	}
 
@@ -443,7 +445,6 @@
 	{"eject",		CD_eject},
 	{"getstatus",		CD_getstatus},
 	{"gettrackinfo",	CD_gettrackinfo},
-	{"getvolume",		CD_getvolume},
 	{"msftoblock",		CD_msftoblock},
 	{"play",		CD_play},
 	{"playabs",		CD_playabs},
@@ -453,7 +454,6 @@
 	{"readda",		CD_readda},
 	{"seek",		CD_seek},
 	{"seektrack",		CD_seektrack},
-	{"setvolume",		CD_setvolume},
 	{"stop",		CD_stop},
 	{"togglepause",		CD_togglepause},
 	{NULL,			NULL} 		/* sentinel */
@@ -528,7 +528,7 @@
 
 	cdp = CDopen(dev, direction);
 	if (cdp == NULL) {
-		err_errno(RuntimeError);
+		err_errno(IOError);
 		return NULL;
 	}
 
@@ -820,7 +820,7 @@
 		return NULL;
 	cdp = CDcreateparser();
 	if (cdp == NULL) {
-		err_setstr(RuntimeError, "createparser failed");
+		err_setstr(IOError, "createparser failed");
 		return NULL;
 	}