Mercurial > sdl-ios-xcode
diff src/cdrom/macos/SDL_syscdrom.c @ 1895:c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 10 Jul 2006 21:04:37 +0000 |
parents | 92947e3a18db |
children |
line wrap: on
line diff
--- a/src/cdrom/macos/SDL_syscdrom.c Thu Jul 06 18:01:37 2006 +0000 +++ b/src/cdrom/macos/SDL_syscdrom.c Mon Jul 10 21:04:37 2006 +0000 @@ -27,7 +27,7 @@ #include <Devices.h> #include <Files.h> -#include <LowMem.h> /* Use entry table macros, not functions in InterfaceLib */ +#include <LowMem.h> /* Use entry table macros, not functions in InterfaceLib */ #include "SDL_cdrom.h" #include "../SDL_syscdrom.h" @@ -35,491 +35,509 @@ /* Added by Matt Slot */ #if !defined(LMGetUnitTableEntryCount) - #define LMGetUnitTableEntryCount() *(short *)0x01D2 +#define LMGetUnitTableEntryCount() *(short *)0x01D2 #endif /* The maximum number of CD-ROM drives we'll detect */ -#define MAX_DRIVES 26 +#define MAX_DRIVES 26 /* A list of available CD-ROM drives */ static long SDL_cdversion = 0; -static struct { - short dRefNum; - short driveNum; - long frames; - char name[256]; - Boolean hasAudio; - } SDL_cdlist[MAX_DRIVES]; +static struct +{ + short dRefNum; + short driveNum; + long frames; + char name[256]; + Boolean hasAudio; +} SDL_cdlist[MAX_DRIVES]; static StringPtr gDriverName = "\p.AppleCD"; /* The system-dependent CD control functions */ static const char *SDL_SYS_CDName(int drive); static int SDL_SYS_CDOpen(int drive); -static int SDL_SYS_CDGetTOC(SDL_CD *cdrom); -static CDstatus SDL_SYS_CDStatus(SDL_CD *cdrom, int *position); -static int SDL_SYS_CDPlay(SDL_CD *cdrom, int start, int length); -static int SDL_SYS_CDPause(SDL_CD *cdrom); -static int SDL_SYS_CDResume(SDL_CD *cdrom); -static int SDL_SYS_CDStop(SDL_CD *cdrom); -static int SDL_SYS_CDEject(SDL_CD *cdrom); -static void SDL_SYS_CDClose(SDL_CD *cdrom); +static int SDL_SYS_CDGetTOC(SDL_CD * cdrom); +static CDstatus SDL_SYS_CDStatus(SDL_CD * cdrom, int *position); +static int SDL_SYS_CDPlay(SDL_CD * cdrom, int start, int length); +static int SDL_SYS_CDPause(SDL_CD * cdrom); +static int SDL_SYS_CDResume(SDL_CD * cdrom); +static int SDL_SYS_CDStop(SDL_CD * cdrom); +static int SDL_SYS_CDEject(SDL_CD * cdrom); +static void SDL_SYS_CDClose(SDL_CD * cdrom); -static short SDL_SYS_ShortToBCD(short value) +static short +SDL_SYS_ShortToBCD(short value) { - return((value % 10) + (value / 10) * 0x10); /* Convert value to BCD */ + return ((value % 10) + (value / 10) * 0x10); /* Convert value to BCD */ } -static short SDL_SYS_BCDToShort(short value) +static short +SDL_SYS_BCDToShort(short value) { - return((value % 0x10) + (value / 0x10) * 10); /* Convert value from BCD */ + return ((value % 0x10) + (value / 0x10) * 10); /* Convert value from BCD */ } -int SDL_SYS_CDInit(void) +int +SDL_SYS_CDInit(void) { - SInt16 dRefNum = 0; - SInt16 first, last; + SInt16 dRefNum = 0; + SInt16 first, last; - SDL_numcds = 0; + SDL_numcds = 0; - /* Check that the software is available */ - if (Gestalt(kGestaltAudioCDSelector, &SDL_cdversion) || - !SDL_cdversion) return(0); + /* Check that the software is available */ + if (Gestalt(kGestaltAudioCDSelector, &SDL_cdversion) || !SDL_cdversion) + return (0); - /* Fill in our driver capabilities */ - SDL_CDcaps.Name = SDL_SYS_CDName; - SDL_CDcaps.Open = SDL_SYS_CDOpen; - SDL_CDcaps.GetTOC = SDL_SYS_CDGetTOC; - SDL_CDcaps.Status = SDL_SYS_CDStatus; - SDL_CDcaps.Play = SDL_SYS_CDPlay; - SDL_CDcaps.Pause = SDL_SYS_CDPause; - SDL_CDcaps.Resume = SDL_SYS_CDResume; - SDL_CDcaps.Stop = SDL_SYS_CDStop; - SDL_CDcaps.Eject = SDL_SYS_CDEject; - SDL_CDcaps.Close = SDL_SYS_CDClose; + /* Fill in our driver capabilities */ + SDL_CDcaps.Name = SDL_SYS_CDName; + SDL_CDcaps.Open = SDL_SYS_CDOpen; + SDL_CDcaps.GetTOC = SDL_SYS_CDGetTOC; + SDL_CDcaps.Status = SDL_SYS_CDStatus; + SDL_CDcaps.Play = SDL_SYS_CDPlay; + SDL_CDcaps.Pause = SDL_SYS_CDPause; + SDL_CDcaps.Resume = SDL_SYS_CDResume; + SDL_CDcaps.Stop = SDL_SYS_CDStop; + SDL_CDcaps.Eject = SDL_SYS_CDEject; + SDL_CDcaps.Close = SDL_SYS_CDClose; - /* Walk the list, count each AudioCD driver, and save the refnums */ - first = -1; - last = 0 - LMGetUnitTableEntryCount(); - for(dRefNum = first; dRefNum >= last; dRefNum--) { - Str255 driverName; - StringPtr namePtr; - DCtlHandle deviceEntry; + /* Walk the list, count each AudioCD driver, and save the refnums */ + first = -1; + last = 0 - LMGetUnitTableEntryCount(); + for (dRefNum = first; dRefNum >= last; dRefNum--) { + Str255 driverName; + StringPtr namePtr; + DCtlHandle deviceEntry; + + deviceEntry = GetDCtlEntry(dRefNum); + if (!deviceEntry) + continue; - deviceEntry = GetDCtlEntry(dRefNum); - if (! deviceEntry) continue; - - /* Is this an .AppleCD ? */ - namePtr = (*deviceEntry)->dCtlFlags & (1L << dRAMBased) ? - ((StringPtr) ((DCtlPtr) deviceEntry)->dCtlDriver + 18) : - ((StringPtr) (*deviceEntry)->dCtlDriver + 18); - BlockMoveData(namePtr, driverName, namePtr[0]+1); - if (driverName[0] > gDriverName[0]) driverName[0] = gDriverName[0]; - if (! EqualString(driverName, gDriverName, false, false)) continue; + /* Is this an .AppleCD ? */ + namePtr = (*deviceEntry)->dCtlFlags & (1L << dRAMBased) ? + ((StringPtr) ((DCtlPtr) deviceEntry)->dCtlDriver + 18) : + ((StringPtr) (*deviceEntry)->dCtlDriver + 18); + BlockMoveData(namePtr, driverName, namePtr[0] + 1); + if (driverName[0] > gDriverName[0]) + driverName[0] = gDriverName[0]; + if (!EqualString(driverName, gDriverName, false, false)) + continue; - /* Record the basic info for each drive */ - SDL_cdlist[SDL_numcds].dRefNum = dRefNum; - BlockMoveData(namePtr + 1, SDL_cdlist[SDL_numcds].name, namePtr[0]); - SDL_cdlist[SDL_numcds].name[namePtr[0]] = 0; - SDL_cdlist[SDL_numcds].hasAudio = false; - SDL_numcds++; - } - return(0); + /* Record the basic info for each drive */ + SDL_cdlist[SDL_numcds].dRefNum = dRefNum; + BlockMoveData(namePtr + 1, SDL_cdlist[SDL_numcds].name, namePtr[0]); + SDL_cdlist[SDL_numcds].name[namePtr[0]] = 0; + SDL_cdlist[SDL_numcds].hasAudio = false; + SDL_numcds++; + } + return (0); } -static const char *SDL_SYS_CDName(int drive) +static const char * +SDL_SYS_CDName(int drive) { - return(SDL_cdlist[drive].name); + return (SDL_cdlist[drive].name); } -static int get_drivenum(int drive) +static int +get_drivenum(int drive) { - QHdr *driveQ = GetDrvQHdr(); - DrvQEl *driveElem; + QHdr *driveQ = GetDrvQHdr(); + DrvQEl *driveElem; - /* Update the drive number */ - SDL_cdlist[drive].driveNum = 0; - if ( driveQ->qTail ) { - driveQ->qTail->qLink = 0; - } - for ( driveElem=(DrvQEl *)driveQ->qHead; driveElem; - driveElem = (DrvQEl *)driveElem->qLink ) { - if ( driveElem->dQRefNum == SDL_cdlist[drive].dRefNum ) { - SDL_cdlist[drive].driveNum = driveElem->dQDrive; - break; - } - } - return(SDL_cdlist[drive].driveNum); + /* Update the drive number */ + SDL_cdlist[drive].driveNum = 0; + if (driveQ->qTail) { + driveQ->qTail->qLink = 0; + } + for (driveElem = (DrvQEl *) driveQ->qHead; driveElem; + driveElem = (DrvQEl *) driveElem->qLink) { + if (driveElem->dQRefNum == SDL_cdlist[drive].dRefNum) { + SDL_cdlist[drive].driveNum = driveElem->dQDrive; + break; + } + } + return (SDL_cdlist[drive].driveNum); } -static int SDL_SYS_CDOpen(int drive) +static int +SDL_SYS_CDOpen(int drive) { - return(drive); + return (drive); } -static int SDL_SYS_CDGetTOC(SDL_CD *cdrom) +static int +SDL_SYS_CDGetTOC(SDL_CD * cdrom) { - CDCntrlParam cdpb; - CDTrackData tracks[SDL_MAX_TRACKS]; - long i, leadout; + CDCntrlParam cdpb; + CDTrackData tracks[SDL_MAX_TRACKS]; + long i, leadout; - /* Get the number of tracks on the CD by examining the TOC */ - SDL_memset(&cdpb, 0, sizeof(cdpb)); - cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; - cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; - cdpb.csCode = kReadTOC; - cdpb.csParam.words[0] = kGetTrackRange; - if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { - SDL_SetError("PBControlSync() failed"); - return(-1); - } + /* Get the number of tracks on the CD by examining the TOC */ + SDL_memset(&cdpb, 0, sizeof(cdpb)); + cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; + cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; + cdpb.csCode = kReadTOC; + cdpb.csParam.words[0] = kGetTrackRange; + if (PBControlSync((ParmBlkPtr) & cdpb) != noErr) { + SDL_SetError("PBControlSync() failed"); + return (-1); + } - cdrom->numtracks = - SDL_SYS_BCDToShort(cdpb.csParam.bytes[1]) - - SDL_SYS_BCDToShort(cdpb.csParam.bytes[0]) + 1; - if ( cdrom->numtracks > SDL_MAX_TRACKS ) - cdrom->numtracks = SDL_MAX_TRACKS; - cdrom->status = CD_STOPPED; - cdrom->cur_track = 0; /* Apparently these are set elsewhere */ - cdrom->cur_frame = 0; /* Apparently these are set elsewhere */ + cdrom->numtracks = + SDL_SYS_BCDToShort(cdpb.csParam.bytes[1]) - + SDL_SYS_BCDToShort(cdpb.csParam.bytes[0]) + 1; + if (cdrom->numtracks > SDL_MAX_TRACKS) + cdrom->numtracks = SDL_MAX_TRACKS; + cdrom->status = CD_STOPPED; + cdrom->cur_track = 0; /* Apparently these are set elsewhere */ + cdrom->cur_frame = 0; /* Apparently these are set elsewhere */ - /* Get the lead out area of the CD by examining the TOC */ - SDL_memset(&cdpb, 0, sizeof(cdpb)); - cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; - cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; - cdpb.csCode = kReadTOC; - cdpb.csParam.words[0] = kGetLeadOutArea; - if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { - SDL_SetError("PBControlSync() failed"); - return(-1); - } + /* Get the lead out area of the CD by examining the TOC */ + SDL_memset(&cdpb, 0, sizeof(cdpb)); + cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; + cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; + cdpb.csCode = kReadTOC; + cdpb.csParam.words[0] = kGetLeadOutArea; + if (PBControlSync((ParmBlkPtr) & cdpb) != noErr) { + SDL_SetError("PBControlSync() failed"); + return (-1); + } - leadout = MSF_TO_FRAMES( - SDL_SYS_BCDToShort(cdpb.csParam.bytes[0]), - SDL_SYS_BCDToShort(cdpb.csParam.bytes[1]), - SDL_SYS_BCDToShort(cdpb.csParam.bytes[2])); + leadout = MSF_TO_FRAMES(SDL_SYS_BCDToShort(cdpb.csParam.bytes[0]), + SDL_SYS_BCDToShort(cdpb.csParam.bytes[1]), + SDL_SYS_BCDToShort(cdpb.csParam.bytes[2])); - /* Get an array of track locations by examining the TOC */ - SDL_memset(tracks, 0, sizeof(tracks)); - SDL_memset(&cdpb, 0, sizeof(cdpb)); - cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; - cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; - cdpb.csCode = kReadTOC; - cdpb.csParam.words[0] = kGetTrackEntries; /* Type of Query */ - * ((long *) (cdpb.csParam.words+1)) = (long) tracks; - cdpb.csParam.words[3] = cdrom->numtracks * sizeof(tracks[0]); - * ((char *) (cdpb.csParam.words+4)) = 1; /* First track */ - if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { - SDL_SetError("PBControlSync() failed"); - return(-1); - } + /* Get an array of track locations by examining the TOC */ + SDL_memset(tracks, 0, sizeof(tracks)); + SDL_memset(&cdpb, 0, sizeof(cdpb)); + cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; + cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; + cdpb.csCode = kReadTOC; + cdpb.csParam.words[0] = kGetTrackEntries; /* Type of Query */ + *((long *) (cdpb.csParam.words + 1)) = (long) tracks; + cdpb.csParam.words[3] = cdrom->numtracks * sizeof(tracks[0]); + *((char *) (cdpb.csParam.words + 4)) = 1; /* First track */ + if (PBControlSync((ParmBlkPtr) & cdpb) != noErr) { + SDL_SetError("PBControlSync() failed"); + return (-1); + } - /* Read all the track TOC entries */ - SDL_cdlist[cdrom->id].hasAudio = false; - for ( i=0; i<cdrom->numtracks; ++i ) - { - cdrom->track[i].id = i+1; - if (tracks[i].entry.control & kDataTrackMask) - cdrom->track[i].type = SDL_DATA_TRACK; - else - { - cdrom->track[i].type = SDL_AUDIO_TRACK; - SDL_cdlist[SDL_numcds].hasAudio = true; - } - - cdrom->track[i].offset = MSF_TO_FRAMES( - SDL_SYS_BCDToShort(tracks[i].entry.min), - SDL_SYS_BCDToShort(tracks[i].entry.min), - SDL_SYS_BCDToShort(tracks[i].entry.frame)); - cdrom->track[i].length = MSF_TO_FRAMES( - SDL_SYS_BCDToShort(tracks[i+1].entry.min), - SDL_SYS_BCDToShort(tracks[i+1].entry.min), - SDL_SYS_BCDToShort(tracks[i+1].entry.frame)) - - cdrom->track[i].offset; - } - - /* Apparently SDL wants a fake last entry */ - cdrom->track[i].offset = leadout; - cdrom->track[i].length = 0; + /* Read all the track TOC entries */ + SDL_cdlist[cdrom->id].hasAudio = false; + for (i = 0; i < cdrom->numtracks; ++i) { + cdrom->track[i].id = i + 1; + if (tracks[i].entry.control & kDataTrackMask) + cdrom->track[i].type = SDL_DATA_TRACK; + else { + cdrom->track[i].type = SDL_AUDIO_TRACK; + SDL_cdlist[SDL_numcds].hasAudio = true; + } - return(0); + cdrom->track[i].offset = + MSF_TO_FRAMES(SDL_SYS_BCDToShort(tracks[i].entry.min), + SDL_SYS_BCDToShort(tracks[i].entry.min), + SDL_SYS_BCDToShort(tracks[i].entry.frame)); + cdrom->track[i].length = + MSF_TO_FRAMES(SDL_SYS_BCDToShort(tracks[i + 1].entry.min), + SDL_SYS_BCDToShort(tracks[i + 1].entry.min), + SDL_SYS_BCDToShort(tracks[i + 1].entry.frame)) - + cdrom->track[i].offset; + } + + /* Apparently SDL wants a fake last entry */ + cdrom->track[i].offset = leadout; + cdrom->track[i].length = 0; + + return (0); } /* Get CD-ROM status */ -static CDstatus SDL_SYS_CDStatus(SDL_CD *cdrom, int *position) +static CDstatus +SDL_SYS_CDStatus(SDL_CD * cdrom, int *position) { - CDCntrlParam cdpb; - CDstatus status = CD_ERROR; - Boolean spinning = false; + CDCntrlParam cdpb; + CDstatus status = CD_ERROR; + Boolean spinning = false; - if (position) *position = 0; + if (position) + *position = 0; - /* Get the number of tracks on the CD by examining the TOC */ - if ( ! get_drivenum(cdrom->id) ) { - return(CD_TRAYEMPTY); - } - SDL_memset(&cdpb, 0, sizeof(cdpb)); - cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; - cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; - cdpb.csCode = kReadTOC; - cdpb.csParam.words[0] = kGetTrackRange; - if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { - SDL_SetError("PBControlSync() failed"); - return(CD_ERROR); - } + /* Get the number of tracks on the CD by examining the TOC */ + if (!get_drivenum(cdrom->id)) { + return (CD_TRAYEMPTY); + } + SDL_memset(&cdpb, 0, sizeof(cdpb)); + cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; + cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; + cdpb.csCode = kReadTOC; + cdpb.csParam.words[0] = kGetTrackRange; + if (PBControlSync((ParmBlkPtr) & cdpb) != noErr) { + SDL_SetError("PBControlSync() failed"); + return (CD_ERROR); + } - cdrom->numtracks = - SDL_SYS_BCDToShort(cdpb.csParam.bytes[1]) - - SDL_SYS_BCDToShort(cdpb.csParam.bytes[0]) + 1; - if ( cdrom->numtracks > SDL_MAX_TRACKS ) - cdrom->numtracks = SDL_MAX_TRACKS; - cdrom->cur_track = 0; /* Apparently these are set elsewhere */ - cdrom->cur_frame = 0; /* Apparently these are set elsewhere */ + cdrom->numtracks = + SDL_SYS_BCDToShort(cdpb.csParam.bytes[1]) - + SDL_SYS_BCDToShort(cdpb.csParam.bytes[0]) + 1; + if (cdrom->numtracks > SDL_MAX_TRACKS) + cdrom->numtracks = SDL_MAX_TRACKS; + cdrom->cur_track = 0; /* Apparently these are set elsewhere */ + cdrom->cur_frame = 0; /* Apparently these are set elsewhere */ - if (1 || SDL_cdlist[cdrom->id].hasAudio) { - /* Get the current playback status */ - SDL_memset(&cdpb, 0, sizeof(cdpb)); - cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; - cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; - cdpb.csCode = kAudioStatus; - if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { - SDL_SetError("PBControlSync() failed"); - return(-1); - } - - switch(cdpb.csParam.cd.status) { - case kStatusPlaying: - status = CD_PLAYING; - spinning = true; - break; - case kStatusPaused: - status = CD_PAUSED; - spinning = true; - break; - case kStatusMuted: - status = CD_PLAYING; /* What should I do here? */ - spinning = true; - break; - case kStatusDone: - status = CD_STOPPED; - spinning = true; - break; - case kStatusStopped: - status = CD_STOPPED; - spinning = false; - break; - case kStatusError: - default: - status = CD_ERROR; - spinning = false; - break; - } + if (1 || SDL_cdlist[cdrom->id].hasAudio) { + /* Get the current playback status */ + SDL_memset(&cdpb, 0, sizeof(cdpb)); + cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; + cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; + cdpb.csCode = kAudioStatus; + if (PBControlSync((ParmBlkPtr) & cdpb) != noErr) { + SDL_SetError("PBControlSync() failed"); + return (-1); + } - if (spinning && position) *position = MSF_TO_FRAMES( - SDL_SYS_BCDToShort(cdpb.csParam.cd.minute), - SDL_SYS_BCDToShort(cdpb.csParam.cd.second), - SDL_SYS_BCDToShort(cdpb.csParam.cd.frame)); - } - else - status = CD_ERROR; /* What should I do here? */ + switch (cdpb.csParam.cd.status) { + case kStatusPlaying: + status = CD_PLAYING; + spinning = true; + break; + case kStatusPaused: + status = CD_PAUSED; + spinning = true; + break; + case kStatusMuted: + status = CD_PLAYING; /* What should I do here? */ + spinning = true; + break; + case kStatusDone: + status = CD_STOPPED; + spinning = true; + break; + case kStatusStopped: + status = CD_STOPPED; + spinning = false; + break; + case kStatusError: + default: + status = CD_ERROR; + spinning = false; + break; + } - return(status); + if (spinning && position) + *position = + MSF_TO_FRAMES(SDL_SYS_BCDToShort(cdpb.csParam.cd.minute), + SDL_SYS_BCDToShort(cdpb.csParam.cd.second), + SDL_SYS_BCDToShort(cdpb.csParam.cd.frame)); + } else + status = CD_ERROR; /* What should I do here? */ + + return (status); } /* Start play */ -static int SDL_SYS_CDPlay(SDL_CD *cdrom, int start, int length) +static int +SDL_SYS_CDPlay(SDL_CD * cdrom, int start, int length) { - CDCntrlParam cdpb; + CDCntrlParam cdpb; - /* Pause the current audio playback to avoid audible artifacts */ - if ( SDL_SYS_CDPause(cdrom) < 0 ) { - return(-1); - } + /* Pause the current audio playback to avoid audible artifacts */ + if (SDL_SYS_CDPause(cdrom) < 0) { + return (-1); + } - /* Specify the AudioCD playback mode */ - SDL_memset(&cdpb, 0, sizeof(cdpb)); - cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; - cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; - cdpb.csCode = kSetPlayMode; - cdpb.csParam.bytes[0] = false; /* Repeat? */ - cdpb.csParam.bytes[1] = kPlayModeSequential; /* Play mode */ - /* ¥¥¥ÊTreat as soft error, NEC Drive doesnt support this call ¥¥¥ */ - PBControlSync((ParmBlkPtr) &cdpb); + /* Specify the AudioCD playback mode */ + SDL_memset(&cdpb, 0, sizeof(cdpb)); + cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; + cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; + cdpb.csCode = kSetPlayMode; + cdpb.csParam.bytes[0] = false; /* Repeat? */ + cdpb.csParam.bytes[1] = kPlayModeSequential; /* Play mode */ + /* ¥¥¥ÊTreat as soft error, NEC Drive doesnt support this call ¥¥¥ */ + PBControlSync((ParmBlkPtr) & cdpb); #if 1 - /* Specify the end of audio playback */ - SDL_memset(&cdpb, 0, sizeof(cdpb)); - cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; - cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; - cdpb.csCode = kAudioStop; - cdpb.csParam.words[0] = kBlockPosition; /* Position Mode */ - *(long *) (cdpb.csParam.words + 1) = start+length-1; /* Search Address */ - if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { - SDL_SetError("PBControlSync() failed"); - return(-1); - } + /* Specify the end of audio playback */ + SDL_memset(&cdpb, 0, sizeof(cdpb)); + cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; + cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; + cdpb.csCode = kAudioStop; + cdpb.csParam.words[0] = kBlockPosition; /* Position Mode */ + *(long *) (cdpb.csParam.words + 1) = start + length - 1; /* Search Address */ + if (PBControlSync((ParmBlkPtr) & cdpb) != noErr) { + SDL_SetError("PBControlSync() failed"); + return (-1); + } - /* Specify the start of audio playback, and start it */ - SDL_memset(&cdpb, 0, sizeof(cdpb)); - cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; - cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; - cdpb.csCode = kAudioPlay; - cdpb.csParam.words[0] = kBlockPosition; /* Position Mode */ - *(long *) (cdpb.csParam.words + 1) = start+1; /* Search Address */ - cdpb.csParam.words[3] = false; /* Stop address? */ - cdpb.csParam.words[4] = kStereoPlayMode; /* Audio Play Mode */ - if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { - SDL_SetError("PBControlSync() failed"); - return(-1); - } + /* Specify the start of audio playback, and start it */ + SDL_memset(&cdpb, 0, sizeof(cdpb)); + cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; + cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; + cdpb.csCode = kAudioPlay; + cdpb.csParam.words[0] = kBlockPosition; /* Position Mode */ + *(long *) (cdpb.csParam.words + 1) = start + 1; /* Search Address */ + cdpb.csParam.words[3] = false; /* Stop address? */ + cdpb.csParam.words[4] = kStereoPlayMode; /* Audio Play Mode */ + if (PBControlSync((ParmBlkPtr) & cdpb) != noErr) { + SDL_SetError("PBControlSync() failed"); + return (-1); + } #else - /* Specify the end of audio playback */ - FRAMES_TO_MSF(start+length, &m, &s, &f); - SDL_memset(&cdpb, 0, sizeof(cdpb)); - cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; - cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; - cdpb.csCode = kAudioStop; - cdpb.csParam.words[0] = kTrackPosition; /* Position Mode */ - cdpb.csParam.words[1] = 0; /* Search Address (hiword)*/ - cdpb.csParam.words[2] = /* Search Address (loword)*/ - SDL_SYS_ShortToBCD(cdrom->numtracks); - if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { - SDL_SetError("PBControlSync() failed"); - return(-1); - } + /* Specify the end of audio playback */ + FRAMES_TO_MSF(start + length, &m, &s, &f); + SDL_memset(&cdpb, 0, sizeof(cdpb)); + cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; + cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; + cdpb.csCode = kAudioStop; + cdpb.csParam.words[0] = kTrackPosition; /* Position Mode */ + cdpb.csParam.words[1] = 0; /* Search Address (hiword) */ + cdpb.csParam.words[2] = /* Search Address (loword) */ + SDL_SYS_ShortToBCD(cdrom->numtracks); + if (PBControlSync((ParmBlkPtr) & cdpb) != noErr) { + SDL_SetError("PBControlSync() failed"); + return (-1); + } - /* Specify the start of audio playback, and start it */ - FRAMES_TO_MSF(start, &m, &s, &f); - SDL_memset(&cdpb, 0, sizeof(cdpb)); - cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; - cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; - cdpb.csCode = kAudioPlay; - cdpb.csParam.words[0] = kTrackPosition; /* Position Mode */ - cdpb.csParam.words[1] = 0; /* Search Address (hiword)*/ - cdpb.csParam.words[2] = SDL_SYS_ShortToBCD(1); /* Search Address (loword)*/ - cdpb.csParam.words[3] = false; /* Stop address? */ - cdpb.csParam.words[4] = kStereoPlayMode; /* Audio Play Mode */ - if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { - SDL_SetError("PBControlSync() failed"); - return(-1); - } + /* Specify the start of audio playback, and start it */ + FRAMES_TO_MSF(start, &m, &s, &f); + SDL_memset(&cdpb, 0, sizeof(cdpb)); + cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; + cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; + cdpb.csCode = kAudioPlay; + cdpb.csParam.words[0] = kTrackPosition; /* Position Mode */ + cdpb.csParam.words[1] = 0; /* Search Address (hiword) */ + cdpb.csParam.words[2] = SDL_SYS_ShortToBCD(1); /* Search Address (loword) */ + cdpb.csParam.words[3] = false; /* Stop address? */ + cdpb.csParam.words[4] = kStereoPlayMode; /* Audio Play Mode */ + if (PBControlSync((ParmBlkPtr) & cdpb) != noErr) { + SDL_SetError("PBControlSync() failed"); + return (-1); + } #endif - return(0); + return (0); } /* Pause play */ -static int SDL_SYS_CDPause(SDL_CD *cdrom) +static int +SDL_SYS_CDPause(SDL_CD * cdrom) { - CDCntrlParam cdpb; + CDCntrlParam cdpb; - SDL_memset(&cdpb, 0, sizeof(cdpb)); - cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; - cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; - cdpb.csCode = kAudioPause; - cdpb.csParam.words[0] = 0; /* Pause/Continue Flag (hiword) */ - cdpb.csParam.words[1] = 1; /* Pause/Continue Flag (loword) */ - if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { - SDL_SetError("PBControlSync() failed"); - return(-1); - } - return(0); + SDL_memset(&cdpb, 0, sizeof(cdpb)); + cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; + cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; + cdpb.csCode = kAudioPause; + cdpb.csParam.words[0] = 0; /* Pause/Continue Flag (hiword) */ + cdpb.csParam.words[1] = 1; /* Pause/Continue Flag (loword) */ + if (PBControlSync((ParmBlkPtr) & cdpb) != noErr) { + SDL_SetError("PBControlSync() failed"); + return (-1); + } + return (0); } /* Resume play */ -static int SDL_SYS_CDResume(SDL_CD *cdrom) +static int +SDL_SYS_CDResume(SDL_CD * cdrom) { - CDCntrlParam cdpb; + CDCntrlParam cdpb; - SDL_memset(&cdpb, 0, sizeof(cdpb)); - cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; - cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; - cdpb.csCode = kAudioPause; - cdpb.csParam.words[0] = 0; /* Pause/Continue Flag (hiword) */ - cdpb.csParam.words[1] = 0; /* Pause/Continue Flag (loword) */ - if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { - SDL_SetError("PBControlSync() failed"); - return(-1); - } - return(0); + SDL_memset(&cdpb, 0, sizeof(cdpb)); + cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; + cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; + cdpb.csCode = kAudioPause; + cdpb.csParam.words[0] = 0; /* Pause/Continue Flag (hiword) */ + cdpb.csParam.words[1] = 0; /* Pause/Continue Flag (loword) */ + if (PBControlSync((ParmBlkPtr) & cdpb) != noErr) { + SDL_SetError("PBControlSync() failed"); + return (-1); + } + return (0); } /* Stop play */ -static int SDL_SYS_CDStop(SDL_CD *cdrom) +static int +SDL_SYS_CDStop(SDL_CD * cdrom) { - CDCntrlParam cdpb; + CDCntrlParam cdpb; - SDL_memset(&cdpb, 0, sizeof(cdpb)); - cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; - cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; - cdpb.csCode = kAudioStop; - cdpb.csParam.words[0] = 0; /* Position Mode */ - cdpb.csParam.words[1] = 0; /* Search Address (hiword) */ - cdpb.csParam.words[2] = 0; /* Search Address (loword) */ - if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { - SDL_SetError("PBControlSync() failed"); - return(-1); - } - return(0); + SDL_memset(&cdpb, 0, sizeof(cdpb)); + cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; + cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; + cdpb.csCode = kAudioStop; + cdpb.csParam.words[0] = 0; /* Position Mode */ + cdpb.csParam.words[1] = 0; /* Search Address (hiword) */ + cdpb.csParam.words[2] = 0; /* Search Address (loword) */ + if (PBControlSync((ParmBlkPtr) & cdpb) != noErr) { + SDL_SetError("PBControlSync() failed"); + return (-1); + } + return (0); } /* Eject the CD-ROM */ -static int SDL_SYS_CDEject(SDL_CD *cdrom) +static int +SDL_SYS_CDEject(SDL_CD * cdrom) { - Boolean disk = false; - QHdr *driveQ = GetDrvQHdr(); - DrvQEl *driveElem; - HParamBlockRec hpb; - ParamBlockRec cpb; + Boolean disk = false; + QHdr *driveQ = GetDrvQHdr(); + DrvQEl *driveElem; + HParamBlockRec hpb; + ParamBlockRec cpb; + + for (driveElem = (DrvQEl *) driveQ->qHead; driveElem; driveElem = + (driveElem) ? ((DrvQEl *) driveElem->qLink) : + ((DrvQEl *) driveQ->qHead)) { + if (driveQ->qTail) { + driveQ->qTail->qLink = 0; + } + if (driveElem->dQRefNum != SDL_cdlist[cdrom->id].dRefNum) { + continue; + } - for ( driveElem = (DrvQEl *) driveQ->qHead; driveElem; driveElem = - (driveElem) ? ((DrvQEl *) driveElem->qLink) : - ((DrvQEl *) driveQ->qHead) ) { - if ( driveQ->qTail ) { - driveQ->qTail->qLink = 0; - } - if ( driveElem->dQRefNum != SDL_cdlist[cdrom->id].dRefNum ) { - continue; - } - - /* Does drive contain mounted volume? If not, skip */ - SDL_memset(&hpb, 0, sizeof(hpb)); - hpb.volumeParam.ioVRefNum = driveElem->dQDrive; - if ( PBHGetVInfoSync(&hpb) != noErr ) { - continue; - } - if ( (UnmountVol(0, driveElem->dQDrive) == noErr) && - (Eject(0, driveElem->dQDrive) == noErr) ) { - driveElem = 0; /* Clear pointer to reset our loop */ - disk = true; - } - } + /* Does drive contain mounted volume? If not, skip */ + SDL_memset(&hpb, 0, sizeof(hpb)); + hpb.volumeParam.ioVRefNum = driveElem->dQDrive; + if (PBHGetVInfoSync(&hpb) != noErr) { + continue; + } + if ((UnmountVol(0, driveElem->dQDrive) == noErr) && + (Eject(0, driveElem->dQDrive) == noErr)) { + driveElem = 0; /* Clear pointer to reset our loop */ + disk = true; + } + } - /* If no disk is present, just eject the tray */ - if (! disk) { - SDL_memset(&cpb, 0, sizeof(cpb)); - cpb.cntrlParam.ioVRefNum = 0; /* No Drive */ - cpb.cntrlParam.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; - cpb.cntrlParam.csCode = kEjectTheDisc; - if ( PBControlSync((ParmBlkPtr)&cpb) != noErr ) { - SDL_SetError("PBControlSync() failed"); - return(-1); - } - } - return(0); + /* If no disk is present, just eject the tray */ + if (!disk) { + SDL_memset(&cpb, 0, sizeof(cpb)); + cpb.cntrlParam.ioVRefNum = 0; /* No Drive */ + cpb.cntrlParam.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; + cpb.cntrlParam.csCode = kEjectTheDisc; + if (PBControlSync((ParmBlkPtr) & cpb) != noErr) { + SDL_SetError("PBControlSync() failed"); + return (-1); + } + } + return (0); } /* Close the CD-ROM handle */ -static void SDL_SYS_CDClose(SDL_CD *cdrom) +static void +SDL_SYS_CDClose(SDL_CD * cdrom) { - return; + return; } -void SDL_SYS_CDQuit(void) +void +SDL_SYS_CDQuit(void) { - while(SDL_numcds--) - SDL_memset(SDL_cdlist + SDL_numcds, 0, sizeof(SDL_cdlist[0])); + while (SDL_numcds--) + SDL_memset(SDL_cdlist + SDL_numcds, 0, sizeof(SDL_cdlist[0])); } #endif /* SDL_CDROM_MACOS */ +/* vi: set ts=4 sw=4 expandtab: */