Listing 2. Drive.java


package Jcd;                                //   1
/**                                              3
  Jcd - Java CD Audio Player                     4
  Michael Hamilton (michael@actrix.gen.nz).      5
  All rights reserved.  See the README for details 
 */                                         //   7
class Drive {                               //  11
  public static final int FRAMES_PER_SECOND = 75;  
      // Lead out is always track 0xAA      //  15
      // regardless of the actual number of //  16
      // tracks.                            //  17
  public static final int LEAD_OUT = 0xAA;  //  18
      // Status values returned by the      //  20
      // status() method. Currently these   //  21
      // correspond to those values defined //  22
      // in <linux/cdrom.h>.  Must match    //  23
      // with those in DriveLib.c           //  24
  public static final int STATUS_INVALID   = 0x00;
  public static final int STATUS_PLAY      = 0x11;
  public static final int STATUS_PAUSED    = 0x12;
  public static final int STATUS_COMPLETED = 0x13;
  public static final int STATUS_ERROR     = 0x14;
  public static final int STATUS_NOSTATUS  = 0x15;
      // Device flag values - bit string.   //  32
  public static final int FLAG_NONE      = 0x00;
      // Needs stop() before play()         //  34
  public static final int FLAG_STOP_PLAY = 0x01; 
      // For now I'll keep the following private.
      // Would expand this to include more  //  37
      // status info if we ever want to support
      // multiple CD drives in the same PC. //  39
  String device_name  = "/dev/cdrom";       //  41
  int    device_flags = FLAG_NONE;          //  42
  int fd = -1; // File descriptor.          //  44
  int audio_status = Drive.STATUS_INVALID;  //  46
  int number_of_tracks = 0;                 //  48
  int current_track = 0;                    //  49
  int current_index = 0;                    //  50
  int current_address = 0; // number of frames
  public Drive()                            //  53
  {                                         //  54
    this("/dev/cdrom", "Jcd_Drive.so", 0);  //  55
  }                                         //  56
  public Drive(String dev,String module,int flags)
  {                                         //  59
    System.load(module);                    //  60
    device_name = dev;                      //  61
    device_flags = flags;                   //  62
    try {                                   //  63
        // Force an attempt to obtain the device.  
      initDrive();                          //  64
    }                                       //  65
    catch (DriveException de) {             //  66
    }                                       //  67
  }                                         //  68
  native void initDrive() throws DriveException;
      // Origin 1.                          //  72
  public native synchronized int currentTrack()   
    throws DriveException;
      // Must call currentTrack() before calling
      // currentIndex().                    //  76
  public native synchronized int currentIndex()  
    throws DriveException; 
  public native synchronized int numberOfTracks()
    throws DriveException;
      // Addresses can vary for the same CD //  81
      // produced in different countries.   //  82
      // Expressed in frame units - 75      //  83
      // frames per second.                 //  84
  public native synchronized int currentAddress()  
    throws DriveException;
  public native synchronized int cdEndAddress()     
    throws DriveException;
  public native synchronized int            //  87
    trackAddress(int n)
      throws DriveException;
  public native synchronized int            //  88
    trackLength(int n)
      throws DriveException;
  public int trackAddress() throws DriveException
  {                                         //  91
    return trackAddress(currentTrack());    //  92
  }                                         //  93
                                            //  94
  public int trackEndAddress(int n) 
    throws DriveException
  {                                         //  96
    return n >= numberOfTracks() ?          //  97
      cdEndAddress() : trackAddress(n + 1) - 1;
  }                                         //  98
  public int trackEndAddress() 
    throws DriveException                   // 100
  {                                         // 101
    return trackEndAddress(currentTrack()); // 102
  }                                         // 103
  public int trackLength() throws DriveException
  {                                         // 106
    return trackLength(currentTrack());     // 107
  }                                         // 108
      // xjcd cddb address -                // 110
      // see https://sunsite.unc.edu~/cddb/xjcd/
  public native synchronized String cddbID() 
    throws DriveException;                  // 112
      // CD's product code (might be different
      // for the same CD produced in different
      // countries?                         // 116
  public native synchronized String productCode()
    throws DriveException;
      // One of the values defined above.   // 119
      // Active query of drive.  May result // 120
      // in drive closing.                  // 121
  public native synchronized int status()
    throws DriveException;                  // 122
      // Play from start to end inclusive.  // 124
  public native synchronized void 
  play(int startTrack,                      // 125
       int startIndex,                      // 126
       int endTrack,                        // 127
       int endIndex) throws DriveException; // 128
  public native synchronized void stop()  
    throws DriveException;                  // 130
  public native synchronized void pause()
    throws DriveException;                  // 131
  public native synchronized void resume()
    throws DriveException;                  // 132
  public native synchronized void eject()
    throws DriveException;                  // 133
  public native synchronized void 
  setVolume(int volume) throws DriveException;
  public native synchronized int volume() 
    throws DriveException;                  // 137
  public void play(int n) throws DriveException
  {  // Play from n to the end.             // 140
    play(n, 1, numberOfTracks(), 0);        // 141
  }                                         // 142
  public void play(int n, int i) 
    throws DriveException                   // 144
  {  // Play from n,i to the end.           // 145
    play(n, i, numberOfTracks(), 0);        // 146
  }                                         // 147
  public void single(int n) throws DriveException
  {  // Play a single track                 // 150
    play(n, 1, n, 0);                       // 151
  }                                         // 152
}                                           // 154
class DriveException extends Exception {    // 157
  DriveException() { super(); }             // 158
  DriveException(String s) { super(s); }    // 159
}                                           // 160
class TrackAddressException extends DriveException 
{                                           // 162
  TrackAddressException() { super(); }      // 163
  TrackAddressException(String s) { super(s); }
}                                           // 165
class PlayException extends DriveException {
  PlayException() { super(); }              // 168
  PlayException(String s) { super(s); }     // 169
}                                           // 170
class StopException extends DriveException {
  StopException() { super(); }              // 173
  StopException(String s) { super(s); }     // 174
}                                           // 175
class PauseException extends DriveException {
  PauseException() { super(); }             // 178
  PauseException(String s) { super(s); }    // 179
}                                           // 180
class ResumeException extends DriveException {
  ResumeException() { super(); }            // 183
  ResumeException(String s) { super(s); }   // 184
}                                           // 185
class EjectException extends DriveException {
  EjectException() { super(); }             // 188
  EjectException(String s) { super(s); }    // 189
}                                           // 190
class VolumeException extends DriveException { 
  VolumeException() { super(); }            // 193
  VolumeException(String s) { super(s); }   // 194
}                                           // 195
class SetVolumeException extends DriveException {
  SetVolumeException() { super(); }         // 198
  SetVolumeException(String s) { super(s);} // 199
}                                           // 200
class ProductCodeException extends DriveException 
{                                           // 202
  ProductCodeException() { super(); }       // 203
  ProductCodeException(String s) { super(s); }
}                                           // 205