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