diff options
| author | SND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2010-06-08 06:22:02 +0000 |
|---|---|---|
| committer | SND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2010-06-08 06:22:02 +0000 |
| commit | 2bfed965a2f117ee4b96e94c46eb4b4e52fec84c (patch) | |
| tree | 91d4b2b5ccc31a67377bb8416ab8d0d2c57f9ae8 | |
| parent | f7d110c7a0ec03491e9fedc70d72a034a4b3dfe8 (diff) | |
| download | pcsxr-2bfed965a2f117ee4b96e94c46eb4b4e52fec84c.tar.gz | |
dfcdrom: implemented CDRreadCDDA() and CDRgetTE() (not tested)
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@51493 e17a0e51-4ae3-4d35-97c3-1a29b211df97
| -rw-r--r-- | ChangeLog | 7 | ||||
| -rw-r--r-- | libpcsxcore/plugins.c | 3 | ||||
| -rw-r--r-- | plugins/dfcdrom/cdr-linux.c | 50 | ||||
| -rw-r--r-- | plugins/dfcdrom/cdr-null.c | 4 |
4 files changed, 61 insertions, 3 deletions
@@ -1,3 +1,10 @@ +Jun 8, 2010 Wei Mingzhi <whistler_wmz@users.sf.net> + + * plugins/dfcdrom/cdr-linux.c: Implemented CDRgetTE() and CDRreadCDDA() (not + tested). + * plugins/dfcdrom/cdr-null.c: Added CDRgetBufferSub(). + * libpcsxcore/plugins.c: CDRgetBufferSub() is now mandatory (again) :) + Jun 7, 2010 Wei Mingzhi <whistler_wmz@users.sf.net> * libpcsxcore/cdrom.c: Use boolean/TRUE/FALSE for where it should, don't use diff --git a/libpcsxcore/plugins.c b/libpcsxcore/plugins.c index 91a199ef..ca62cf2f 100644 --- a/libpcsxcore/plugins.c +++ b/libpcsxcore/plugins.c @@ -228,7 +228,6 @@ long CALLBACK CDR__getStatus(struct CdrStat *stat) { }
char* CALLBACK CDR__getDriveLetter(void) { return NULL; }
-unsigned char* CALLBACK CDR__getBufferSub(void) { return NULL; }
long CALLBACK CDR__configure(void) { return 0; }
long CALLBACK CDR__test(void) { return 0; }
void CALLBACK CDR__about(void) {}
@@ -270,7 +269,7 @@ static int LoadCDRplugin(const char *CDRdll) { LoadCdrSym0(stop, "CDRstop");
LoadCdrSym0(getStatus, "CDRgetStatus");
LoadCdrSym0(getDriveLetter, "CDRgetDriveLetter");
- LoadCdrSym0(getBufferSub, "CDRgetBufferSub");
+ LoadCdrSym1(getBufferSub, "CDRgetBufferSub");
LoadCdrSym0(configure, "CDRconfigure");
LoadCdrSym0(test, "CDRtest");
LoadCdrSym0(about, "CDRabout");
diff --git a/plugins/dfcdrom/cdr-linux.c b/plugins/dfcdrom/cdr-linux.c index 68443ee9..59115390 100644 --- a/plugins/dfcdrom/cdr-linux.c +++ b/plugins/dfcdrom/cdr-linux.c @@ -21,10 +21,20 @@ #define CDROMSETSPINDOWN 0x531e #endif -static inline int msf_to_lba(char m, char s, char f) { +static inline unsigned int msf_to_lba(char m, char s, char f) { return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET; } +static inline void lba_to_msf(unsigned int s, char *msf) { + s += CD_MSF_OFFSET; + + msf[0] = s / CD_FRAMES / CD_SECS; + s = s - msf[0] * CD_FRAMES * CD_SECS; + msf[1] = s / CD_FRAMES; + s = s - msf[1] * CD_FRAMES; + msf[2] = s; +} + int initial_time = 0; pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; @@ -564,6 +574,44 @@ unsigned char *CDRgetBufferSub(void) { return (unsigned char *)&subq; } +// read CDDA sector into buffer +long CDRreadCDDA(unsigned char m, unsigned char s, unsigned char f, unsigned char *buffer) { + unsigned char msf[3] = {m, s, f}; + unsigned char *p; + + if (CDRreadTrack(msf) != 0) return -1; + + p = CDRgetBuffer(); + if (p == NULL) return -1; + + memcpy(buffer, p - 12, 2352); // copy from the beginning of the sector + return 0; +} + +// get Track End Time +long CDRgetTE(unsigned char track, unsigned char *m, unsigned char *s, unsigned char *f) { + struct cdrom_tocentry entry; + char msf[3]; + + if (cdHandle < 1) return -1; + + track++; + + entry.cdte_track = track; + entry.cdte_format = CDROM_MSF; + + if (ioctl(cdHandle, CDROMREADTOCENTRY, &entry) == -1) + return -1; + + lba_to_msf(msf_to_lba(entry.cdte_addr.msf.minute, entry.cdte_addr.msf.second, entry.cdte_addr.msf.frame) - CD_MSF_OFFSET, msf); + + *m = msf[0]; + *s = msf[1]; + *f = msf[2]; + + return 0; +} + void ExecCfg(char *arg) { char cfg[256]; struct stat buf; diff --git a/plugins/dfcdrom/cdr-null.c b/plugins/dfcdrom/cdr-null.c index 9b2923d1..abaf2207 100644 --- a/plugins/dfcdrom/cdr-null.c +++ b/plugins/dfcdrom/cdr-null.c @@ -44,6 +44,10 @@ unsigned char *CDRgetBuffer(void) { return NULL; } +unsigned char *CDRgetBufferSub(void) { + return NULL; +} + long CDRplay(unsigned char *sector) { return 0; } |
