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