static OSErr mainQTInst(void *unused, OSType order, // Order to execute InstrData *InsHeader, // Ptr on instrument header sData **sample, // Ptr on samples data short *sampleID, // If you need to replace/add only a sample, not replace the entire instrument (by example for 'AIFF' sound) // If sampleID == -1 : add sample else replace selected sample. CFURLRef AlienFileURLRef, // IN/OUT file PPInfoPlug *thePPInfoPlug) { MADErr myErr = MADNoErr; FSIORefNum iFileRefI = -1; ByteCount inOutBytes; FSSpec tmpSpec; OSErr QTErr = noErr; myErr = CFURLToFSSpec(AlienFileURLRef, &tmpSpec); switch (myErr) { case memFullErr: return MADNeedMemory; break; default: case fnfErr: return order == MADPlugExport ? MADWritingErr : MADReadingErr; break; case noErr: break; } switch (order) { case MADPlugPlay: break; case MADPlugImport: { Ptr theSound; int lS, lE; short sS; unsigned long rate; bool stereo; FSSpec newFile; myErr = ConvertDataToWAVE(tmpSpec, &newFile, thePPInfoPlug); if (myErr == noErr) { theSound = ConvertWAV(&newFile, &lS, &lE, &sS, &rate, &stereo); if (theSound) { long sndSize = GetPtrSize(theSound); Ptr newSound = malloc(sndSize); memcpy(newSound, theSound, sndSize); DisposePtr(theSound); myErr = inAddSoundToMAD(newSound, sndSize, lS, lE, sS, 60, rate, stereo, newFile.name, InsHeader, sample, sampleID); } else { myErr = MADNeedMemory; } FSpDelete(&newFile); } } break; case MADPlugTest: { Boolean canOpenAsMovie = false; FInfo fInfo; FSpGetFInfo(&tmpSpec, &fInfo); QTErr = CanQuickTimeOpenFile(&tmpSpec, fInfo.fdType, 0, NULL, &canOpenAsMovie, NULL, 0); if (QTErr == noErr && canOpenAsMovie == true) { myErr = MADNoErr; } else { myErr = MADIncompatibleFile; } } break; case MADPlugExport: if (*sampleID >= 0) { OSType compType = 'NONE'; unsigned long rate; sData *curData = sample[*sampleID]; short numChan; FSpDelete(&tmpSpec); myErr = FSpCreate(&tmpSpec, 'TVOD', 'AIFF', smCurrentScript); if(myErr == noErr) myErr = FSpOpenDF(&tmpSpec, fsCurPerm, &iFileRefI); if (myErr == noErr) { inOutBytes = curData->size; rate = curData->c2spd; if (curData->stereo) numChan = 2; else numChan = 1; myErr = SetupAIFFHeader(iFileRefI, numChan, rate << 16L, curData->amp, compType, inOutBytes, 0); if(myErr == noErr) myErr = FSWriteFork(iFileRefI, fsAtMark, 0, inOutBytes, curData->data, &inOutBytes); FSCloseFork(iFileRefI); } } break; default: myErr = MADOrderNotImplemented; break; } return myErr; }
static MADErr mainAIFF(void *unused, OSType order, InstrData *InsHeader, sData **sample, short *sampleID, CFURLRef AlienFileURL, PPInfoPlug *thePPInfoPlug) { MADErr myErr = MADNoErr; //char *AlienFile; switch(order) { #if 0 case 'IMPL': { char *theSound; long lS, lE; short sS; unsigned long rate; Boolean stereo; FSSpec newFile; myErr = ConvertDataToWAVE(*AlienFileFSSpec, &newFile, thePPInfoPlug); if (myErr == MADNoErr) { theSound = ConvertWAV(&newFile, &lS, &lE, &sS, &rate, &stereo); if (theSound) myErr = inAddSoundToMAD(theSound, lS, lE, sS, 60, rate, stereo, AlienFileFSSpec->name, InsHeader, sample, sampleID); else myErr = MADNeedMemory; FSpDelete(&newFile); } } break; #endif case MADPlugImport: { AudioFileID theInID; OSStatus myStat = AudioFileOpenURL(AlienFileURL, kAudioFileReadPermission, 0, &theInID); if (myStat != noErr) { myErr = MADReadingErr; } else { AudioFileClose(theInID); myErr = MADOrderNotImplemented; } } case MADPlugTest: { AudioFileID audioFile; OSStatus res; res = AudioFileOpenURL(AlienFileURL, kAudioFileReadPermission, kAudioFileAIFFType, &audioFile); if (res != noErr) { res = AudioFileOpenURL(AlienFileURL, kAudioFileReadPermission, kAudioFileAIFCType, &audioFile); if (res != noErr) { myErr = MADFileNotSupportedByThisPlug; } else { AudioFileClose(audioFile); } } else { AudioFileClose(audioFile); } } break; case MADPlugExport: if (*sampleID >= 0) { char* data = NULL; sData *curData = sample[*sampleID]; AudioStreamBasicDescription asbd = {0}; asbd.mSampleRate = curData->c2spd; asbd.mFormatID = kAudioFormatLinearPCM; asbd.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked | kAudioFormatFlagIsBigEndian; asbd.mBitsPerChannel = curData->amp; asbd.mChannelsPerFrame = curData->stereo ? 2 : 1; asbd.mFramesPerPacket = 1; asbd.mBytesPerFrame = asbd.mBitsPerChannel * asbd.mChannelsPerFrame / 8; asbd.mBytesPerPacket = asbd.mBytesPerFrame * asbd.mFramesPerPacket; AudioFileID audioFile; OSStatus res; if (curData->amp == 16) { data = malloc(curData->size); if (!data) return MADNeedMemory; memcpy(data, curData->data, curData->size); dispatch_apply(curData->size / 2, dispatch_get_global_queue(0, 0), ^(size_t i) { PPBE16(&((short*)data)[i]); });