146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* 246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL - Simple DirectMedia Layer 346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Copyright (C) 1997-2006 Sam Lantinga 446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This library is free software; you can redistribute it and/or 646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner modify it under the terms of the GNU Lesser General Public 746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner License as published by the Free Software Foundation; either 846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner version 2.1 of the License, or (at your option) any later version. 946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This library is distributed in the hope that it will be useful, 1146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner but WITHOUT ANY WARRANTY; without even the implied warranty of 1246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Lesser General Public License for more details. 1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner You should have received a copy of the GNU Lesser General Public 1646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner License along with this library; if not, write to the Free Software 1746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 1846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Sam Lantinga 2046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner slouken@libsdl.org 2146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/ 2246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_config.h" 2346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef SDL_CDROM_MACOS 2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* MacOS functions for system-level CD-ROM audio control */ 2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <Devices.h> 2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <Files.h> 3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <LowMem.h> /* Use entry table macros, not functions in InterfaceLib */ 3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_cdrom.h" 3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../SDL_syscdrom.h" 3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_syscdrom_c.h" 3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Added by Matt Slot */ 3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if !defined(LMGetUnitTableEntryCount) 3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner #define LMGetUnitTableEntryCount() *(short *)0x01D2 3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* The maximum number of CD-ROM drives we'll detect */ 4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define MAX_DRIVES 26 4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* A list of available CD-ROM drives */ 4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic long SDL_cdversion = 0; 4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic struct { 4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner short dRefNum; 4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner short driveNum; 4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner long frames; 5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner char name[256]; 5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Boolean hasAudio; 5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } SDL_cdlist[MAX_DRIVES]; 5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic StringPtr gDriverName = "\p.AppleCD"; 5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* The system-dependent CD control functions */ 5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic const char *SDL_SYS_CDName(int drive); 5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDOpen(int drive); 5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDGetTOC(SDL_CD *cdrom); 5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic CDstatus SDL_SYS_CDStatus(SDL_CD *cdrom, int *position); 6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDPlay(SDL_CD *cdrom, int start, int length); 6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDPause(SDL_CD *cdrom); 6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDResume(SDL_CD *cdrom); 6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDStop(SDL_CD *cdrom); 6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDEject(SDL_CD *cdrom); 6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void SDL_SYS_CDClose(SDL_CD *cdrom); 6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic short SDL_SYS_ShortToBCD(short value) 6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return((value % 10) + (value / 10) * 0x10); /* Convert value to BCD */ 7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic short SDL_SYS_BCDToShort(short value) 7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return((value % 0x10) + (value / 0x10) * 10); /* Convert value from BCD */ 7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint SDL_SYS_CDInit(void) 7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SInt16 dRefNum = 0; 8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SInt16 first, last; 8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_numcds = 0; 8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Check that the software is available */ 8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (Gestalt(kGestaltAudioCDSelector, &SDL_cdversion) || 8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner !SDL_cdversion) return(0); 8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Fill in our driver capabilities */ 8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_CDcaps.Name = SDL_SYS_CDName; 9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_CDcaps.Open = SDL_SYS_CDOpen; 9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_CDcaps.GetTOC = SDL_SYS_CDGetTOC; 9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_CDcaps.Status = SDL_SYS_CDStatus; 9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_CDcaps.Play = SDL_SYS_CDPlay; 9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_CDcaps.Pause = SDL_SYS_CDPause; 9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_CDcaps.Resume = SDL_SYS_CDResume; 9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_CDcaps.Stop = SDL_SYS_CDStop; 9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_CDcaps.Eject = SDL_SYS_CDEject; 9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_CDcaps.Close = SDL_SYS_CDClose; 9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 10046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Walk the list, count each AudioCD driver, and save the refnums */ 10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner first = -1; 10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner last = 0 - LMGetUnitTableEntryCount(); 10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for(dRefNum = first; dRefNum >= last; dRefNum--) { 10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Str255 driverName; 10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner StringPtr namePtr; 10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DCtlHandle deviceEntry; 10746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 10846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner deviceEntry = GetDCtlEntry(dRefNum); 10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (! deviceEntry) continue; 11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Is this an .AppleCD ? */ 11246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner namePtr = (*deviceEntry)->dCtlFlags & (1L << dRAMBased) ? 11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ((StringPtr) ((DCtlPtr) deviceEntry)->dCtlDriver + 18) : 11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ((StringPtr) (*deviceEntry)->dCtlDriver + 18); 11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner BlockMoveData(namePtr, driverName, namePtr[0]+1); 11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (driverName[0] > gDriverName[0]) driverName[0] = gDriverName[0]; 11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (! EqualString(driverName, gDriverName, false, false)) continue; 11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Record the basic info for each drive */ 12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_cdlist[SDL_numcds].dRefNum = dRefNum; 12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner BlockMoveData(namePtr + 1, SDL_cdlist[SDL_numcds].name, namePtr[0]); 12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_cdlist[SDL_numcds].name[namePtr[0]] = 0; 12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_cdlist[SDL_numcds].hasAudio = false; 12446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_numcds++; 12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(0); 12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic const char *SDL_SYS_CDName(int drive) 13046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 13146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(SDL_cdlist[drive].name); 13246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 13346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 13446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int get_drivenum(int drive) 13546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 13646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner QHdr *driveQ = GetDrvQHdr(); 13746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DrvQEl *driveElem; 13846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 13946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Update the drive number */ 14046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_cdlist[drive].driveNum = 0; 14146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( driveQ->qTail ) { 14246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner driveQ->qTail->qLink = 0; 14346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 14446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for ( driveElem=(DrvQEl *)driveQ->qHead; driveElem; 14546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner driveElem = (DrvQEl *)driveElem->qLink ) { 14646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( driveElem->dQRefNum == SDL_cdlist[drive].dRefNum ) { 14746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_cdlist[drive].driveNum = driveElem->dQDrive; 14846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 14946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 15046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 15146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(SDL_cdlist[drive].driveNum); 15246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 15346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 15446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDOpen(int drive) 15546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 15646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(drive); 15746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 15846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 15946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDGetTOC(SDL_CD *cdrom) 16046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 16146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner CDCntrlParam cdpb; 16246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner CDTrackData tracks[SDL_MAX_TRACKS]; 16346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner long i, leadout; 16446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 16546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Get the number of tracks on the CD by examining the TOC */ 16646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(&cdpb, 0, sizeof(cdpb)); 16746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; 16846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; 16946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csCode = kReadTOC; 17046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[0] = kGetTrackRange; 17146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { 17246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("PBControlSync() failed"); 17346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(-1); 17446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 17546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 17646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdrom->numtracks = 17746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SYS_BCDToShort(cdpb.csParam.bytes[1]) - 17846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SYS_BCDToShort(cdpb.csParam.bytes[0]) + 1; 17946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( cdrom->numtracks > SDL_MAX_TRACKS ) 18046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdrom->numtracks = SDL_MAX_TRACKS; 18146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdrom->status = CD_STOPPED; 18246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdrom->cur_track = 0; /* Apparently these are set elsewhere */ 18346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdrom->cur_frame = 0; /* Apparently these are set elsewhere */ 18446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 18546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 18646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Get the lead out area of the CD by examining the TOC */ 18746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(&cdpb, 0, sizeof(cdpb)); 18846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; 18946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; 19046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csCode = kReadTOC; 19146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[0] = kGetLeadOutArea; 19246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { 19346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("PBControlSync() failed"); 19446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(-1); 19546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 19646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner leadout = MSF_TO_FRAMES( 19846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SYS_BCDToShort(cdpb.csParam.bytes[0]), 19946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SYS_BCDToShort(cdpb.csParam.bytes[1]), 20046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SYS_BCDToShort(cdpb.csParam.bytes[2])); 20146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 20246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Get an array of track locations by examining the TOC */ 20346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(tracks, 0, sizeof(tracks)); 20446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(&cdpb, 0, sizeof(cdpb)); 20546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; 20646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; 20746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csCode = kReadTOC; 20846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[0] = kGetTrackEntries; /* Type of Query */ 20946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner * ((long *) (cdpb.csParam.words+1)) = (long) tracks; 21046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[3] = cdrom->numtracks * sizeof(tracks[0]); 21146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner * ((char *) (cdpb.csParam.words+4)) = 1; /* First track */ 21246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { 21346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("PBControlSync() failed"); 21446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(-1); 21546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 21646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 21746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Read all the track TOC entries */ 21846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_cdlist[cdrom->id].hasAudio = false; 21946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for ( i=0; i<cdrom->numtracks; ++i ) 22046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 22146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdrom->track[i].id = i+1; 22246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (tracks[i].entry.control & kDataTrackMask) 22346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdrom->track[i].type = SDL_DATA_TRACK; 22446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 22546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 22646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdrom->track[i].type = SDL_AUDIO_TRACK; 22746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_cdlist[SDL_numcds].hasAudio = true; 22846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 22946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 23046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdrom->track[i].offset = MSF_TO_FRAMES( 23146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SYS_BCDToShort(tracks[i].entry.min), 23246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SYS_BCDToShort(tracks[i].entry.min), 23346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SYS_BCDToShort(tracks[i].entry.frame)); 23446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdrom->track[i].length = MSF_TO_FRAMES( 23546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SYS_BCDToShort(tracks[i+1].entry.min), 23646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SYS_BCDToShort(tracks[i+1].entry.min), 23746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SYS_BCDToShort(tracks[i+1].entry.frame)) - 23846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdrom->track[i].offset; 23946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 24046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 24146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Apparently SDL wants a fake last entry */ 24246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdrom->track[i].offset = leadout; 24346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdrom->track[i].length = 0; 24446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 24546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(0); 24646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 24746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 24846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Get CD-ROM status */ 24946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic CDstatus SDL_SYS_CDStatus(SDL_CD *cdrom, int *position) 25046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 25146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner CDCntrlParam cdpb; 25246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner CDstatus status = CD_ERROR; 25346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Boolean spinning = false; 25446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 25546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (position) *position = 0; 25646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 25746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Get the number of tracks on the CD by examining the TOC */ 25846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( ! get_drivenum(cdrom->id) ) { 25946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(CD_TRAYEMPTY); 26046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 26146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(&cdpb, 0, sizeof(cdpb)); 26246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; 26346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; 26446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csCode = kReadTOC; 26546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[0] = kGetTrackRange; 26646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { 26746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("PBControlSync() failed"); 26846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(CD_ERROR); 26946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 27046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 27146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdrom->numtracks = 27246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SYS_BCDToShort(cdpb.csParam.bytes[1]) - 27346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SYS_BCDToShort(cdpb.csParam.bytes[0]) + 1; 27446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( cdrom->numtracks > SDL_MAX_TRACKS ) 27546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdrom->numtracks = SDL_MAX_TRACKS; 27646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdrom->cur_track = 0; /* Apparently these are set elsewhere */ 27746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdrom->cur_frame = 0; /* Apparently these are set elsewhere */ 27846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 27946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 28046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (1 || SDL_cdlist[cdrom->id].hasAudio) { 28146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Get the current playback status */ 28246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(&cdpb, 0, sizeof(cdpb)); 28346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; 28446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; 28546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csCode = kAudioStatus; 28646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { 28746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("PBControlSync() failed"); 28846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(-1); 28946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 29046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 29146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch(cdpb.csParam.cd.status) { 29246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case kStatusPlaying: 29346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner status = CD_PLAYING; 29446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner spinning = true; 29546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 29646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case kStatusPaused: 29746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner status = CD_PAUSED; 29846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner spinning = true; 29946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 30046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case kStatusMuted: 30146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner status = CD_PLAYING; /* What should I do here? */ 30246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner spinning = true; 30346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 30446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case kStatusDone: 30546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner status = CD_STOPPED; 30646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner spinning = true; 30746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 30846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case kStatusStopped: 30946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner status = CD_STOPPED; 31046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner spinning = false; 31146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 31246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case kStatusError: 31346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner default: 31446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner status = CD_ERROR; 31546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner spinning = false; 31646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 31746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 31846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 31946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (spinning && position) *position = MSF_TO_FRAMES( 32046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SYS_BCDToShort(cdpb.csParam.cd.minute), 32146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SYS_BCDToShort(cdpb.csParam.cd.second), 32246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SYS_BCDToShort(cdpb.csParam.cd.frame)); 32346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 32446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 32546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner status = CD_ERROR; /* What should I do here? */ 32646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 32746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(status); 32846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 32946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 33046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Start play */ 33146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDPlay(SDL_CD *cdrom, int start, int length) 33246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 33346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner CDCntrlParam cdpb; 33446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 33546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Pause the current audio playback to avoid audible artifacts */ 33646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( SDL_SYS_CDPause(cdrom) < 0 ) { 33746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(-1); 33846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 33946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 34046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Specify the AudioCD playback mode */ 34146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(&cdpb, 0, sizeof(cdpb)); 34246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; 34346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; 34446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csCode = kSetPlayMode; 34546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.bytes[0] = false; /* Repeat? */ 34646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.bytes[1] = kPlayModeSequential; /* Play mode */ 34746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* ����Treat as soft error, NEC Drive doesnt support this call ��� */ 34846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PBControlSync((ParmBlkPtr) &cdpb); 34946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 35046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if 1 35146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Specify the end of audio playback */ 35246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(&cdpb, 0, sizeof(cdpb)); 35346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; 35446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; 35546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csCode = kAudioStop; 35646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[0] = kBlockPosition; /* Position Mode */ 35746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *(long *) (cdpb.csParam.words + 1) = start+length-1; /* Search Address */ 35846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { 35946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("PBControlSync() failed"); 36046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(-1); 36146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 36246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 36346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Specify the start of audio playback, and start it */ 36446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(&cdpb, 0, sizeof(cdpb)); 36546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; 36646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; 36746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csCode = kAudioPlay; 36846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[0] = kBlockPosition; /* Position Mode */ 36946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *(long *) (cdpb.csParam.words + 1) = start+1; /* Search Address */ 37046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[3] = false; /* Stop address? */ 37146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[4] = kStereoPlayMode; /* Audio Play Mode */ 37246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { 37346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("PBControlSync() failed"); 37446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(-1); 37546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 37646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else 37746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Specify the end of audio playback */ 37846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FRAMES_TO_MSF(start+length, &m, &s, &f); 37946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(&cdpb, 0, sizeof(cdpb)); 38046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; 38146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; 38246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csCode = kAudioStop; 38346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[0] = kTrackPosition; /* Position Mode */ 38446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[1] = 0; /* Search Address (hiword)*/ 38546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[2] = /* Search Address (loword)*/ 38646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SYS_ShortToBCD(cdrom->numtracks); 38746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { 38846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("PBControlSync() failed"); 38946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(-1); 39046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 39146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 39246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Specify the start of audio playback, and start it */ 39346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FRAMES_TO_MSF(start, &m, &s, &f); 39446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(&cdpb, 0, sizeof(cdpb)); 39546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; 39646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; 39746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csCode = kAudioPlay; 39846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[0] = kTrackPosition; /* Position Mode */ 39946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[1] = 0; /* Search Address (hiword)*/ 40046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[2] = SDL_SYS_ShortToBCD(1); /* Search Address (loword)*/ 40146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[3] = false; /* Stop address? */ 40246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[4] = kStereoPlayMode; /* Audio Play Mode */ 40346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { 40446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("PBControlSync() failed"); 40546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(-1); 40646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 40746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 40846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 40946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(0); 41046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 41146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 41246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Pause play */ 41346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDPause(SDL_CD *cdrom) 41446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 41546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner CDCntrlParam cdpb; 41646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 41746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(&cdpb, 0, sizeof(cdpb)); 41846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; 41946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; 42046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csCode = kAudioPause; 42146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[0] = 0; /* Pause/Continue Flag (hiword) */ 42246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[1] = 1; /* Pause/Continue Flag (loword) */ 42346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { 42446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("PBControlSync() failed"); 42546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(-1); 42646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 42746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(0); 42846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 42946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 43046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Resume play */ 43146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDResume(SDL_CD *cdrom) 43246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 43346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner CDCntrlParam cdpb; 43446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 43546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(&cdpb, 0, sizeof(cdpb)); 43646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; 43746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; 43846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csCode = kAudioPause; 43946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[0] = 0; /* Pause/Continue Flag (hiword) */ 44046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[1] = 0; /* Pause/Continue Flag (loword) */ 44146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { 44246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("PBControlSync() failed"); 44346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(-1); 44446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 44546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(0); 44646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 44746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 44846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Stop play */ 44946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDStop(SDL_CD *cdrom) 45046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 45146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner CDCntrlParam cdpb; 45246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 45346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(&cdpb, 0, sizeof(cdpb)); 45446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioVRefNum = SDL_cdlist[cdrom->id].driveNum; 45546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; 45646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csCode = kAudioStop; 45746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[0] = 0; /* Position Mode */ 45846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[1] = 0; /* Search Address (hiword) */ 45946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdpb.csParam.words[2] = 0; /* Search Address (loword) */ 46046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( PBControlSync((ParmBlkPtr)&cdpb) != noErr ) { 46146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("PBControlSync() failed"); 46246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(-1); 46346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 46446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(0); 46546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 46646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 46746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Eject the CD-ROM */ 46846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDEject(SDL_CD *cdrom) 46946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 47046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Boolean disk = false; 47146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner QHdr *driveQ = GetDrvQHdr(); 47246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DrvQEl *driveElem; 47346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HParamBlockRec hpb; 47446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ParamBlockRec cpb; 47546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 47646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for ( driveElem = (DrvQEl *) driveQ->qHead; driveElem; driveElem = 47746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (driveElem) ? ((DrvQEl *) driveElem->qLink) : 47846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ((DrvQEl *) driveQ->qHead) ) { 47946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( driveQ->qTail ) { 48046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner driveQ->qTail->qLink = 0; 48146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 48246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( driveElem->dQRefNum != SDL_cdlist[cdrom->id].dRefNum ) { 48346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner continue; 48446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 48546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 48646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Does drive contain mounted volume? If not, skip */ 48746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(&hpb, 0, sizeof(hpb)); 48846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hpb.volumeParam.ioVRefNum = driveElem->dQDrive; 48946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( PBHGetVInfoSync(&hpb) != noErr ) { 49046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner continue; 49146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 49246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( (UnmountVol(0, driveElem->dQDrive) == noErr) && 49346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (Eject(0, driveElem->dQDrive) == noErr) ) { 49446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner driveElem = 0; /* Clear pointer to reset our loop */ 49546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner disk = true; 49646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 49746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 49846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 49946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* If no disk is present, just eject the tray */ 50046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (! disk) { 50146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(&cpb, 0, sizeof(cpb)); 50246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cpb.cntrlParam.ioVRefNum = 0; /* No Drive */ 50346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cpb.cntrlParam.ioCRefNum = SDL_cdlist[cdrom->id].dRefNum; 50446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cpb.cntrlParam.csCode = kEjectTheDisc; 50546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( PBControlSync((ParmBlkPtr)&cpb) != noErr ) { 50646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("PBControlSync() failed"); 50746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(-1); 50846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 50946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 51046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(0); 51146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 51246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 51346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Close the CD-ROM handle */ 51446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void SDL_SYS_CDClose(SDL_CD *cdrom) 51546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 51646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return; 51746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 51846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 51946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_SYS_CDQuit(void) 52046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 52146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while(SDL_numcds--) 52246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(SDL_cdlist + SDL_numcds, 0, sizeof(SDL_cdlist[0])); 52346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 52446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 52546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* SDL_CDROM_MACOS */ 526