Source Code (Use browser search to find items of interest.)

Class Index

kautorun'CDROM (./kdemultimedia/kautorun/cdrom.h:33)

class CDROM : public QObject
{
  Q_OBJECT

public:

  CDROM(const QString devfile = "/dev/cdrom");
  ~CDROM();

  DriveState driveState() { return _state; };
  void play();


protected slots:

  void checkDrive();


signals:

  void discChanged(DriveState state);
  void discRemoved();


private:

  bool doOpen();
  void doClose();

  int _device;
  DriveState _state, _oldState;
  QTimer     *_timer;
  QString    _devFile;

};


kautorun'CDROM::CDROM() (./kdemultimedia/kautorun/cdrom.cpp:38)

CDROM::CDROM(const QString devfile)
  : _state(Unknown), _oldState(Unknown), _timer(0), _devFile(devfile)
{
  // initially check the drive
  checkDrive();

  // start the timer
  _timer = new QTimer(this);
  connect(_timer, SIGNAL(timeout()), this, SLOT(checkDrive()));
  _timer->start(1000);
}



kautorun'CDROM::~CDROM() (./kdemultimedia/kautorun/cdrom.cpp:51)

CDROM::~CDROM()
{
  delete _timer;
}



kautorun'CDROM::doOpen() (./kdemultimedia/kautorun/cdrom.cpp:57)

bool CDROM::doOpen()
{
  doClose();
    
  _device = ::open(_devFile.data(), O_RDONLY | O_NONBLOCK);
  return _device >= 0;

}



kautorun'CDROM::doClose() (./kdemultimedia/kautorun/cdrom.cpp:67)

void CDROM::doClose()
{
  if (_device >= 0)
    ::close(_device);
  _device = -1;
}



kautorun'CDROM::checkDrive() (./kdemultimedia/kautorun/cdrom.cpp:75)

void CDROM::checkDrive()
{
  if (!doOpen())
    {
      _state = Unknown;
    }
  else
    {
      // get the drive state
      int state = ioctl(_device, CDROM_DRIVE_STATUS, CDSL_CURRENT);
      if (state != CDS_DISC_OK)
      {
	_state = Empty;
      }
      else
      {
	// get disc state
        state = ioctl(_device, CDROM_DISC_STATUS);
      
        // evaluate the state
        switch (state)
	  {
  	  case CDS_NO_DISC:
  	  case CDS_TRAY_OPEN:
	    _state = Empty;
	    break;
	  case CDS_AUDIO:
	    _state = AudioCD;
	    break;
	  case CDS_DATA_1:
	  case CDS_DATA_2:
	  case CDS_XA_2_1:
	  case CDS_XA_2_2:
	    _state = DataCD;
	    break;
	  case CDS_MIXED:
	    _state = MixedCD;
	    break;
	  default: 
	    _state = Unknown;	 
	  }
      }
    }

  // decide what to do
  if (_state != _oldState)
    {
      // NOTE: this must be done right here. Otherwise, a slot
      // attached to discChanged might take longer than our
      // timeout to complete, and we would emit the signal
      // over and over again.
      _oldState = _state;

      if (_state == AudioCD || _state == DataCD || _state == MixedCD)
	emit discChanged(_state);
      if (_state == Unknown || _state == Empty)
	emit discRemoved();
    }

#if 0
  // debug output
  switch (_state)
    {
    case Unknown: cout << "Unknown" << endl; break;
    case Empty: cout << "Empty" << endl; break;
    case AudioCD: cout << "AudioCD" << endl; break;
    case DataCD: cout << "DataCD" << endl; break;
    case MixedCD: cout << "MixedCD" << endl; break;
    }
#endif 

  doClose();
}



kautorun'CDROM::play() (./kdemultimedia/kautorun/cdrom.cpp:150)

void CDROM::play()
{
  if (_state == DataCD)
    return;

  if (doOpen())
    {
      struct cdrom_tochdr toc;
      struct cdrom_ti tracks;
  
      if (ioctl(_device, CDROMREADTOCHDR, &toc) != -1)
	{
	  int first = toc.cdth_trk0;
	  int last = toc.cdth_trk1;
          struct cdrom_tocentry	entry,first_te,last_te;
	  struct cdrom_msf msf;

	  entry.cdte_format = CDROM_MSF;
	  if (_state == MixedCD)
	    {
	      // check where the audio tracks start
	      for (int track=first; track <= last; track++)
		{		  		  
		  entry.cdte_track = track;
		  if (ioctl(_device, CDROMREADTOCENTRY, &entry) != -1)
		    if (!(entry.cdte_ctrl & CDROM_DATA_TRACK))
		      {
			first = track;
			break;
		      }
		}
	    }

	  tracks.cdti_trk0 = first;
	  tracks.cdti_trk1 = last;
	  tracks.cdti_ind0 = 0;
	  tracks.cdti_ind1 = 0;                                                  
	  if (-1!=ioctl(_device, CDROMPLAYTRKIND, &tracks))
		goto closeit;

	  first_te.cdte_format = CDROM_MSF;
	  first_te.cdte_track = first;
	  if (ioctl(_device, CDROMREADTOCENTRY, &first_te)==-1)
		goto closeit;
	  last_te.cdte_format = CDROM_MSF;
	  last_te.cdte_track = last;
	  if (ioctl(_device, CDROMREADTOCENTRY, &last_te)==-1)
		goto closeit;

	  msf.cdmsf_min0	= first_te.cdte_addr.msf.minute;
	  msf.cdmsf_sec0	= first_te.cdte_addr.msf.second;
	  msf.cdmsf_frame0	= first_te.cdte_addr.msf.frame;
	  msf.cdmsf_min1	= last_te.cdte_addr.msf.minute;
	  msf.cdmsf_sec1	= last_te.cdte_addr.msf.second;
	  msf.cdmsf_frame1	= last_te.cdte_addr.msf.frame;

	  if (-1==ioctl(_device, CDROMPLAYMSF, &msf))
		  goto closeit;
	}

closeit:
      doClose();
    }
}