This file documents the ``Extended'' VLC CD-DA Plugin

Copyright (C) 2003, 2004 Rocky Bernstein (rocky@panix.com)

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.1 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software'' and ``Free Software Needs
Free Documentation'', with the Front-Cover Texts being ``A GNU Manual,''
and with the Back-Cover Texts as in (a) below.

(a) The Free Software Foundation's Back-Cover Text is: ``You have
freedom to copy and modify this GNU Manual, like GNU software.  Copies
published by the Free Software Foundation raise funds for GNU
development.''

- - - - - -

Features over the older VLC CD-DA plugin

Internally I think this is much much cleaner. It uses the 
libcdio for disk reading and libcddb to get CDDB information.

MRL handling: 
-  Can specify device as well as track.
-  Because we use the libcdio library, the "device" can be a disk image
   to be burned (e.g. a cdrdao bin/cue pair and some primitive Nero
   support)

Features:
-  Can customize the what to show in the play-list title and author. 
-  Duration of each track is shown
-  Media information is shown using CDDB
-  Dynamic debugging
-  Will scan for a CD-ROM drive with a CD-DA loaded in it.

-----------------------------------------------------------------
General Info
-----------------------------------------------------------------

Much of what I write in this section can be found elsewhere. See for
example http://www.pctechguide.com/08cd-rom.htm, or the libcdio
documentation.

The Sony and Philips Corporations invented and Compact Disc (CD) in
the early 1980s. The specifications for the layout is often referred
to by the color of the cover on the specification. 

The first type of CD specification that was produced was the Compact
Disc Digital Audio (CD-DA) or just plain ``audio CD'' and is commonly
called the ``Red Book''. Music CD's are recorded in this format which
basically allows for around 74 minutes of audio per disc and for that
information to be split up into *tracks*. Tracks are broken up into
"sectors" and each sector contains 2,352 bytes. To play one 44.1 kHz
CD-DA sampled audio second, 75 sectors are used.

A CD can hold at most 99 such tracks. Between the tracks CD
specifications require a ``2 second'' in gap (called a @term{lead-in
gap}. This is unused space with no ``data'' similar to the space
between tracks on an old phonograph. The word ``second'' here really
refers to a measure of space and not really necessarily an amount of
time. However in the special case here where you have an audio CD, the
amount of time to play a gap of this size will take 2 seconds. Note
this is independent of how fast your CD drive can read a sector.

The beginning (or inner edge) of the CD is supposed to have a ``2
second'' lead-in gap and there is supposed to be another ``2 second''
*lead-out* gap at the end (or outer edge) of the CD.

CD-DA ``Red Book'' Specification

One can create and then write or "burn" a CD in the CD-DA format
and in this process sometimes one writes the bytes that will appear as
a file on a hard disk. This is called a "CD disk image". This
plugin may be able to play this file just the same as if it were
burned onto a CD.

As there are a number of CD-burning programs, there are a number of
CD-image formats. This plugin uses libcdio which currently understands
the BIN/CUE disk-image format used by a popular DOS/Window mastering
tool and a limited subset of the proprietary and unpublished form at
used by the Nero burning software. Over time however perhaps more
disk-image formats will be recognized.

Audio CD Identification Information (CDDB)

The Philips Red-Book specification allows for a Compact Disc to have a
Media Catalog Number or MCN written on it, and probably this
was how they CD's would be identified. Alas, very few audio discs
actually have a Medium Catalog Number on the box, and the way the code
is written on CD is *not* uniform across all discs!

However the listening community wanted a way to identify an audio CD,
so a database of CD information was gathered by basically making a
``signature'' or hash from the number of tracks on a disk and a
checksum of the bytes of the tracks. This is referred to as CDDB
information. Using the hash the database gives information about the
titles of the tracks, the CD album name, year it was published and so
on. This plugin has the ability to show this information courtesy of
libcddb written by Kris Verbeeck.


-----------------------------------------------------------------
MRLS:
-----------------------------------------------------------------

the vlc CD-DA plugin, identifies itself in the vlc GUI as CDDAX. It
also registers itelf to handle a class of MRL's that start with
cddax://.

The CDDAX MRL takes the following form:

  cddax://[path to file or CD-DA device][@[Tt]number]]

A simple cddax:// runs the default item: track 1 using the default CD
device (perhaps /dev/cdrom). The default default device is
user-configurable.

It is however also possible to specify both Compact Disc device/filename
and item explicitly in the MRL.

For example cddax://dev/cdrom2 specifies using device /dev/cdrom2 which
might useful if as I have /dev/cdrom is a burner and the /dev/cdrom2
is a read-only device. And cddax://test_cdda.cue specifies the
"cuesheet" file for a CD-DA image on disk created say with cdrdao.
(test_cdda.bin is the corresponding bin file, but using that won't
work.)

After the optional device name or file name, you can name the track
number unit which preceded by a @ or an @ and T in either case. A MRL
which ends in an @ is like not adding it at all.

Some examples of MRLS are given below. In the examples, we assume the
following configuration setting:

cdda.default_device:/dev/cdrom

    cddax://                   - track 1 of device: /dev/cdrom
    cddax://@                  - same as above
    cddax:///dev/cdrom         - probably same as above
    cddax:///dev/cdrom2        - track 1 of /dev/cdrom2
    cddax:///dev/cdrom2@       - same as above
    cddax://dev/cdrom2@53      - track 53 from /dev/cdrom2
    cddax://dev/cdrom2@T53     - Same as above
    cddax://dev/cdrom2@t53     - Same as above
    cddax://@2                 - track 2 from default device
    cddax://3                  - track 3 from default device
    cddax:///tmp/ntsc.cue      - track 1 from /tmp/ntsc.bin, (a bin/cue
                                 disk image)
    cddax:///tmp/ntsc.cue@     - same as above
    cddax://tmp/ntsc.cue@      - track 1 of tmp/ntsc.bin. NOT the
                                 the same as above unless the cwd is /.
    cddax://ntsc.nrg           - track 1 of ntsc.nrg (a nero disk image)
    cddax://tmp/ntsc.nrg@5     - track 5 of /tmp/ntsc.nrg

  Bad MRL's
    cddax://@x                  - x is not a number
    cddax/tmp                   - no colon
    cddax:/                     - must start cddax://

