aboutsummaryrefslogtreecommitdiff
path: root/plugins/dfcdrom
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/dfcdrom')
-rw-r--r--plugins/dfcdrom/cdr-libcdio.c257
-rw-r--r--plugins/dfcdrom/cdr-linux.c407
-rw-r--r--plugins/dfcdrom/cdr-null.c72
-rw-r--r--plugins/dfcdrom/cdr.c515
-rw-r--r--plugins/dfcdrom/cdr.h215
-rw-r--r--plugins/dfcdrom/cdrcfg-0.1df/main.c290
-rw-r--r--plugins/dfcdrom/cfg.c99
-rw-r--r--plugins/dfcdrom/util.c95
8 files changed, 0 insertions, 1950 deletions
diff --git a/plugins/dfcdrom/cdr-libcdio.c b/plugins/dfcdrom/cdr-libcdio.c
deleted file mode 100644
index 738d203..0000000
--- a/plugins/dfcdrom/cdr-libcdio.c
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
- * All Rights Reserved.
- *
- * Based on: Cdrom for Psemu Pro like Emulators
- * By: linuzappz <linuzappz@hotmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses>.
- */
-
-#ifdef USE_LIBCDIO
-
-#include <cdio/cdio.h>
-#include <cdio/mmc.h>
-
-#include "cdr.h"
-
-static CdIo_t *cdHandle = NULL;
-
-static void SetSpeed(int speed) {
- speed *= 176;
- if (speed == 0) speed = 0xFFFF;
-
- cdio_set_speed(cdHandle, speed);
-}
-
-static void SetSpinDown(unsigned char spindown) {
- mmc_cdb_t cdb;
- char buf[16];
-
- memset(&cdb, 0, sizeof(cdb));
-
- cdb.field[0] = 0x5A;
- cdb.field[2] = 0x0D;
- cdb.field[8] = sizeof(buf);
-
- if (mmc_run_cmd(cdHandle, 10000, &cdb, SCSI_MMC_DATA_READ, sizeof(buf), buf) != DRIVER_OP_SUCCESS)
- return;
-
- buf[11] = (buf[11] & 0xF0) | (spindown & 0x0F);
-
- memset(&cdb, 0, sizeof(cdb));
- memset(buf, 0, 2);
-
- cdb.field[0] = 0x55;
- cdb.field[1] = 0x10;
- cdb.field[8] = sizeof(buf);
-
- mmc_run_cmd(cdHandle, 10000, &cdb, SCSI_MMC_DATA_WRITE, sizeof(buf), buf);
-}
-
-static void UnlockDoor() {
- mmc_cdb_t cdb;
-
- memset(&cdb, 0, sizeof(cdb));
-
- cdb.field[0] = 0x1E;
- cdb.field[4] = 0;
-
- mmc_run_cmd(cdHandle, 10000, &cdb, SCSI_MMC_DATA_WRITE, 0, NULL);
-}
-
-int OpenCdHandle(const char *dev) {
- if (dev == NULL || dev[0] == '\0') {
- if ((dev = cdio_get_default_device(NULL)) == NULL) {
- return -1;
- }
- }
-
-#ifdef __FreeBSD__
- cdHandle = cdio_open_am_cd(dev, "CAM");
-#else
- cdHandle = cdio_open_cd(dev);
-#endif
-
- if (cdHandle != NULL) {
- SetSpeed(CdrSpeed);
- SetSpinDown(SpinDown);
- UnlockDoor();
-
- return 0;
- }
-
- return -1;
-}
-
-void CloseCdHandle() {
- if (cdHandle != NULL) {
- cdio_set_speed(cdHandle, 0xFFFF);
- SetSpinDown(SPINDOWN_VENDOR_SPECIFIC);
-
- cdio_destroy(cdHandle);
- }
-
- cdHandle = NULL;
-}
-
-int IsCdHandleOpen() {
- return (cdHandle != NULL);
-}
-
-long GetTN(unsigned char *buffer) {
- buffer[0] = cdio_get_first_track_num(cdHandle);
- buffer[1] = cdio_get_last_track_num(cdHandle);
-
- return 0;
-}
-
-long GetTD(unsigned char track, unsigned char *buffer) {
- msf_t msf;
-
- if (track == 0) track = CDIO_CDROM_LEADOUT_TRACK;
-
- if (!cdio_get_track_msf(cdHandle, track, &msf)) {
- memset(buffer + 1, 0, 3);
- return 0;
- }
-
- buffer[0] = btoi(msf.f);
- buffer[1] = btoi(msf.s);
- buffer[2] = btoi(msf.m);
-
- return 0;
-}
-
-long GetTE(unsigned char track, unsigned char *m, unsigned char *s, unsigned char *f) {
- unsigned char msf[3];
-
- lba_to_msf(cdio_get_track_lba(cdHandle, track + 1) - CD_MSF_OFFSET, msf);
-
- *m = msf[0];
- *s = msf[1];
- *f = msf[2];
-
- return 0;
-}
-
-long ReadSector(crdata *cr) {
- int lba;
- MMC_READ_CD cdb;
-
- lba = msf_to_lba(cr->msf.cdmsf_min0, cr->msf.cdmsf_sec0, cr->msf.cdmsf_frame0);
- memset(&cdb, 0, sizeof(cdb));
-
- cdb.Code = 0xBE;
- cdb.IncludeEDC = 1;
- cdb.IncludeUserData = 1;
- cdb.HeaderCode = 3;
- cdb.IncludeSyncData = 1;
- cdb.SubChannelSelection = 0;
- cdb.StartingLBA[1] = lba >> 16;
- cdb.StartingLBA[2] = lba >> 8;
- cdb.StartingLBA[3] = lba;
- cdb.TransferBlocks[2] = 1;
-
- if (mmc_run_cmd(cdHandle, 10000, (mmc_cdb_t *)&cdb, SCSI_MMC_DATA_READ, sizeof(*cr), cr) != DRIVER_OP_SUCCESS)
- return -1;
-
- return 0;
-}
-
-long PlayCDDA(unsigned char *sector) {
- msf_t start, end;
-
- if (!cdio_get_track_msf(cdHandle, CDIO_CDROM_LEADOUT_TRACK, &end))
- return -1;
-
- start.m = itob(sector[0]);
- start.s = itob(sector[1]);
- start.f = itob(sector[2]);
-
- if (cdio_audio_play_msf(cdHandle, &start, &end) != DRIVER_OP_SUCCESS)
- return -1;
-
- return 0;
-}
-
-long StopCDDA() {
- cdio_subchannel_t subchnl;
-
- if (cdio_audio_read_subchannel(cdHandle, &subchnl) != DRIVER_OP_SUCCESS)
- return -1;
-
- switch (subchnl.audio_status) {
- case CDIO_MMC_READ_SUB_ST_PLAY:
- case CDIO_MMC_READ_SUB_ST_PAUSED:
- cdio_audio_stop(cdHandle);
- }
-
- return 0;
-}
-
-long GetStatus(int playing, struct CdrStat *stat) {
- cdio_subchannel_t subchnl;
-
- memset(stat, 0, sizeof(struct CdrStat));
-
- if (playing) {
- if (cdio_audio_read_subchannel(cdHandle, &subchnl) == DRIVER_OP_SUCCESS) {
- stat->Time[0] = btoi(subchnl.abs_addr.m);
- stat->Time[1] = btoi(subchnl.abs_addr.s);
- stat->Time[2] = btoi(subchnl.abs_addr.f);
- }
- }
-
- stat->Type = 0x01;
-
- if (mmc_get_tray_status(cdHandle)) {
- stat->Type = 0xff;
- stat->Status |= 0x10;
- } else {
- SetSpeed(CdrSpeed);
- SetSpinDown(SpinDown);
- UnlockDoor();
- }
-
- return 0;
-}
-
-unsigned char *ReadSub(const unsigned char *time) {
- int lba = msf_to_lba(btoi(time[0]), btoi(time[1]), btoi(time[2]));
- static unsigned char buf[CD_FRAMESIZE_RAW + 96];
-
- MMC_READ_CD cdb;
-
- memset(&cdb, 0, sizeof(cdb));
-
- cdb.Code = 0xBE;
- cdb.IncludeEDC = 1;
- cdb.IncludeUserData = 1;
- cdb.HeaderCode = 3;
- cdb.IncludeSyncData = 1;
- cdb.StartingLBA[1] = lba >> 16;
- cdb.StartingLBA[2] = lba >> 8;
- cdb.StartingLBA[3] = lba;
- cdb.TransferBlocks[2] = 1;
- cdb.SubChannelSelection = 1;
-
- if (mmc_run_cmd(cdHandle, 10000, (mmc_cdb_t *)&cdb, SCSI_MMC_DATA_READ, sizeof(buf), buf) != DRIVER_OP_SUCCESS)
- return NULL;
-
- DecodeRawSubData(buf + CD_FRAMESIZE_RAW);
- return buf + CD_FRAMESIZE_RAW;
-}
-
-#endif
diff --git a/plugins/dfcdrom/cdr-linux.c b/plugins/dfcdrom/cdr-linux.c
deleted file mode 100644
index a814962..0000000
--- a/plugins/dfcdrom/cdr-linux.c
+++ /dev/null
@@ -1,407 +0,0 @@
-/*
- * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
- * All Rights Reserved.
- *
- * Based on: Cdrom for Psemu Pro like Emulators
- * By: linuzappz <linuzappz@hotmail.com>
- *
- * Portions based on: cdrdao - write audio CD-Rs in disc-at-once mode
- * Copyright (C) 2007 Denis Leroy <denis@poolshark.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses>.
- */
-
-#if defined (__linux__) && !defined (USE_LIBCDIO)
-
-#include "cdr.h"
-
-static int cdHandle = -1;
-static int ReadMMC = 0, SubQMMC = 0;
-
-static int SendMMCCmd(const unsigned char *cmd, int cmdLen, const unsigned char *dataOut,
- int dataOutLen, unsigned char *dataIn, int dataInLen)
-{
- sg_io_hdr_t io_hdr;
-
- memset(&io_hdr, 0, sizeof(io_hdr));
-
- io_hdr.interface_id = 'S';
- io_hdr.cmd_len = cmdLen;
- io_hdr.cmdp = (unsigned char *)cmd;
- io_hdr.timeout = 10000;
- io_hdr.sbp = NULL;
- io_hdr.mx_sb_len = 0;
- io_hdr.flags = 1;
-
- if (dataOut != NULL) {
- io_hdr.dxferp = (void *)dataOut;
- io_hdr.dxfer_len = dataOutLen;
- io_hdr.dxfer_direction = SG_DXFER_TO_DEV;
- } else if (dataIn != NULL) {
- io_hdr.dxferp = (void *)dataIn;
- io_hdr.dxfer_len = dataInLen;
- io_hdr.dxfer_direction = SG_DXFER_FROM_DEV;
- }
-
- if (ioctl(cdHandle, SG_IO, &io_hdr) < 0) {
- return -1;
- }
-
- return io_hdr.status;
-}
-
-static int CheckReadMMC() {
- MMC_READ_CD cdb;
- unsigned char buf[CD_FRAMESIZE_RAW];
-
- memset(&cdb, 0, sizeof(cdb));
- memset(buf, 0xAA, sizeof(buf));
-
- cdb.Code = GPCMD_READ_CD;
- cdb.IncludeEDC = 0;
- cdb.IncludeUserData = 1;
- cdb.HeaderCode = 3;
- cdb.IncludeSyncData = 1;
- cdb.TransferBlocks[2] = 1;
-
- if (SendMMCCmd((unsigned char *)&cdb, sizeof(cdb), NULL, 0, buf, sizeof(buf)) == 0) {
- if (buf[0] != 0xAA) {
- PRINTF("Using MMC for data\n");
- return 1; // supported
- }
- }
-
- return 0; // NOT supported
-}
-
-static int CheckSubQMMC() {
- MMC_READ_CD cdb;
- unsigned char buf[CD_FRAMESIZE_RAW + 96];
-
- memset(&cdb, 0, sizeof(cdb));
- memset(buf, 0xAA, sizeof(buf));
-
- cdb.Code = GPCMD_READ_CD;
- cdb.IncludeEDC = 1;
- cdb.IncludeUserData = 1;
- cdb.HeaderCode = 3;
- cdb.IncludeSyncData = 1;
- cdb.SubChannelSelection = 1;
- cdb.TransferBlocks[2] = 1;
-
- if (SendMMCCmd((unsigned char *)&cdb, sizeof(cdb), NULL, 0, buf, sizeof(buf)) == 0) {
- if (buf[0] != 0xAA && (buf[2352] != 0xAA || buf[2353] != 0xAA)) {
- PRINTF("Using MMC for subchannel\n");
- return 1; // supported
- }
- }
-
- return 0; // NOT supported
-}
-
-int OpenCdHandle(const char *dev) {
- char spindown;
-
- cdHandle = open(dev, O_RDONLY);
-
- if (cdHandle != -1) {
- ioctl(cdHandle, CDROM_LOCKDOOR, 0);
-
- spindown = (char)SpinDown;
- ioctl(cdHandle, CDROMSETSPINDOWN, &spindown);
-
- ioctl(cdHandle, CDROM_SELECT_SPEED, CdrSpeed);
-
- ReadMMC = CheckReadMMC();
- SubQMMC = CheckSubQMMC();
-
- return 0;
- }
-
- return -1;
-}
-
-void CloseCdHandle() {
- char spindown = SPINDOWN_VENDOR_SPECIFIC;
- ioctl(cdHandle, CDROMSETSPINDOWN, &spindown);
-
- close(cdHandle);
-
- cdHandle = -1;
-}
-
-int IsCdHandleOpen() {
- return (cdHandle != -1);
-}
-
-long GetTN(unsigned char *buffer) {
- struct cdrom_tochdr toc;
-
- if (ioctl(cdHandle, CDROMREADTOCHDR, &toc) == -1)
- return -1;
-
- buffer[0] = toc.cdth_trk0; // start track
- buffer[1] = toc.cdth_trk1; // end track
-
- return 0;
-}
-
-long GetTD(unsigned char track, unsigned char *buffer) {
- struct cdrom_tocentry entry;
-
- if (track == 0)
- track = 0xAA; // total time (leadout)
- entry.cdte_track = track;
- entry.cdte_format = CDROM_MSF;
-
- if (ioctl(cdHandle, CDROMREADTOCENTRY, &entry) == -1)
- return -1;
-
- buffer[0] = entry.cdte_addr.msf.frame;
- buffer[1] = entry.cdte_addr.msf.second;
- buffer[2] = entry.cdte_addr.msf.minute;
-
- return 0;
-}
-
-long GetTE(unsigned char track, unsigned char *m, unsigned char *s, unsigned char *f) {
- struct cdrom_tocentry entry;
- unsigned char msf[3];
-
- if (GetTN(msf) == -1) return -1;
-
- entry.cdte_track = track + 1;
- if (entry.cdte_track > msf[1]) entry.cdte_track = 0xaa;
-
- entry.cdte_format = CDROM_MSF;
-
- if (ioctl(cdHandle, CDROMREADTOCENTRY, &entry) == -1)
- return -1;
-
- lba_to_msf(msf_to_lba(entry.cdte_addr.msf.minute, entry.cdte_addr.msf.second, entry.cdte_addr.msf.frame) - CD_MSF_OFFSET, msf);
-
- *m = msf[0];
- *s = msf[1];
- *f = msf[2];
-
- return 0;
-}
-
-long ReadSector(crdata *cr) {
- if (ReadMMC) {
- MMC_READ_CD cdb;
- int lba;
-
- memset(&cdb, 0, sizeof(cdb));
-
- lba = msf_to_lba(cr->msf.cdmsf_min0, cr->msf.cdmsf_sec0, cr->msf.cdmsf_frame0);
-
- cdb.Code = GPCMD_READ_CD;
- cdb.IncludeEDC = 1;
- cdb.IncludeUserData = 1;
- cdb.HeaderCode = 3;
- cdb.IncludeSyncData = 1;
- cdb.SubChannelSelection = 0;
- cdb.StartingLBA[1] = lba >> 16;
- cdb.StartingLBA[2] = lba >> 8;
- cdb.StartingLBA[3] = lba;
- cdb.TransferBlocks[2] = 1;
-
- if (SendMMCCmd((unsigned char *)&cdb, sizeof(cdb), NULL, 0, (unsigned char *)cr, sizeof(*cr)) != 0)
- return -1;
- } else {
- if (ioctl(cdHandle, CDROMREADRAW, cr) == -1)
- return -1;
- }
-
- return 0;
-}
-
-long PlayCDDA(unsigned char *sector) {
- struct cdrom_msf addr;
- unsigned char ptmp[4];
-
- // 0 is the last track of every cdrom, so play up to there
- if (GetTD(0, ptmp) == -1)
- return -1;
-
- addr.cdmsf_min0 = sector[0];
- addr.cdmsf_sec0 = sector[1];
- addr.cdmsf_frame0 = sector[2];
- addr.cdmsf_min1 = ptmp[2];
- addr.cdmsf_sec1 = ptmp[1];
- addr.cdmsf_frame1 = ptmp[0];
-
- if (ioctl(cdHandle, CDROMPLAYMSF, &addr) == -1)
- return -1;
-
- return 0;
-}
-
-long StopCDDA() {
- struct cdrom_subchnl sc;
-
- sc.cdsc_format = CDROM_MSF;
- if (ioctl(cdHandle, CDROMSUBCHNL, &sc) == -1)
- return -1;
-
- switch (sc.cdsc_audiostatus) {
- case CDROM_AUDIO_PAUSED:
- case CDROM_AUDIO_PLAY:
- ioctl(cdHandle, CDROMSTOP);
- break;
- }
-
- return 0;
-}
-
-long GetStatus(int playing, struct CdrStat *stat) {
- struct cdrom_subchnl sc;
- int ret;
- char spindown;
-
- memset(stat, 0, sizeof(struct CdrStat));
-
- if (playing) { // return Time only if playing
- sc.cdsc_format = CDROM_MSF;
- if (ioctl(cdHandle, CDROMSUBCHNL, &sc) != -1)
- memcpy(stat->Time, &sc.cdsc_absaddr.msf, 3);
- }
-
- ret = ioctl(cdHandle, CDROM_DISC_STATUS);
- switch (ret) {
- case CDS_AUDIO:
- stat->Type = 0x02;
- break;
- case CDS_DATA_1:
- case CDS_DATA_2:
- case CDS_XA_2_1:
- case CDS_XA_2_2:
- stat->Type = 0x01;
- break;
- }
- ret = ioctl(cdHandle, CDROM_DRIVE_STATUS);
- switch (ret) {
- case CDS_NO_DISC:
- case CDS_TRAY_OPEN:
- stat->Type = 0xff;
- stat->Status |= 0x10;
- break;
- default:
- spindown = (char)SpinDown;
- ioctl(cdHandle, CDROMSETSPINDOWN, &spindown);
- ioctl(cdHandle, CDROM_SELECT_SPEED, CdrSpeed);
- ioctl(cdHandle, CDROM_LOCKDOOR, 0);
- break;
- }
-
- switch (sc.cdsc_audiostatus) {
- case CDROM_AUDIO_PLAY:
- stat->Status |= 0x80;
- break;
- }
-
- return 0;
-}
-
-static unsigned char *ReadSubMMC(const unsigned char *time) {
- static unsigned char buf[CD_FRAMESIZE_RAW + 96];
- int lba = msf_to_lba(btoi(time[0]), btoi(time[1]), btoi(time[2]));
- MMC_READ_CD cdb;
-
- memset(&cdb, 0, sizeof(cdb));
-
- cdb.Code = GPCMD_READ_CD;
- cdb.IncludeEDC = 1;
- cdb.IncludeUserData = 1;
- cdb.HeaderCode = 3;
- cdb.IncludeSyncData = 1;
- cdb.StartingLBA[1] = lba >> 16;
- cdb.StartingLBA[2] = lba >> 8;
- cdb.StartingLBA[3] = lba;
- cdb.TransferBlocks[2] = 1;
- cdb.SubChannelSelection = 1;
-
- if (SendMMCCmd((unsigned char *)&cdb, sizeof(cdb), NULL, 0, buf, sizeof(buf)) != 0)
- return NULL;
-
- DecodeRawSubData(buf + CD_FRAMESIZE_RAW);
- return buf + CD_FRAMESIZE_RAW;
-}
-
-static unsigned char *ReadSubIOCTL(const unsigned char *time) {
- static struct SubQ subq;
- struct cdrom_subchnl subchnl;
- int r;
- crdata cr;
- unsigned short crc;
-
- cr.msf.cdmsf_min0 = btoi(time[0]);
- cr.msf.cdmsf_sec0 = btoi(time[1]);
- cr.msf.cdmsf_frame0 = btoi(time[2]);
-
- if (ioctl(cdHandle, CDROMSEEK, &cr.msf) == -1) {
- // will be slower, but there's no other way to make it accurate
- if (ioctl(cdHandle, CDROMREADRAW, &cr) == -1) {
- return NULL;
- }
- }
-
- subchnl.cdsc_format = CDROM_MSF;
- r = ioctl(cdHandle, CDROMSUBCHNL, &subchnl);
-
- if (r == -1) return NULL;
-
- subq.ControlAndADR = 0x41;
- subq.TrackNumber = subchnl.cdsc_trk;
- subq.IndexNumber = subchnl.cdsc_ind;
- subq.TrackRelativeAddress[0] = itob(subchnl.cdsc_reladdr.msf.minute);
- subq.TrackRelativeAddress[1] = itob(subchnl.cdsc_reladdr.msf.second);
- subq.TrackRelativeAddress[2] = itob(subchnl.cdsc_reladdr.msf.frame);
- subq.AbsoluteAddress[0] = itob(subchnl.cdsc_absaddr.msf.minute);
- subq.AbsoluteAddress[1] = itob(subchnl.cdsc_absaddr.msf.second);
- subq.AbsoluteAddress[2] = itob(subchnl.cdsc_absaddr.msf.frame);
-
- // CRC is not supported with IOCTL, fake it.
- crc = calcCrc((unsigned char *)&subq + 12, 10);
- subq.CRC[0] = (crc >> 8);
- subq.CRC[1] = (crc & 0xFF);
-
- r = msf_to_lba(btoi(time[0]), btoi(time[1]), btoi(time[2]));
-
- if (GetTE(1, &cr.msf.cdmsf_min0, &cr.msf.cdmsf_sec0, &cr.msf.cdmsf_frame0) == -1) {
- cr.msf.cdmsf_min0 = 80;
- cr.msf.cdmsf_sec0 = 0;
- cr.msf.cdmsf_frame0 = 0;
- }
-
- if (msf_to_lba(cr.msf.cdmsf_min0, cr.msf.cdmsf_sec0, cr.msf.cdmsf_frame0) >= r &&
- (msf_to_lba(subchnl.cdsc_absaddr.msf.minute, subchnl.cdsc_absaddr.msf.second, subchnl.cdsc_absaddr.msf.frame) != r ||
- msf_to_lba(subchnl.cdsc_reladdr.msf.minute, subchnl.cdsc_reladdr.msf.second, subchnl.cdsc_reladdr.msf.frame) != r - CD_MSF_OFFSET))
- subq.CRC[1] ^= 1; // time mismatch; report wrong CRC
-
- PRINTF("subq : %x,%x : %x,%x,%x : %x,%x,%x\n",
- subchnl.cdsc_trk, subchnl.cdsc_ind,
- itob(subchnl.cdsc_reladdr.msf.minute), itob(subchnl.cdsc_reladdr.msf.second), itob(subchnl.cdsc_reladdr.msf.frame),
- itob(subchnl.cdsc_absaddr.msf.minute), itob(subchnl.cdsc_absaddr.msf.second), itob(subchnl.cdsc_absaddr.msf.frame));
-
- return (unsigned char *)&subq;
-}
-
-unsigned char *ReadSub(const unsigned char *time) {
- if (SubQMMC) return ReadSubMMC(time);
- else return ReadSubIOCTL(time);
-}
-
-#endif
diff --git a/plugins/dfcdrom/cdr-null.c b/plugins/dfcdrom/cdr-null.c
deleted file mode 100644
index c6aa396..0000000
--- a/plugins/dfcdrom/cdr-null.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
- * All Rights Reserved.
- *
- * Based on: Cdrom for Psemu Pro like Emulators
- * By: linuzappz <linuzappz@hotmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses>.
- */
-
-#include "cdr.h"
-
-#ifdef USE_NULL
-
-int OpenCdHandle(const char *dev) {
- return -1;
-}
-
-void CloseCdHandle() {
-}
-
-int IsCdHandleOpen() {
- return 0;
-}
-
-long GetTN(unsigned char *buffer) {
- buffer[0] = 0;
- buffer[1] = 0;
- return 0;
-}
-
-long GetTD(unsigned char track, unsigned char *buffer) {
- memset(buffer + 1, 0, 3);
- return 0;
-}
-
-long GetTE(unsigned char track, unsigned char *m, unsigned char *s, unsigned char *f) {
- return -1;
-}
-
-long ReadSector(crdata *cr) {
- return -1;
-}
-
-long PlayCDDA(unsigned char *sector) {
- return 0;
-}
-
-long StopCDDA() {
- return 0;
-}
-
-long GetStatus(int playing, struct CdrStat *stat) {
- return -1;
-}
-
-unsigned char *ReadSub(const unsigned char *time) {
- return NULL;
-}
-
-#endif
diff --git a/plugins/dfcdrom/cdr.c b/plugins/dfcdrom/cdr.c
deleted file mode 100644
index f011684..0000000
--- a/plugins/dfcdrom/cdr.c
+++ /dev/null
@@ -1,515 +0,0 @@
-/*
- * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
- * All Rights Reserved.
- *
- * Based on: Cdrom for Psemu Pro like Emulators
- * By: linuzappz <linuzappz@hotmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses>.
- */
-
-#include "cdr.h"
-
-#ifndef USE_NULL
-static char *LibName = N_("CD-ROM Drive Reader");
-#else
-static char *LibName = N_("CDR NULL Plugin");
-#endif
-
-int initial_time = 0;
-
-pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
-pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
-
-CacheData *cdcache;
-unsigned char *cdbuffer;
-int cacheaddr;
-
-crdata cr;
-
-unsigned char lastTime[3];
-pthread_t thread;
-int subqread;
-volatile int stopth, found, locked, playing;
-
-long (*ReadTrackT[])() = {
- ReadNormal,
- ReadThreaded,
-};
-
-unsigned char* (*GetBufferT[])() = {
- GetBNormal,
- GetBThreaded,
-};
-
-long (*fReadTrack)();
-unsigned char* (*fGetBuffer)();
-
-void *CdrThread(void *arg);
-
-long CDRinit(void) {
- thread = (pthread_t)-1;
- return 0;
-}
-
-long CDRshutdown(void) {
- return 0;
-}
-
-long CDRopen(void) {
- LoadConf();
-
-#ifndef _MACOSX
- if (IsCdHandleOpen())
- return 0; // it's already open
-#endif
-
- if (OpenCdHandle(CdromDev) == -1) { // if we can't open the cdrom we'll works as a null plugin
- fprintf(stderr, "CDR: Could not open %s\n", CdromDev);
- }
-
- fReadTrack = ReadTrackT[ReadMode];
- fGetBuffer = GetBufferT[ReadMode];
-
- if (ReadMode == THREADED) {
- cdcache = (CacheData *)malloc(CacheSize * sizeof(CacheData));
- if (cdcache == NULL) return -1;
- memset(cdcache, 0, CacheSize * sizeof(CacheData));
-
- found = 0;
- } else {
- cdbuffer = cr.buf + 12; /* skip sync data */
- }
-
- if (ReadMode == THREADED) {
- pthread_attr_t attr;
-
- pthread_mutex_init(&mut, NULL);
- pthread_cond_init(&cond, NULL);
- locked = 0;
-
- pthread_attr_init(&attr);
- pthread_create(&thread, &attr, CdrThread, NULL);
-
- cacheaddr = -1;
- } else thread = (pthread_t)-1;
-
- playing = 0;
- stopth = 0;
- initial_time = 0;
-
- return 0;
-}
-
-long CDRclose(void) {
- if (!IsCdHandleOpen()) return 0;
-
- if (playing) CDRstop();
-
- CloseCdHandle();
-
- if (thread != (pthread_t)-1) {
- if (locked == 0) {
- stopth = 1;
- while (locked == 0) usleep(5000);
- }
-
- stopth = 2;
- pthread_mutex_lock(&mut);
- pthread_cond_signal(&cond);
- pthread_mutex_unlock(&mut);
-
- pthread_join(thread, NULL);
- pthread_mutex_destroy(&mut);
- pthread_cond_destroy(&cond);
- }
-
- if (ReadMode == THREADED) {
- free(cdcache);
- }
-
- return 0;
-}
-
-// return Starting and Ending Track
-// buffer:
-// byte 0 - start track
-// byte 1 - end track
-long CDRgetTN(unsigned char *buffer) {
- long ret;
-
- if (!IsCdHandleOpen()) {
- buffer[0] = 1;
- buffer[1] = 1;
- return 0;
- }
-
- if (ReadMode == THREADED) pthread_mutex_lock(&mut);
- ret = GetTN(buffer);
- if (ReadMode == THREADED) pthread_mutex_unlock(&mut);
-
- return ret;
-}
-
-// return Track Time
-// buffer:
-// byte 0 - frame
-// byte 1 - second
-// byte 2 - minute
-long CDRgetTD(unsigned char track, unsigned char *buffer) {
- long ret;
-
- if (!IsCdHandleOpen()) {
- memset(buffer + 1, 0, 3);
- return 0;
- }
-
- if (ReadMode == THREADED) pthread_mutex_lock(&mut);
- ret = GetTD(track, buffer);
- if (ReadMode == THREADED) pthread_mutex_unlock(&mut);
-
- return ret;
-}
-
-// normal reading
-long ReadNormal() {
- if (ReadSector(&cr) == -1)
- return -1;
-
- return 0;
-}
-
-unsigned char* GetBNormal() {
- return cdbuffer;
-}
-
-// threaded reading (with cache)
-long ReadThreaded() {
- int addr = msf_to_lba(cr.msf.cdmsf_min0, cr.msf.cdmsf_sec0, cr.msf.cdmsf_frame0);
- int i;
-
- if (addr >= cacheaddr && addr < (cacheaddr + CacheSize) && cacheaddr != -1) {
- i = addr - cacheaddr;
- PRINTF("found %d\n", (addr - cacheaddr));
- cdbuffer = cdcache[i].cr.buf + 12;
- while (btoi(cdbuffer[0]) != cr.msf.cdmsf_min0 ||
- btoi(cdbuffer[1]) != cr.msf.cdmsf_sec0 ||
- btoi(cdbuffer[2]) != cr.msf.cdmsf_frame0) {
- if (locked == 1) {
- if (cdcache[i].ret == 0) break;
- return -1;
- }
- usleep(5000);
- }
- PRINTF("%x:%x:%x, %p, %p\n", cdbuffer[0], cdbuffer[1], cdbuffer[2], cdbuffer, cdcache);
- found = 1;
-
- return 0;
- } else found = 0;
-
- if (locked == 0) {
- stopth = 1;
- while (locked == 0) { usleep(5000); }
- stopth = 0;
- }
-
- // not found in cache
- locked = 0;
- pthread_mutex_lock(&mut);
- pthread_cond_signal(&cond);
- pthread_mutex_unlock(&mut);
-
- return 0;
-}
-
-unsigned char* GetBThreaded() {
- PRINTF("threadc %d\n", found);
-
- if (found == 1) return cdbuffer;
- cdbuffer = cdcache[0].cr.buf + 12;
- while (btoi(cdbuffer[0]) != cr.msf.cdmsf_min0 ||
- btoi(cdbuffer[1]) != cr.msf.cdmsf_sec0 ||
- btoi(cdbuffer[2]) != cr.msf.cdmsf_frame0) {
- if (locked == 1) return NULL;
- usleep(5000);
- }
- if (cdcache[0].ret == -1) return NULL;
-
- return cdbuffer;
-}
-
-void *CdrThread(void *arg) {
- unsigned char curTime[3];
- int i;
-
- for (;;) {
- locked = 1;
- pthread_mutex_lock(&mut);
- pthread_cond_wait(&cond, &mut);
-
- if (stopth == 2) pthread_exit(NULL);
- // refill the buffer
- cacheaddr = msf_to_lba(cr.msf.cdmsf_min0, cr.msf.cdmsf_sec0, cr.msf.cdmsf_frame0);
-
- memcpy(curTime, &cr.msf, 3);
-
- PRINTF("start thc %d:%d:%d\n", curTime[0], curTime[1], curTime[2]);
-
- for (i = 0; i < CacheSize; i++) {
- memcpy(&cdcache[i].cr.msf, curTime, 3);
- PRINTF("reading %d:%d:%d\n", curTime[0], curTime[1], curTime[2]);
- cdcache[i].ret = ReadSector(&cdcache[i].cr);
-
- PRINTF("readed %x:%x:%x\n", cdcache[i].cr.buf[12], cdcache[i].cr.buf[13], cdcache[i].cr.buf[14]);
- if (cdcache[i].ret == -1) break;
-
- curTime[2]++;
- if (curTime[2] == 75) {
- curTime[2] = 0;
- curTime[1]++;
- if (curTime[1] == 60) {
- curTime[1] = 0;
- curTime[0]++;
- }
- }
-
- if (stopth) break;
- }
-
- pthread_mutex_unlock(&mut);
- }
-
- return NULL;
-}
-
-// read track
-// time:
-// byte 0 - minute
-// byte 1 - second
-// byte 2 - frame
-// uses bcd format
-long CDRreadTrack(unsigned char *time) {
- if (!IsCdHandleOpen()) {
- memset(cr.buf, 0, DATA_SIZE);
- return 0;
- }
-
- PRINTF("CDRreadTrack %d:%d:%d\n", btoi(time[0]), btoi(time[1]), btoi(time[2]));
-
- if (UseSubQ) memcpy(lastTime, time, 3);
- subqread = 0;
-
- cr.msf.cdmsf_min0 = btoi(time[0]);
- cr.msf.cdmsf_sec0 = btoi(time[1]);
- cr.msf.cdmsf_frame0 = btoi(time[2]);
-
- return fReadTrack();
-}
-
-// return readed track
-unsigned char *CDRgetBuffer(void) {
- return fGetBuffer();
-}
-
-// plays cdda audio
-// sector:
-// byte 0 - minute
-// byte 1 - second
-// byte 2 - frame
-// does NOT uses bcd format
-long CDRplay(unsigned char *sector) {
- long ret;
-
- if (!IsCdHandleOpen())
- return 0;
-
- // If play was called with the same time as the previous call,
- // don't restart it. Of course, if play is called with a different
- // track, stop playing the current stream.
- if (playing) {
- if (msf_to_lba(sector[0], sector[1], sector[2]) == initial_time)
- return 0;
- else
- CDRstop();
- }
-
- initial_time = msf_to_lba(sector[0], sector[1], sector[2]);
-
- if (ReadMode == THREADED) pthread_mutex_lock(&mut);
- ret = PlayCDDA(sector);
- if (ReadMode == THREADED) pthread_mutex_unlock(&mut);
-
- if (ret == 0) {
- playing = 1;
- return 0;
- }
-
- return -1;
-}
-
-// stops cdda audio
-long CDRstop(void) {
- long ret;
-
- if (!IsCdHandleOpen())
- return 0;
-
- if (ReadMode == THREADED) pthread_mutex_lock(&mut);
- ret = StopCDDA();
- if (ReadMode == THREADED) pthread_mutex_unlock(&mut);
-
- if (ret == 0) {
- playing = 0;
- initial_time = 0;
-
- return 0;
- }
-
- return -1;
-}
-
-// reads cdr status
-// type:
-// 0x00 - unknown
-// 0x01 - data
-// 0x02 - audio
-// 0xff - no cdrom
-// status: (only shell open supported)
-// 0x00 - unknown
-// 0x01 - error
-// 0x04 - seek error
-// 0x10 - shell open
-// 0x20 - reading
-// 0x40 - seeking
-// 0x80 - playing
-// time:
-// byte 0 - minute
-// byte 1 - second
-// byte 2 - frame
-
-long CDRgetStatus(struct CdrStat *stat) {
- long ret;
-
- if (!IsCdHandleOpen())
- return -1;
-
- if (ReadMode == THREADED) pthread_mutex_lock(&mut);
- ret = GetStatus(playing, stat);
- if (ReadMode == THREADED) pthread_mutex_unlock(&mut);
-
- return ret;
-}
-
-unsigned char *CDRgetBufferSub(void) {
- static unsigned char *p = NULL;
-
- if (!UseSubQ) return NULL;
- if (subqread) return p;
-
- if (ReadMode == THREADED) pthread_mutex_lock(&mut);
- p = ReadSub(lastTime);
- if (ReadMode == THREADED) pthread_mutex_unlock(&mut);
-
- if (p != NULL) subqread = 1;
-
- return p;
-}
-
-// read CDDA sector into buffer
-long CDRreadCDDA(unsigned char m, unsigned char s, unsigned char f, unsigned char *buffer) {
- unsigned char msf[3] = {m, s, f};
- unsigned char *p;
-
- if (CDRreadTrack(msf) != 0) return -1;
-
- p = CDRgetBuffer();
- if (p == NULL) return -1;
-
- memcpy(buffer, p - 12, CD_FRAMESIZE_RAW); // copy from the beginning of the sector
- return 0;
-}
-
-// get Track End Time
-long CDRgetTE(unsigned char track, unsigned char *m, unsigned char *s, unsigned char *f) {
- long ret;
-
- if (!IsCdHandleOpen()) return -1;
-
- if (ReadMode == THREADED) pthread_mutex_lock(&mut);
- ret = GetTE(track, m, s, f);
- if (ReadMode == THREADED) pthread_mutex_unlock(&mut);
-
- return ret;
-}
-
-#ifndef _MACOSX
-
-void ExecCfg(char *arg) {
- char cfg[256];
- struct stat buf;
-
- strcpy(cfg, "./cfgDFCdrom");
- if (stat(cfg, &buf) != -1) {
- if (fork() == 0) {
- execl(cfg, "cfgDFCdrom", arg, NULL);
- exit(0);
- }
- return;
- }
-
- strcpy(cfg, "./cfg/DFCdrom");
- if (stat(cfg, &buf) != -1) {
- if (fork() == 0) {
- execl(cfg, "cfgDFCdrom", arg, NULL);
- exit(0);
- }
- return;
- }
-
- fprintf(stderr, "cfgDFCdrom file not found!\n");
-}
-
-long CDRconfigure() {
-#ifndef USE_NULL
- ExecCfg("configure");
-#endif
- return 0;
-}
-
-void CDRabout() {
- ExecCfg("about");
-}
-
-#endif
-
-long CDRtest(void) {
-#ifndef USE_NULL
- if (OpenCdHandle(CdromDev) == -1)
- return -1;
- CloseCdHandle();
-#endif
- return 0;
-}
-
-char *PSEgetLibName(void) {
- return _(LibName);
-}
-
-unsigned long PSEgetLibType(void) {
- return PSE_LT_CDR;
-}
-
-unsigned long PSEgetLibVersion(void) {
- return 1 << 16;
-}
diff --git a/plugins/dfcdrom/cdr.h b/plugins/dfcdrom/cdr.h
deleted file mode 100644
index 0ae2c68..0000000
--- a/plugins/dfcdrom/cdr.h
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
- * All Rights Reserved.
- *
- * Based on: Cdrom for Psemu Pro like Emulators
- * By: linuzappz <linuzappz@hotmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses>.
- */
-
-#ifndef __CDR_H__
-#define __CDR_H__
-
-//#define DEBUG 1
-
-#include "config.h"
-
-#ifdef ENABLE_NLS
-#include <libintl.h>
-#include <locale.h>
-#define _(x) gettext(x)
-#define N_(x) (x)
-#else
-#define _(x) (x)
-#define N_(x) (x)
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <pthread.h>
-#include <time.h>
-#include <string.h>
-
-#include "psemu_plugin_defs.h"
-
-#if defined (__linux__)
-
-#include <linux/cdrom.h>
-#include <scsi/scsi.h>
-#include <scsi/sg.h>
-
-#ifndef CDROMSETSPINDOWN
-#define CDROMSETSPINDOWN 0x531e
-#endif
-
-#define DEV_DEF "/dev/cdrom"
-
-#else
-
-struct cdrom_msf {
- unsigned char cdmsf_min0; /* start minute */
- unsigned char cdmsf_sec0; /* start second */
- unsigned char cdmsf_frame0; /* start frame */
- unsigned char cdmsf_min1; /* end minute */
- unsigned char cdmsf_sec1; /* end second */
- unsigned char cdmsf_frame1; /* end frame */
-};
-
-#define CD_SECS 60
-#define CD_FRAMES 75
-#define CD_MSF_OFFSET 150
-#define CD_FRAMESIZE_SUB 96
-
-#if defined (__FreeBSD__)
-#define DEV_DEF "/dev/cd0"
-#else
-#define DEV_DEF ""
-#endif
-
-#if !defined (USE_LIBCDIO) && !defined (_MACOSX)
-#define USE_NULL 1
-#endif
-
-#endif
-
-extern char CdromDev[256];
-extern long ReadMode;
-extern long UseSubQ;
-extern long CacheSize;
-extern long CdrSpeed;
-extern long SpinDown;
-
-#define NORMAL 0
-#define THREADED 1
-#define READ_MODES 2
-
-#ifndef CD_FRAMESIZE_RAW
-#define CD_FRAMESIZE_RAW 2352
-#endif
-
-#define DATA_SIZE (CD_FRAMESIZE_RAW - 12)
-
-// spindown codes
-#define SPINDOWN_VENDOR_SPECIFIC 0x00
-#define SPINDOWN_125MS 0x01
-#define SPINDOWN_250MS 0x02
-#define SPINDOWN_500MS 0x03
-#define SPINDOWN_1S 0x04
-#define SPINDOWN_2S 0x05
-#define SPINDOWN_4S 0x06
-#define SPINDOWN_8S 0x07
-#define SPINDOWN_16S 0x08
-#define SPINDOWN_32S 0x09
-#define SPINDOWN_1MIN 0x0A
-#define SPINDOWN_2MIN 0x0B
-#define SPINDOWN_4MIN 0x0C
-#define SPINDOWN_8MIN 0x0D
-#define SPINDOWN_16MIN 0x0E
-#define SPINDOWN_32MIN 0x0F
-
-typedef struct _MMC_READ_CD {
- unsigned char Code; // 0xBE
-
- unsigned char RelativeAddress : 1;
- unsigned char : 1;
- unsigned char ExpectedSectorType : 3;
- unsigned char Lun : 3;
-
- unsigned char StartingLBA[4];
- unsigned char TransferBlocks[3];
-
- unsigned char : 1;
- unsigned char ErrorFlags : 2;
- unsigned char IncludeEDC : 1;
- unsigned char IncludeUserData : 1;
- unsigned char HeaderCode : 2;
- unsigned char IncludeSyncData : 1;
-
- unsigned char SubChannelSelection : 3;
- unsigned char : 5;
-
- unsigned char Ctrl;
-} MMC_READ_CD;
-
-#define itob(i) ((i)/10*16 + (i)%10) /* u_char to BCD */
-#define btoi(b) ((b)/16*10 + (b)%16) /* BCD to u_char */
-
-struct CdrStat {
- unsigned long Type;
- unsigned long Status;
- unsigned char Time[3]; // current playing time
-};
-
-struct SubQ {
- char res0[12];
- unsigned char ControlAndADR;
- unsigned char TrackNumber;
- unsigned char IndexNumber;
- unsigned char TrackRelativeAddress[3];
- unsigned char Filler;
- unsigned char AbsoluteAddress[3];
- unsigned char CRC[2];
- char res1[72];
-};
-
-typedef union {
- struct cdrom_msf msf;
- unsigned char buf[CD_FRAMESIZE_RAW];
-} crdata;
-
-typedef struct {
- crdata cr;
- int ret;
-} CacheData;
-
-long ReadNormal();
-long ReadThreaded();
-unsigned char* GetBNormal();
-unsigned char* GetBThreaded();
-
-long CDRstop(void);
-
-void LoadConf();
-void SaveConf();
-
-#ifdef DEBUG
-#define PRINTF printf
-#else
-#define PRINTF(...) /* */
-#endif
-
-unsigned int msf_to_lba(char m, char s, char f);
-void lba_to_msf(unsigned int s, unsigned char *msf);
-void DecodeRawSubData(unsigned char *subbuffer);
-unsigned short calcCrc(unsigned char *d, int len);
-
-int OpenCdHandle();
-void CloseCdHandle();
-int IsCdHandleOpen();
-long GetTN(unsigned char *buffer);
-long GetTD(unsigned char track, unsigned char *buffer);
-long GetTE(unsigned char track, unsigned char *m, unsigned char *s, unsigned char *f);
-long ReadSector(crdata *cr);
-long PlayCDDA(unsigned char *sector);
-long StopCDDA();
-long GetStatus(int playing, struct CdrStat *stat);
-unsigned char *ReadSub(const unsigned char *time);
-
-#endif
diff --git a/plugins/dfcdrom/cdrcfg-0.1df/main.c b/plugins/dfcdrom/cdrcfg-0.1df/main.c
deleted file mode 100644
index c611120..0000000
--- a/plugins/dfcdrom/cdrcfg-0.1df/main.c
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
- * All Rights Reserved.
- *
- * Based on: Cdrom for Psemu Pro like Emulators
- * By: linuzappz <linuzappz@hotmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses>.
- */
-
-#include "../cfg.c"
-
-#include <gtk/gtk.h>
-#include <glade/glade.h>
-
-GtkWidget *MainWindow;
-
-// function to check if the device is a cdrom
-int is_cdrom(const char *device) {
- struct stat st;
- int fd = -1;
-
- // check if the file exist
- if (stat(device, &st) < 0) return 0;
-
- // check if is a block or char device
- if (!S_ISCHR(st.st_mode) && !S_ISBLK(st.st_mode)) return 0;
-
- // try to open the device file descriptor
- if ((fd = open(device, O_RDONLY | O_NONBLOCK)) < 0) return 0;
-
-#ifdef __linux__
- // I need a method to check is a device is really a CD-ROM.
- // some problems/ideas are:
- // - different protocls (ide, scsi, old proprietary...)
- // - maybe we can use major number (see linux/major.h) to do some check.
- // major number can be retrieved with (st.st_rdev>>8)
- // scsi has SCSI_CDROM_MAJOR but does this cover all scsi drives?
- // beside IDE major is the same for hard disks and cdroms...
- // and DVDs?
- // - another idea is to parse /proc, but again IDE, scsi etc have
- // different files... I've not found a way to query "which CD drives
- // are available?"
- //
- // Now I use this ioctl which works also if the drive is empty,
- // I hope that is implemented for all the drives... here works
- // fine: at least doesn't let me to select my HD as CDs ;)
-
- // try a ioctl to see if it's a CD-ROM device
- if (ioctl(fd, CDROM_GET_CAPABILITY, NULL) < 0) {
- close(fd);
- return 0;
- }
-#endif
-
- close(fd);
-
- // yes, it seems a CD drive!
- return 1;
-}
-
-// fill_drives_list: retrieves available cd drives. At the moment it use a quite
-// ugly "brute force" method: we check for the most common location for cdrom
-// in /dev and chech if they are cdrom devices.
-// If your cdrom path is not listed here you'll have to type it in the dialog
-// entry yourself (or add it here and recompile).
-// Are there any other common entry to add to the list? (especially scsi, I
-// deliberately ignored old non standard cdroms... )
-// If you come up with a better method let me know!!
-void fill_drives_list(GtkWidget *widget) {
- int i;
- GtkListStore *store;
- GtkTreeIter iter;
-
-#if defined (__linux__)
- static const char *cdrom_devices[] = {
- "/dev/cdrom",
- "/dev/cdrom0",
- "/dev/cdrom1",
- "/dev/cdrom2",
- "/dev/cdrom3",
- "/dev/cdroms/cdrom0",
- "/dev/cdroms/cdrom1",
- "/dev/cdroms/cdrom2",
- "/dev/cdroms/cdrom3",
- "/dev/hda",
- "/dev/hdb",
- "/dev/hdc",
- "/dev/hdd",
- "/dev/sda",
- "/dev/sdb",
- "/dev/sdc",
- "/dev/sdd",
- "/dev/scd0",
- "/dev/scd1",
- "/dev/scd2",
- "/dev/scd3",
- "/dev/optcd",
- ""};
-#elif defined (__FreeBSD__)
- static const char *cdrom_devices[] = {
- "/dev/cd0",
- "/dev/cd1",
- "/dev/cd2",
- "/dev/cd3",
- ""};
-#elif defined (__sun)
- char cdrom_devices[256][256];
- FILE *fp;
- char buf[256], *devname, *nick;
-
- memset(cdrom_devices, 0, sizeof(cdrom_devices));
-
- i = 0;
-
- fp = popen("eject -l", "r");
-
- if (fp != NULL) {
- while (!feof(fp) && i < 256) {
- fgets(buf, 256, fp);
-
- devname = strtok(buf, " ");
- nick = strtok(NULL, " ");
-
- if (devname == NULL || nick == NULL) continue;
-
- if (strstr(nick, "cdrom") != NULL) {
- strcpy(cdrom_devices[i++], devname);
- }
- }
-
- pclose(fp);
- }
-#else
- static const char *cdrom_devices[] = { "" };
-#endif
-
- store = gtk_list_store_new(1, G_TYPE_STRING);
-
- // first we put our current drive
- if (CdromDev[0] != '\0') {
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, CdromDev, -1);
- }
-
- i = 0;
-
- // scan cdrom_devices for real cdrom and add them to list
- while (cdrom_devices[i][0] != '\0') {
- // check that is not our current dev (already in list)
- if (strcmp(cdrom_devices[i], CdromDev) != 0) {
- // check that is a cdrom device
- if (is_cdrom(cdrom_devices[i])) {
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, 0, cdrom_devices[i], -1);
- }
- }
- ++i;
- }
-
- gtk_combo_box_set_model(GTK_COMBO_BOX(widget), GTK_TREE_MODEL(store));
- gtk_combo_box_entry_set_text_column(GTK_COMBO_BOX_ENTRY(widget), 0);
-}
-
-static void OnConfigExit(GtkWidget *widget, gpointer user_data) {
- GladeXML *xml;
-
- xml = glade_get_widget_tree(MainWindow);
-
- widget = glade_xml_get_widget(xml, "cddev_comboboxentry");
- strncpy(CdromDev, gtk_entry_get_text(GTK_ENTRY(GTK_BIN(widget)->child)), 255);
- CdromDev[255] = '\0';
-
- widget = glade_xml_get_widget(xml, "readmode_combobox");
- ReadMode = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
-
- widget = glade_xml_get_widget(xml, "subQ_button");
- UseSubQ = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-
- widget = glade_xml_get_widget(xml, "spinCacheSize");
- CacheSize = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
-
- widget = glade_xml_get_widget(xml, "spinCdrSpeed");
- CdrSpeed = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
-
- widget = glade_xml_get_widget(xml, "comboSpinDown");
- SpinDown = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
-
- SaveConf();
-
- gtk_widget_destroy(widget);
- gtk_exit(0);
-}
-
-long CDRconfigure() {
- GladeXML *xml;
- GtkWidget *widget;
-
- LoadConf();
-
- xml = glade_xml_new(DATADIR "dfcdrom.glade2", "CfgWnd", NULL);
- if (xml == NULL) {
- g_warning("We could not load the interface!");
- return -1;
- }
-
- MainWindow = glade_xml_get_widget(xml, "CfgWnd");
- gtk_window_set_title(GTK_WINDOW(MainWindow), _("CDR configuration"));
-
- widget = glade_xml_get_widget(xml, "CfgWnd");
- g_signal_connect_data(GTK_OBJECT(widget), "delete_event",
- GTK_SIGNAL_FUNC(OnConfigExit), NULL, NULL, G_CONNECT_AFTER);
-
- widget = glade_xml_get_widget(xml, "cfg_closebutton");
- g_signal_connect_data(GTK_OBJECT(widget), "clicked",
- GTK_SIGNAL_FUNC(OnConfigExit), NULL, NULL, G_CONNECT_AFTER);
-
- widget = glade_xml_get_widget(xml, "cddev_comboboxentry");
- fill_drives_list(widget);
- gtk_entry_set_text(GTK_ENTRY(GTK_BIN(widget)->child), CdromDev);
-
- widget = glade_xml_get_widget(xml, "readmode_combobox");
- gtk_combo_box_set_active(GTK_COMBO_BOX(widget), ReadMode);
-
- widget = glade_xml_get_widget(xml, "subQ_button");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), UseSubQ);
-
- widget = glade_xml_get_widget(xml, "spinCacheSize");
- gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), (float)CacheSize);
-
- widget = glade_xml_get_widget(xml, "spinCdrSpeed");
- gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), (float)CdrSpeed);
-
- widget = glade_xml_get_widget(xml, "comboSpinDown");
- gtk_combo_box_set_active(GTK_COMBO_BOX(widget), SpinDown);
-
- gtk_widget_show(MainWindow);
- gtk_main();
-
- return 0;
-}
-
-void CDRabout() {
- GtkWidget *widget;
- const char *authors[]= {"linuzappz <linuzappz@hotmail.com>",
- "xobro <_xobro_@tin.it>",
- "Wei Mingzhi <whistler_wmz@users.sf.net>", NULL};
-
- widget = gtk_about_dialog_new();
- gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(widget), "CD-ROM Device Reader");
- gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(widget), "1.0");
- gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(widget), authors);
- gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(widget), "http://pcsxr.codeplex.com/");
-
- gtk_dialog_run(GTK_DIALOG(widget));
- gtk_widget_destroy(widget);
-}
-
-int main(int argc, char *argv[]) {
-#ifdef ENABLE_NLS
- setlocale(LC_ALL, "");
- bindtextdomain(GETTEXT_PACKAGE, LOCALE_DIR);
- bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
- textdomain(GETTEXT_PACKAGE);
-#endif
-
- gtk_set_locale();
- gtk_init(&argc, &argv);
-
- if (argc != 2) return 0;
-
- if (strcmp(argv[1], "configure") == 0) {
- CDRconfigure();
- } else {
- CDRabout();
- }
-
- return 0;
-}
diff --git a/plugins/dfcdrom/cfg.c b/plugins/dfcdrom/cfg.c
deleted file mode 100644
index 2bbc844..0000000
--- a/plugins/dfcdrom/cfg.c
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
- * All Rights Reserved.
- *
- * Based on: Cdrom for Psemu Pro like Emulators
- * By: linuzappz <linuzappz@hotmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses>.
- */
-
-#include "cdr.h"
-
-char CdromDev[256];
-long ReadMode;
-long UseSubQ;
-long CacheSize;
-long CdrSpeed;
-long SpinDown;
-
-void LoadConf() {
- FILE *f;
-
-#if defined (__sun)
- char buf[256], *devname, *nick;
-
- CdromDev[0] = '\0';
- f = popen("eject -l", "r");
-
- if (f != NULL) {
- while (!feof(f)) {
- fgets(buf, 256, f);
-
- devname = strtok(buf, " ");
- nick = strtok(NULL, " ");
-
- if (devname == NULL || nick == NULL) continue;
-
- if (strstr(nick, "cdrom") != NULL) {
- strcpy(CdromDev, devname);
- break;
- }
- }
-
- pclose(f);
- }
-#else
- strcpy(CdromDev, DEV_DEF);
-#endif
-
- ReadMode = THREADED;
- UseSubQ = 0;
- CacheSize = 64;
- CdrSpeed = 0;
- SpinDown = SPINDOWN_VENDOR_SPECIFIC;
-
- f = fopen("dfcdrom.cfg", "r");
- if (f == NULL) return;
-
- fscanf(f, "CdromDev = %s\n", CdromDev);
- fscanf(f, "ReadMode = %ld\n", &ReadMode);
- fscanf(f, "UseSubQ = %ld\n", &UseSubQ);
- fscanf(f, "CacheSize = %ld\n", &CacheSize);
- fscanf(f, "CdrSpeed = %ld\n", &CdrSpeed);
- fscanf(f, "SpinDown = %ld\n", &SpinDown);
- fclose(f);
-
- if (ReadMode >= READ_MODES) ReadMode = THREADED;
- if (CacheSize <= 0) CacheSize = 32;
- if (CacheSize > 2048) CacheSize = 2048;
- if (SpinDown <= 0) SpinDown = SPINDOWN_VENDOR_SPECIFIC;
- if (SpinDown > SPINDOWN_32MIN) SpinDown = SPINDOWN_32MIN;
-}
-
-void SaveConf() {
- FILE *f;
-
- f = fopen("dfcdrom.cfg", "w");
- if (f == NULL)
- return;
-
- fprintf(f, "CdromDev = %s\n", CdromDev);
- fprintf(f, "ReadMode = %ld\n", ReadMode);
- fprintf(f, "UseSubQ = %ld\n", UseSubQ);
- fprintf(f, "CacheSize = %ld\n", CacheSize);
- fprintf(f, "CdrSpeed = %ld\n", CdrSpeed);
- fprintf(f, "SpinDown = %ld\n", SpinDown);
- fclose(f);
-}
diff --git a/plugins/dfcdrom/util.c b/plugins/dfcdrom/util.c
deleted file mode 100644
index c80c872..0000000
--- a/plugins/dfcdrom/util.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
- * All Rights Reserved.
- *
- * Based on: Cdrom for Psemu Pro like Emulators
- * By: linuzappz <linuzappz@hotmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses>.
- */
-
-#include "cdr.h"
-
-unsigned int msf_to_lba(char m, char s, char f) {
- return (m * CD_SECS + s) * CD_FRAMES + f - CD_MSF_OFFSET;
-}
-
-void lba_to_msf(unsigned int s, unsigned char *msf) {
- s += CD_MSF_OFFSET;
-
- msf[0] = s / CD_FRAMES / CD_SECS;
- s = s - msf[0] * CD_FRAMES * CD_SECS;
- msf[1] = s / CD_FRAMES;
- s = s - msf[1] * CD_FRAMES;
- msf[2] = s;
-}
-
-void DecodeRawSubData(unsigned char *subbuffer) {
- unsigned char subQData[12];
- int i;
-
- memset(subQData, 0, sizeof(subQData));
-
- for (i = 0; i < 8 * 12; i++) {
- if (subbuffer[i] & (1 << 6)) { // only subchannel Q is needed
- subQData[i >> 3] |= (1 << (7 - (i & 7)));
- }
- }
-
- memcpy(&subbuffer[12], subQData, 12);
-}
-
-// lookup table for crc calculation
-static unsigned short crctab[256] = {
- 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108,
- 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210,
- 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B,
- 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401,
- 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE,
- 0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6,
- 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D,
- 0xC7BC, 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
- 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5,
- 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC,
- 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4,
- 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD,
- 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13,
- 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A,
- 0x9F59, 0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E,
- 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
- 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1,
- 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB,
- 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0,
- 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8,
- 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657,
- 0x7676, 0x4615, 0x5634, 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9,
- 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882,
- 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
- 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E,
- 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07,
- 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D,
- 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74,
- 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
-};
-
-unsigned short calcCrc(unsigned char *d, int len) {
- unsigned short crc = 0;
- int i;
-
- for (i = 0; i < len; i++) {
- crc = crctab[(crc >> 8) ^ d[i]] ^ (crc << 8);
- }
-
- return ~crc;
-}