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();
}
}