-----------------------------------------------------------------
Configuration settings:
-----------------------------------------------------------------

Configuration settings in vlc are generally put in ~/.vlc/vlcrc. A
description of the ones specific to CDDAX are listed below.

- -
cddax-cddb-title-format

This gives a format used in the playlist title string when CDDB is consulted.
Similar to the Unix date command, there are format specifiers
that start with a percent sign for which various information is filled
in dynamically.  The control specifiers are given as below

   %a : The album artist
   %A : The album information
   %C : Category
   %I : CDDB disk ID
   %G : Genre
   %M : The current MRL
   %m : The CD-DA Media Catalog Number (MCN)
   %n : The number of tracks on the CD
   %p : The artist/performer/composer in the track
   %T : The track number
   %s : Number of seconds in this track
   %t : The name
   %Y : The year 19xx or 20xx
   %% : a %

The default is
  Track %T. %t - %p 

- -
cddax-title-format

This gives a format used in the playlist title string when CDDB is
*NOT* consulted.  Similar to the Unix date command, there are format
specifiers that start with a percent sign for which various
information is filled in dynamically.  The control specifiers are
given as below

   %M : The current MRL
   %m : The CD-DA Media Catalog Number (MCN)
   %n : The number of tracks on the CD
   %T : The track number
   %s : Number of seconds in this track
   %% : a %

The default is 
  %T %M 

- -
cddax-cddb-email

# email given on cddb requests
# string, default: me@home

- -
cddax-cddb-enabled

# Do we use CDDB to retrieve CD information?
# bool, default: 1

- -
cddax-cddb-http

# Contact CDDB via the HTTP protocol?
# bool, default: 0

- -
cddax-cddb-port

# numeric, default: 8880

- -
cddax-cddb-server

# The server CDDB contacts to get CD info
# string, default: freedb.freedb.org

- -
cddax-debug

An integer (interpreted as a bit mask) which shows additional
debugging information see the section below on debugging for more
information about the bits that can be set.

- - 
cddax-device

What to use if no drive specified. If null, we'll scan for CD
drives with a CD-DA loaded in it.

# string, default: 

-----------------------------------------------------------------
Troubleshooting Guide
-----------------------------------------------------------------

This gives higher-level troubleshooting. More detailed and
lower-level information is given in the next section DEBUGGING. 

Problem: something doesn't work. Start at step -1.

Problem: The program gets a SEGFAULT or gives core dump. Start at step
0.

Problem: I don't get anything playing. I can't even get a playlist of
the CD.
Determination: start at step 1.

Problem: Okay, I something plays menu now. But I don't see information
about the CD in the playlist.
Determination: start at step 5.

-1. (Something doesn't work.)

   A lot of what is put here really is applicable to reporting
   problems and troubleshooting in vlc and the concepts really
   apply to any sort of bug reporting. 

   When reporting a problem it's helpful to have facts:

     a) the version of vlc) you are using

     b) the OS you are running on 

     c) the version of libcdio and/or libcddb you are using 
        versions of libcdio and libcddb can be obtained by running 
          pkg-config --modversion libcdio
          pkg-config --modversion libcddb

     d) what you input or requested (e.g. the full command line entered -
        if it is possible to reproduce the problem by giving a
        commandline that is desirable since it is probably the simplest
        way to convey exactly what was requested)
   
        People often give (some part) of an error message neglecting
        to also include what was requested or entered that led to the
        output.

     e) The setting for this plugin. That is the values of the
        variables that start cddax- listed above. On Unix this can
	generally be found in ~/.vlc/vlcrc
  
     f) Exactly the messages that were what given. You can turn
        increase the verbosity level by setting "verbosity=2" in the
        vlc preferences files. On Unix the preferences file is
        generally in ~/vlc/.vlcrc but there are GUI ways to set this
        too. Give everything that is in the message log.

