git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@38248 e17a0e51-4ae3-4d35-97c3-1a29b211df97
This commit is contained in:
parent
9b9ad9958e
commit
acd164d56c
20
ChangeLog
20
ChangeLog
|
@ -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.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
pcsxr (2:1.9.83-1) unstable; urgency=low
|
||||
pcsxr (2:1.9.91-1) unstable; urgency=low
|
||||
|
||||
* Initial Release.
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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() {
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "cdr.h"
|
||||
#include "../cdr.h"
|
||||
#include "callbacks.h"
|
||||
#include "interface.h"
|
||||
#include "support.h"
|
|
@ -15,7 +15,7 @@
|
|||
#include <time.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "cdr.h"
|
||||
#include "../cdr.h"
|
||||
|
||||
void LoadConf() {
|
||||
FILE *f;
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#ifdef __linux__
|
||||
#if defined (__linux__)
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
|
Loading…
Reference in New Issue