diff options
| author | SND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2009-11-26 06:41:17 +0000 |
|---|---|---|
| committer | SND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2009-11-26 06:41:17 +0000 |
| commit | acd164d56c60efd57a87c0cbe53fe6aee3be6696 (patch) | |
| tree | f9de10a5ff2039170952a910920496a77ac825da /plugins | |
| parent | 9b9ad9958e1e373fa8804e5866e77d9f40b5d624 (diff) | |
| download | pcsxr-acd164d56c60efd57a87c0cbe53fe6aee3be6696.tar.gz | |
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@38248 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/dfcdrom/Makefile.am | 4 | ||||
| -rw-r--r-- | plugins/dfcdrom/Makefile.in | 75 | ||||
| -rw-r--r-- | plugins/dfcdrom/cdr-linux.c | 598 | ||||
| -rw-r--r-- | plugins/dfcdrom/cdr-null.c | 88 | ||||
| -rw-r--r-- | plugins/dfcdrom/cdr.c | 656 | ||||
| -rw-r--r-- | plugins/dfcdrom/cdr.h | 6 | ||||
| -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.c | 2 |
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> |
