00001 #include <errno.h>
00002 #include <sys/ioctl.h>
00003 #include <sys/cdio.h>
00004
00005 #include "mythcdrom.h"
00006 #include "mythcdrom-freebsd.h"
00007 #include "mythlogging.h"
00008
00009
00010 #define ASSUME_WANT_AUDIO 1
00011
00012 class MythCDROMFreeBSD: public MythCDROM
00013 {
00014 public:
00015 MythCDROMFreeBSD(QObject* par, const char* DevicePath, bool SuperMount,
00016 bool AllowEject):
00017 MythCDROM(par, DevicePath, SuperMount, AllowEject) {
00018 }
00019
00020 virtual MythMediaError testMedia(void);
00021 virtual MythMediaError eject(bool open_close = true);
00022 virtual MythMediaError lock(void);
00023 virtual MythMediaError unlock(void);
00024 };
00025
00026 MythCDROM *GetMythCDROMFreeBSD(QObject* par, const char* devicePath,
00027 bool SuperMount, bool AllowEject)
00028 {
00029 return new MythCDROMFreeBSD(par, devicePath, SuperMount, AllowEject);
00030 }
00031
00032 MythMediaError MythCDROMFreeBSD::eject(bool open_close)
00033 {
00034 if (!isDeviceOpen())
00035 openDevice();
00036
00037 if (open_close)
00038 return (ioctl(m_DeviceHandle, CDIOCEJECT) == 0) ? MEDIAERR_OK :
00039 MEDIAERR_FAILED;
00040 else
00041 return MEDIAERR_UNSUPPORTED;
00042 }
00043
00044
00045 MythMediaError MythCDROMFreeBSD::testMedia()
00046 {
00047 bool OpenedHere = false;
00048 if (!isDeviceOpen())
00049 {
00050 if (!openDevice())
00051 {
00052 if (errno == EBUSY)
00053 {
00054 return isMounted() ? MEDIAERR_OK : MEDIAERR_FAILED;
00055 }
00056 else
00057 {
00058 return MEDIAERR_FAILED;
00059 }
00060 }
00061 OpenedHere = true;
00062 }
00063
00064
00065 if (OpenedHere)
00066 closeDevice();
00067
00068 return MEDIAERR_OK;
00069 }
00070
00071 MythMediaError MythCDROMFreeBSD::lock()
00072 {
00073 MythMediaError ret = MythMediaDevice::lock();
00074 if (ret == MEDIAERR_OK)
00075 ioctl(m_DeviceHandle, CDIOCPREVENT);
00076
00077 return ret;
00078 }
00079
00080 MythMediaError MythCDROMFreeBSD::unlock()
00081 {
00082 if (isDeviceOpen() || openDevice())
00083 {
00084 #if 0
00085 LOG(VB_GENERAL, LOG_DEBUG, "Unlocking CDROM door");
00086 #endif
00087 ioctl(m_DeviceHandle, CDIOCALLOW);
00088 }
00089 else
00090 {
00091 LOG(VB_GENERAL, LOG_INFO, "Failed to open device, CDROM try will "
00092 "remain locked.");
00093 }
00094
00095 return MythMediaDevice::unlock();
00096 }