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_MACOSX 2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_syscdrom_c.h" 2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#pragma mark -- Globals -- 2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic FSRef** tracks; 3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic FSVolumeRefNum* volumes; 3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic CDstatus status; 3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int nextTrackFrame; 3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int nextTrackFramesRemaining; 3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int fakeCD; 3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int currentTrack; 3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int didReadTOC; 3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int cacheTOCNumTracks; 3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int currentDrive; /* Only allow 1 drive in use at a time */ 4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#pragma mark -- Prototypes -- 4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic const char *SDL_SYS_CDName (int drive); 4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDOpen (int drive); 4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDGetTOC (SDL_CD *cdrom); 4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic CDstatus SDL_SYS_CDStatus (SDL_CD *cdrom, int *position); 4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDPlay (SDL_CD *cdrom, int start, int length); 4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDPause (SDL_CD *cdrom); 4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDResume (SDL_CD *cdrom); 5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDStop (SDL_CD *cdrom); 5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDEject (SDL_CD *cdrom); 5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void SDL_SYS_CDClose (SDL_CD *cdrom); 5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#pragma mark -- Helper Functions -- 5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Read a list of tracks from the volume */ 5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int LoadTracks (SDL_CD *cdrom) 5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Check if tracks are already loaded */ 6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( tracks[cdrom->id] != NULL ) 6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Allocate memory for tracks */ 6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner tracks[cdrom->id] = (FSRef*) SDL_calloc (1, sizeof(**tracks) * cdrom->numtracks); 6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (tracks[cdrom->id] == NULL) { 6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_OutOfMemory (); 6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Load tracks */ 7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (ListTrackFiles (volumes[cdrom->id], tracks[cdrom->id], cdrom->numtracks) < 0) 7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Find a file for a given start frame and length */ 7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic FSRef* GetFileForOffset (SDL_CD *cdrom, int start, int length, int *outStartFrame, int *outStopFrame) 7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int i; 8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for (i = 0; i < cdrom->numtracks; i++) { 8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (cdrom->track[i].offset <= start && 8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner start < (cdrom->track[i].offset + cdrom->track[i].length)) 8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (i == cdrom->numtracks) 9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return NULL; 9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner currentTrack = i; 9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *outStartFrame = start - cdrom->track[i].offset; 9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((*outStartFrame + length) < cdrom->track[i].length) { 9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *outStopFrame = *outStartFrame + length; 9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner length = 0; 9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner nextTrackFrame = -1; 10046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner nextTrackFramesRemaining = -1; 10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else { 10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *outStopFrame = -1; 10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner length -= cdrom->track[i].length - *outStartFrame; 10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner nextTrackFrame = cdrom->track[i+1].offset; 10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner nextTrackFramesRemaining = length; 10746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 10846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return &tracks[cdrom->id][i]; 11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Setup another file for playback, or stop playback (called from another thread) */ 11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void CompletionProc (SDL_CD *cdrom) 11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Lock (); 11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (nextTrackFrame > 0 && nextTrackFramesRemaining > 0) { 11946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Load the next file to play */ 12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int startFrame, stopFrame; 12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSRef *file; 12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 12446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PauseFile (); 12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ReleaseFile (); 12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner file = GetFileForOffset (cdrom, nextTrackFrame, 12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner nextTrackFramesRemaining, &startFrame, &stopFrame); 12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 13046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (file == NULL) { 13146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner status = CD_STOPPED; 13246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Unlock (); 13346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return; 13446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 13546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 13646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner LoadFile (file, startFrame, stopFrame); 13746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 13846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SetCompletionProc (CompletionProc, cdrom); 13946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 14046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PlayFile (); 14146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 14246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else { 14346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 14446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Release the current file */ 14546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PauseFile (); 14646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ReleaseFile (); 14746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner status = CD_STOPPED; 14846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 14946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 15046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Unlock (); 15146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 15246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 15346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 15446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#pragma mark -- Driver Functions -- 15546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 15646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Initialize */ 15746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint SDL_SYS_CDInit (void) 15846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 15946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Initialize globals */ 16046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner volumes = NULL; 16146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner tracks = NULL; 16246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner status = CD_STOPPED; 16346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner nextTrackFrame = -1; 16446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner nextTrackFramesRemaining = -1; 16546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fakeCD = SDL_FALSE; 16646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner currentTrack = -1; 16746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner didReadTOC = SDL_FALSE; 16846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cacheTOCNumTracks = -1; 16946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner currentDrive = -1; 17046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 17146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Fill in function pointers */ 17246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_CDcaps.Name = SDL_SYS_CDName; 17346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_CDcaps.Open = SDL_SYS_CDOpen; 17446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_CDcaps.GetTOC = SDL_SYS_CDGetTOC; 17546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_CDcaps.Status = SDL_SYS_CDStatus; 17646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_CDcaps.Play = SDL_SYS_CDPlay; 17746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_CDcaps.Pause = SDL_SYS_CDPause; 17846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_CDcaps.Resume = SDL_SYS_CDResume; 17946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_CDcaps.Stop = SDL_SYS_CDStop; 18046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_CDcaps.Eject = SDL_SYS_CDEject; 18146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_CDcaps.Close = SDL_SYS_CDClose; 18246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 18346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* 18446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Read the list of "drives" 18546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 18646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This is currently a hack that infers drives from 18746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mounted audio CD volumes, rather than 18846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner actual CD-ROM devices - which means it may not 18946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner act as expected sometimes. 19046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 19146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Find out how many cd volumes are mounted */ 19346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_numcds = DetectAudioCDVolumes (NULL, 0); 19446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* 19646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner If there are no volumes, fake a cd device 19746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner so tray empty can be reported. 19846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 19946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (SDL_numcds == 0) { 20046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 20146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fakeCD = SDL_TRUE; 20246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_numcds = 1; 20346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner status = CD_TRAYEMPTY; 20446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 20546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 20646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 20746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 20846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Allocate space for volumes */ 20946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner volumes = (FSVolumeRefNum*) SDL_calloc (1, sizeof(*volumes) * SDL_numcds); 21046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (volumes == NULL) { 21146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_OutOfMemory (); 21246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 21346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 21446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 21546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Allocate space for tracks */ 21646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner tracks = (FSRef**) SDL_calloc (1, sizeof(*tracks) * (SDL_numcds + 1)); 21746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (tracks == NULL) { 21846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_OutOfMemory (); 21946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 22046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 22146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 22246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Mark the end of the tracks array */ 22346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner tracks[ SDL_numcds ] = (FSRef*)-1; 22446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 22546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* 22646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Redetect, now save all volumes for later 22746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Update SDL_numcds just in case it changed 22846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 22946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 23046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int numVolumes = SDL_numcds; 23146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 23246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_numcds = DetectAudioCDVolumes (volumes, numVolumes); 23346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 23446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* If more cds suddenly show up, ignore them */ 23546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (SDL_numcds > numVolumes) { 23646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError ("Some CD's were added but they will be ignored"); 23746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_numcds = numVolumes; 23846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 23946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 24046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 24146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 24246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 24346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 24446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Shutdown and cleanup */ 24546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_SYS_CDQuit(void) 24646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 24746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ReleaseFile(); 24846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 24946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (volumes != NULL) 25046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner free (volumes); 25146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 25246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (tracks != NULL) { 25346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 25446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSRef **ptr; 25546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for (ptr = tracks; *ptr != (FSRef*)-1; ptr++) 25646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (*ptr != NULL) 25746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner free (*ptr); 25846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 25946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner free (tracks); 26046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 26146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 26246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 26346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Get the Unix disk name of the volume */ 26446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic const char *SDL_SYS_CDName (int drive) 26546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 26646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner OSStatus err = noErr; 26746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HParamBlockRec pb; 26846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner GetVolParmsInfoBuffer volParmsInfo; 26946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 27046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (fakeCD) 27146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return "Fake CD-ROM Device"; 27246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 27346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pb.ioParam.ioNamePtr = NULL; 27446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pb.ioParam.ioVRefNum = volumes[drive]; 27546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pb.ioParam.ioBuffer = (Ptr)&volParmsInfo; 27646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pb.ioParam.ioReqCount = (SInt32)sizeof(volParmsInfo); 27746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner err = PBHGetVolParmsSync(&pb); 27846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 27946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (err != noErr) { 28046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError ("PBHGetVolParmsSync returned %d", err); 28146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return NULL; 28246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 28346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 28446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return volParmsInfo.vMDeviceID; 28546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 28646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 28746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Open the "device" */ 28846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDOpen (int drive) 28946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 29046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Only allow 1 device to be open */ 29146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (currentDrive >= 0) { 29246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError ("Only one cdrom is supported"); 29346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 29446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 29546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 29646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner currentDrive = drive; 29746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 29846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return drive; 29946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 30046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 30146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Get the table of contents */ 30246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDGetTOC (SDL_CD *cdrom) 30346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 30446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (fakeCD) { 30546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError (kErrorFakeDevice); 30646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 30746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 30846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 30946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (didReadTOC) { 31046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cdrom->numtracks = cacheTOCNumTracks; 31146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 31246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 31346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 31446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 31546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ReadTOCData (volumes[cdrom->id], cdrom); 31646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner didReadTOC = SDL_TRUE; 31746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cacheTOCNumTracks = cdrom->numtracks; 31846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 31946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 32046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 32146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 32246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Get CD-ROM status */ 32346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic CDstatus SDL_SYS_CDStatus (SDL_CD *cdrom, int *position) 32446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 32546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (position) { 32646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int trackFrame; 32746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 32846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Lock (); 32946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner trackFrame = GetCurrentFrame (); 33046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Unlock (); 33146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 33246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *position = cdrom->track[currentTrack].offset + trackFrame; 33346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 33446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 33546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return status; 33646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 33746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 33846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Start playback */ 33946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDPlay(SDL_CD *cdrom, int start, int length) 34046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 34146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int startFrame, stopFrame; 34246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSRef *ref; 34346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 34446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (fakeCD) { 34546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError (kErrorFakeDevice); 34646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 34746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 34846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 34946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Lock(); 35046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 35146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (LoadTracks (cdrom) < 0) 35246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -2; 35346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 35446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (PauseFile () < 0) 35546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -3; 35646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 35746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (ReleaseFile () < 0) 35846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -4; 35946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 36046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ref = GetFileForOffset (cdrom, start, length, &startFrame, &stopFrame); 36146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (ref == NULL) { 36246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError ("SDL_SYS_CDPlay: No file for start=%d, length=%d", start, length); 36346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -5; 36446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 36546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 36646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (LoadFile (ref, startFrame, stopFrame) < 0) 36746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -6; 36846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 36946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SetCompletionProc (CompletionProc, cdrom); 37046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 37146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (PlayFile () < 0) 37246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -7; 37346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 37446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner status = CD_PLAYING; 37546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 37646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Unlock(); 37746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 37846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 37946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 38046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 38146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Pause playback */ 38246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDPause(SDL_CD *cdrom) 38346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 38446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (fakeCD) { 38546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError (kErrorFakeDevice); 38646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 38746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 38846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 38946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Lock (); 39046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 39146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (PauseFile () < 0) { 39246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Unlock (); 39346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -2; 39446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 39546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 39646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner status = CD_PAUSED; 39746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 39846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Unlock (); 39946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 40046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 40146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 40246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 40346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Resume playback */ 40446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDResume(SDL_CD *cdrom) 40546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 40646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (fakeCD) { 40746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError (kErrorFakeDevice); 40846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 40946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 41046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 41146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Lock (); 41246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 41346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (PlayFile () < 0) { 41446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Unlock (); 41546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -2; 41646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 41746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 41846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner status = CD_PLAYING; 41946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 42046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Unlock (); 42146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 42246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 42346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 42446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 42546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Stop playback */ 42646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDStop(SDL_CD *cdrom) 42746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 42846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (fakeCD) { 42946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError (kErrorFakeDevice); 43046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 43146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 43246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 43346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Lock (); 43446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 43546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (PauseFile () < 0) { 43646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Unlock (); 43746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -2; 43846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 43946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 44046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (ReleaseFile () < 0) { 44146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Unlock (); 44246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -3; 44346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 44446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 44546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner status = CD_STOPPED; 44646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 44746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Unlock (); 44846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 44946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 45046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 45146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 45246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Eject the CD-ROM (Unmount the volume) */ 45346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int SDL_SYS_CDEject(SDL_CD *cdrom) 45446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 45546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner OSStatus err; 45646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pid_t dissenter; 45746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 45846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (fakeCD) { 45946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError (kErrorFakeDevice); 46046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 46146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 46246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 46346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Lock (); 46446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 46546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (PauseFile () < 0) { 46646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Unlock (); 46746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -2; 46846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 46946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 47046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (ReleaseFile () < 0) { 47146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Unlock (); 47246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -3; 47346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 47446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 47546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner status = CD_STOPPED; 47646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 47746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Eject the volume */ 47846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner err = FSEjectVolumeSync(volumes[cdrom->id], kNilOptions, &dissenter); 47946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 48046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (err != noErr) { 48146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Unlock (); 48246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError ("PBUnmountVol returned %d", err); 48346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -4; 48446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 48546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 48646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner status = CD_TRAYEMPTY; 48746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 48846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Invalidate volume and track info */ 48946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner volumes[cdrom->id] = 0; 49046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner free (tracks[cdrom->id]); 49146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner tracks[cdrom->id] = NULL; 49246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 49346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Unlock (); 49446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 49546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 49646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 49746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 49846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Close the CD-ROM */ 49946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void SDL_SYS_CDClose(SDL_CD *cdrom) 50046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 50146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner currentDrive = -1; 50246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return; 50346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 50446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 50546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* SDL_CDROM_MACOSX */ 506