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

This commit is contained in:
SND\weimingzhi_cp 2009-11-26 06:41:17 +00:00
parent 9b9ad9958e
commit acd164d56c
19 changed files with 806 additions and 682 deletions

View File

@ -1,3 +1,23 @@
November 26, 2009 Wei Mingzhi <weimingzhi@gmail.com>
* plugins/dfcdrom/cdr.c: Separated GNU/Linux-specific code and NULL code
into separate files (cdr-linux.c and cdr-null.c).
* plugins/dfcdrom/cdr-linux.c: Added.
* plugins/dfcdrom/cdr-null.c: Likewise.
* plugins/dfcdrom/cdrcfg-0.1df: Moved configuration utility into a subdir.
* plugins/dfcdrom/interface.c: Moved into cdrcfg-0.1df directory.
* plugins/dfcdrom/interface.h: Likewise.
* plugins/dfcdrom/cfg-gtk2.c: Likewise.
* plugins/dfcdrom/support.c: Likewise.
* plugins/dfcdrom/support.h: Likewise.
* plugins/dfcdrom/main.c: Likewise.
* plugins/dfcdrom/callbacks.c: Likewise.
* plugins/dfcdrom/callbacks.h: Likewise.
* plugins/dfcdrom/cfgCdr.glade: Likewise.
* plugins/dfcdrom/Makefile.am: Likewise.
* libpcsxcore/psxbios.c: Fixed MSVC6 errors when psxbios logging is enabled.
* debian/changelog: Changed version number.
November 25, 2009 Wei Mingzhi <weimingzhi@gmail.com>
* po/zh_CN.po, po/zh_TW.po: Updated.

2
debian/changelog vendored
View File

@ -1,4 +1,4 @@
pcsxr (2:1.9.83-1) unstable; urgency=low
pcsxr (2:1.9.91-1) unstable; urgency=low
* Initial Release.

View File