0. (The program gets a SEGFAULT or gives core dump.)

   Get and send a stack trace. 

   In addition to -1. Make sure the program has been compiled with
   debugging symbols put into the code. This is usually done by having
   the "-g" flag set when compiling the program.

   You can get a strack trace the GNU debugger using the "where"
   command. For example on this might work:

     gdb vlc *name-of-corefile*
     where


1. (I don't get anything playing. I can't even get a playlist of
    the CD.)

   Do you even have the plugin loaded? 

   When you run the vlc GUI, under Settings/Preferences you should see
   a "plugins" expandable list and under that another "access" list do
   you see a expandable entry under "access" labeled "cddax"? If so,
   skip on to step 2.

   a) If no "cddax" expandable list, then the CDDAX plugin isn't
   loaded. Does a shared object exist?  The plugin shared object is
   called "libcddax_plugin.so" It should be in the directory that has
   ...vlc/access. If this isn't around you need to build and install
   the CDDAX plugin.

   b) if libcddax_plugin.so is in the filesystem, there might be a
   loader error; perhaps libcdio is not installed or
   are the wrong version. Use ldd on the file to see that it has all
   of the libraries dependencies satisfied. Also you might be able
   check if there was an attempt to load it by tracking system
   calls. On Linux and other OS's) "strace" can be used to see if the
   file gets accessed. On Solaris use "truss". 

   For example on Linux, among the many line of output when I run
   "strace -e trace=file vlc" I see this along with a lot of other
   output:

   ...
   stat64("/usr/local/lib/vlc/access/libcddax_plugin.so", {st_mode=S_IFREG|0755, st_size=238921, ...}) = 0
   open("/usr/local/lib/vlc/access/libcddax_plugin.so", O_RDONLY) = 5

   The parameters inside the calls may be different depending on where
   vlc is installed and what release is installed. If the the file is
   found and "opened", 
  
   There may also be a message may under "setup/logs".

2. (There plugin was loaded and preferences found.)  In the "cddax" tab
   of preference. An important selection is "cddax-device."  If this is
   set to the empty string, CDDAX will try to scan your drives for a
   suitable device if the driver has the capability to scan for
   drives. However you can set the device to something of your
   choosing. On GNU/Linux, this may be "/dev/cdrom" and on Solaris it
   may be "/vol/dev/aliases/cdrom0".  If you set this field, make sure
   these are correct for your particular setup. For example, I
   generally play out of the DVD device and this is called /dev/dvd
   rather than /dev/cdrom.

3. (CD-DA Setup devices seems correct and there is a CD in the
   drive.)  Bring up the playlist. If you specified only a drive and
   no track, you should see in the playlist a list of tracks on the CD.
   
   a. If not something's wrong like step 2. Another tack may be to try
   to read a disk image of a CD and thus eliminate any problems with
   hardware. If this works, then this is a hardware problem. 

4. (You have a list of entries describing the CD-DA or disk-file of
   a CD-DA image.)

   There should be at least one "track" listed for the CD-DA and track
   1 will end with the digit 1.  If there are NO tracks listed then
   there may be a problem with the that particular medium. So as in
   step 3 you can try a known good sample and perhaps burn a CD from
   that. 

5. <<Fill in info about CDDB hacking>>

-----------------------------------------------------------------
Debugging
-----------------------------------------------------------------

**General vlc debugging...

Before delving to things specific to this plugin, some preparation may
be in order. You'll probably want to configure vlc with "--enable-debug".
plugin with debug information. Instead of "make'ing" with "make", use
"make debug" and instead of installing using "make install" use "make
install-debug". 

I use gdb to debug. Debugging vlc with the entire suite of plugins
under gdb is slow because it has to read in symbol tables from all the
plugins. There are two ways to make loading faster when debugging. The
simplest is just to go to the plugin directory and remove unused
plugins. Another approach is create a new directory and make
(symbolic) links into the complete plugin directory. Another way to
speed up gdb loading is to attach the debugger after vlc has started up
via a command like:

  gdb -p *pid-of-vlc-process*

**cddax debugging...

It's a fact of life that this plugin may be in an incomplete state
and/or will have bugs. So to facilitate tracking down problems we let
you see what's going on dynamically. Various debugging settings will
cause output to appear on vlc's plugin log and/or "standard error"
(assuming you've run vlc in a way that you can capture this).

You think of debug switches as a bit mask, that you specify as an
integers the various "bit" values (given in decimal) are listed below.

   name    value  description
---------- -----  -----------
   META        1  Meta information
   EVENT       2  Trace keyboard events
   MRL         4  MRL debugging
   EXT         8  Calls from external routines
   CALL       16  all calls
   LSN        32  LSN changes
   SEEK       64  Seeks to set location
   CDIO      128  Debugging from CDIO library routines
   CDDB      256  debugging from CDDB library routines

**CD debugging...

The tool cd-info from libcdio can be used to show the contents and
analyze the contents of a CD.

The tool cd-read from libcdio can be used to show the sectors of 
the CD or CD image or extract sectors. 

$Id$
