summaryrefslogtreecommitdiff
path: root/macosx/plugins
diff options
context:
space:
mode:
authorSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-07-25 02:48:41 +0000
committerSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-07-25 02:48:41 +0000
commit8da3cda2b3d231298d3dd602fe879521106e91c2 (patch)
treef81ab640723833868dac053d2d077a1a01406d58 /macosx/plugins
parent363d5e10353d32be5ef56ce988358bcf3811245b (diff)
downloadpcsxr-8da3cda2b3d231298d3dd602fe879521106e91c2.tar.gz
Ported DFCdrom to osx, removed old CDDeviceInterface plugin
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@55123 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'macosx/plugins')
-rwxr-xr-xmacosx/plugins/CDDeviceInterface/English.lproj/InfoPlist.stringsbin558 -> 0 bytes
-rw-r--r--macosx/plugins/CDDeviceInterface/src/PlugCD.c901
-rw-r--r--macosx/plugins/CDDeviceInterface/src/PlugCD.h120
-rw-r--r--macosx/plugins/DFCdrom/DFCdrom.xcodeproj/project.pbxproj (renamed from macosx/plugins/CDDeviceInterface/CDDeviceInterfacePlugin.xcodeproj/project.pbxproj)135
-rw-r--r--macosx/plugins/DFCdrom/English.lproj/Credits.rtf13
-rw-r--r--macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/classes.nib18
-rw-r--r--macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/info.nib16
-rw-r--r--macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/keyedobjects.nibbin0 -> 8896 bytes
-rwxr-xr-xmacosx/plugins/DFCdrom/English.lproj/InfoPlist.stringsbin0 -> 486 bytes
-rw-r--r--macosx/plugins/DFCdrom/Info.plist (renamed from macosx/plugins/CDDeviceInterface/Info.plist)4
-rw-r--r--macosx/plugins/DFCdrom/macsrc/PluginConfigController.h18
-rw-r--r--macosx/plugins/DFCdrom/macsrc/PluginConfigController.m158
-rw-r--r--macosx/plugins/DFCdrom/macsrc/cdr-macosx.c215
-rw-r--r--macosx/plugins/DFCdrom/macsrc/cfg.c53
-rw-r--r--macosx/plugins/DFCdrom/version.plist (renamed from macosx/plugins/CDDeviceInterface/version.plist)2
15 files changed, 592 insertions, 1061 deletions
diff --git a/macosx/plugins/CDDeviceInterface/English.lproj/InfoPlist.strings b/macosx/plugins/CDDeviceInterface/English.lproj/InfoPlist.strings
deleted file mode 100755
index 3f9ed475..00000000
--- a/macosx/plugins/CDDeviceInterface/English.lproj/InfoPlist.strings
+++ /dev/null
Binary files differ
diff --git a/macosx/plugins/CDDeviceInterface/src/PlugCD.c b/macosx/plugins/CDDeviceInterface/src/PlugCD.c
deleted file mode 100644
index 18e848bf..00000000
--- a/macosx/plugins/CDDeviceInterface/src/PlugCD.c
+++ /dev/null
@@ -1,901 +0,0 @@
-/***************************************************************************
- PlugCD.c
- CDDeviceInterface
-
- Created by Gil Pedersen on Fri July 18 2003.
- Copyright (c) 2003,2004 Gil Pedersen.
- ***************************************************************************/
-
-/***************************************************************************
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. See also the license.txt file for *
- * additional informations. *
- * *
- ***************************************************************************/
-
-#include <string.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <paths.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <pthread.h>
-#include <mach/mach_port.h>
-
-#include <IOKit/IOKitLib.h>
-#include <IOKit/IOBSD.h>
-#include <IOKit/storage/IOCDMedia.h>
-#include <IOKit/storage/IODVDMedia.h>
-#include <IOKit/storage/IOMedia.h>
-#include <IOKit/storage/IOCDTypes.h>
-#include <IOKit/storage/IOCDMediaBSDClient.h>
-#include <IOKit/scsi/SCSITaskLib.h>
-#include <CoreFoundation/CoreFoundation.h>
-
-//#include "plugins.h"
-#include "PlugCD.h"
-
-//#define USE_DEVICE_INTERFACE
-
-long CDRclose(void);
-
-/////////////////////////////////////////////////////////
-typedef void* HWND;
-#include "psemu_plugin_defs.h"
-
-const char *LibName = "CD-ROM Device Interface";
-const int version = 0;
-const int revision = 1;
-const int build = 0;
-
-const char *PSEgetLibName(void) {
- return LibName;
-}
-
-unsigned long PSEgetLibType(void) {
- return PSE_LT_CDR;
-}
-
-unsigned long PSEgetLibVersion(void) {
- return version << 16 | revision << 8 | build;
-}
-/////////////////////////////////////////////////////////
-
-//#define SysPrintf printf
-#define SysPrintf(...) ((void)0)
-
-#define UseMultiThreaded 1
-#define NoIdleSleep 1
-
-struct CdrStat {
- unsigned long Type;
- unsigned long Status;
- unsigned char Time[3];
-};
-
-MMCDeviceInterface **cdInterface;
-pthread_t readThread;
-pthread_cond_t readCond;
-pthread_mutex_t readMutex;
-char deviceFilePath[ 256 ];
-
-kern_return_t FindEjectableCDMedia( io_iterator_t *mediaIterator, mach_port_t *masterPort )
-{
- kern_return_t kernResult;
- CFMutableDictionaryRef classesToMatch;
- int i;
-
- kernResult = IOMasterPort( bootstrap_port, masterPort );
- if ( kernResult != KERN_SUCCESS )
- {
- SysPrintf( "IOMasterPort returned %d\n", kernResult );
- return kernResult;
- }
-
- for (i = 0; i < 2; i++)
- {
- // CD media are instances of class kIOCDMediaClass/kIODVDMediaClass.
- classesToMatch = IOServiceMatching( (i == 0) ? kIOCDMediaClass : kIODVDMediaClass );
-
- if ( classesToMatch == NULL )
- {
- SysPrintf( "IOServiceMatching returned a NULL dictionary.\n" );
- continue;
- }
- else
- {
- // Each IOMedia object has a property with key kIOMediaEjectable
- // which is true if the media is indeed ejectable. So add property
- // to CFDictionary for matching.
- CFDictionarySetValue( classesToMatch,
- CFSTR( kIOMediaEjectableKey ), kCFBooleanTrue );
- }
- kernResult = IOServiceGetMatchingServices( *masterPort,
- classesToMatch, mediaIterator );
- if ( (kernResult != KERN_SUCCESS) || (*mediaIterator == NULL) )
- SysPrintf( "No ejectable CD media found.\n kernResult = %d\n", kernResult );
- else
- break;
- }
-
- return kernResult;
-}
-
-kern_return_t GetDeviceFilePath( io_service_t media,
- char *deviceFilePath, CFIndex maxPathSize )
-{
- kern_return_t kernResult = KERN_FAILURE;
- CFTypeRef deviceFilePathAsCFString;
-
- deviceFilePathAsCFString = IORegistryEntryCreateCFProperty(
- media, CFSTR( kIOBSDNameKey ),
- kCFAllocatorDefault, 0 );
- *deviceFilePath = '\0';
- if ( deviceFilePathAsCFString )
- {
- size_t devPathLength = strlen( _PATH_DEV )+0;//+1;
-
- strcpy( deviceFilePath, _PATH_DEV );
- // Add "r" before the BSD node name from the I/O Registry
- // to specify the raw disk node. The raw disk node receives
- // I/O requests directly and does not go through the
- // buffer cache.
- // strcat( deviceFilePath, "r"); // apparently som cd-rom drives don't like this
-
- if ( CFStringGetCString( deviceFilePathAsCFString,
- deviceFilePath + devPathLength,
- maxPathSize - devPathLength,
- kCFStringEncodingASCII ) )
- {
- SysPrintf( "BSD path: %s\n", deviceFilePath );
- kernResult = KERN_SUCCESS;
- }
- CFRelease( deviceFilePathAsCFString );
- }
-
- return kernResult;
-}
-
-MMCDeviceInterface ** GetMMCInterfaceForDevice(io_service_t service)
-{
- SInt32 score;
- HRESULT herr;
- kern_return_t err;
- IOCFPlugInInterface **plugInInterface = NULL;
- MMCDeviceInterface **mmcInterface = NULL;
-
- // Create the IOCFPlugIn interface so we can query it.
- err = IOCreatePlugInInterfaceForService ( service,
- kIOMMCDeviceUserClientTypeID,
- kIOCFPlugInInterfaceID,
- &plugInInterface,
- &score );
-
- if ( err != noErr )
- {
- SysPrintf("IOCreatePlugInInterfaceForService returned %d\n", err);
- return NULL;
- }
-
- // Query the interface for the MMCDeviceInterface.
- herr = ( *plugInInterface )->QueryInterface ( plugInInterface,
- CFUUIDGetUUIDBytes ( kIOMMCDeviceInterfaceID ),
- ( LPVOID ) &mmcInterface );
- if ( herr != S_OK )
- {
- SysPrintf("QueryInterface returned %ld\n", herr);
- return NULL;
- }
-
-// ( *mmcInterface )->Release ( mmcInterface );
-// IODestroyPlugInInterface ( plugInInterface );
-
- return mmcInterface;
-}
-
-int GetCDROMServices()
-{
- mach_port_t masterPort;
- CFMutableDictionaryRef matchingDict;
- CFMutableDictionaryRef subDict;
- io_service_t nextDevice;
- io_iterator_t iterator;
- kern_return_t kr;
- int retVal = -1;
-
- // first create a master_port for my task
- kr = IOMasterPort(MACH_PORT_NULL, &masterPort);
- if (kr || !masterPort)
- {
- SysPrintf("ERR: Couldn't create a master IOKit Port(%08x)\n", kr);
- return -1;
- }
-
- // Create the dictionaries
- matchingDict = CFDictionaryCreateMutable ( kCFAllocatorDefault, 0, NULL, NULL );
- subDict = CFDictionaryCreateMutable ( kCFAllocatorDefault, 0, NULL, NULL );
-
- // Create a dictionary with the "SCSITaskDeviceCategory" key = "SCSITaskAuthoringDevice"
- // TODO: examine if this also work on non-authoring capable devices
- CFDictionarySetValue ( subDict,
- CFSTR ( kIOPropertySCSITaskDeviceCategory ),
- CFSTR ( kIOPropertySCSITaskAuthoringDevice ) );
-
- // Add the dictionary to the main dictionary with the key "IOPropertyMatch" to
- // narrow the search to the above dictionary.
- CFDictionarySetValue ( matchingDict,
- CFSTR ( kIOPropertyMatchKey ),
- subDict );
-
-
- kr = IOServiceGetMatchingServices( masterPort,
- matchingDict, &iterator );
- if ( (kr != KERN_SUCCESS) || (iterator == NULL) ) {
- SysPrintf( "No CDROM drives found.\n kernResult = %d\n", kr );
- goto error;
- }
-
- // Find best cdrom drive - i.e. the first :-)
- while(nextDevice = IOIteratorNext( iterator )) {
- cdInterface = GetMMCInterfaceForDevice(nextDevice);
- kr = IOObjectRelease(nextDevice);
- break; // hack
- }
- IOObjectRelease( iterator );
-
- retVal = 0;
-error:
- // Now done with the master_port
- if (masterPort)
- mach_port_deallocate(mach_task_self(), masterPort);
-
- return retVal;
-}
-
-/* determine if the tray is open for our cd-drive */
-int TrayIsOpen()
-{
-#ifdef USE_DEVICE_INTERFACE
- if (cdInterface) {
- if ((*cdInterface)->GetTrayState) {
- IOReturn res;
- char state;
-
- res = (*cdInterface)->GetTrayState(cdInterface, &state);
- if (kIOReturnSuccess == res) {
- if (kMMCDeviceTrayOpen == state)
- return true;
- }
- }
- }
-#endif
- return true;
-}
-
-/* opens tray if no media is in the device */
-void TrayOpen()
-{
- if (TrayIsOpen())
- return;
-
- if (cdInterface) {
- if ((*cdInterface)->SetTrayState) {
- (*cdInterface)->SetTrayState(cdInterface, kMMCDeviceTrayOpen);
- }
- }
-}
-
-long openDisc()
-{
- mach_port_t masterPort = NULL;
- kern_return_t kernResult;
- io_iterator_t mediaIterator;
- io_service_t media;
- CFTypeRef toc_cf;
- //dk_cd_read_disc_info_t cd_read_disc_info;
- //dk_cd_read_track_info_t cd_read_track_info;
- //CDDiscInfo di; CDTrackInfo ti;
- u_int16_t speed;
- int i;
-
- CD.cd = 0;
- CD.status = 0x10;
-
- // Find 1st CD
- kernResult = FindEjectableCDMedia( &mediaIterator, &masterPort );
- if ( kernResult != KERN_SUCCESS )
- return -1;
-
- media = IOIteratorNext( mediaIterator );
- if (NULL == media)
- return -1;
-
- // Release the iterator.
- IOObjectRelease( mediaIterator );
-
- // Get The device path
- kernResult = GetDeviceFilePath( media, deviceFilePath,
- sizeof( deviceFilePath ) );
- if ( kernResult != KERN_SUCCESS )
- return -1;
-
- toc_cf = IORegistryEntryCreateCFProperty(media,CFSTR(kIOCDMediaTOCKey),kCFAllocatorDefault,0);
- if(toc_cf != nil)
- {
- CDTOC *toc = (CDTOC *)CFDataGetBytePtr(toc_cf);
- int ndesc;
-
- ndesc = CDTOCGetDescriptorCount(toc);
- if (CD.tl) free(CD.tl);
- CD.tl = calloc(ndesc, sizeof(Track));
- if (NULL == CD.tl)
- return -1;
-
- CD.numtracks = 0;
- for (i=0; i<ndesc; i++)
- {
- CDTOCDescriptor *desc = &toc->descriptors[i];
-
- if(desc->point < 100)
- {
- CD.tl[CD.numtracks].type = ((desc->control & 0x0f) != 0) ? Mode2 : Audio; // TODO: set correct type
- CD.tl[CD.numtracks].num = desc->point;
- CD.tl[CD.numtracks].start[2] = desc->p.frame;
- CD.tl[CD.numtracks].start[1] = desc->p.second;
- CD.tl[CD.numtracks].start[0] = desc->p.minute;
-
- if (CD.numtracks) {
- CD.tl[CD.numtracks-1].end[2] = desc->p.frame;
- CD.tl[CD.numtracks-1].end[1] = desc->p.second;
- CD.tl[CD.numtracks-1].end[0] = desc->p.minute;
- }
- //normalizeTime(CD.tl[0].start);
- //normalizeTime(CD.tl[0].end);
- CD.numtracks++;
- }
- }
- CDMSF end = CDConvertTrackNumberToMSF(0xa2, toc);
- CD.tl[CD.numtracks-1].end[2] = end.frame;
- CD.tl[CD.numtracks-1].end[1] = end.second;
- CD.tl[CD.numtracks-1].end[0] = end.minute;
-
- CFRelease(toc_cf);
- } else {
- SysPrintf("failed to read cdrom toc information\n");
- IOObjectRelease( mediaIterator );
- return -1;
- }
-
- IOObjectRelease( media );
-
- // Free master port if we created one.
- if (masterPort)
- mach_port_deallocate(mach_task_self(), masterPort);
-
- // Now open it
- CD.cd = open(deviceFilePath, O_RDONLY, 0);
- if (CD.cd <= 0) {
- perror("failed to open cd: ");
- CD.cd = 0;
- return -1;
- }
-
- // get number of tracks
-/* memset(&cd_read_disc_info, 0, sizeof(dk_cd_read_disc_info_t));
- cd_read_disc_info.bufferLength = sizeof(CDDiscInfo);
- cd_read_disc_info.buffer = &di;
- if (ioctl(CD.cd, DKIOCCDREADDISCINFO, &cd_read_disc_info) < 0) {
- perror("error reading cd info: ");
- CD.numtracks = 1;
- }
- else {
- CD.numtracks = di.lastTrackNumberInLastSessionLSB-di.firstTrackNumberInLastSessionLSB+1;
- }
-
- CD.tl = calloc(CD.numtracks, sizeof(Track));
- for (i=0; i<CD.numtracks; i++)
- {
- int blocks;
- memset(&cd_read_track_info, 0, sizeof(dk_cd_read_track_info_t));
- cd_read_track_info.address = di.firstTrackNumberInLastSessionLSB+i;
- cd_read_track_info.addressType = kCDTrackInfoAddressTypeTrackNumber;
- cd_read_track_info.bufferLength = sizeof(CDTrackInfo);
- cd_read_track_info.buffer = &ti;
- if (ioctl(CD.cd, DKIOCCDREADTRACKINFO, &cd_read_track_info) < 0) {
- perror("error reading track info");
- close(CD.cd); CD.cd = 0;
- return -1;
- }
-
- //SysPrintf("Track %i: %i - %i\n", di.firstTrackNumberInLastSessionLSB+i,
- // ti.trackStartAddress, ti.trackSize);
-
- CD.tl[i].type = ti.trackMode ? Mode2 : Audio; // TODO: set correct type
- CD.tl[i].num = ti.trackNumberLSB;
- blocks = ti.trackStartAddress;
- CD.tl[i].start[2] = blocks % 75;
- CD.tl[i].start[1] = ((blocks - CD.tl[i].end[2]) / 75) % 60;
- CD.tl[i].start[0] = (((blocks - CD.tl[i].end[2]) / 75) - CD.tl[i].end[1]) / 60;
- blocks += ti.trackSize;
- CD.tl[i].end[2] = blocks % 75;
- CD.tl[i].end[1] = ((blocks - CD.tl[i].end[2]) / 75) % 60;
- CD.tl[i].end[0] = (((blocks - CD.tl[i].end[2]) / 75) - CD.tl[i].end[1]) / 60;
-
- normalizeTime(CD.tl[i].start);
- normalizeTime(CD.tl[i].end);
- }*/
-
- speed = kCDSpeedMin*4; // 4x
- if (ioctl(CD.cd, DKIOCCDSETSPEED, &speed) < 0)
- perror("couldn't set cd speed");
-
- CD.sectorType = kCDSectorTypeMode2Form1;
- CD.bufferSize = 0;
- CD.bufferPos = 0x7FFFFFFF;
- CD.status = 0x00;
-
-// fcntl(CD.cd, F_RDAHEAD, 1);
-// fcntl(CD.cd, F_NOCACHE, 0);
- fcntl(CD.cd, F_RDAHEAD, 0);
- fcntl(CD.cd, F_NOCACHE, 1);
-
- return 0;
-}
-
-// gets track
-long getTN(unsigned char* buffer)
-{
- int numtracks = getNumTracks();
-
- if (-1 == numtracks)
- {
- buffer[0]=buffer[1]=1;
- return -1;
- }
-
- buffer[0]=CD.tl[0].num;
- buffer[1]=numtracks;
- return 0;
-}
-
- // if track==0 -> return total length of cd
- // otherwise return start in bcd time format
-long getTD(int track, unsigned char* buffer)
-{
- // lasttrack just keeps track of which track TD was requested last (go fig)
-
- if (track > getNumTracks())
- {
-// SysPrintf("getTD bad %2d\n", track);
- return -1;
- }
-
- if (track == 0)
- {
- buffer[0] = CD.tl[CD.numtracks-1].end[0];
- buffer[1] = CD.tl[CD.numtracks-1].end[1];
- buffer[2] = CD.tl[CD.numtracks-1].end[2];
- }
- else
- {
- buffer[0] = CD.tl[track-1].start[0];
- buffer[1] = CD.tl[track-1].start[1];
- buffer[2] = CD.tl[track-1].start[2];
- }
-// SysPrintf("getTD %2d %02d:%02d:%02d\n", track, (int)buffer[0],
-// (int)buffer[1], (int)buffer[2]);
-
- // bcd encode it
- buffer[0] = intToBCD(buffer[0]);
- buffer[1] = intToBCD(buffer[1]);
- buffer[2] = intToBCD(buffer[2]);
-// SysPrintf("end getTD()\r\n");
- return 0;
-}
-
-// return the sector address - the buffer address + 12 bytes for subheader offset.
-unsigned char* getSector(int subchannel)
-{
- SysPrintf("getSector()\n");
-
- if (readThread) {
- int err;
- // wait until we can obtain a lock */
- err = pthread_mutex_lock(&readMutex);
- if (err != 0) {
- SysPrintf("failed to lock mutex, error = %i\n", err);
- } else {
- err = pthread_mutex_unlock(&readMutex);
- if (err != 0) {
- SysPrintf("failed to unlock mutex, error = %i\n", err);
- }
- }
- }
-
- if (CD.sector == -1)
- return NULL;
- else {
- return CD.buffer /*+ (CD.sector - CD.bufferPos)*/ + ((subchannel) ? 0 : 12);
- }
-}
-
-// returns the number of tracks
-char getNumTracks()
-{
-// SysPrintf("start getNumTracks()\r\n");
- // if there's no open cd, return -1
- if (CD.cd == 0) {
- return -1;
- }
-
-// SysPrintf("numtracks %d\n",CD.numtracks);
-// SysPrintf("end getNumTracks()\r\n");
- return CD.numtracks;
-}
-
-// read the sector pointed to by pos
-int readSector(off_t pos, unsigned char *buffer)
-{
- int len;
-
- SysPrintf("start readit()\n");
-
- if (0 == CD.cd)
- return 0;
-
- // go to the sector
- pos = lseek(CD.cd, pos, SEEK_SET);
- if (pos < 0)
- goto error;
-
- // and read it into the buffer
- len = read(CD.cd, buffer, 2352);
- if (len < 2352)
- goto error;
-
- SysPrintf("end readit()\n");
- return 2352;
-
-error:
- perror("CD read error");
- return 0;
-}
-
-void seekSector(const unsigned char m, const unsigned char s, const unsigned char f)
-{
- int err;
- SysPrintf("start seekSector()\n");
-
- if (0 == CD.cd)
- return;
-
- if (readThread) {
- // wait until we're done reading
- err = pthread_mutex_lock(&readMutex);
- if (err != 0) {
- SysPrintf("failed to lock mutex, error = %i\n", err);
- } else {
- // calc byte to search for
- CD.sector = (( (m * 60) + (s - 2)) * 75 + f) * 2352;
-
- // unlock again, since the mutex won't be set until
- // we signal a cond later in this function
- err = pthread_mutex_unlock(&readMutex);
- if (err != 0) {
- SysPrintf("failed to unlock mutex, error = %i\n", err);
- }
- }
- } else {
- // calc byte to search for
- CD.sector = (( (m * 60) + (s - 2)) * 75 + f) * 2352;
- }
-// SysPrintf("seek %d %02d:%02d:%02d",CD.sector, (int)m, (int)s, (int)f);
-
- // is it cached?
-#if 0
- if ((CD.sector >= CD.bufferPos) &&
- (CD.sector < (CD.bufferPos + CD.bufferSize)) ) {
-// SysPrintf(" cached %d %d\n",CD.sector - CD.bufferPos,BUFFER_SIZE);
-// SysPrintf("end seekSector()\r\n");
- return;
- }
- // not cached - read a few blocks into the cache
- else
-#endif
- {
- if (readThread) {
- SysPrintf("end seekSector()\n");
-
- // signal that a new sector is ready to be read
- if (pthread_cond_broadcast(&readCond) == 0)
- return;
-
- SysPrintf("failed to signal 'readCond'\n");
- }
-
- CD.bufferSize = readSector(CD.sector, CD.buffer);
- if (CD.bufferSize==0) CD.sector = -1;
- else CD.bufferPos = CD.sector;
- }
- SysPrintf("end seekSector()\n");
-}
-
-/* handles reading from the cd */
-void *read_thread(void *arg)
-{
- struct timespec dT = { 20, 0 }; // 20 s
- //struct timespec dT = { 0, 400*1000*1000 }; // 400 ms
- int err;
-
- pthread_mutex_lock(&readMutex);
- //pthread_cleanup_push(pthread_exit, 0);
-
- for (;;) {
- // wait until we're signalled
- if (NoIdleSleep) {
- err = pthread_cond_timedwait_relative_np(&readCond, &readMutex, &dT);
- pthread_testcancel();
- } else {
- err = pthread_cond_wait(&readCond, &readMutex);
- }
- if (err == EINVAL) {
- SysPrintf("failed cond wait for 'readCond', error = %i\n", err);
- return (void *)-1;
- }
-
- CD.bufferSize = readSector(CD.sector, CD.buffer);
- if (CD.bufferSize==0) CD.sector = -1;
- else CD.bufferPos = CD.sector;
- }
- //pthread_cleanup_pop(1);
-
- return 0;
-}
-
-long CDRopen(void)
-{
- SysPrintf("CDR_open()\n");
- if (UseMultiThreaded && !readThread) {
- int err;
-
- err = pthread_cond_init(&readCond, NULL);
- if (err != 0) {
- SysPrintf("failed to create conditional, error=%i\n"
- "going to single thread mode\n", err);
- } else {
- err = pthread_mutex_init(&readMutex, NULL);
- if (err != 0) {
- SysPrintf("failed to create mutex, error=%i\n"
- "going to single thread mode\n", err);
- } else {
- struct sched_param params;
- int policy;
-
- err = pthread_create(&readThread, NULL, read_thread, NULL);
- if (err!=0) {
- SysPrintf("failed to create read thread, error=%i\n"
- "going to single thread mode\n", err);
- } else {
- // set the thread to maximum priority
- pthread_getschedparam(readThread, &policy, &params);
- params.sched_priority = sched_get_priority_max(policy);
- pthread_setschedparam(readThread, policy, &params);
- }
- }
- }
- }
-
- if (openDisc() < 0) {
- TrayOpen();
- return 0;
- }
-
- seekSector(0,2,0);
-
- SysPrintf("end CDR_open()\n");
- return 0;
-}
-
-long CDRinit(void) {
-
-#ifdef USE_DEVICE_INTERFACE
- return GetCDROMServices();
-#endif
-
- return 0;
-}
-
-long CDRshutdown(void) {
- // do cleanup
- CDRclose();
-
- return 0;
-}
-
-long CDRclose(void) {
- SysPrintf("start CDR_close()\n");
-
- if (!CD.cd)
- return 0;
-
- if (readThread) {
- int termVal = 0;
- // make sure we're done reading
- pthread_mutex_lock(&readMutex);
- pthread_mutex_unlock(&readMutex);
-
- // kill read thread
- pthread_cancel(readThread);
- //pthread_kill(readThread, SIGTERM);
- pthread_cond_broadcast(&readCond);
- pthread_join(readThread, (void **)&termVal);
-
- // remove fluff
- pthread_mutex_destroy(&readMutex);
- pthread_cond_destroy(&readCond);
-
- readThread = 0;
- }
-
- close(CD.cd);
- CD.cd = 0;
-
- SysPrintf("end CDR_close()\n");
- return 0;
-}
-
-long CDRgetTN(unsigned char *buffer) {
- //SysPrintf("start CDRgetTN()\n");
- return getTN(buffer);
-}
-
-long CDRgetTD(unsigned char track, unsigned char *buffer) {
- unsigned char temp[3];
- int result = getTD((int)track, temp);
-
- // SysPrintf("start CDRgetTD()\n");
-
- if (result == -1) return -1;
-
- buffer[1] = temp[1];
- buffer[2] = temp[0];
-
- return 0;
-}
-
-/* called when the psx requests a read */
-long CDRreadTrack(unsigned char *time) {
-// SysPrintf("start CDR_readTrack()\r\n");
- //SysPrintf("readTrack at %02d:%02d:%02d\n", BCDToInt(time[0]), BCDToInt(time[1]), BCDToInt(time[2]));
-
- if (CD.cd != 0)
- seekSector(BCDToInt(time[0]), BCDToInt(time[1]), BCDToInt(time[2]));
-
-// SysPrintf("end CDR_readTrack()\r\n");
- return PSE_CDR_ERR_SUCCESS;
-}
-
-/* called after the read should be finished, and the data is needed */
-unsigned char *CDRgetBuffer(void) {
- //SysPrintf("start CDR_getBuffer()\n");
-// SysPrintf("start CDR_getBuffer()\r\n");
- if (CD.cd == 0)
- return NULL;
-
- return getSector(0);
-}
-
-unsigned char *CDRgetBufferSub(void) {
- //SysPrintf("start CDR_getBuffer()\n");
-// SysPrintf("start CDR_getBuffer()\r\n");
- return getSector(1);
-}
-
-/* from PSX manual p. 83 */
-#define CDR_STATUS_UNKNOWN 0x00
-#define CDR_STATUS_ERROR 0x02 /* command error detected */
-#define CDR_STATUS_STANDBY 0x04 /* spindle motor rotating */
-#define CDR_STATUS_SEEK_ERROR 0x08 /* seek error detected */
-#define CDR_STATUS_SHELL_OPEN 0x10 /* once shell open */
-#define CDR_STATUS_READING 0x20 /* reading data sectors */
-#define CDR_STATUS_SEEKING 0x40
-#define CDR_STATUS_PLAYING 0x80 /* playing CD-DA */
-
-// reads cdr status - from old plugin
-// type:
-// 0x00 - unknown
-// 0x01 - data
-// 0x02 - audio
-// 0xff - no cdrom
-// status: (only shell open supported)
-// 0x00 - unknown
-// 0x01 - error
-// 0x04 - seek error -> no disk???
-// 0x10 - shell open -> tray open
-// 0x20 - reading
-// 0x40 - seeking
-// 0x80 - playing
-// time:
-// byte 0 - minute
-// byte 1 - second
-// byte 2 - frame
-
-long CDRgetStatus(struct CdrStat *stat)
-{
- if (CD.cd == 0) {
- // no cd - check for disc
- if (openDisc() < 0) {
- if (TrayIsOpen()) {
- stat->Type = 0xff;//0x00;
- stat->Status |= CDR_STATUS_SHELL_OPEN;
- } else {
- TrayOpen();
- stat->Type = 0xff; // indicates no cd
- stat->Status = CDR_STATUS_UNKNOWN;
- }
- stat->Time[0] =
- stat->Time[1] =
- stat->Time[2] = 0;
- return 0;
- }
- }
-
- if (CD.tl[0].type == Mode1 || CD.tl[0].type == Mode2) {
- stat->Type = 0x01;
- stat->Status = CDR_STATUS_UNKNOWN;
- } else if (CD.tl[0].type == Audio) {
- stat->Type = 0x02;
- stat->Status = CDR_STATUS_UNKNOWN; // FIXME
- } else {
- stat->Type = 0x00;
- stat->Status = CDR_STATUS_UNKNOWN; // FIXME
- }
-
- stat->Time[0] =
- stat->Time[1] =
- stat->Time[2] = 0; // FIXME
-
- return 0;
-}
-
-char *CDRgetDriveLetter(void) {
- //SysPrintf("start CDR_getBuffer()\n");
-// SysPrintf("start CDR_getBuffer()\r\n");
- return deviceFilePath;
-}
-
-#if 0
-AudioFilePlayID cdFilePlayID;
-long CDRplay(unsigned char *sector)
-{
- // TODO: find the correct track...
-
- NewAudioFilePlayID(&fsref, &cdFilePlayID);
-
- return 0;
-}
-
-long CDRstop(void)
-{
-
- return 0;
-}
-#endif
-/*
-long (CALLBACK* CDRconfigure)(void);
-long (CALLBACK* CDRtest)(void);
-void (CALLBACK* CDRabout)(void);
-*/
-
-#ifdef TEST
-int main (int argc, int *argv)
-{
- CDRopen();
- CDRclose();
- return 0;
-}
-#endif
diff --git a/macosx/plugins/CDDeviceInterface/src/PlugCD.h b/macosx/plugins/CDDeviceInterface/src/PlugCD.h
deleted file mode 100644
index 9ca68acf..00000000
--- a/macosx/plugins/CDDeviceInterface/src/PlugCD.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************
- PlugCD.h
- CDDeviceInterface
-
- Created by Gil Pedersen on Fri July 18 2003.
- Copyright (c) 2003,2004 Gil Pedersen.
- ***************************************************************************/
-
-/***************************************************************************
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. See also the license.txt file for *
- * additional informations. *
- * *
- ***************************************************************************/
-
-#ifndef _PLUGCD_H_
-#define _PLUGCD_H_
-
-#include <stdio.h>
-
-#define CHAR_LEN 256
-
-// 2352 is a sector size
-#define BUFFER_SECTORS 50
-#define BUFFER_SIZE BUFFER_SECTORS*2352
-#define BZIP_BUFFER_SECTORS 10
-
-// 74 minutes * 60 sex/min * 75 frames/sec * 96 bytes needed per frame
-#define TOTAL_CD_LENGTH 74*60*75
-#define BYTES_PER_SUBCHANNEL_FRAME 96
-#define MAX_SUBCHANNEL_DATA TOTAL_CD_LENGTH*BYTES_PER_SUBCHANNEL_FRAME
-
-typedef struct {
- char dn[128];
- char fn[128];
-} cd_conf;
-
-cd_conf CDConfiguration;
-
-int rc;
-
-enum TrackType
-{
- unknown, Mode1, Mode2, Audio, Pregap = 0x80
-};
-
-typedef struct
-{
- enum TrackType type;
- char num;
- unsigned char start[3];
- unsigned char end[3];
-} Track;
-
-struct
-{
- int cd;
- FILE* cdda;
- int numtracks;
- long bufferPos;
- long bufferSize;
- long sector;
- long sectorType;
- long status;
- Track* tl;
- unsigned char buffer[BUFFER_SIZE];
-} CD;
-
-void CDDAclose(void);
-
-// function headers for cdreader.c
-char getNumTracks();
-void seekSector(const unsigned char m, const unsigned char s, const unsigned char f);
-unsigned char* getSector();
-void newCD(const char * filename);
-void readit();
-
-
-// subtracts two times in integer format (non-BCD) -> l - r = a
-#define sub(l, r, a)\
- a[1] = 0;\
- a[0] = 0;\
- a[2] = l[2] - r[2];\
- if ((char)a[2] < 0)\
- {\
- a[2] += 75;\
- a[1] -= 1;\
- }\
- a[1] += l[1] - r[1];\
- if ((char)a[1] < 0)\
- {\
- a[1] += 60;\
- a[0] -= 1;\
- }\
- a[0] += l[0] - r[0];\
-
-// converts a time like 17:61:00 to 18:01:00
-#define normalizeTime(c)\
- while(c[2] > 75)\
- {\
- c[2] -= 75;\
- c[1] += 1;\
- }\
- while(c[1] > 60)\
- {\
- c[1] -= 60;\
- c[0] += 1;\
- }
-
-// converts uchar in c to BCD character
-#define intToBCD(c) (unsigned char)((c%10) | ((c/10)<<4))
-
-// converts BCD number in c to uchar
-#define BCDToInt(c) (unsigned char)((c & 0x0F) + 10 * ((c & 0xF0) >> 4))
-
-#endif
-
diff --git a/macosx/plugins/CDDeviceInterface/CDDeviceInterfacePlugin.xcodeproj/project.pbxproj b/macosx/plugins/DFCdrom/DFCdrom.xcodeproj/project.pbxproj
index 066d4788..e5767cbf 100644
--- a/macosx/plugins/CDDeviceInterface/CDDeviceInterfacePlugin.xcodeproj/project.pbxproj
+++ b/macosx/plugins/DFCdrom/DFCdrom.xcodeproj/project.pbxproj
@@ -7,11 +7,18 @@
objects = {
/* Begin PBXBuildFile section */
- 2BC4895406DF958C00274548 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2BC4895306DF958C00274548 /* CoreAudio.framework */; };
- 2BC4897906DF966200274548 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2BC4897706DF966200274548 /* CoreServices.framework */; };
- 2BD707140555995400CB5D9B /* PlugCD.c in Sources */ = {isa = PBXBuildFile; fileRef = 2BD707110555995400CB5D9B /* PlugCD.c */; };
- 2BD707150555995400CB5D9B /* PlugCD.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BD707120555995400CB5D9B /* PlugCD.h */; };
2BD707180555997500CB5D9B /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2BD707170555997500CB5D9B /* IOKit.framework */; };
+ 713DB2E811F113C30001BDD4 /* cdr.c in Sources */ = {isa = PBXBuildFile; fileRef = 713DB2E311F113C30001BDD4 /* cdr.c */; };
+ 713DB2E911F113C30001BDD4 /* cdr.h in Headers */ = {isa = PBXBuildFile; fileRef = 713DB2E411F113C30001BDD4 /* cdr.h */; };
+ 713DB2EB11F113C30001BDD4 /* util.c in Sources */ = {isa = PBXBuildFile; fileRef = 713DB2E611F113C30001BDD4 /* util.c */; };
+ 71F3C32811F3CD0B007B9F12 /* cdr-macosx.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F3C32411F3CD0B007B9F12 /* cdr-macosx.c */; };
+ 71F3C32911F3CD0B007B9F12 /* cfg.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F3C32511F3CD0B007B9F12 /* cfg.c */; };
+ 71F3C32A11F3CD0B007B9F12 /* PluginConfigController.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F3C32611F3CD0B007B9F12 /* PluginConfigController.h */; };
+ 71F3C32B11F3CD0B007B9F12 /* PluginConfigController.m in Sources */ = {isa = PBXBuildFile; fileRef = 71F3C32711F3CD0B007B9F12 /* PluginConfigController.m */; };
+ 71F3C38611F3CFED007B9F12 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 71F3C38511F3CFED007B9F12 /* AppKit.framework */; };
+ 71F3C38811F3CFF7007B9F12 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 71F3C38711F3CFF7007B9F12 /* Carbon.framework */; };
+ 71F3C47A11F3D108007B9F12 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 71F3C47811F3D108007B9F12 /* Credits.rtf */; };
+ 71F3C49D11F3D2B3007B9F12 /* DFCdromPluginConfig.nib in Resources */ = {isa = PBXBuildFile; fileRef = 71F3C49B11F3D2B3007B9F12 /* DFCdromPluginConfig.nib */; };
8D576314048677EA00EA77CD /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */; };
8D5B49A804867FD3000E48DA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8D5B49A704867FD3000E48DA /* InfoPlist.strings */; };
/* End PBXBuildFile section */
@@ -19,12 +26,19 @@
/* Begin PBXFileReference section */
089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
- 2BC4895306DF958C00274548 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = "<absolute>"; };
- 2BC4897706DF966200274548 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = "<absolute>"; };
- 2BD707110555995400CB5D9B /* PlugCD.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = PlugCD.c; path = src/PlugCD.c; sourceTree = SOURCE_ROOT; };
- 2BD707120555995400CB5D9B /* PlugCD.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PlugCD.h; path = src/PlugCD.h; sourceTree = SOURCE_ROOT; };
2BD707170555997500CB5D9B /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = "<absolute>"; };
- 8D576316048677EA00EA77CD /* CDDeviceInterface.psxplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CDDeviceInterface.psxplugin; sourceTree = BUILT_PRODUCTS_DIR; };
+ 713DB2E311F113C30001BDD4 /* cdr.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; name = cdr.c; path = ../../../plugins/dfcdrom/cdr.c; sourceTree = SOURCE_ROOT; };
+ 713DB2E411F113C30001BDD4 /* cdr.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; name = cdr.h; path = ../../../plugins/dfcdrom/cdr.h; sourceTree = SOURCE_ROOT; };
+ 713DB2E611F113C30001BDD4 /* util.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; name = util.c; path = ../../../plugins/dfcdrom/util.c; sourceTree = SOURCE_ROOT; };
+ 71F3C32411F3CD0B007B9F12 /* cdr-macosx.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; name = "cdr-macosx.c"; path = "macsrc/cdr-macosx.c"; sourceTree = "<group>"; };
+ 71F3C32511F3CD0B007B9F12 /* cfg.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; name = cfg.c; path = macsrc/cfg.c; sourceTree = "<group>"; };
+ 71F3C32611F3CD0B007B9F12 /* PluginConfigController.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; name = PluginConfigController.h; path = macsrc/PluginConfigController.h; sourceTree = "<group>"; };
+ 71F3C32711F3CD0B007B9F12 /* PluginConfigController.m */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.objc; name = PluginConfigController.m; path = macsrc/PluginConfigController.m; sourceTree = "<group>"; };
+ 71F3C38511F3CFED007B9F12 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
+ 71F3C38711F3CFF7007B9F12 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
+ 71F3C47911F3D108007B9F12 /* English */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = English; path = English.lproj/Credits.rtf; sourceTree = "<group>"; };
+ 71F3C49C11F3D2B3007B9F12 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/DFCdromPluginConfig.nib; sourceTree = "<group>"; };
+ 8D576316048677EA00EA77CD /* DFCdrom.psxplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DFCdrom.psxplugin; sourceTree = BUILT_PRODUCTS_DIR; };
8D576317048677EA00EA77CD /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
/* End PBXFileReference section */
@@ -35,8 +49,8 @@
files = (
8D576314048677EA00EA77CD /* CoreFoundation.framework in Frameworks */,
2BD707180555997500CB5D9B /* IOKit.framework in Frameworks */,
- 2BC4895406DF958C00274548 /* CoreAudio.framework in Frameworks */,
- 2BC4897906DF966200274548 /* CoreServices.framework in Frameworks */,
+ 71F3C38611F3CFED007B9F12 /* AppKit.framework in Frameworks */,
+ 71F3C38811F3CFF7007B9F12 /* Carbon.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -46,7 +60,7 @@
089C166AFE841209C02AAC07 /* CdrDevMac */ = {
isa = PBXGroup;
children = (
- 08FB77AFFE84173DC02AAC07 /* Source */,
+ 08FB77AFFE84173DC02AAC07 /* Source Files */,
089C167CFE841241C02AAC07 /* Resources */,
089C1671FE841209C02AAC07 /* External Frameworks and Libraries */,
19C28FB6FE9D52B211CA2CBB /* Products */,
@@ -57,8 +71,8 @@
089C1671FE841209C02AAC07 /* External Frameworks and Libraries */ = {
isa = PBXGroup;
children = (
- 2BC4897706DF966200274548 /* CoreServices.framework */,
- 2BC4895306DF958C00274548 /* CoreAudio.framework */,
+ 71F3C38511F3CFED007B9F12 /* AppKit.framework */,
+ 71F3C38711F3CFF7007B9F12 /* Carbon.framework */,
0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */,
2BD707170555997500CB5D9B /* IOKit.framework */,
);
@@ -68,36 +82,50 @@
089C167CFE841241C02AAC07 /* Resources */ = {
isa = PBXGroup;
children = (
+ 71F3C49B11F3D2B3007B9F12 /* DFCdromPluginConfig.nib */,
+ 71F3C47811F3D108007B9F12 /* Credits.rtf */,
8D576317048677EA00EA77CD /* Info.plist */,
8D5B49A704867FD3000E48DA /* InfoPlist.strings */,
);
name = Resources;
sourceTree = "<group>";
};
- 08FB77AFFE84173DC02AAC07 /* Source */ = {
+ 08FB77AFFE84173DC02AAC07 /* Source Files */ = {
isa = PBXGroup;
children = (
- 2BD707110555995400CB5D9B /* PlugCD.c */,
- 2BD707120555995400CB5D9B /* PlugCD.h */,
- 2BC488C406DF90FF00274548 /* CoreAudioUtils */,
+ 71F3C32111F3CCEF007B9F12 /* macsrc */,
+ 71F3C30911F3CC22007B9F12 /* src */,
);
- name = Source;
+ name = "Source Files";
sourceTree = "<group>";
};
19C28FB6FE9D52B211CA2CBB /* Products */ = {
isa = PBXGroup;
children = (
- 8D576316048677EA00EA77CD /* CDDeviceInterface.psxplugin */,
+ 8D576316048677EA00EA77CD /* DFCdrom.psxplugin */,
);
name = Products;
sourceTree = "<group>";
};
- 2BC488C406DF90FF00274548 /* CoreAudioUtils */ = {
+ 71F3C30911F3CC22007B9F12 /* src */ = {
isa = PBXGroup;
children = (
+ 713DB2E311F113C30001BDD4 /* cdr.c */,
+ 713DB2E411F113C30001BDD4 /* cdr.h */,
+ 713DB2E611F113C30001BDD4 /* util.c */,
);
- name = CoreAudioUtils;
- path = src/CoreAudioUtils;
+ name = src;
+ sourceTree = "<group>";
+ };
+ 71F3C32111F3CCEF007B9F12 /* macsrc */ = {
+ isa = PBXGroup;
+ children = (
+ 71F3C32411F3CD0B007B9F12 /* cdr-macosx.c */,
+ 71F3C32511F3CD0B007B9F12 /* cfg.c */,
+ 71F3C32611F3CD0B007B9F12 /* PluginConfigController.h */,
+ 71F3C32711F3CD0B007B9F12 /* PluginConfigController.m */,
+ );
+ name = macsrc;
sourceTree = "<group>";
};
/* End PBXGroup section */
@@ -107,16 +135,17 @@
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
- 2BD707150555995400CB5D9B /* PlugCD.h in Headers */,
+ 713DB2E911F113C30001BDD4 /* cdr.h in Headers */,
+ 71F3C32A11F3CD0B007B9F12 /* PluginConfigController.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
- 8D57630D048677EA00EA77CD /* CDDeviceInterface */ = {
+ 8D57630D048677EA00EA77CD /* DFCdrom */ = {
isa = PBXNativeTarget;
- buildConfigurationList = 710735990FDEED75004AD098 /* Build configuration list for PBXNativeTarget "CDDeviceInterface" */;
+ buildConfigurationList = 710735990FDEED75004AD098 /* Build configuration list for PBXNativeTarget "DFCdrom" */;
buildPhases = (
8D57630E048677EA00EA77CD /* Headers */,
8D57630F048677EA00EA77CD /* Resources */,
@@ -128,10 +157,10 @@
);
dependencies = (
);
- name = CDDeviceInterface;
+ name = DFCdrom;
productInstallPath = "$(HOME)/Library/Bundles";
productName = CdrDevMac;
- productReference = 8D576316048677EA00EA77CD /* CDDeviceInterface.psxplugin */;
+ productReference = 8D576316048677EA00EA77CD /* DFCdrom.psxplugin */;
productType = "com.apple.product-type.bundle";
};
/* End PBXNativeTarget section */
@@ -139,12 +168,12 @@
/* Begin PBXProject section */
089C1669FE841209C02AAC07 /* Project object */ = {
isa = PBXProject;
- buildConfigurationList = 7107359E0FDEED75004AD098 /* Build configuration list for PBXProject "CDDeviceInterfacePlugin" */;
+ buildConfigurationList = 7107359E0FDEED75004AD098 /* Build configuration list for PBXProject "DFCdrom" */;
hasScannedForEncodings = 1;
mainGroup = 089C166AFE841209C02AAC07 /* CdrDevMac */;
projectDirPath = "";
targets = (
- 8D57630D048677EA00EA77CD /* CDDeviceInterface */,
+ 8D57630D048677EA00EA77CD /* DFCdrom */,
);
};
/* End PBXProject section */
@@ -155,6 +184,8 @@
buildActionMask = 2147483647;
files = (
8D5B49A804867FD3000E48DA /* InfoPlist.strings in Resources */,
+ 71F3C47A11F3D108007B9F12 /* Credits.rtf in Resources */,
+ 71F3C49D11F3D2B3007B9F12 /* DFCdromPluginConfig.nib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -175,13 +206,33 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- 2BD707140555995400CB5D9B /* PlugCD.c in Sources */,
+ 713DB2E811F113C30001BDD4 /* cdr.c in Sources */,
+ 713DB2EB11F113C30001BDD4 /* util.c in Sources */,
+ 71F3C32811F3CD0B007B9F12 /* cdr-macosx.c in Sources */,
+ 71F3C32911F3CD0B007B9F12 /* cfg.c in Sources */,
+ 71F3C32B11F3CD0B007B9F12 /* PluginConfigController.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
+ 71F3C47811F3D108007B9F12 /* Credits.rtf */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 71F3C47911F3D108007B9F12 /* English */,
+ );
+ name = Credits.rtf;
+ sourceTree = "<group>";
+ };
+ 71F3C49B11F3D2B3007B9F12 /* DFCdromPluginConfig.nib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 71F3C49C11F3D2B3007B9F12 /* English */,
+ );
+ name = DFCdromPluginConfig.nib;
+ sourceTree = "<group>";
+ };
8D5B49A704867FD3000E48DA /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
@@ -210,7 +261,7 @@
OTHER_CFLAGS = "";
OTHER_LDFLAGS = "";
OTHER_REZFLAGS = "";
- PRODUCT_NAME = CDDeviceInterface;
+ PRODUCT_NAME = DFCdrom;
SECTORDER_FLAGS = "";
SYMROOT = ../../build;
WARNING_CFLAGS = (
@@ -241,7 +292,7 @@
OTHER_CFLAGS = "";
OTHER_LDFLAGS = "";
OTHER_REZFLAGS = "";
- PRODUCT_NAME = CDDeviceInterface;
+ PRODUCT_NAME = DFCdrom;
SECTORDER_FLAGS = "";
SYMROOT = ../../build;
WARNING_CFLAGS = (
@@ -259,7 +310,12 @@
buildSettings = {
GCC_MODEL_TUNING = "";
GCC_OPTIMIZATION_LEVEL = 0;
- HEADER_SEARCH_PATHS = ../../../libpcsxcore;
+ GCC_PREPROCESSOR_DEFINITIONS = "_MACOSX=1";
+ HEADER_SEARCH_PATHS = (
+ ../../../libpcsxcore,
+ ../..,
+ ../../../plugins/dfcdrom,
+ );
STRIP_INSTALLED_PRODUCT = NO;
};
name = Development;
@@ -268,14 +324,19 @@
isa = XCBuildConfiguration;
buildSettings = {
GCC_MODEL_TUNING = "";
- HEADER_SEARCH_PATHS = ../../../libpcsxcore;
+ GCC_PREPROCESSOR_DEFINITIONS = "_MACOSX=1";
+ HEADER_SEARCH_PATHS = (
+ ../../../libpcsxcore,
+ ../..,
+ ../../../plugins/dfcdrom,
+ );
};
name = Deployment;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
- 710735990FDEED75004AD098 /* Build configuration list for PBXNativeTarget "CDDeviceInterface" */ = {
+ 710735990FDEED75004AD098 /* Build configuration list for PBXNativeTarget "DFCdrom" */ = {
isa = XCConfigurationList;
buildConfigurations = (
7107359A0FDEED75004AD098 /* Development */,
@@ -284,7 +345,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Development;
};
- 7107359E0FDEED75004AD098 /* Build configuration list for PBXProject "CDDeviceInterfacePlugin" */ = {
+ 7107359E0FDEED75004AD098 /* Build configuration list for PBXProject "DFCdrom" */ = {
isa = XCConfigurationList;
buildConfigurations = (
7107359F0FDEED75004AD098 /* Development */,
diff --git a/macosx/plugins/DFCdrom/English.lproj/Credits.rtf b/macosx/plugins/DFCdrom/English.lproj/Credits.rtf
new file mode 100644
index 00000000..76fa6442
--- /dev/null
+++ b/macosx/plugins/DFCdrom/English.lproj/Credits.rtf
@@ -0,0 +1,13 @@
+{\rtf1\mac\ansicpg10025\cocoartf824\cocoasubrtf420
+{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
+
+\f0\b\fs24 \cf0 Original coder:
+\f1\b0 \
+ linuzappz\
+\
+
+\f0\b Macintosh Port:
+\f1\b0 \
+ Wei Mingzhi} \ No newline at end of file
diff --git a/macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/classes.nib b/macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/classes.nib
new file mode 100644
index 00000000..b1e8f6c7
--- /dev/null
+++ b/macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/classes.nib
@@ -0,0 +1,18 @@
+{
+ IBClasses = (
+ {
+ ACTIONS = {cancel = id; ok = id; };
+ CLASS = DFCdromPluginConfigController;
+ LANGUAGE = ObjC;
+ OUTLETS = {CacheSize = NSSlider; Cached = NSControl; CdSpeed = NSPopUpButton; };
+ SUPERCLASS = NSWindowController;
+ },
+ {
+ ACTIONS = {"" = id; };
+ CLASS = FirstResponder;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSObject;
+ }
+ );
+ IBVersion = 1;
+} \ No newline at end of file
diff --git a/macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/info.nib b/macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/info.nib
new file mode 100644
index 00000000..f90f50b0
--- /dev/null
+++ b/macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/info.nib
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>IBDocumentLocation</key>
+ <string>117 49 561 249 0 0 1024 746 </string>
+ <key>IBFramework Version</key>
+ <string>446.1</string>
+ <key>IBOpenObjects</key>
+ <array>
+ <integer>5</integer>
+ </array>
+ <key>IBSystem Version</key>
+ <string>8P2137</string>
+</dict>
+</plist>
diff --git a/macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/keyedobjects.nib b/macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/keyedobjects.nib
new file mode 100644
index 00000000..64a50213
--- /dev/null
+++ b/macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/keyedobjects.nib
Binary files differ
diff --git a/macosx/plugins/DFCdrom/English.lproj/InfoPlist.strings b/macosx/plugins/DFCdrom/English.lproj/InfoPlist.strings
new file mode 100755
index 00000000..ea885a5d
--- /dev/null
+++ b/macosx/plugins/DFCdrom/English.lproj/InfoPlist.strings
Binary files differ
diff --git a/macosx/plugins/CDDeviceInterface/Info.plist b/macosx/plugins/DFCdrom/Info.plist
index b121197a..ee25402f 100644
--- a/macosx/plugins/CDDeviceInterface/Info.plist
+++ b/macosx/plugins/DFCdrom/Info.plist
@@ -5,11 +5,11 @@
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
- <string>CDDeviceInterface</string>
+ <string>DFCdrom</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
- <string>net.pcsx.CDDeviceInterfacePlugin</string>
+ <string>net.pcsx.DFCdrom</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
diff --git a/macosx/plugins/DFCdrom/macsrc/PluginConfigController.h b/macosx/plugins/DFCdrom/macsrc/PluginConfigController.h
new file mode 100644
index 00000000..b7f6fafb
--- /dev/null
+++ b/macosx/plugins/DFCdrom/macsrc/PluginConfigController.h
@@ -0,0 +1,18 @@
+#define PluginConfigController DFCdromPluginConfigController
+
+#import <Cocoa/Cocoa.h>
+
+@interface PluginConfigController : NSWindowController
+{
+ IBOutlet NSControl *Cached;
+ IBOutlet NSSlider *CacheSize;
+ IBOutlet NSPopUpButton *CdSpeed;
+
+ NSMutableDictionary *keyValues;
+}
+- (IBAction)cancel:(id)sender;
+- (IBAction)ok:(id)sender;
+
+- (void)loadValues;
+
+@end
diff --git a/macosx/plugins/DFCdrom/macsrc/PluginConfigController.m b/macosx/plugins/DFCdrom/macsrc/PluginConfigController.m
new file mode 100644
index 00000000..02b3a76d
--- /dev/null
+++ b/macosx/plugins/DFCdrom/macsrc/PluginConfigController.m
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
+ * All Rights Reserved.
+ *
+ * Based on: Cdrom for Psemu Pro like Emulators
+ * By: linuzappz <linuzappz@hotmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#import "PluginConfigController.h"
+#include "cdr.h"
+
+#define APP_ID @"net.pcsx.DFCdrom"
+#define PrefsKey APP_ID @" Settings"
+
+static PluginConfigController *windowController;
+
+void AboutDlgProc()
+{
+ // Get parent application instance
+ NSApplication *app = [NSApplication sharedApplication];
+ NSBundle *bundle = [NSBundle bundleWithIdentifier:APP_ID];
+
+ // Get Credits.rtf
+ NSString *path = [bundle pathForResource:@"Credits" ofType:@"rtf"];
+ NSAttributedString *credits;
+ if (path) {
+ credits = [[[NSAttributedString alloc] initWithPath: path
+ documentAttributes:NULL] autorelease];
+ } else {
+ credits = [[[NSAttributedString alloc] initWithString:@""] autorelease];
+ }
+
+ // Get Application Icon
+ NSImage *icon = [[NSWorkspace sharedWorkspace] iconForFile:[bundle bundlePath]];
+ NSSize size = NSMakeSize(64, 64);
+ [icon setSize:size];
+
+ [app orderFrontStandardAboutPanelWithOptions:[NSDictionary dictionaryWithObjectsAndKeys:
+ [bundle objectForInfoDictionaryKey:@"CFBundleName"], @"ApplicationName",
+ icon, @"ApplicationIcon",
+ [bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"], @"ApplicationVersion",
+ [bundle objectForInfoDictionaryKey:@"CFBundleVersion"], @"Version",
+ [bundle objectForInfoDictionaryKey:@"NSHumanReadableCopyright"], @"Copyright",
+ credits, @"Credits",
+ nil]];
+}
+
+void ConfDlgProc()
+{
+ NSWindow *window;
+
+ if (windowController == nil) {
+ windowController = [[PluginConfigController alloc] initWithWindowNibName:@"DFCdromPluginConfig"];
+ }
+ window = [windowController window];
+
+ [windowController loadValues];
+
+ [window center];
+ [window makeKeyAndOrderFront:nil];
+}
+
+void ReadConfig()
+{
+ NSDictionary *keyValues;
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+ [defaults registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:
+ [[NSMutableDictionary alloc] initWithObjectsAndKeys:
+ [NSNumber numberWithBool:YES], @"Threaded",
+ [NSNumber numberWithInt:64], @"Cache Size",
+ [NSNumber numberWithInt:0], @"Speed",
+ nil], PrefsKey, nil]];
+
+ keyValues = [defaults dictionaryForKey:PrefsKey];
+
+ ReadMode = ([[keyValues objectForKey:@"Threaded"] boolValue] ? THREADED : NORMAL);
+ CacheSize = [[keyValues objectForKey:@"Cache Size"] intValue];
+ CdrSpeed = [[keyValues objectForKey:@"Speed"] intValue];
+}
+
+@implementation PluginConfigController
+
+- (IBAction)cancel:(id)sender
+{
+ [self close];
+}
+
+- (IBAction)ok:(id)sender
+{
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+
+ NSMutableDictionary *writeDic = [NSMutableDictionary dictionaryWithDictionary:keyValues];
+
+ [writeDic setObject:[NSNumber numberWithInt:[Cached intValue]] forKey:@"Threaded"];
+ [writeDic setObject:[NSNumber numberWithInt:[CacheSize intValue]] forKey:@"Cache Size"];
+
+ switch ([CdSpeed indexOfSelectedItem]) {
+ case 1: [writeDic setObject:[NSNumber numberWithInt:1] forKey:@"Speed"]; break;
+ case 2: [writeDic setObject:[NSNumber numberWithInt:2] forKey:@"Speed"]; break;
+ case 3: [writeDic setObject:[NSNumber numberWithInt:4] forKey:@"Speed"]; break;
+ case 4: [writeDic setObject:[NSNumber numberWithInt:8] forKey:@"Speed"]; break;
+ case 5: [writeDic setObject:[NSNumber numberWithInt:16] forKey:@"Speed"]; break;
+ case 6: [writeDic setObject:[NSNumber numberWithInt:32] forKey:@"Speed"]; break;
+ default: [writeDic setObject:[NSNumber numberWithInt:0] forKey:@"Speed"]; break;
+ }
+
+ // write to defaults
+ [defaults setObject:writeDic forKey:PrefsKey];
+ [defaults synchronize];
+
+ // and set global values accordingly
+ ReadConfig();
+
+ [self close];
+}
+
+- (void)loadValues
+{
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+
+ ReadConfig();
+
+ // load from preferences
+ [keyValues release];
+ keyValues = [[defaults dictionaryForKey:PrefsKey] retain];
+
+ [Cached setIntValue:[[keyValues objectForKey:@"Threaded"] intValue]];
+ [CacheSize setIntValue:[[keyValues objectForKey:@"Cache Size"] intValue]];
+
+ switch ([[keyValues objectForKey:@"Speed"] intValue]) {
+ case 1: [CdSpeed selectItemAtIndex:1]; break;
+ case 2: [CdSpeed selectItemAtIndex:2]; break;
+ case 4: [CdSpeed selectItemAtIndex:3]; break;
+ case 8: [CdSpeed selectItemAtIndex:4]; break;
+ case 16: [CdSpeed selectItemAtIndex:5]; break;
+ case 32: [CdSpeed selectItemAtIndex:6]; break;
+ default: [CdSpeed selectItemAtIndex:0]; break;
+ }
+}
+
+- (void)awakeFromNib
+{
+}
+
+@end
diff --git a/macosx/plugins/DFCdrom/macsrc/cdr-macosx.c b/macosx/plugins/DFCdrom/macsrc/cdr-macosx.c
new file mode 100644
index 00000000..4b7fdfbe
--- /dev/null
+++ b/macosx/plugins/DFCdrom/macsrc/cdr-macosx.c
@@ -0,0 +1,215 @@
+/*
+ * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
+ * All Rights Reserved.
+ *
+ * Based on: Cdrom for Psemu Pro like Emulators
+ * By: linuzappz <linuzappz@hotmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#include "cdr.h"
+
+#ifdef _MACOSX
+
+#include <IOKit/IOKitLib.h>
+#include <IOKit/IOBSD.h>
+#include <IOKit/storage/IOCDMedia.h>
+#include <IOKit/storage/IODVDMedia.h>
+#include <IOKit/storage/IOMedia.h>
+#include <IOKit/storage/IOCDMediaBSDClient.h>
+#include <CoreFoundation/CoreFoundation.h>
+
+int cdHandle = -1;
+char cdDevice[4096] = "";
+
+static void FindCdDevice(char *dev) {
+ io_object_t next_media;
+ kern_return_t kern_result;
+ io_iterator_t media_iterator;
+ CFMutableDictionaryRef classes_to_match;
+ const char *name, *cd = kIOCDMediaClass, *dvd = kIODVDMediaClass;
+
+ dev[0] = '\0';
+ name = cd;
+
+start:
+ classes_to_match = IOServiceMatching(name);
+ if (classes_to_match == NULL) goto end;
+
+ CFDictionarySetValue(classes_to_match, CFSTR(kIOMediaEjectableKey),
+ kCFBooleanTrue);
+
+ kern_result = IOServiceGetMatchingServices(kIOMasterPortDefault,
+ classes_to_match, &media_iterator);
+
+ if (kern_result != KERN_SUCCESS) goto end;
+
+ next_media = IOIteratorNext(media_iterator);
+ if (next_media != 0) {
+ char psz_buf[0x32];
+ size_t dev_path_length;
+ CFTypeRef str_bsd_path;
+
+ do {
+ str_bsd_path = IORegistryEntryCreateCFProperty(next_media,
+ CFSTR(kIOBSDNameKey), kCFAllocatorDefault, 0);
+
+ if (str_bsd_path == NULL) {
+ IOObjectRelease(next_media);
+ continue;
+ }
+
+ strcpy(psz_buf, "/dev/r");
+ dev_path_length = strlen(psz_buf);
+
+ if (CFStringGetCString(str_bsd_path, (char *)&psz_buf + dev_path_length,
+ sizeof(psz_buf) - dev_path_length, kCFStringEncodingASCII))
+ {
+ CFRelease(str_bsd_path);
+ IOObjectRelease(next_media);
+ IOObjectRelease(media_iterator);
+ strcpy(dev, psz_buf);
+ PRINTF("Found CD-ROM Device: %s\n", dev);
+ return;
+ }
+
+ CFRelease(str_bsd_path);
+ IOObjectRelease(next_media);
+ } while ((next_media = IOIteratorNext(media_iterator)) != 0);
+ }
+
+ IOObjectRelease(media_iterator);
+
+end:
+ if (dev[0] == '\0') {
+ if (name == cd) {
+ name = dvd; // Is this really necessary or correct? Dunno...
+ goto start;
+ }
+ }
+}
+
+int OpenCdHandle(const char *dev) {
+ if (dev != NULL && dev[0] != '\0') strcpy(cdDevice, dev);
+ else if (cdDevice[0] == '\0') FindCdDevice(cdDevice);
+
+ cdHandle = open(cdDevice, O_RDONLY, 0);
+ if (cdHandle < 0) return -1;
+
+ if (CdrSpeed > 0) {
+ u_int16_t speed = kCDSpeedMin * CdrSpeed;
+ ioctl(cdHandle, DKIOCCDSETSPEED, &speed);
+ }
+
+ return 0;
+}
+
+void CloseCdHandle() {
+ if (cdHandle != -1) close(cdHandle);
+ cdHandle = -1;
+}
+
+int IsCdHandleOpen() {
+ return 1;
+}
+
+long GetTN(unsigned char *buffer) {
+ if (cdHandle < 0) return -1;
+
+ // TODO
+ buffer[0] = 0;
+ buffer[1] = 0;
+ return 0;
+}
+
+long GetTD(unsigned char track, unsigned char *buffer) {
+ if (cdHandle < 0) return -1;
+
+ // TODO
+ memset(buffer + 1, 0, 3);
+ return 0;
+}
+
+long GetTE(unsigned char track, unsigned char *m, unsigned char *s, unsigned char *f) {
+ return -1; // TODO
+}
+
+long ReadSector(crdata *cr) {
+ int lba;
+ dk_cd_read_t r;
+
+ if (cdHandle < 0) return -1;
+
+ lba = msf_to_lba(cr->msf.cdmsf_min0, cr->msf.cdmsf_sec0, cr->msf.cdmsf_frame0);
+
+ memset(&r, 0, sizeof(r));
+
+ r.offset = lba * CD_FRAMESIZE_RAW;
+ r.sectorArea = 0xF8;
+ r.sectorType = kCDSectorTypeUnknown;
+ r.bufferLength = CD_FRAMESIZE_RAW;
+ r.buffer = cr->buf;
+
+ if (ioctl(cdHandle, DKIOCCDREAD, &r) != kIOReturnSuccess) {
+ return -1;
+ }
+
+ return 0;
+}
+
+long PlayCDDA(unsigned char *sector) {
+ return 0; // TODO
+}
+
+long StopCDDA() {
+ return 0; // TODO
+}
+
+long GetStatus(int playing, struct CdrStat *stat) {
+ memset(stat, 0, sizeof(struct CdrStat));
+ stat->Type = 0x01;
+
+ // Close and reopen the CD handle. If opening failed,
+ // then there is no CD in drive.
+ // Note that this WILL be screwed if user inserted another
+ // removable device such as USB stick when tray is open.
+ // There may be a better way, but this should do the job.
+ if (cdHandle >= 0) {
+ close(cdHandle);
+ cdHandle = -1;
+ }
+
+ cdHandle = open(cdDevice, O_RDONLY, 0);
+ if (cdHandle < 0) {
+ // No CD in drive
+ stat->Type = 0xff;
+ stat->Status |= 0x10;
+ } else if (CdrSpeed > 0) {
+ u_int16_t speed = kCDSpeedMin * CdrSpeed;
+ ioctl(cdHandle, DKIOCCDSETSPEED, &speed);
+ }
+
+ return 0;
+}
+
+unsigned char *ReadSub(const unsigned char *time) {
+ return NULL; // TODO
+}
+
+char *CDRgetDriveLetter(void) {
+ return cdDevice;
+}
+
+#endif
diff --git a/macosx/plugins/DFCdrom/macsrc/cfg.c b/macosx/plugins/DFCdrom/macsrc/cfg.c
new file mode 100644
index 00000000..6b5c1513
--- /dev/null
+++ b/macosx/plugins/DFCdrom/macsrc/cfg.c
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
+ * All Rights Reserved.
+ *
+ * Based on: Cdrom for Psemu Pro like Emulators
+ * By: linuzappz <linuzappz@hotmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#include "cdr.h"
+
+void AboutDlgProc();
+void ConfDlgProc();
+void ReadConfig();
+
+char CdromDev[256];
+long ReadMode;
+long UseSubQ;
+long CacheSize;
+long CdrSpeed;
+long SpinDown;
+
+void LoadConf() {
+ strcpy(CdromDev, "");
+ ReadMode = THREADED;
+ UseSubQ = 0;
+ CacheSize = 64;
+ CdrSpeed = 0;
+ SpinDown = SPINDOWN_VENDOR_SPECIFIC;
+
+ ReadConfig();
+}
+
+long CDRconfigure() {
+ ConfDlgProc();
+ return 0;
+}
+
+void CDRabout() {
+ AboutDlgProc();
+} \ No newline at end of file
diff --git a/macosx/plugins/CDDeviceInterface/version.plist b/macosx/plugins/DFCdrom/version.plist
index 78195202..a9c51a62 100644
--- a/macosx/plugins/CDDeviceInterface/version.plist
+++ b/macosx/plugins/DFCdrom/version.plist
@@ -9,7 +9,7 @@
<key>CFBundleVersion</key>
<string>1.0</string>
<key>ProjectName</key>
- <string>CdrDevMac</string>
+ <string>DFCdrom</string>
<key>SourceVersion</key>
<string>2350000</string>
</dict>