Fixed CD-ROM code to work with Mac OS X 10.6 SDK and 64-bit targets. SDL-1.2
authorRyan C. Gordon <icculus@icculus.org>
Sat, 12 Sep 2009 15:06:16 +0000
branchSDL-1.2
changeset 4190 386181851388
parent 4189 95213cf5efcc
child 4191 caaa3cbf7b13
Fixed CD-ROM code to work with Mac OS X 10.6 SDK and 64-bit targets.
src/cdrom/macosx/AudioFilePlayer.c
src/cdrom/macosx/AudioFilePlayer.h
src/cdrom/macosx/AudioFileReaderThread.c
src/cdrom/macosx/CDPlayer.c
src/cdrom/macosx/SDL_syscdrom.c
--- a/src/cdrom/macosx/AudioFilePlayer.c	Sat Sep 12 15:04:32 2009 +0000
+++ b/src/cdrom/macosx/AudioFilePlayer.c	Sat Sep 12 15:06:16 2009 +0000
@@ -23,6 +23,7 @@
     so if you want to see the original search for it on apple.com/developer
 */
 #include "SDL_config.h"
+#include "SDL_endian.h"
 
 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     AudioFilePlayer.cpp
@@ -78,7 +79,7 @@
         /* we're going to use this to know which convert routine to call
            a v1 audio unit will have a type of 'aunt'
            a v2 audio unit will have one of several different types. */