@ -487,12 +487,12 @@ void psxBios_srand() { // 30
void psxBios_malloc() { // 33
#ifdef PSXBIOS_LOG
PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x33]);
#endif
unsigned int *chunk, *newchunk;
unsigned int dsize, csize, cstat;
int colflag;
#ifdef PSXBIOS_LOG
PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x33]);
#endif
// scan through heap and combine free chunks of space
chunk = heap_addr;
@ -591,12 +591,11 @@ void psxBios_calloc() { // 37
}
void psxBios_realloc() { // 38
#ifdef PSXBIOS_LOG
PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x38]);
#endif
u32 block = a0;
u32 size = a1;
#ifdef PSXBIOS_LOG
PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x38]);
#endif
a0 = block;
psxBios_free();
@ -607,12 +606,11 @@ void psxBios_realloc() { // 38
/* InitHeap(void *block , int n) */
void psxBios_InitHeap() { // 39
unsigned int size;
#ifdef PSXBIOS_LOG
PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x39]);
#endif
unsigned int size;
#ifdef PSXBIOS_LOG
PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x39]);
#endif
if (((a0 & 0x1fffff) + a1)>= 0x200000) size = 0x1ffffc - (a0 & 0x1fffff);
else size = a1;
@ -893,18 +891,19 @@ void psxBios__96_remove() { // 72
}
void psxBios_SetMem() { // 9f
#ifdef PSXBIOS_LOG
PSXBIOS_LOG("psxBios_%s: %x, %x\n", biosA0n[0x9f], a0, a1);
#endif
u32 new = psxHu32(0x1060);
#ifdef PSXBIOS_LOG
PSXBIOS_LOG("psxBios_%s: %x, %x\n", biosA0n[0x9f], a0, a1);
#endif
switch(a0) {
case 2:
psxHu32ref(0x1060) = SWAP32(new);
psxMu32ref(0x060) = a0;
SysPrintf("Change effective memory : %d MBytes\n",a0);
break;
case 8:
psxHu32ref(0x1060) = SWAP32(new | 0x300);
psxMu32ref(0x060) = a0;

View File

@ -13,5 +13,7 @@ INCLUDES = -DPIXMAPDIR=\"${datadir}/pixmaps/\" \
-I../../libpcsxcore -I../../include
bin_PROGRAMS = cfgDFCdrom
cfgDFCdrom_SOURCES = cfg-gtk2.c main.c support.c interface.c callbacks.c
cfgDFCdrom_SOURCES = cdrcfg-0.1df/cfg-gtk2.c cdrcfg-0.1df/main.c \
cdrcfg-0.1df/support.c cdrcfg-0.1df/interface.c \
cdrcfg-0.1df/callbacks.c
cfgDFCdrom_LDADD = $(GTK2_LIBS)

View File

@ -241,7 +241,10 @@ INCLUDES = -DPIXMAPDIR=\"${datadir}/pixmaps/\" \
$(GTK2_CFLAGS) \
-I../../libpcsxcore -I../../include
cfgDFCdrom_SOURCES = cfg-gtk2.c main.c support.c interface.c callbacks.c
cfgDFCdrom_SOURCES = cdrcfg-0.1df/cfg-gtk2.c cdrcfg-0.1df/main.c \
cdrcfg-0.1df/support.c cdrcfg-0.1df/interface.c \
cdrcfg-0.1df/callbacks.c
cfgDFCdrom_LDADD = $(GTK2_LIBS)
all: all-am
@ -372,6 +375,76 @@ distclean-compile:
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
cfg-gtk2.o: cdrcfg-0.1df/cfg-gtk2.c
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cfg-gtk2.o -MD -MP -MF $(DEPDIR)/cfg-gtk2.Tpo -c -o cfg-gtk2.o `test -f 'cdrcfg-0.1df/cfg-gtk2.c' || echo '$(srcdir)/'`cdrcfg-0.1df/cfg-gtk2.c
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/cfg-gtk2.Tpo $(DEPDIR)/cfg-gtk2.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cdrcfg-0.1df/cfg-gtk2.c' object='cfg-gtk2.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cfg-gtk2.o `test -f 'cdrcfg-0.1df/cfg-gtk2.c' || echo '$(srcdir)/'`cdrcfg-0.1df/cfg-gtk2.c
cfg-gtk2.obj: cdrcfg-0.1df/cfg-gtk2.c
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cfg-gtk2.obj -MD -MP -MF $(DEPDIR)/cfg-gtk2.Tpo -c -o cfg-gtk2.obj `if test -f 'cdrcfg-0.1df/cfg-gtk2.c'; then $(CYGPATH_W) 'cdrcfg-0.1df/cfg-gtk2.c'; else $(CYGPATH_W) '$(srcdir)/cdrcfg-0.1df/cfg-gtk2.c'; fi`
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/cfg-gtk2.Tpo $(DEPDIR)/cfg-gtk2.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cdrcfg-0.1df/cfg-gtk2.c' object='cfg-gtk2.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cfg-gtk2.obj `if test -f 'cdrcfg-0.1df/cfg-gtk2.c'; then $(CYGPATH_W) 'cdrcfg-0.1df/cfg-gtk2.c'; else $(CYGPATH_W) '$(srcdir)/cdrcfg-0.1df/cfg-gtk2.c'; fi`
main.o: cdrcfg-0.1df/main.c
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT main.o -MD -MP -MF $(DEPDIR)/main.Tpo -c -o main.o `test -f 'cdrcfg-0.1df/main.c' || echo '$(srcdir)/'`cdrcfg-0.1df/main.c
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/main.Tpo $(DEPDIR)/main.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cdrcfg-0.1df/main.c' object='main.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o main.o `test -f 'cdrcfg-0.1df/main.c' || echo '$(srcdir)/'`cdrcfg-0.1df/main.c
main.obj: cdrcfg-0.1df/main.c
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT main.obj -MD -MP -MF $(DEPDIR)/main.Tpo -c -o main.obj `if test -f 'cdrcfg-0.1df/main.c'; then $(CYGPATH_W) 'cdrcfg-0.1df/main.c'; else $(CYGPATH_W) '$(srcdir)/cdrcfg-0.1df/main.c'; fi`
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/main.Tpo $(DEPDIR)/main.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cdrcfg-0.1df/main.c' object='main.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o main.obj `if test -f 'cdrcfg-0.1df/main.c'; then $(CYGPATH_W) 'cdrcfg-0.1df/main.c'; else $(CYGPATH_W) '$(srcdir)/cdrcfg-0.1df/main.c'; fi`
support.o: cdrcfg-0.1df/support.c
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT support.o -MD -MP -MF $(DEPDIR)/support.Tpo -c -o support.o `test -f 'cdrcfg-0.1df/support.c' || echo '$(srcdir)/'`cdrcfg-0.1df/support.c
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/support.Tpo $(DEPDIR)/support.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cdrcfg-0.1df/support.c' object='support.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o support.o `test -f 'cdrcfg-0.1df/support.c' || echo '$(srcdir)/'`cdrcfg-0.1df/support.c
support.obj: cdrcfg-0.1df/support.c
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT support.obj -MD -MP -MF $(DEPDIR)/support.Tpo -c -o support.obj `if test -f 'cdrcfg-0.1df/support.c'; then $(CYGPATH_W) 'cdrcfg-0.1df/support.c'; else $(CYGPATH_W) '$(srcdir)/cdrcfg-0.1df/support.c'; fi`
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/support.Tpo $(DEPDIR)/support.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cdrcfg-0.1df/support.c' object='support.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o support.obj `if test -f 'cdrcfg-0.1df/support.c'; then $(CYGPATH_W) 'cdrcfg-0.1df/support.c'; else $(CYGPATH_W) '$(srcdir)/cdrcfg-0.1df/support.c'; fi`
interface.o: cdrcfg-0.1df/interface.c
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT interface.o -MD -MP -MF $(DEPDIR)/interface.Tpo -c -o interface.o `test -f 'cdrcfg-0.1df/interface.c' || echo '$(srcdir)/'`cdrcfg-0.1df/interface.c
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/interface.Tpo $(DEPDIR)/interface.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cdrcfg-0.1df/interface.c' object='interface.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o interface.o `test -f 'cdrcfg-0.1df/interface.c' || echo '$(srcdir)/'`cdrcfg-0.1df/interface.c
interface.obj: cdrcfg-0.1df/interface.c
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT interface.obj -MD -MP -MF $(DEPDIR)/interface.Tpo -c -o interface.obj `if test -f 'cdrcfg-0.1df/interface.c'; then $(CYGPATH_W) 'cdrcfg-0.1df/interface.c'; else $(CYGPATH_W) '$(srcdir)/cdrcfg-0.1df/interface.c'; fi`
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/interface.Tpo $(DEPDIR)/interface.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cdrcfg-0.1df/interface.c' object='interface.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o interface.obj `if test -f 'cdrcfg-0.1df/interface.c'; then $(CYGPATH_W) 'cdrcfg-0.1df/interface.c'; else $(CYGPATH_W) '$(srcdir)/cdrcfg-0.1df/interface.c'; fi`
callbacks.o: cdrcfg-0.1df/callbacks.c
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT callbacks.o -MD -MP -MF $(DEPDIR)/callbacks.Tpo -c -o callbacks.o `test -f 'cdrcfg-0.1df/callbacks.c' || echo '$(srcdir)/'`cdrcfg-0.1df/callbacks.c
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/callbacks.Tpo $(DEPDIR)/callbacks.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cdrcfg-0.1df/callbacks.c' object='callbacks.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o callbacks.o `test -f 'cdrcfg-0.1df/callbacks.c' || echo '$(srcdir)/'`cdrcfg-0.1df/callbacks.c
callbacks.obj: cdrcfg-0.1df/callbacks.c
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT callbacks.obj -MD -MP -MF $(DEPDIR)/callbacks.Tpo -c -o callbacks.obj `if test -f 'cdrcfg-0.1df/callbacks.c'; then $(CYGPATH_W) 'cdrcfg-0.1df/callbacks.c'; else $(CYGPATH_W) '$(srcdir)/cdrcfg-0.1df/callbacks.c'; fi`
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/callbacks.Tpo $(DEPDIR)/callbacks.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cdrcfg-0.1df/callbacks.c' object='callbacks.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o callbacks.obj `if test -f 'cdrcfg-0.1df/callbacks.c'; then $(CYGPATH_W) 'cdrcfg-0.1df/callbacks.c'; else $(CYGPATH_W) '$(srcdir)/cdrcfg-0.1df/callbacks.c'; fi`
mostlyclean-libtool:
-rm -f *.lo

598
plugins/dfcdrom/cdr-linux.c Normal file
View File

@ -0,0 +1,598 @@
/*
* Cdrom for Psemu Pro like Emulators
*
* By: linuzappz <linuzappz@hotmail.com>
*
*/
#include "config.h"
#include <stdio.h>
#include <stdlib.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 "cdr.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
static inline int msf_to_lba(char m, char s, char f) {
return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;
}
int initial_time = 0;
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
long (*ReadTrackT[])() = {
ReadNormal,
ReadThreaded,
};
unsigned char* (*GetBufferT[])() = {
GetBNormal,
GetBThreaded,
};
long (*fReadTrack)();
unsigned char* (*fGetBuffer)();
void *CdrThread(void *arg);
char *LibName = N_("CD-ROM Drive Reader");
char *PSEgetLibName(void) {
return _(LibName);
}
unsigned long PSEgetLibType(void) {
return PSE_LT_CDR;
}
unsigned long PSEgetLibVersion(void) {
return 1 << 16;
}
long CDRinit(void) {
cdHandle = -1;
thread = -1;
return 0;
}
long CDRshutdown(void) {
return 0;
}
long CDRopen(void) {
LoadConf();
if (cdHandle > 0)
return 0; /* it's already open */
cdHandle = open(CdromDev, O_RDONLY);
if (cdHandle != -1) { // if we can't open the cdrom we'll works as a null plugin
ioctl(cdHandle, CDROM_LOCKDOOR, 0);
// ioctl(cdHandle, CDROMSTART, NULL);
ioctl(cdHandle, CDROM_SELECT_SPEED, CdrSpeed);
} else {
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));
} 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 = -1;
playing = 0;
stopth = 0;
initial_time = 0;
return 0;
}
long CDRclose(void) {
if (cdHandle < 1) return 0;
if (playing) CDRstop();
close(cdHandle);
cdHandle = -1;
if (thread != -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) {
struct cdrom_tochdr toc;
if (cdHandle < 1) {
buffer[0] = 1;
buffer[1] = 1;
return 0;
}
if (ioctl(cdHandle, CDROMREADTOCHDR, &toc) == -1)
return -1;
buffer[0] = toc.cdth_trk0; // start track
buffer[1] = toc.cdth_trk1; // end track
return 0;
}
// return Track Time
// buffer:
// byte 0 - frame
// byte 1 - second
// byte 2 - minute
long CDRgetTD(unsigned char track, unsigned char *buffer) {
struct cdrom_tocentry entry;
if (cdHandle < 1) {
memset(buffer + 1, 0, 3);
return 0;
}
if (track == 0)
track = 0xaa; // total time
entry.cdte_track = track;
entry.cdte_format = CDROM_MSF;
if (ioctl(cdHandle, CDROMREADTOCENTRY, &entry) == -1)
return -1;
buffer[0] = entry.cdte_addr.msf.frame; /* frame */
buffer[1] = entry.cdte_addr.msf.second; /* second */
buffer[2] = entry.cdte_addr.msf.minute; /* minute */
return 0;
}
// normal reading
long ReadNormal() {
if (ioctl(cdHandle, CDROMREADRAW, &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) { found = 0; 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;
}
// read track
// time:
// byte 0 - minute
// byte 1 - second
// byte 2 - frame
// uses bcd format
long CDRreadTrack(unsigned char *time) {
if (cdHandle < 1) {
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();
}
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", crp.msf.cdmsf_min0, crp.msf.cdmsf_sec0, crp.msf.cdmsf_frame0);
cdcache[i].ret = ioctl(cdHandle, CDROMREADRAW, &cdcache[i].cr);
// printf("readed %x:%x:%x\n", crd.buf[12], crd.buf[13], crd.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;
}
// 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) {
struct cdrom_msf addr;
unsigned char ptmp[4];
if (cdHandle < 1)
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]);
// 0 is the last track of every cdrom, so play up to there
if (CDRgetTD(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;
playing = 1;
return 0;
}
// stops cdda audio
long CDRstop(void) {
struct cdrom_subchnl sc;
if (cdHandle < 1)
return 0;
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;
}
playing = 0;
initial_time = 0;
return 0;
}
struct CdrStat {
unsigned long Type;
unsigned long Status;
unsigned char Time[3]; // current playing time
};
struct CdrStat ostat;
// 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) {
struct cdrom_subchnl sc;
int ret;
static time_t to;
if (cdHandle < 1)
return -1;
if (!playing) { // if not playing update stat only once in a second
if (to < time(NULL)) {
to = time(NULL);
} else {
memcpy(stat, &ostat, sizeof(struct CdrStat));
return 0;
}
}
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:
ioctl(cdHandle, CDROM_LOCKDOOR, 0);
break;
}
switch (sc.cdsc_audiostatus) {
case CDROM_AUDIO_PLAY:
stat->Status |= 0x80;
break;
}
memcpy(&ostat, stat, sizeof(struct CdrStat));
return 0;
}
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];
char res1[72];
};
struct SubQ subq;
unsigned char *CDRgetBufferSub(void) {
struct cdrom_subchnl subchnl;
int ret;
if (!UseSubQ) return NULL;
if (subqread) return (unsigned char *)&subq;
cr.msf.cdmsf_min0 = btoi(lastTime[0]);
cr.msf.cdmsf_sec0 = btoi(lastTime[1]);
cr.msf.cdmsf_frame0 = btoi(lastTime[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;
ret = ioctl(cdHandle, CDROMSUBCHNL, &subchnl);
if (ret == -1) return NULL;
subqread = 1;
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);
#if 0
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));
#endif
return (unsigned char *)&subq;
}
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;
}
printf("cfgDFCdrom file not found!\n");
}
long CDRconfigure() {
ExecCfg("configure");
return 0;
}
void CDRabout() {
ExecCfg("about");
}
long CDRtest(void) {
cdHandle = open(CdromDev, O_RDONLY);
if (cdHandle == -1)
return -1;
close(cdHandle);
cdHandle = -1;
return 0;
}

