Interface to CD-ROM player.

This module implements an interface to the built-in cd module.  The
intention is to provide a more user-friendly interface than the
built-in module.

The module defines a class Readcd with several methods.  The
initialization of the class will try to open the CD player.  This
means that initialization will fail if the CD player is already in
use.  A RuntimeError will be raised by the cd module in that case.

The way to work with this module is as follows.  The user specifies
the parts of the CD that are to be read and he specifies callback
functions which are to be called by the system.  At some point he can
tell the system to play.  The specified parts of the CD will then be
read and the callbacks will be called.

Initialization.
===============

r = readcd.Readcd([cd-player [, mode]])

The optional arguments are the name of the CD device and the mode.
When "mode" is not specified, it defaults to 'r' (which is the only
possible value); when "cd-player" also isn't specified, it defaults
to "None" which indicates the default CD player.

Methods.
========

eject() -- Eject the CD from the player.

reset() -- Reset the list of data stretches to be played.

appendtrack(track) -- Append the specified track to the list of music
stretches.

appendstretch(first, last) -- Append the stretch from "first" to "last"
to the list of music stretches.  Both "first" and "last" can be in one
of four forms.  "None": for "first", the beginning of the CD, for
"last" the end of the CD; a single integer: a track number--playing
starts at the beginning of the track or ends at the end of the
specified track; a three-tuple: the absolute time from the start of
the CD in minutes, seconds, frames; a four-tuple: track number and
relative time within the track in minutes, seconds, frames.

settracks(tracklist) -- The argument is a list of integers.  The list
of stretches is set to argument list.  The old list is discarded.

setcallback(type, func, arg) -- Set a callback function for "type".
The function will be called as func(arg, type, data) where "arg" is
the third argument of setcallback, "type" is the type of callback,
"data" is type-dependent data.  See the CDsetcallback(3) manual page
for more information.  The possible "type" arguments are defined in
the CD module.

removecallback(type) -- Remove the callback for "type".

gettrackinfo([tracklist]) -- Return a list of tuples.  Each tuple
consists of start and length information of a track.  The start and
length information consist of three-tuples with minutes, seconds and
frames.  The optional tracklist argument gives a list of interesting
track numbers.  If no tracklist is specified, information about all
tracks is returned.

getstatus() -- Return the status information of the CD.

play() -- Play the preprogrammed stretches of music from the CD.  When
nothing was programmed, the whole CD is played.

Specifying stretches.
=====================

There are three methods available to specify a stretch of music to be
played.  The easiest way is to use "settracklist(tracklist)" with which
a list of tracks can be specified.  "settracklist(tracklist)" is
equivalent to the sequence
	reset()
	for track in tracklist:
		appendtrack(track)

The next method is "appendtrack(track)" with which a whole track can be
added to the list of music to be played.  "appendtrack(track)" is
equivalent to "appendstretch(track, track)".

The most complete method is "appendstretch(first, last)".  Using this
method, it is possible to specify any stretch of music.

When two consecutive tracks are played, it is possible to choose
whether the pause that may be between the tracks is played as well or
whether the pause should be skipped.  When the end of a stretch is
specified using a track number and the next stretch starts at the
beginning of the following track and that was also specified using the
track number (that is, both were specified as integers, not as tuples),
the pause is played.  When either value was specified using absolute
time or track-relative time (that is, as three-tuple or as
four-tuple), the pause will not be played.

Errors.
=======

When an error occurs, an exception will be raised.  Depending on where
the error occurs, the exception may either be "readcd.Error" or
"RuntimeError".
