From 0538ed8780e71ce3d0aa1cf006a1ae1800819be0 Mon Sep 17 00:00:00 2001 From: faust3 Date: Sun, 6 Nov 2005 17:42:20 +0000 Subject: make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia patch by Erik Lunchpail base on patch by Rocky Bernstein minor modification by myself git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@16936 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpdemux/cddb.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) (limited to 'libmpdemux/cddb.c') diff --git a/libmpdemux/cddb.c b/libmpdemux/cddb.c index 8fe59db0be..04bd83d5fa 100644 --- a/libmpdemux/cddb.c +++ b/libmpdemux/cddb.c @@ -21,10 +21,18 @@ #include #include #include -#include #include #include +#ifdef WIN32 +#ifdef __MINGW32__ +#define mkdir(a,b) mkdir(a) +#endif +#include +#include +#else +#include #include +#endif #include #include @@ -32,6 +40,8 @@ #include #elif defined(__FreeBSD__) || defined(__bsdi__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) #include +#elif defined(WIN32) + #include #endif #include "cdd.h" @@ -83,6 +93,41 @@ read_toc(const char *dev) { return tochdr.cdth_trk1; } +#elif defined(WIN32) +int +read_toc(const char *dev) { + HANDLE drive; + DWORD r; + CDROM_TOC toc; + char device[10]; + int i; + + sprintf(device, "\\\\.\\%s", dev); + drive = CreateFile(device, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); + + if(!DeviceIoControl(drive, IOCTL_CDROM_READ_TOC, NULL, 0, &toc, sizeof(CDROM_TOC), &r, 0)) { + mp_msg(MSGT_OPEN, MSGL_ERR, "Failed to read TOC.\n"); + return 0; + } + + for (i = toc.FirstTrack; i <= toc.LastTrack; i++) { + toc.FirstTrack = i; + cdtoc[i-1].min = toc.TrackData[i - 1].Address[1]; + cdtoc[i-1].sec = toc.TrackData[i - 1].Address[2]; + cdtoc[i-1].frame = toc.TrackData[i - 1].Address[3]; + cdtoc[i-1].frame += cdtoc[i-1].min*60*75; + cdtoc[i-1].frame += cdtoc[i-1].sec*75; + } + toc.FirstTrack = 0xAA; + cdtoc[toc.LastTrack].min = toc.TrackData[toc.LastTrack].Address[1]; + cdtoc[toc.LastTrack].sec = toc.TrackData[toc.LastTrack].Address[2]; + cdtoc[toc.LastTrack].frame = toc.TrackData[toc.LastTrack].Address[3]; + cdtoc[toc.LastTrack].frame += cdtoc[toc.LastTrack].min*60*75; + cdtoc[toc.LastTrack].frame += cdtoc[toc.LastTrack].sec*75; + CloseHandle(drive); + return toc.LastTrack; +} + #elif defined(__FreeBSD__) || defined(__bsdi__) || defined(__DragonFly__) int read_toc(const char *dev) { @@ -281,7 +326,11 @@ cddb_read_cache(cddb_data_t *cddb_data) { sprintf( file_name, "%s%08lx", cddb_data->cache_dir, cddb_data->disc_id); - file_fd = open(file_name, O_RDONLY); + file_fd = open(file_name, O_RDONLY +#ifdef WIN32 + | O_BINARY +#endif + ); if( file_fd<0 ) { printf("No cache found\n"); return -1; @@ -328,7 +377,11 @@ cddb_write_cache(cddb_data_t *cddb_data) { if( ret<0 ) { // Directory not present, create it. ret = mkdir( cddb_data->cache_dir, 0755 ); +#ifdef __MINGW32__ + if( ret<0 && errno != EEXIST ) { +#else if( ret<0 ) { +#endif perror("mkdir"); printf("Failed to create directory %s\n", cddb_data->cache_dir ); return -1; @@ -674,6 +727,12 @@ cddb_resolve(const char *dev, char **xmcd_file) { } home_dir = getenv("HOME"); +#ifdef __MINGW32__ + if( home_dir==NULL ) home_dir = getenv("USERPROFILE"); + if( home_dir==NULL ) home_dir = getenv("HOMEPATH"); + // Last resort, store the cddb cache in the mplayer directory + if( home_dir==NULL ) home_dir = (char *)get_path(""); +#endif if( home_dir==NULL ) { cddb_data.cache_dir = NULL; } else { -- cgit v1.2.3