summaryrefslogtreecommitdiff
path: root/plugins/dfcdrom
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 /plugins/dfcdrom
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
Diffstat (limited to 'plugins/dfcdrom')
-rw-r--r--plugins/dfcdrom/cdr-linux.c50
-rw-r--r--plugins/dfcdrom/cdr-null.c4
2 files changed, 53 insertions, 1 deletions
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;
}