git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@54386 e17a0e51-4ae3-4d35-97c3-1a29b211df97

This commit is contained in:
SND\weimingzhi_cp 2010-07-09 04:15:47 +00:00
parent 83e06df409
commit e52097ddfe
8 changed files with 150 additions and 93 deletions

View File

@ -4,6 +4,11 @@ July 9, 2010 Wei Mingzhi <whistler_wmz@users.sf.net>
* plugins/dfcdrom/Makefile.am: Added cdr-solaris.c.
* plugins/dfcdrom/cdr-freebsd.c: Return 0 for PlayCDDA()/StopCDDA().
* gui/ConfDlg.c: Don't use dlerror() to check for symbol load failure.
* plugins/dfcdrom/cdr.c: Make cdHandle singleton as it could be different
type on some OS and we don't need to open multiple handles.
* plugins/dfcdrom/cdr.h: Likewise.
* plugins/dfcdrom/cdr-linux.c: Likewise.
* plugins/dfcdrom/cdrcfg-0.1df/main.c: Added device listing for Solaris.
July 8, 2010 Wei Mingzhi <whistler_wmz@users.sf.net>

View File

@ -25,13 +25,15 @@
char *LibName = N_("CD-ROM Drive Reader");
static int handle = -1;
int OpenCdHandle(const char *dev) {
int h, parameter;
int parameter;
char spindown;
h = open(dev, O_RDONLY);
handle = open(dev, O_RDONLY);
if (h != -1) {
if (handle != -1) {
if (SpinDown != SPINDOWN_VENDOR_SPECIFIC) {
if (SpinDown > SPINDOWN_1S) {
parameter = (1 << (SpinDown - SPINDOWN_1S));
@ -39,19 +41,19 @@ int OpenCdHandle(const char *dev) {
parameter = 1;
}
ioctl(h, IOCATASSPINDOWN, &parameter);
ioctl(handle, IOCATASSPINDOWN, &parameter);
parameter = CdrSpeed * 177;
if (parameter == 0) parameter = CDR_MAX_SPEED;
ioctl(h, CDRIOCREADSPEED, &parameter);
ioctl(handle, CDRIOCREADSPEED, &parameter);
}
}
return h;
return (h == -1) ? -1 : 0;
}
void CloseCdHandle(int handle) {
void CloseCdHandle() {
int parameter;
parameter = 0;
@ -61,24 +63,30 @@ void CloseCdHandle(int handle) {
ioctl(handle, CDRIOCREADSPEED, &parameter);
close(handle);
handle = -1;
}
long GetTN(int handle, unsigned char *buffer) {
int IsCdHandleOpen () {
return (handle != -1);
}
long GetTN(unsigned char *buffer) {
buffer[0] = 0;
buffer[1] = 0;
return 0;
}
long GetTD(int handle, unsigned char track, unsigned char *buffer) {
long GetTD(unsigned char track, unsigned char *buffer) {
memset(buffer + 1, 0, 3);
return 0;
}
long GetTE(int handle, unsigned char track, unsigned char *m, unsigned char *s, unsigned char *f) {
long GetTE(unsigned char track, unsigned char *m, unsigned char *s, unsigned char *f) {
return -1;
}
long ReadSector(int handle, crdata *cr) {
long ReadSector(crdata *cr) {
unsigned int lba = msf_to_lba(cr->msf.cdmsf_min0, cr->msf.cdmsf_sec0,
cr->msf.cdmsf_frame0);
@ -99,19 +107,19 @@ long ReadSector(int handle, crdata *cr) {
return 0;
}
long PlayCDDA(int handle, unsigned char *sector) {
long PlayCDDA(unsigned char *sector) {
return -1;
}
long StopCDDA(int handle) {
long StopCDDA() {
return -1;
}
long GetStatus(int handle, int playing, struct CdrStat *stat) {
long GetStatus(int playing, struct CdrStat *stat) {
return -1;
}
unsigned char *ReadSub(int handle, const unsigned char *time) {
unsigned char *ReadSub(const unsigned char *time) {
return NULL;
}

View File

@ -25,33 +25,40 @@
char *LibName = N_("CD-ROM Drive Reader");
static int handle = -1;
int OpenCdHandle(const char *dev) {
int h;
char spindown;
h = open(dev, O_RDONLY);
handle = open(dev, O_RDONLY);
if (h != -1) {
ioctl(h, CDROM_LOCKDOOR, 0);
// ioctl(h, CDROMSTART, NULL);
if (handle != -1) {
ioctl(handle, CDROM_LOCKDOOR, 0);
// ioctl(handle, CDROMSTART, NULL);
spindown = (char)SpinDown;
ioctl(h, CDROMSETSPINDOWN, &spindown);
ioctl(handle, CDROMSETSPINDOWN, &spindown);
ioctl(h, CDROM_SELECT_SPEED, CdrSpeed);
ioctl(handle, CDROM_SELECT_SPEED, CdrSpeed);
}
return h;
return (handle == -1) ? -1 : 0;
}
void CloseCdHandle(int handle) {
void CloseCdHandle() {
char spindown = SPINDOWN_VENDOR_SPECIFIC;
ioctl(handle, CDROMSETSPINDOWN, &spindown);
close(handle);
handle = -1;
}
long GetTN(int handle, unsigned char *buffer) {
int IsCdHandleOpen () {
return (handle != -1);
}
long GetTN(unsigned char *buffer) {
struct cdrom_tochdr toc;
if (ioctl(handle, CDROMREADTOCHDR, &toc) == -1)
@ -63,7 +70,7 @@ long GetTN(int handle, unsigned char *buffer) {
return 0;
}
long GetTD(int handle, unsigned char track, unsigned char *buffer) {
long GetTD(unsigned char track, unsigned char *buffer) {
struct cdrom_tocentry entry;
if (track == 0)
@ -81,7 +88,7 @@ long GetTD(int handle, unsigned char track, unsigned char *buffer) {
return 0;
}
long GetTE(int handle, unsigned char track, unsigned char *m, unsigned char *s, unsigned char *f) {
long GetTE(unsigned char track, unsigned char *m, unsigned char *s, unsigned char *f) {
struct cdrom_tocentry entry;
char msf[3];
@ -100,19 +107,19 @@ long GetTE(int handle, unsigned char track, unsigned char *m, unsigned char *s,
return 0;
}
long ReadSector(int handle, crdata *cr) {
long ReadSector(crdata *cr) {
if (ioctl(handle, CDROMREADRAW, cr) == -1)
return -1;
return 0;
}
long PlayCDDA(int handle, unsigned char *sector) {
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(handle, 0, ptmp) == -1)
if (GetTD(0, ptmp) == -1)
return -1;
addr.cdmsf_min0 = sector[0];
@ -128,7 +135,7 @@ long PlayCDDA(int handle, unsigned char *sector) {
return 0;
}
long StopCDDA(int handle) {
long StopCDDA() {
struct cdrom_subchnl sc;
sc.cdsc_format = CDROM_MSF;
@ -145,7 +152,7 @@ long StopCDDA(int handle) {
return 0;
}
long GetStatus(int handle, int playing, struct CdrStat *stat) {
long GetStatus(int playing, struct CdrStat *stat) {
struct cdrom_subchnl sc;
int ret;
char spindown;
@ -193,7 +200,7 @@ long GetStatus(int handle, int playing, struct CdrStat *stat) {
return 0;
}
unsigned char *ReadSub(int handle, const unsigned char *time) {
unsigned char *ReadSub(const unsigned char *time) {
static struct SubQ subq;
struct cdrom_subchnl subchnl;
int ret;

View File

@ -29,41 +29,45 @@ int OpenCdHandle(const char *dev) {
return -1;
}
void CloseCdHandle(int handle) {
void CloseCdHandle() {
}
long GetTN(int handle, unsigned char *buffer) {
int IsCdHandleOpen () {
return 0;
}
long GetTN(unsigned char *buffer) {
buffer[0] = 0;
buffer[1] = 0;
return 0;
}
long GetTD(int handle, unsigned char track, unsigned char *buffer) {
long GetTD(unsigned char track, unsigned char *buffer) {
memset(buffer + 1, 0, 3);
return 0;
}
long GetTE(int handle, unsigned char track, unsigned char *m, unsigned char *s, unsigned char *f) {
long GetTE(unsigned char track, unsigned char *m, unsigned char *s, unsigned char *f) {
return -1;
}
long ReadSector(int handle, crdata *cr) {
long ReadSector(crdata *cr) {
return -1;
}
long PlayCDDA(int handle, unsigned char *sector) {
long PlayCDDA(unsigned char *sector) {
return -1;
}
long StopCDDA(int handle) {
long StopCDDA() {
return -1;
}
long GetStatus(int handle, int playing, struct CdrStat *stat) {
long GetStatus(int playing, struct CdrStat *stat) {
return -1;
}
unsigned char *ReadSub(int handle, const unsigned char *time) {
unsigned char *ReadSub(const unsigned char *time) {
return NULL;
}

View File

@ -29,41 +29,45 @@ int OpenCdHandle(const char *dev) {
return -1;
}
void CloseCdHandle(int handle) {
void CloseCdHandle() {
}
long GetTN(int handle, unsigned char *buffer) {
int IsCdHandleOpen () {
return 0;
}
long GetTN(unsigned char *buffer) {
buffer[0] = 0;
buffer[1] = 0;
return 0;
}
long GetTD(int handle, unsigned char track, unsigned char *buffer) {
long GetTD(unsigned char track, unsigned char *buffer) {
memset(buffer + 1, 0, 3);
return 0;
}
long GetTE(int handle, unsigned char track, unsigned char *m, unsigned char *s, unsigned char *f) {
long GetTE(unsigned char track, unsigned char *m, unsigned char *s, unsigned char *f) {
return -1;
}
long ReadSector(int handle, crdata *cr) {
long ReadSector(crdata *cr) {
return -1;
}
long PlayCDDA(int handle, unsigned char *sector) {
long PlayCDDA(unsigned char *sector) {
return -1;
}
long StopCDDA(int handle) {
long StopCDDA() {
return -1;
}
long GetStatus(int handle, int playing, struct CdrStat *stat) {
long GetStatus(int playing, struct CdrStat *stat) {
return -1;
}
unsigned char *ReadSub(int handle, const unsigned char *time) {
unsigned char *ReadSub(const unsigned char *time) {
return NULL;
}

View File

@ -47,7 +47,6 @@ int cacheaddr;
crdata cr;
unsigned char lastTime[3];
int cdHandle;
pthread_t thread;
int subqread;
volatile int stopth, found, locked, playing;
@ -70,9 +69,7 @@ void *CdrThread(void *arg);
extern char *LibName;
long CDRinit(void) {
cdHandle = -1;
thread = -1;
return 0;
}
@ -83,11 +80,10 @@ long CDRshutdown(void) {
long CDRopen(void) {
LoadConf();
if (cdHandle > 0)
if (IsCdHandleOpen())
return 0; /* it's already open */
cdHandle = OpenCdHandle(CdromDev);
if (cdHandle == -1) { // if we can't open the cdrom we'll works as a null plugin
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);
}
@ -125,12 +121,11 @@ long CDRopen(void) {
}
long CDRclose(void) {
if (cdHandle < 1) return 0;
if (!IsCdHandleOpen()) return 0;
if (playing) CDRstop();
CloseCdHandle(cdHandle);
cdHandle = -1;
CloseCdHandle();
if (thread != -1) {
if (locked == 0) {
@ -160,13 +155,13 @@ long CDRclose(void) {
// byte 0 - start track
// byte 1 - end track
long CDRgetTN(unsigned char *buffer) {
if (cdHandle < 1) {
if (!IsCdHandleOpen()) {
buffer[0] = 1;
buffer[1] = 1;
return 0;
}
return GetTN(cdHandle, buffer);
return GetTN(buffer);
}
// return Track Time
@ -175,17 +170,17 @@ long CDRgetTN(unsigned char *buffer) {
// byte 1 - second
// byte 2 - minute
long CDRgetTD(unsigned char track, unsigned char *buffer) {
if (cdHandle < 1) {
if (!IsCdHandleOpen()) {
memset(buffer + 1, 0, 3);
return 0;
}
return GetTD(cdHandle, track, buffer);
return GetTD(track, buffer);
}
// normal reading
long ReadNormal() {
if (ReadSector(cdHandle, &cr) == -1)
if (ReadSector(&cr) == -1)
return -1;
return 0;
@ -270,7 +265,7 @@ void *CdrThread(void *arg) {
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(cdHandle, &cdcache[i].cr);
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;
@ -301,7 +296,7 @@ void *CdrThread(void *arg) {
// byte 2 - frame
// uses bcd format
long CDRreadTrack(unsigned char *time) {
if (cdHandle < 1) {
if (!IsCdHandleOpen()) {
memset(cr.buf, 0, DATA_SIZE);
return 0;
}
@ -330,7 +325,7 @@ unsigned char *CDRgetBuffer(void) {
// byte 2 - frame
// does NOT uses bcd format
long CDRplay(unsigned char *sector) {
if (cdHandle < 1)
if (!IsCdHandleOpen())
return 0;
// If play was called with the same time as the previous call,
@ -345,7 +340,7 @@ long CDRplay(unsigned char *sector) {
initial_time = msf_to_lba(sector[0], sector[1], sector[2]);
if (PlayCDDA(cdHandle, sector) == 0) {
if (PlayCDDA(sector) == 0) {
playing = 1;
return 0;
}
@ -355,10 +350,10 @@ long CDRplay(unsigned char *sector) {
// stops cdda audio
long CDRstop(void) {
if (cdHandle < 1)
if (!IsCdHandleOpen())
return 0;
if (StopCDDA(cdHandle) == 0) {
if (StopCDDA() == 0) {
playing = 0;
initial_time = 0;
@ -388,10 +383,10 @@ long CDRstop(void) {
// byte 2 - frame
long CDRgetStatus(struct CdrStat *stat) {
if (cdHandle < 1)
if (!IsCdHandleOpen())
return -1;
return GetStatus(cdHandle, playing, stat);
return GetStatus(playing, stat);
}
unsigned char *CDRgetBufferSub(void) {
@ -402,7 +397,7 @@ unsigned char *CDRgetBufferSub(void) {
if (ReadMode == THREADED) pthread_mutex_lock(&mut);
p = ReadSub(cdHandle, lastTime);
p = ReadSub(lastTime);
if (ReadMode == THREADED) pthread_mutex_unlock(&mut);
@ -427,8 +422,8 @@ long CDRreadCDDA(unsigned char m, unsigned char s, unsigned char f, unsigned cha
// get Track End Time
long CDRgetTE(unsigned char track, unsigned char *m, unsigned char *s, unsigned char *f) {
if (cdHandle < 1) return -1;
return GetTE(cdHandle, track, m, s, f);
if (!IsCdHandleOpen()) return -1;
return GetTE(track, m, s, f);
}
void ExecCfg(char *arg) {
@ -469,11 +464,9 @@ void CDRabout() {
long CDRtest(void) {
#ifndef USE_NULL
cdHandle = open(CdromDev, O_RDONLY);
if (cdHandle == -1)
if (OpenCdHandle(CdromDev) == -1)
return -1;
close(cdHandle);
cdHandle = -1;
CloseCdHandle();
#endif
return 0;
}

View File

@ -74,7 +74,7 @@ struct cdrom_msf {
#define CD_FRAMESIZE_SUB 96
#define CD_MSF_OFFSET 150
#ifdef __FreeBSD__
#if defined (__FreeBSD__)
#include <sys/ata.h>
#include <sys/cdio.h>
@ -83,6 +83,14 @@ struct cdrom_msf {
#define DEV_DEF "/dev/acd0"
#elif defined (__sun)
#include <sys/cdio.h>
/* The CD-ROM device name seems to vary on different computers on Solaris, so
let user set this. */
#define DEV_DEF ""
#else
#define DEV_DEF ""
@ -178,14 +186,15 @@ unsigned int msf_to_lba(char m, char s, char f);
void lba_to_msf(unsigned int s, char *msf);
int OpenCdHandle();
void CloseCdHandle(int handle);
long GetTN(int handle, unsigned char *buffer);
long GetTD(int handle, unsigned char track, unsigned char *buffer);
long GetTE(int handle, unsigned char track, unsigned char *m, unsigned char *s, unsigned char *f);
long ReadSector(int handle, crdata *cr);
long PlayCDDA(int handle, unsigned char *sector);
long StopCDDA(int handle);
long GetStatus(int handle, int playing, struct CdrStat *stat);
unsigned char *ReadSub(int handle, const unsigned char *time);
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

View File

@ -107,14 +107,41 @@ void fill_drives_list(GtkWidget *widget) {
"/dev/scd2",
"/dev/scd3",
"/dev/optcd",
NULL};
""};
#elif defined (__FreeBSD__)
static const char *cdrom_devices[] = {
"/dev/acd0",
"/dev/acd1",
"/dev/acd2",
"/dev/acd3",
NULL};
""};
#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[] = { NULL };
#endif
@ -126,7 +153,7 @@ void fill_drives_list(GtkWidget *widget) {
gtk_list_store_set(store, &iter, 0, CdromDev, -1);
// scan cdrom_devices for real cdrom and add them to list
while (cdrom_devices[i] != NULL) {
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