View File

@ -0,0 +1,88 @@
/*
* Cdrom for Psemu Pro like Emulators
*
* By: linuzappz <linuzappz@hotmail.com>
*
*/
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>
#include <string.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
char *LibName = N_("CDR NULL Plugin");
char *PSEgetLibName(void) {
return _(LibName);
}
unsigned long PSEgetLibType(void) {
return PSE_LT_CDR;
}
unsigned long PSEgetLibVersion(void) {
return 1 << 16;
}
long CDRinit(void) {
return 0;
}
long CDRshutdown(void) {
return 0;
}
long CDRopen(void) {
return 0;
}
long CDRclose(void) {
return 0;
}
long CDRgetTN(unsigned char *buffer) {
buffer[0] = 1;
buffer[1] = 1;
return 0;
}
long CDRgetTD(unsigned char track, unsigned char *buffer) {
memset(buffer + 1, 0, 3);
return 0;
}
long CDRreadTrack(unsigned char *time) {
return -1;
}
unsigned char *CDRgetBuffer(void) {
return NULL;
}
long CDRplay(unsigned char *sector) {
return 0;
}
long CDRstop(void) {
return 0;
}
long CDRconfigure() {
return 0;
}
void CDRabout() {
}

View File

@ -5,658 +5,8 @@
*
*/
#include "config.h"
#include <stdio.h>
#include <stdlib.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 "cdr.h"
#ifdef ENABLE_NLS
#include <libintl.h>
#include <locale.h>
#define _(x) gettext(x)
#define N_(x) (x)
#if defined (__linux__)
#include "cdr-linux.c"
#else
#define _(x) (x)
#define N_(x) (x)
#endif
#ifdef __linux__
static inline int msf_to_lba(char m, char s, char f) {
return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;
}
int initial_time = 0;
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
long (*ReadTrackT[])() = {
ReadNormal,
ReadThreaded,
};
unsigned char* (*GetBufferT[])() = {
GetBNormal,
GetBThreaded,
};
long (*fReadTrack)();
unsigned char* (*fGetBuffer)();
void *CdrThread(void *arg);
char *LibName = N_("CD-ROM Drive Reader");
#else
char *LibName = N_("CDR NULL Plugin");
#endif
char *PSEgetLibName(void) {
return _(LibName);
}
unsigned long PSEgetLibType(void) {
return PSE_LT_CDR;
}
unsigned long PSEgetLibVersion(void) {
return 1 << 16;
}
#ifdef __linux__
long CDRinit(void) {
cdHandle = -1;
thread = -1;
return 0;
}
long CDRshutdown(void) {
return 0;
}
long CDRopen(void) {
LoadConf();
if (cdHandle > 0)
return 0; /* it's already open */
cdHandle = open(CdromDev, O_RDONLY);
if (cdHandle != -1) { // if we can't open the cdrom we'll works as a null plugin
ioctl(cdHandle, CDROM_LOCKDOOR, 0);
// ioctl(cdHandle, CDROMSTART, NULL);
ioctl(cdHandle, CDROM_SELECT_SPEED, CdrSpeed);
} else {
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));
} 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 = -1;
playing = 0;
stopth = 0;
initial_time = 0;
return 0;
}
long CDRclose(void) {
if (cdHandle < 1) return 0;
if (playing) CDRstop();
close(cdHandle);
cdHandle = -1;
if (thread != -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) {
struct cdrom_tochdr toc;
if (cdHandle < 1) {
buffer[0] = 1;
buffer[1] = 1;
return 0;
}
if (ioctl(cdHandle, CDROMREADTOCHDR, &toc) == -1)
return -1;
buffer[0] = toc.cdth_trk0; // start track
buffer[1] = toc.cdth_trk1; // end track
return 0;
}
// return Track Time
// buffer:
// byte 0 - frame
// byte 1 - second
// byte 2 - minute
long CDRgetTD(unsigned char track, unsigned char *buffer) {
struct cdrom_tocentry entry;
if (cdHandle < 1) {
memset(buffer + 1, 0, 3);
return 0;
}
if (track == 0)
track = 0xaa; // total time
entry.cdte_track = track;
entry.cdte_format = CDROM_MSF;
if (ioctl(cdHandle, CDROMREADTOCENTRY, &entry) == -1)
return -1;
buffer[0] = entry.cdte_addr.msf.frame; /* frame */
buffer[1] = entry.cdte_addr.msf.second; /* second */
buffer[2] = entry.cdte_addr.msf.minute; /* minute */
return 0;
}
// normal reading
long ReadNormal() {
if (ioctl(cdHandle, CDROMREADRAW, &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) { found = 0; 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;
}
// read track
// time:
// byte 0 - minute
// byte 1 - second
// byte 2 - frame
// uses bcd format
long CDRreadTrack(unsigned char *time) {
if (cdHandle < 1) {
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();
}
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", crp.msf.cdmsf_min0, crp.msf.cdmsf_sec0, crp.msf.cdmsf_frame0);
cdcache[i].ret = ioctl(cdHandle, CDROMREADRAW, &cdcache[i].cr);
// printf("readed %x:%x:%x\n", crd.buf[12], crd.buf[13], crd.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;
}
// 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) {
struct cdrom_msf addr;
unsigned char ptmp[4];
if (cdHandle < 1)
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]);
// 0 is the last track of every cdrom, so play up to there
if (CDRgetTD(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;
playing = 1;
return 0;
}
// stops cdda audio
long CDRstop(void) {
struct cdrom_subchnl sc;
if (cdHandle < 1)
return 0;
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;
}
playing = 0;
initial_time = 0;
return 0;
}
struct CdrStat {
unsigned long Type;
unsigned long Status;
unsigned char Time[3]; // current playing time
};
struct CdrStat ostat;
// 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) {
struct cdrom_subchnl sc;
int ret;
static time_t to;
if (cdHandle < 1)
return -1;
if (!playing) { // if not playing update stat only once in a second
if (to < time(NULL)) {
to = time(NULL);
} else {
memcpy(stat, &ostat, sizeof(struct CdrStat));
return 0;
}
}
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:
ioctl(cdHandle, CDROM_LOCKDOOR, 0);
break;
}
switch (sc.cdsc_audiostatus) {
case CDROM_AUDIO_PLAY:
stat->Status |= 0x80;
break;
}
memcpy(&ostat, stat, sizeof(struct CdrStat));
return 0;
}
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];
char res1[72];
};
struct SubQ subq;
unsigned char *CDRgetBufferSub(void) {
struct cdrom_subchnl subchnl;
int ret;
if (!UseSubQ) return NULL;
if (subqread) return (unsigned char *)&subq;
cr.msf.cdmsf_min0 = btoi(lastTime[0]);
cr.msf.cdmsf_sec0 = btoi(lastTime[1]);
cr.msf.cdmsf_frame0 = btoi(lastTime[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;
ret = ioctl(cdHandle, CDROMSUBCHNL, &subchnl);
if (ret == -1) return NULL;
subqread = 1;
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);
#if 0
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));
#endif
return (unsigned char *)&subq;
}
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;
}
printf("cfgDFCdrom file not found!\n");
}
long CDRconfigure() {
ExecCfg("configure");
return 0;
}
void CDRabout() {
ExecCfg("about");
}
long CDRtest(void) {
cdHandle = open(CdromDev, O_RDONLY);
if (cdHandle == -1)
return -1;
close(cdHandle);
cdHandle = -1;
return 0;
}
#else
long CDRinit(void) {
return 0;
}
long CDRshutdown(void) {
return 0;
}
long CDRopen(void) {
return 0;
}
long CDRclose(void) {
return 0;
}
long CDRgetTN(unsigned char *buffer) {
buffer[0] = 1;
buffer[1] = 1;
return 0;
}
long CDRgetTD(unsigned char track, unsigned char *buffer) {
memset(buffer + 1, 0, 3);
return 0;
}
long CDRreadTrack(unsigned char *time) {
return -1;
}
unsigned char *CDRgetBuffer(void) {
return NULL;
}
long CDRplay(unsigned char *sector) {
return 0;
}
long CDRstop(void) {
return 0;
}
long CDRconfigure() {
return 0;
}
void CDRabout() {
}
#include "cdr-null.c"
#endif

View File

@ -1,9 +1,7 @@
#ifndef __CDR_H__
#define __CDR_H__
#ifdef __linux__
#include <linux/cdrom.h>
#endif
typedef char HWND;
@ -16,8 +14,6 @@ long UseSubQ;
long CacheSize;
long CdrSpeed;
#ifdef __linux__
#define DEV_DEF "/dev/cdrom"
#define NORMAL 0
#define THREADED 1
@ -61,6 +57,4 @@ long CDRstop(void);
void LoadConf();
void SaveConf();
#endif
#endif /* __CDR_H__ */

View File

@ -15,7 +15,7 @@
#include <gtk/gtk.h>
#include "cdr.h"
#include "../cdr.h"
#include "callbacks.h"
#include "interface.h"
#include "support.h"

View File

@ -15,7 +15,7 @@
#include <time.h>
#include <string.h>
#include "cdr.h"
#include "../cdr.h"
void LoadConf() {
FILE *f;

View File

@ -5,7 +5,7 @@
*
*/
#ifdef __linux__
#if defined (__linux__)
#include <stdio.h>
#include <stdlib.h>