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