From 2bfed965a2f117ee4b96e94c46eb4b4e52fec84c Mon Sep 17 00:00:00 2001 From: "SND\\weimingzhi_cp" Date: Tue, 8 Jun 2010 06:22:02 +0000 Subject: dfcdrom: implemented CDRreadCDDA() and CDRgetTE() (not tested) git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@51493 e17a0e51-4ae3-4d35-97c3-1a29b211df97 --- plugins/dfcdrom/cdr-linux.c | 50 ++++++++++++++++++++++++++++++++++++++++++++- plugins/dfcdrom/cdr-null.c | 4 ++++ 2 files changed, 53 insertions(+), 1 deletion(-) (limited to 'plugins/dfcdrom') 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; } -- cgit v1.2.3