Commit a787ace0 authored by Ryan C. Gordon's avatar Ryan C. Gordon

Fixed CD-ROM code to work with Mac OS X 10.6 SDK and 64-bit targets.

--HG--
branch : SDL-1.2
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/branches/SDL-1.2%403798
parent ea2239b3
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
so if you want to see the original search for it on apple.com/developer so if you want to see the original search for it on apple.com/developer
*/ */
#include "SDL_config.h" #include "SDL_config.h"
#include "SDL_endian.h"
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
AudioFilePlayer.cpp AudioFilePlayer.cpp
...@@ -78,7 +79,7 @@ static int AudioFilePlayer_SetDestination (AudioFilePlayer *afp, AudioUnit *inD ...@@ -78,7 +79,7 @@ static int AudioFilePlayer_SetDestination (AudioFilePlayer *afp, AudioUnit *inD
/* we're going to use this to know which convert routine to call /* we're going to use this to know which convert routine to call
a v1 audio unit will have a type of 'aunt' a v1 audio unit will have a type of 'aunt'
a v2 audio unit will have one of several different types. */ a v2 audio unit will have one of several different types. */
if (desc.componentType != kAudioUnitComponentType) { if (desc.componentType != kAudioUnitType_Output) {
result = badComponentInstance; result = badComponentInstance;
/*THROW_RESULT("BAD COMPONENT")*/ /*THROW_RESULT("BAD COMPONENT")*/
if (result) return 0; if (result) return 0;
...@@ -175,7 +176,7 @@ static int AudioFilePlayer_Connect(AudioFilePlayer *afp) ...@@ -175,7 +176,7 @@ static int AudioFilePlayer_Connect(AudioFilePlayer *afp)
afp->mInputCallback.inputProcRefCon = afp->mAudioFileManager; afp->mInputCallback.inputProcRefCon = afp->mAudioFileManager;
OSStatus result = AudioUnitSetProperty (afp->mPlayUnit, OSStatus result = AudioUnitSetProperty (afp->mPlayUnit,
kAudioUnitProperty_SetInputCallback, kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Input, kAudioUnitScope_Input,
0, 0,
&afp->mInputCallback, &afp->mInputCallback,
...@@ -215,7 +216,7 @@ static void AudioFilePlayer_Disconnect (AudioFilePlayer *afp) ...@@ -215,7 +216,7 @@ static void AudioFilePlayer_Disconnect (AudioFilePlayer *afp)
afp->mInputCallback.inputProc = 0; afp->mInputCallback.inputProc = 0;
afp->mInputCallback.inputProcRefCon = 0; afp->mInputCallback.inputProcRefCon = 0;
OSStatus result = AudioUnitSetProperty (afp->mPlayUnit, OSStatus result = AudioUnitSetProperty (afp->mPlayUnit,
kAudioUnitProperty_SetInputCallback, kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Input, kAudioUnitScope_Input,
0, 0,
&afp->mInputCallback, &afp->mInputCallback,
...@@ -254,12 +255,12 @@ static int AudioFilePlayer_OpenFile (AudioFilePlayer *afp, const FSRef *inRef ...@@ -254,12 +255,12 @@ static int AudioFilePlayer_OpenFile (AudioFilePlayer *afp, const FSRef *inRef
result = FSReadFork(afp->mForkRefNum, fsAtMark, 0, sizeof(chunkHeader), &chunkHeader, &actual); result = FSReadFork(afp->mForkRefNum, fsAtMark, 0, sizeof(chunkHeader), &chunkHeader, &actual);
if (result) return 0; /*THROW_RESULT("AudioFilePlayer::OpenFile(): FSReadFork")*/ if (result) return 0; /*THROW_RESULT("AudioFilePlayer::OpenFile(): FSReadFork")*/
if (chunkHeader.ckID != 'FORM') { if (SDL_SwapBE32(chunkHeader.ckID) != 'FORM') {
result = -1; result = -1;
if (result) return 0; /*THROW_RESULT("AudioFilePlayer::OpenFile(): chunk id is not 'FORM'");*/ if (result) return 0; /*THROW_RESULT("AudioFilePlayer::OpenFile(): chunk id is not 'FORM'");*/
} }
if (chunkHeader.formType != 'AIFC') { if (SDL_SwapBE32(chunkHeader.formType) != 'AIFC') {
result = -1; result = -1;
if (result) return 0; /*THROW_RESULT("AudioFilePlayer::OpenFile(): file format is not 'AIFC'");*/ if (result) return 0; /*THROW_RESULT("AudioFilePlayer::OpenFile(): file format is not 'AIFC'");*/
} }
...@@ -272,8 +273,11 @@ static int AudioFilePlayer_OpenFile (AudioFilePlayer *afp, const FSRef *inRef ...@@ -272,8 +273,11 @@ static int AudioFilePlayer_OpenFile (AudioFilePlayer *afp, const FSRef *inRef
offset = 0; offset = 0;
do { do {
result = FSReadFork(afp->mForkRefNum, fsFromMark, offset, sizeof(chunk), &chunk, &actual); result = FSReadFork(afp->mForkRefNum, fsFromMark, offset, sizeof(chunk), &chunk, &actual);
if (result) return 0; /*THROW_RESULT("AudioFilePlayer::OpenFile(): FSReadFork")*/ if (result) return 0; /*THROW_RESULT("AudioFilePlayer::OpenFile(): FSReadFork")*/
chunk.ckID = SDL_SwapBE32(chunk.ckID);
chunk.ckSize = SDL_SwapBE32(chunk.ckSize);
/* Skip the chunk data */ /* Skip the chunk data */
offset = chunk.ckSize; offset = chunk.ckSize;
} while (chunk.ckID != 'SSND'); } while (chunk.ckID != 'SSND');
...@@ -281,10 +285,12 @@ static int AudioFilePlayer_OpenFile (AudioFilePlayer *afp, const FSRef *inRef ...@@ -281,10 +285,12 @@ static int AudioFilePlayer_OpenFile (AudioFilePlayer *afp, const FSRef *inRef
/* Read the header of the SSND chunk. After this, we are positioned right /* Read the header of the SSND chunk. After this, we are positioned right
at the start of the audio data. */ at the start of the audio data. */
result = FSReadFork(afp->mForkRefNum, fsAtMark, 0, sizeof(ssndData), &ssndData, &actual); result = FSReadFork(afp->mForkRefNum, fsAtMark, 0, sizeof(ssndData), &ssndData, &actual);
if (result) return 0; /*THROW_RESULT("AudioFilePlayer::OpenFile(): FSReadFork")*/ if (result) return 0; /*THROW_RESULT("AudioFilePlayer::OpenFile(): FSReadFork")*/
ssndData.offset = SDL_SwapBE32(ssndData.offset);
result = FSSetForkPosition(afp->mForkRefNum, fsFromMark, ssndData.offset); result = FSSetForkPosition(afp->mForkRefNum, fsFromMark, ssndData.offset);
if (result) return 0; /*THROW_RESULT("AudioFilePlayer::OpenFile(): FSSetForkPosition")*/ if (result) return 0; /*THROW_RESULT("AudioFilePlayer::OpenFile(): FSSetForkPosition")*/
/* Data size */ /* Data size */
*outFileDataSize = chunk.ckSize - ssndData.offset - 8; *outFileDataSize = chunk.ckSize - ssndData.offset - 8;
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
#include <CoreServices/CoreServices.h> #include <CoreServices/CoreServices.h>
#include <AudioUnit/AudioUnit.h> #include <AudioUnit/AudioUnit.h>
#ifdef AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER #if MAC_OS_X_VERSION_MAX_ALLOWED <= 1050
#include <AudioUnit/AUNTComponent.h> #include <AudioUnit/AUNTComponent.h>
#endif #endif
...@@ -82,7 +82,7 @@ typedef struct S_AudioFilePlayer ...@@ -82,7 +82,7 @@ typedef struct S_AudioFilePlayer
AudioUnit mPlayUnit; AudioUnit mPlayUnit;
SInt16 mForkRefNum; SInt16 mForkRefNum;
AudioUnitInputCallback mInputCallback; AURenderCallbackStruct mInputCallback;
AudioStreamBasicDescription mFileDescription; AudioStreamBasicDescription mFileDescription;
...@@ -114,7 +114,7 @@ typedef struct S_AudioFileManager ...@@ -114,7 +114,7 @@ typedef struct S_AudioFileManager
as it is called by the parent's Disconnect() method */ as it is called by the parent's Disconnect() method */
void (*Disconnect)(struct S_AudioFileManager *afm); void (*Disconnect)(struct S_AudioFileManager *afm);
int (*DoConnect)(struct S_AudioFileManager *afm); int (*DoConnect)(struct S_AudioFileManager *afm);
OSStatus (*Read)(struct S_AudioFileManager *afm, char *buffer, UInt32 *len); OSStatus (*Read)(struct S_AudioFileManager *afm, char *buffer, ByteCount *len);
const char* (*GetFileBuffer)(struct S_AudioFileManager *afm); const char* (*GetFileBuffer)(struct S_AudioFileManager *afm);
const AudioFilePlayer *(*GetParent)(struct S_AudioFileManager *afm); const AudioFilePlayer *(*GetParent)(struct S_AudioFileManager *afm);
void (*SetPosition)(struct S_AudioFileManager *afm, SInt64 pos); /* seek/rewind in the file */ void (*SetPosition)(struct S_AudioFileManager *afm, SInt64 pos); /* seek/rewind in the file */
...@@ -148,17 +148,18 @@ typedef struct S_AudioFileManager ...@@ -148,17 +148,18 @@ typedef struct S_AudioFileManager
int mFinishedReadingData; int mFinishedReadingData;
/*protected:*/ /*protected:*/
OSStatus (*Render)(struct S_AudioFileManager *afm, AudioBuffer *ioData); OSStatus (*Render)(struct S_AudioFileManager *afm, AudioBufferList *ioData);
OSStatus (*GetFileData)(struct S_AudioFileManager *afm, void** inOutData, UInt32 *inOutDataSize); OSStatus (*GetFileData)(struct S_AudioFileManager *afm, void** inOutData, UInt32 *inOutDataSize);
void (*AfterRender)(struct S_AudioFileManager *afm); void (*AfterRender)(struct S_AudioFileManager *afm);
/*public:*/ /*public:*/
/*static*/ /*static*/
OSStatus (*FileInputProc)(void *inRefCon, OSStatus (*FileInputProc)(void *inRefCon,
AudioUnitRenderActionFlags inActionFlags, AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp, const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber, UInt32 inBusNumber,
AudioBuffer *ioData); UInt32 inNumberFrames,
AudioBufferList *ioData);
} AudioFileManager; } AudioFileManager;
......
...@@ -245,7 +245,7 @@ static void *FileReaderThread_DiskReaderEntry (void *inRefCon) ...@@ -245,7 +245,7 @@ static void *FileReaderThread_DiskReaderEntry (void *inRefCon)
static void FileReaderThread_ReadNextChunk (FileReaderThread *frt) static void FileReaderThread_ReadNextChunk (FileReaderThread *frt)
{ {
OSStatus result; OSStatus result;
UInt32 dataChunkSize; ByteCount dataChunkSize;
AudioFileManager* theItem = 0; AudioFileManager* theItem = 0;
for (;;) for (;;)
...@@ -380,7 +380,7 @@ static int AudioFileManager_DoConnect (AudioFileManager *afm) ...@@ -380,7 +380,7 @@ static int AudioFileManager_DoConnect (AudioFileManager *afm)
afm->mNumTimesAskedSinceFinished = 0; afm->mNumTimesAskedSinceFinished = 0;
afm->mLockUnsuccessful = 0; afm->mLockUnsuccessful = 0;
UInt32 dataChunkSize; ByteCount dataChunkSize;
if ((afm->mFileLength - afm->mReadFilePosition) < afm->mChunkSize) if ((afm->mFileLength - afm->mReadFilePosition) < afm->mChunkSize)
dataChunkSize = afm->mFileLength - afm->mReadFilePosition; dataChunkSize = afm->mFileLength - afm->mReadFilePosition;
...@@ -415,7 +415,7 @@ static void AudioFileManager_Disconnect (AudioFileManager *afm) ...@@ -415,7 +415,7 @@ static void AudioFileManager_Disconnect (AudioFileManager *afm)
} }
} }
static OSStatus AudioFileManager_Read(AudioFileManager *afm, char *buffer, UInt32 *len) static OSStatus AudioFileManager_Read(AudioFileManager *afm, char *buffer, ByteCount *len)
{ {
return FSReadFork (afm->mForkRefNum, return FSReadFork (afm->mForkRefNum,
fsFromStart, fsFromStart,
...@@ -508,39 +508,44 @@ static int AudioFileManager_GetByteCounter(AudioFileManager *afm) ...@@ -508,39 +508,44 @@ static int AudioFileManager_GetByteCounter(AudioFileManager *afm)
return afm->mByteCounter; return afm->mByteCounter;
} }
static OSStatus AudioFileManager_FileInputProc (void *inRefCon,
static OSStatus AudioFileManager_FileInputProc (void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags,
AudioUnitRenderActionFlags inActionFlags, const AudioTimeStamp *inTimeStamp,
const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber,
UInt32 inBusNumber, UInt32 inNumberFrames,
AudioBuffer *ioData) AudioBufferList *ioData)
{ {
AudioFileManager* afm = (AudioFileManager*)inRefCon; AudioFileManager* afm = (AudioFileManager*)inRefCon;
return afm->Render(afm, ioData); return afm->Render(afm, ioData);
} }
static OSStatus AudioFileManager_Render (AudioFileManager *afm, AudioBuffer *ioData) static OSStatus AudioFileManager_Render (AudioFileManager *afm, AudioBufferList *ioData)
{ {
OSStatus result = noErr; OSStatus result = noErr;
AudioBuffer *abuf;
UInt32 i;
for (i = 0; i < ioData->mNumberBuffers; i++) {
abuf = &ioData->mBuffers[i];
if (afm->mBufferOffset >= afm->mBufferSize) {
result = afm->GetFileData(afm, &afm->mTmpBuffer, &afm->mBufferSize);
if (result) {
SDL_SetError ("AudioConverterFillBuffer:%ld\n", result);
afm->mParent->DoNotification(afm->mParent, result);
return result;
}
afm->mBufferOffset = 0;
}
if (abuf->mDataByteSize > afm->mBufferSize - afm->mBufferOffset)
abuf->mDataByteSize = afm->mBufferSize - afm->mBufferOffset;
abuf->mData = (char *)afm->mTmpBuffer + afm->mBufferOffset;
afm->mBufferOffset += abuf->mDataByteSize;
if (afm->mBufferOffset >= afm->mBufferSize) { afm->mByteCounter += abuf->mDataByteSize;
result = afm->GetFileData(afm, &afm->mTmpBuffer, &afm->mBufferSize); afm->AfterRender(afm);
if (result) { }
SDL_SetError ("AudioConverterFillBuffer:%ld\n", result);
afm->mParent->DoNotification(afm->mParent, result);
return result;
}
afm->mBufferOffset = 0;
}
if (ioData->mDataByteSize > afm->mBufferSize - afm->mBufferOffset)
ioData->mDataByteSize = afm->mBufferSize - afm->mBufferOffset;
ioData->mData = (char *)afm->mTmpBuffer + afm->mBufferOffset;
afm->mBufferOffset += ioData->mDataByteSize;
afm->mByteCounter += ioData->mDataByteSize;
afm->AfterRender(afm);
return result; return result;
} }
......
...@@ -134,28 +134,37 @@ int ReadTOCData (FSVolumeRefNum theVolume, SDL_CD *theCD) ...@@ -134,28 +134,37 @@ int ReadTOCData (FSVolumeRefNum theVolume, SDL_CD *theCD)
{ {
HFSUniStr255 dataForkName; HFSUniStr255 dataForkName;
OSStatus theErr; OSStatus theErr;
SInt16 forkRefNum; FSIORefNum forkRefNum;
SInt64 forkSize; SInt64 forkSize;
Ptr forkData = 0; Ptr forkData = 0;
ByteCount actualRead; ByteCount actualRead;
CFDataRef dataRef = 0; CFDataRef dataRef = 0;
CFPropertyListRef propertyListRef = 0; CFPropertyListRef propertyListRef = 0;
int i;
FSRefParam fsRefPB; FSRefParam fsRefPB;
FSRef tocPlistFSRef; FSRef tocPlistFSRef;
FSRef rootRef;
const char* error = "Unspecified Error"; const char* error = "Unspecified Error";
const UniChar uniName[] = { '.','T','O','C','.','p','l','i','s','t' };
theErr = FSGetVolumeInfo(theVolume, 0, 0, kFSVolInfoNone, 0, 0, &rootRef);
if(theErr != noErr) {
error = "FSGetVolumeInfo";
goto bail;
}
SDL_memset(&fsRefPB, '\0', sizeof (fsRefPB));
/* get stuff from .TOC.plist */ /* get stuff from .TOC.plist */
fsRefPB.ioCompletion = NULL; fsRefPB.ref = &rootRef;
fsRefPB.ioNamePtr = "\p.TOC.plist";
fsRefPB.ioVRefNum = theVolume;
fsRefPB.ioDirID = 0;
fsRefPB.newRef = &tocPlistFSRef; fsRefPB.newRef = &tocPlistFSRef;
fsRefPB.nameLength = sizeof (uniName) / sizeof (uniName[0]);
theErr = PBMakeFSRefSync (&fsRefPB); fsRefPB.name = uniName;
fsRefPB.textEncodingHint = kTextEncodingUnknown;
theErr = PBMakeFSRefUnicodeSync (&fsRefPB);
if(theErr != noErr) { if(theErr != noErr) {
error = "PBMakeFSRefSync"; error = "PBMakeFSRefUnicodeSync";
goto bail; goto bail;
} }
...@@ -551,9 +560,9 @@ static OSStatus CheckInit () ...@@ -551,9 +560,9 @@ static OSStatus CheckInit ()
{ /*try {*/ { /*try {*/
ComponentDescription desc; ComponentDescription desc;
desc.componentType = kAudioUnitComponentType; desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_Output; desc.componentSubType = kAudioUnitSubType_DefaultOutput;
desc.componentManufacturer = kAudioUnitID_DefaultOutput; desc.componentManufacturer = kAudioUnitManufacturer_Apple;
desc.componentFlags = 0; desc.componentFlags = 0;
desc.componentFlagsMask = 0; desc.componentFlagsMask = 0;
......
...@@ -263,6 +263,14 @@ void SDL_SYS_CDQuit(void) ...@@ -263,6 +263,14 @@ void SDL_SYS_CDQuit(void)
/* Get the Unix disk name of the volume */ /* Get the Unix disk name of the volume */
static const char *SDL_SYS_CDName (int drive) static const char *SDL_SYS_CDName (int drive)
{ {
/*
* !!! FIXME: PBHGetVolParmsSync() is gone in 10.6,
* !!! FIXME: replaced with FSGetVolumeParms(), which
* !!! FIXME: isn't available before 10.5. :/
*/
return "Mac OS X CD-ROM Device";
#if 0
OSStatus err = noErr; OSStatus err = noErr;
HParamBlockRec pb; HParamBlockRec pb;
GetVolParmsInfoBuffer volParmsInfo; GetVolParmsInfoBuffer volParmsInfo;
...@@ -282,6 +290,7 @@ static const char *SDL_SYS_CDName (int drive) ...@@ -282,6 +290,7 @@ static const char *SDL_SYS_CDName (int drive)
} }
return volParmsInfo.vMDeviceID; return volParmsInfo.vMDeviceID;
#endif
} }
/* Open the "device" */ /* Open the "device" */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment