summaryrefslogtreecommitdiff
path: root/plugins/dfcdrom
diff options
context:
space:
mode:
authorSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2009-11-26 06:41:17 +0000
committerSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2009-11-26 06:41:17 +0000
commitacd164d56c60efd57a87c0cbe53fe6aee3be6696 (patch)
treef9de10a5ff2039170952a910920496a77ac825da /plugins/dfcdrom
parent9b9ad9958e1e373fa8804e5866e77d9f40b5d624 (diff)
downloadpcsxr-acd164d56c60efd57a87c0cbe53fe6aee3be6696.tar.gz
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@38248 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'plugins/dfcdrom')
-rw-r--r--plugins/dfcdrom/Makefile.am4
-rw-r--r--plugins/dfcdrom/Makefile.in75
-rw-r--r--plugins/dfcdrom/cdr-linux.c598
-rw-r--r--plugins/dfcdrom/cdr-null.c88
-rw-r--r--plugins/dfcdrom/cdr.c656
-rw-r--r--plugins/dfcdrom/cdr.h6
-rw-r--r--plugins/dfcdrom/cdrcfg-0.1df/callbacks.c (renamed from plugins/dfcdrom/callbacks.c)2
-rw-r--r--plugins/dfcdrom/cdrcfg-0.1df/callbacks.h (renamed from plugins/dfcdrom/callbacks.h)0
-rw-r--r--plugins/dfcdrom/cdrcfg-0.1df/cfg-gtk2.c (renamed from plugins/dfcdrom/cfg-gtk2.c)2
-rw-r--r--plugins/dfcdrom/cdrcfg-0.1df/cfgCdr.glade (renamed from plugins/dfcdrom/cfgCdr.glade)0
-rw-r--r--plugins/dfcdrom/cdrcfg-0.1df/interface.c (renamed from plugins/dfcdrom/interface.c)0
-rw-r--r--plugins/dfcdrom/cdrcfg-0.1df/interface.h (renamed from plugins/dfcdrom/interface.h)0
-rw-r--r--plugins/dfcdrom/cdrcfg-0.1df/main.c (renamed from plugins/dfcdrom/main.c)0
-rw-r--r--plugins/dfcdrom/cdrcfg-0.1df/support.c (renamed from plugins/dfcdrom/support.c)0
-rw-r--r--plugins/dfcdrom/cdrcfg-0.1df/support.h (renamed from plugins/dfcdrom/support.h)0
-rw-r--r--plugins/dfcdrom/cfg.c2
16 files changed, 769 insertions, 664 deletions
diff --git a/plugins/dfcdrom/Makefile.am b/plugins/dfcdrom/Makefile.am
index da03d92c..a0ecdd0c 100644
--- a/plugins/dfcdrom/Makefile.am
+++ b/plugins/dfcdrom/Makefile.am
@@ -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)
diff --git a/plugins/dfcdrom/Makefile.in b/plugins/dfcdrom/Makefile.in
index 5e91d951..4b7bce73 100644
--- a/plugins/dfcdrom/Makefile.in
+++ b/plugins/dfcdrom/Makefile.in
@@ -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
diff --git a/plugins/dfcdrom/cdr-linux.c b/plugins/dfcdrom/cdr-linux.c
new file mode 100644
index 00000000..c0e27807
--- /dev/null
+++ b/plugins/dfcdrom/cdr-linux.c
@@ -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;
+}
diff --git a/plugins/dfcdrom/cdr-null.c b/plugins/dfcdrom/cdr-null.c
new file mode 100644
index 00000000..dac0d1df
--- /dev/null
+++ b/plugins/dfcdrom/cdr-null.c
@@ -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() {
+}
diff --git a/plugins/dfcdrom/cdr.c b/plugins/dfcdrom/cdr.c
index f8262353..7e4effce 100644
--- a/plugins/dfcdrom/cdr.c
+++ b/plugins/dfcdrom/cdr.c
@@ -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)
-#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");
-
+#if defined (__linux__)
+#include "cdr-linux.c"
#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
diff --git a/plugins/dfcdrom/cdr.h b/plugins/dfcdrom/cdr.h
index 9a83d512..b7e20dfd 100644
--- a/plugins/dfcdrom/cdr.h
+++ b/plugins/dfcdrom/cdr.h
@@ -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__ */
diff --git a/plugins/dfcdrom/callbacks.c b/plugins/dfcdrom/cdrcfg-0.1df/callbacks.c
index 09f72f63..8330cd77 100644
--- a/plugins/dfcdrom/callbacks.c
+++ b/plugins/dfcdrom/cdrcfg-0.1df/callbacks.c
@@ -15,7 +15,7 @@
#include <gtk/gtk.h>
-#include "cdr.h"
+#include "../cdr.h"
#include "callbacks.h"
#include "interface.h"
#include "support.h"
diff --git a/plugins/dfcdrom/callbacks.h b/plugins/dfcdrom/cdrcfg-0.1df/callbacks.h
index 622914d9..622914d9 100644
--- a/plugins/dfcdrom/callbacks.h
+++ b/plugins/dfcdrom/cdrcfg-0.1df/callbacks.h
diff --git a/plugins/dfcdrom/cfg-gtk2.c b/plugins/dfcdrom/cdrcfg-0.1df/cfg-gtk2.c
index ac3e829a..4d9314e2 100644
--- a/plugins/dfcdrom/cfg-gtk2.c
+++ b/plugins/dfcdrom/cdrcfg-0.1df/cfg-gtk2.c
@@ -15,7 +15,7 @@
#include <time.h>
#include <string.h>
-#include "cdr.h"
+#include "../cdr.h"
void LoadConf() {
FILE *f;
diff --git a/plugins/dfcdrom/cfgCdr.glade b/plugins/dfcdrom/cdrcfg-0.1df/cfgCdr.glade
index c926cf08..c926cf08 100644
--- a/plugins/dfcdrom/cfgCdr.glade
+++ b/plugins/dfcdrom/cdrcfg-0.1df/cfgCdr.glade
diff --git a/plugins/dfcdrom/interface.c b/plugins/dfcdrom/cdrcfg-0.1df/interface.c
index 3bb08af6..3bb08af6 100644
--- a/plugins/dfcdrom/interface.c
+++ b/plugins/dfcdrom/cdrcfg-0.1df/interface.c
diff --git a/plugins/dfcdrom/interface.h b/plugins/dfcdrom/cdrcfg-0.1df/interface.h
index e23e1adb..e23e1adb 100644
--- a/plugins/dfcdrom/interface.h
+++ b/plugins/dfcdrom/cdrcfg-0.1df/interface.h
diff --git a/plugins/dfcdrom/main.c b/plugins/dfcdrom/cdrcfg-0.1df/main.c
index 3241561e..3241561e 100644
--- a/plugins/dfcdrom/main.c
+++ b/plugins/dfcdrom/cdrcfg-0.1df/main.c
diff --git a/plugins/dfcdrom/support.c b/plugins/dfcdrom/cdrcfg-0.1df/support.c
index 9da69992..9da69992 100644
--- a/plugins/dfcdrom/support.c
+++ b/plugins/dfcdrom/cdrcfg-0.1df/support.c
diff --git a/plugins/dfcdrom/support.h b/plugins/dfcdrom/cdrcfg-0.1df/support.h
index 2dea079c..2dea079c 100644
--- a/plugins/dfcdrom/support.h
+++ b/plugins/dfcdrom/cdrcfg-0.1df/support.h
diff --git a/plugins/dfcdrom/cfg.c b/plugins/dfcdrom/cfg.c
index ac3e829a..050ed021 100644
--- a/plugins/dfcdrom/cfg.c
+++ b/plugins/dfcdrom/cfg.c
@@ -5,7 +5,7 @@
*
*/
-#ifdef __linux__
+#if defined (__linux__)
#include <stdio.h>
#include <stdlib.h>