summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-06-08 06:22:02 +0000
committerSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-06-08 06:22:02 +0000
commit2bfed965a2f117ee4b96e94c46eb4b4e52fec84c (patch)
tree91d4b2b5ccc31a67377bb8416ab8d0d2c57f9ae8
parentf7d110c7a0ec03491e9fedc70d72a034a4b3dfe8 (diff)
downloadpcsxr-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--ChangeLog7
-rw-r--r--libpcsxcore/plugins.c3
-rw-r--r--plugins/dfcdrom/cdr-linux.c50
-rw-r--r--plugins/dfcdrom/cdr-null.c4
4 files changed, 61 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 191606af..9bce3eec 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;
}