-    if (desc.componentType != kAudioUnitComponentType) {
+    if (desc.componentType != kAudioUnitType_Output) {
         result = badComponentInstance;
         /*THROW_RESULT("BAD COMPONENT")*/
         if (result) return 0;
@@ -175,7 +176,7 @@
         afp->mInputCallback.inputProcRefCon = afp->mAudioFileManager;
 
         OSStatus result = AudioUnitSetProperty (afp->mPlayUnit, 
-                            kAudioUnitProperty_SetInputCallback, 
+                            kAudioUnitProperty_SetRenderCallback,
                             kAudioUnitScope_Input, 
                             0,
                             &afp->mInputCallback, 
@@ -215,7 +216,7 @@
         afp->mInputCallback.inputProc = 0;
         afp->mInputCallback.inputProcRefCon = 0;
         OSStatus result = AudioUnitSetProperty (afp->mPlayUnit, 
-                                        kAudioUnitProperty_SetInputCallback, 
+                                        kAudioUnitProperty_SetRenderCallback,
                                         kAudioUnitScope_Input, 
                                         0,
                                         &afp->mInputCallback, 
@@ -254,12 +255,12 @@
     result = FSReadFork(afp->mForkRefNum, fsAtMark, 0, sizeof(chunkHeader), &chunkHeader, &actual);
        if (result) return 0; /*THROW_RESULT("AudioFilePlayer::OpenFile(): FSReadFork")*/
 
-    if (chunkHeader.ckID != 'FORM') {
+    if (SDL_SwapBE32(chunkHeader.ckID) != 'FORM') {
         result = -1;
         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;
         if (result) return 0; /*THROW_RESULT("AudioFilePlayer::OpenFile(): file format is not 'AIFC'");*/
     }
@@ -272,8 +273,11 @@
     offset = 0;
     do {
         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 */
         offset = chunk.ckSize;
     } while (chunk.ckID != 'SSND');
@@ -281,10 +285,12 @@
     /* Read the header of the SSND chunk. After this, we are positioned right
        at the start of the audio data. */
     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);
-       if (result) return 0; /*THROW_RESULT("AudioFilePlayer::OpenFile(): FSSetForkPosition")*/
+    if (result) return 0; /*THROW_RESULT("AudioFilePlayer::OpenFile(): FSSetForkPosition")*/
 
     /* Data size */
     *outFileDataSize = chunk.ckSize - ssndData.offset - 8;
--- a/src/cdrom/macosx/AudioFilePlayer.h	Sat Sep 12 15:04:32 2009 +0000
+++ b/src/cdrom/macosx/AudioFilePlayer.h	Sat Sep 12 15:06:16 2009 +0000
@@ -33,7 +33,7 @@
 #include <CoreServices/CoreServices.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>
 #endif
 
@@ -82,7 +82,7 @@
     AudioUnit                       mPlayUnit;
     SInt16                          mForkRefNum;
     
-    AudioUnitInputCallback          mInputCallback;
+    AURenderCallbackStruct          mInputCallback;
 
     AudioStreamBasicDescription     mFileDescription;
     
@@ -114,7 +114,7 @@
            as it is called by the parent's Disconnect() method */
     void                (*Disconnect)(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 AudioFilePlayer *(*GetParent)(struct S_AudioFileManager *afm);
     void                (*SetPosition)(struct S_AudioFileManager *afm, SInt64 pos);  /* seek/rewind in the file */
@@ -148,17 +148,18 @@
     int                 mFinishedReadingData;
 
 /*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);
     void                (*AfterRender)(struct S_AudioFileManager *afm);
 
 /*public:*/
     /*static*/
-    OSStatus            (*FileInputProc)(void                             *inRefCon,
-                                         AudioUnitRenderActionFlags      inActionFlags,
+    OSStatus            (*FileInputProc)(void                            *inRefCon,
+                                         AudioUnitRenderActionFlags      *ioActionFlags,
                                          const AudioTimeStamp            *inTimeStamp,
                                          UInt32                          inBusNumber,
-                                         AudioBuffer                     *ioData);
+                                         UInt32                          inNumberFrames,
+                                         AudioBufferList                 *ioData);
 } AudioFileManager;
 
 
--- a/src/cdrom/macosx/AudioFileReaderThread.c	Sat Sep 12 15:04:32 2009 +0000
+++ b/src/cdrom/macosx/AudioFileReaderThread.c	Sat Sep 12 15:06:16 2009 +0000
@@ -245,7 +245,7 @@
 static void    FileReaderThread_ReadNextChunk (FileReaderThread *frt)
 {
     OSStatus result;
-    UInt32  dataChunkSize;
+    ByteCount dataChunkSize;
     AudioFileManager* theItem = 0;
 
     for (;;) 
@@ -380,7 +380,7 @@
         afm->mNumTimesAskedSinceFinished = 0;
         afm->mLockUnsuccessful = 0;
         
-        UInt32 dataChunkSize;
+        ByteCount dataChunkSize;
         
         if ((afm->mFileLength - afm->mReadFilePosition) < afm->mChunkSize)
             dataChunkSize = afm->mFileLength - afm->mReadFilePosition;
@@ -415,7 +415,7 @@
     }
 }
 
-static OSStatus AudioFileManager_Read(AudioFileManager *afm, char *buffer, UInt32 *len)
+static OSStatus AudioFileManager_Read(AudioFileManager *afm, char *buffer, ByteCount *len)
 {
     return FSReadFork (afm->mForkRefNum,
                        fsFromStart,
@@ -508,39 +508,44 @@
     return afm->mByteCounter;
 }
 
-
-static OSStatus    AudioFileManager_FileInputProc (void                       *inRefCon,
-                                             AudioUnitRenderActionFlags inActionFlags,
-                                             const AudioTimeStamp       *inTimeStamp, 
-                                             UInt32                     inBusNumber, 
-                                             AudioBuffer                *ioData)
+static OSStatus    AudioFileManager_FileInputProc (void                  *inRefCon,
+                                         AudioUnitRenderActionFlags      *ioActionFlags,
+                                         const AudioTimeStamp            *inTimeStamp,
+                                         UInt32                          inBusNumber,
+                                         UInt32                          inNumberFrames,
+                                         AudioBufferList                 *ioData)
 {
     AudioFileManager* afm = (AudioFileManager*)inRefCon;
     return afm->Render(afm, ioData);
 }
 
-static OSStatus    AudioFileManager_Render (AudioFileManager *afm, AudioBuffer *ioData)
+static OSStatus    AudioFileManager_Render (AudioFileManager *afm, AudioBufferList *ioData)
 {
     OSStatus result = noErr;
-    
-	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;
-		}
+    AudioBuffer *abuf;
+    UInt32 i;
 
-		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;
+    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;
     
-	afm->mByteCounter += ioData->mDataByteSize;
-	afm->AfterRender(afm);
+        afm->mByteCounter += abuf->mDataByteSize;
+        afm->AfterRender(afm);
+    }
     return result;
 }
 
--- a/src/cdrom/macosx/CDPlayer.c	Sat Sep 12 15:04:32 2009 +0000
+++ b/src/cdrom/macosx/CDPlayer.c	Sat Sep 12 15:06:16 2009 +0000
@@ -134,28 +134,37 @@
 {
     HFSUniStr255      dataForkName;
     OSStatus          theErr;
-    SInt16            forkRefNum;
+    FSIORefNum        forkRefNum;
     SInt64            forkSize;
     Ptr               forkData = 0;
     ByteCount         actualRead;
     CFDataRef         dataRef = 0;
     CFPropertyListRef propertyListRef = 0;
-
+    int               i;
     FSRefParam      fsRefPB;
     FSRef           tocPlistFSRef;
-    
+    FSRef           rootRef;
     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 */
-    fsRefPB.ioCompletion = NULL;
-    fsRefPB.ioNamePtr = "\p.TOC.plist";
-    fsRefPB.ioVRefNum = theVolume;
-    fsRefPB.ioDirID = 0;
+    fsRefPB.ref = &rootRef;
     fsRefPB.newRef = &tocPlistFSRef;
-    
-    theErr = PBMakeFSRefSync (&fsRefPB);
+    fsRefPB.nameLength = sizeof (uniName) / sizeof (uniName[0]);
+    fsRefPB.name = uniName;
+    fsRefPB.textEncodingHint = kTextEncodingUnknown;
+
+    theErr = PBMakeFSRefUnicodeSync (&fsRefPB);
     if(theErr != noErr) {
-        error = "PBMakeFSRefSync";
+        error = "PBMakeFSRefUnicodeSync";
         goto bail;
     }
     
@@ -551,9 +560,9 @@
     { /*try {*/
         ComponentDescription desc;
     
-        desc.componentType = kAudioUnitComponentType;
-        desc.componentSubType = kAudioUnitSubType_Output;
-        desc.componentManufacturer = kAudioUnitID_DefaultOutput;
+        desc.componentType = kAudioUnitType_Output;
+        desc.componentSubType = kAudioUnitSubType_DefaultOutput;
+        desc.componentManufacturer = kAudioUnitManufacturer_Apple;
         desc.componentFlags = 0;
         desc.componentFlagsMask = 0;
         
--- a/src/cdrom/macosx/SDL_syscdrom.c	Sat Sep 12 15:04:32 2009 +0000
+++ b/src/cdrom/macosx/SDL_syscdrom.c	Sat Sep 12 15:06:16 2009 +0000
@@ -263,6 +263,14 @@
 /* Get the Unix disk name of the volume */
 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;
     HParamBlockRec  pb;
     GetVolParmsInfoBuffer   volParmsInfo;
@@ -282,6 +290,7 @@
     }
 
     return volParmsInfo.vMDeviceID;
+#endif
 }
 
 /* Open the "device" */