OSErr FindPrefs(FSSpec* where) { OSErr error = noErr; Str255 theString; Str255 name; FSSpec spec; short foundVRefNum; long foundDirID; // Look for the prefs in the folder GetIndString(theString, kTransportPath, 1); p2cstr(theString); strncpy(name, theString, 63); strncat(name, "Modem prefs", 63); c2pstr(name); error = FindFolder(kOnSystemDisk, kPreferencesFolderType, kDontCreateFolder, &foundVRefNum, &foundDirID); if (error == noErr) { error = FSMakeFSSpec(foundVRefNum, foundDirID, name, where); if (error == fnfErr) { // May need to create the file FSpCreateResFile(where, 'mwNT', 'pref', smSystemScript); error = ResError(); } } return error; }
/* * We don't bother with the usual FSpExchangeFiles dance here because * it doesn't really matter if the old random seed gets lost. */ void write_random_seed(void *data, int len) { short puttyVRefNum; long puttyDirID; OSErr error; FSSpec dstfile; short refnum; long count = len; if (get_putty_dir(kCreateFolder, &puttyVRefNum, &puttyDirID) != noErr) return; error = FSMakeFSSpec(puttyVRefNum, puttyDirID, "\pPuTTY Random Seed", &dstfile); if (error == fnfErr) { /* Set up standard resources */ FSpCreateResFile(&dstfile, INTERNAL_CREATOR, SEED_TYPE, smRoman); refnum = FSpOpenResFile(&dstfile, fsWrPerm); if (ResError() == noErr) { copy_resource('STR ', -16397); CloseResFile(refnum); } } else if (error != noErr) return; if (FSpOpenDF(&dstfile, fsWrPerm, &refnum) != noErr) return; FSWrite(refnum, &count, data); FSClose(refnum); return; }
static PyObject *Res_FSpCreateResFile(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; FSSpec spec; OSType creator; OSType fileType; ScriptCode scriptTag; #ifndef FSpCreateResFile PyMac_PRECHECK(FSpCreateResFile); #endif if (!PyArg_ParseTuple(_args, "O&O&O&h", PyMac_GetFSSpec, &spec, PyMac_GetOSType, &creator, PyMac_GetOSType, &fileType, &scriptTag)) return NULL; FSpCreateResFile(&spec, creator, fileType, scriptTag); { OSErr _err = ResError(); if (_err != noErr) return PyMac_Error(_err); } Py_INCREF(Py_None); _res = Py_None; return _res; }
static CWResult LinkHeaders(CWPluginContext context, XPIDLSettings& settings) { // find out how many files there are to link. long fileCount = 0; CWResult err = CWGetProjectFileCount(context, &fileCount); if (err != cwNoErr || fileCount == 0) return err; // get the output directory. FSSpec outputDir; err = CWGetOutputFileDirectory(context, &outputDir); if (!CWSUCCESS(err)) return err; // enumerate all of the output header files, and make aliases to them in // the output directory. for (long index = 0; (err == cwNoErr) && (index < fileCount); index++) { // get the name of each output file. CWFileSpec outputFile; err = CWGetStoredObjectFileSpec(context, index, &outputFile); if (err == cwNoErr) { FInfo info; err = FSpGetFInfo(&outputFile, &info); FSSpec aliasFile = { outputDir.vRefNum, outputDir.parID }; BlockMoveData(outputFile.name, aliasFile.name, 1 + outputFile.name[0]); AliasHandle alias = NULL; if (NewAliasMinimal(&outputFile, &alias) == noErr) { // recreate the alias file from scratch. FSpDelete(&aliasFile); FSpCreateResFile(&aliasFile, info.fdCreator, info.fdType, smRoman); short refNum = FSpOpenResFile(&aliasFile, fsRdWrPerm); if (refNum != -1) { UseResFile(refNum); AddResource(Handle(alias), rAliasType, 0, aliasFile.name); ReleaseResource(Handle(alias)); UpdateResFile(refNum); CloseResFile(refNum); } // finally, mark the newly created file as an alias file. FSpGetFInfo(&aliasFile, &info); info.fdFlags |= kIsAlias; FSpSetFInfo(&aliasFile, &info); } } } // create the target file in the output directory. BlockMoveData(settings.output, outputDir.name, 1 + settings.output[0]); FILE* outputFile = FSp_fopen(&outputDir, "w"); if (outputFile != NULL) fclose(outputFile); return err; }
ConstStr255Param fname = (ConstStr255Param)"\pxxx-test-resource-xxx"; void test_fspcreateresfile(void) { OSErr err; FSSpec spec; err = FSMakeFSSpec(0, 0, fname, &spec); if (err) { fprintf(stderr, "FSMakeFSSpec failed: %d\n", err); exit(3); } FSpDelete(&spec); FSpCreateResFile(&spec, 'TEST', 'BINA', 0); if ( (err = ResError()) != 0) { fprintf(stderr, "FSpCreateResFile failed (File does not exist): %d\n", err); exit(1); } // Verify it doesn't fail if the file/fork already exist. FSpCreateResFile(&spec, 'TEST', 'BINA', 0); if ( (err = ResError()) != 0) { fprintf(stderr, "FSpCreateResFile (File/Fork exist) failed: %d\n", err); exit(2); } // Verify it doesn't fail if the file exists w/o a resource fork. FSpDelete(&spec); FSpCreate(&spec, 'TEST', 'BINA', 0); FSpCreateResFile(&spec, 'TEST', 'BINA', 0); if ( (err = ResError()) != 0) { fprintf(stderr, "FSpCreateResFile (File exists) failed: %d\n", err); exit(2); } FSpDelete(&spec); }
pascal void FSpCreateResFileCompat(const FSSpec *spec, OSType creator, OSType fileType, ScriptCode scriptTag) { #if !__MACOSSEVENFIVEONEORLATER if ( #if !__MACOSSEVENORLATER (!FSHasFSSpecCalls() && !QTHasFSSpecCalls()) || #endif /* !__MACOSSEVENORLATER */ !HasFSpCreateScriptSupportFix() ) { OSErr result; CInfoPBRec pb; HCreateResFile(spec->vRefNum, spec->parID, spec->name); if ( ResError() == noErr ) { /* get info on created item */ pb.hFileInfo.ioVRefNum = spec->vRefNum; pb.hFileInfo.ioDirID = spec->parID; pb.hFileInfo.ioNamePtr = (StringPtr) &(spec->name); pb.hFileInfo.ioFDirIndex = 0; result = PBGetCatInfoSync(&pb); if ( result == noErr ) { /* Set fdScript in FXInfo */ /* The negative script constants (smSystemScript, smCurrentScript, and smAllScripts) */ /* don't make sense on disk, so only use scriptTag if scriptTag >= smRoman */ /* (smRoman is 0). fdScript is valid if high bit is set (see IM-6, page 9-38) */ pb.hFileInfo.ioFlXFndrInfo.fdScript = (scriptTag >= smRoman) ? ((char)scriptTag | (char)0x80) : (smRoman); /* Set creator/fileType */ pb.hFileInfo.ioFlFndrInfo.fdCreator = creator; pb.hFileInfo.ioFlFndrInfo.fdType = fileType; /* Restore ioDirID field in pb which was changed by PBGetCatInfo */ pb.hFileInfo.ioDirID = spec->parID; result = PBSetCatInfoSync(&pb); } /* Set ResErr low memory global to result */ LMSetResErr(result); } return; } else #endif /* !__MACOSSEVENFIVEONEORLATER */ { FSpCreateResFile(spec, creator, fileType, scriptTag); return; } }
void dump_colors( struct rgb_color_value *colors, short color_count) { CTabHandle new_table; Handle old_bad_clut; struct rgb_color_value *color; short loop; FSSpec file; short refnum; file.vRefNum= -1; file.parID= 2; strcpy((char *)file.name, (const char *)"\pMarathon2 Clut\0"); FSpCreateResFile(&file, 'RSED', 'rsrc', smSystemScript); refnum= FSpOpenResFile(&file, fsWrPerm); if(refnum>=0) { new_table= (CTabHandle) NewHandleClear(sizeof(ColorTable)+color_count*sizeof(ColorSpec)); HLock((Handle) new_table); (*new_table)->ctSeed= GetCTSeed(); (*new_table)->ctFlags= 0; (*new_table)->ctSize= color_count-1; /* Slam the colors.. */ color= colors; for(loop=0; loop<=color_count; ++loop) { (*new_table)->ctTable[loop].rgb.red= color->red; (*new_table)->ctTable[loop].rgb.green= color->green; (*new_table)->ctTable[loop].rgb.blue= color->blue; (*new_table)->ctTable[loop].value= loop; color++; } HUnlock((Handle) new_table); old_bad_clut= GetResource('clut', 5454); if (old_bad_clut) { RmveResource((Handle) old_bad_clut); DisposeHandle((Handle) old_bad_clut); UpdateResFile(CurResFile()); } AddResource((Handle) new_table, 'clut', 5454, "\pMarathon2 Color Table"); if(ResError()) dprintf("Err adding it: %d", ResError()); WriteResource((Handle) new_table); ReleaseResource((Handle) new_table); CloseResFile(refnum); }
void add_finishing_touches_to_save_file(FileSpecifier &File) // FileDesc *file) { short refnum; unsigned char name[64+1]; OSErr err; FSSpec *SpecPtr = &File.GetSpec(); FInfo finder_info; err = FSpGetFInfo((FSSpec *)SpecPtr, &finder_info); if (err != noErr) return; FSpCreateResFile(SpecPtr, finder_info.fdCreator, finder_info.fdType, smSystemScript); if (ResError() != noErr) return; /* Save the STR resource that tells us what our application name is. */ refnum= FSpOpenResFile(&File.GetSpec(), fsWrPerm); // resource_file_ref= FSpOpenResFile((FSSpec *) file, fsWrPerm); if (refnum < 0) return; Handle resource; /* Add in the overhead thumbnail. */ add_overhead_thumbnail(File); /* Add the application name resource.. */ getpstr(name, strFILENAMES, filenameMARATHON_NAME); // add_application_name_to_fsspec((FileDesc *) file, name); // LP: copied out of files_macintosh.c -- add_application_name_to_fsspec(); // this is the only place that uses this code /* Add in the application name */ err= PtrToHand(name, &resource, name[0]+1); assert(!err && resource); AddResource(resource, 'STR ', -16396, "\p"); ReleaseResource(resource); CloseResFile(refnum); // End copying }
/* * NB: Destination file must exist. */ void *open_settings_w_fsp(FSSpec *dstfile) { short tmpVRefNum; long tmpDirID; struct write_settings *ws; OSErr error; Str255 tmpname; ws = snew(struct write_settings); ws->dstfile = *dstfile; /* Create a temporary file to save to first. */ error = FindFolder(ws->dstfile.vRefNum, kTemporaryFolderType, kCreateFolder, &tmpVRefNum, &tmpDirID); if (error != noErr) goto out; c2pstrcpy(tmpname, tmpnam(NULL)); error = FSMakeFSSpec(tmpVRefNum, tmpDirID, tmpname, &ws->tmpfile); if (error != noErr && error != fnfErr) goto out; if (error == noErr) { error = FSpDelete(&ws->tmpfile); if (error != noErr) goto out; } FSpCreateResFile(&ws->tmpfile, PUTTY_CREATOR, SESS_TYPE, smSystemScript); if ((error = ResError()) != noErr) goto out; ws->fd = FSpOpenResFile(&ws->tmpfile, fsWrPerm); if (ws->fd == -1) {error = ResError(); goto out;} /* Set up standard resources. Doesn't matter if these fail. */ copy_resource('STR ', -16396); copy_resource('TMPL', TMPL_Int); return ws; out: safefree(ws); fatalbox("Failed to open session for write (%d)", error); }
void *open_settings_w(char const *sessionname, char **errmsg) { short sessVRefNum; long sessDirID; OSErr error; Str255 psessionname; FSSpec dstfile; *errmsg = NULL; error = get_session_dir(kCreateFolder, &sessVRefNum, &sessDirID); if (error != noErr) return NULL; if (!sessionname || !*sessionname) sessionname = "Default Settings"; c2pstrcpy(psessionname, sessionname); error = FSMakeFSSpec(sessVRefNum, sessDirID, psessionname, &dstfile); if (error == fnfErr) { FSpCreateResFile(&dstfile, PUTTY_CREATOR, SESS_TYPE, smSystemScript); if ((error = ResError()) != noErr) return NULL; } else if (error != noErr) return NULL; return open_settings_w_fsp(&dstfile); }
void mac_savesessionas(void) { #if !TARGET_API_MAC_CARBON /* XXX Navigation Services */ Session *s = mac_windowsession(FrontWindow()); StandardFileReply sfr; void *sesshandle; StandardPutFile("\pSave session as:", s->hasfile ? s->savefile.name : "\puntitled", &sfr); if (!sfr.sfGood) return; if (!sfr.sfReplacing) { FSpCreateResFile(&sfr.sfFile, PUTTY_CREATOR, SESS_TYPE, sfr.sfScript); if (ResError() != noErr) return; /* XXX report error */ } sesshandle = open_settings_w_fsp(&sfr.sfFile); if (sesshandle == NULL) return; /* XXX report error */ save_open_settings(sesshandle, &s->cfg); close_settings_w(sesshandle); s->hasfile = TRUE; s->savefile = sfr.sfFile; #endif }
/* create folder with IPIcon */ OSErr MakeFolderWithIPIcon(const FSSpec *theFolder,const IPIconRec *ipIcon) { OSErr err; long dirID; FSSpec theIconFile; Str15 iconFileName; #ifdef __MOREFILESX__ FSRef fsRef; #endif /* create a folder */ err=FSpDirCreate(theFolder,smSystemScript,&dirID); if (err==dupFNErr || err==dirNFErr) { Boolean isDirectory; #ifdef __MOREFILESX__ err = FSpMakeFSRef(theFolder,&fsRef); err = FSGetNodeID(&fsRef,&dirID,&isDirectory); #else err=FSpGetDirectoryID(theFolder,&dirID,&isDirectory); #endif if (!isDirectory) return -1; } if (err!=noErr) return err; #ifdef __MOREFILESX__ err = FSpMakeFSRef(theFolder,&fsRef); #endif /* create icon file */ GetIndString(iconFileName,140,3); err=FSMakeFSSpec(theFolder->vRefNum,dirID,iconFileName,&theIconFile); if (err==fnfErr) { FInfo fndrInfo; FSpCreateResFile(&theIconFile,kFinderCreator,'icon',smSystemScript); err=FSpGetFInfo(&theIconFile,&fndrInfo); fndrInfo.fdFlags |= kIsInvisible; err=FSpSetFInfo(&theIconFile,&fndrInfo); } /* save icon data */ if (err==noErr) { short refNum; IconActionUPP addIconUPP; MyIconResRec newIcon; #ifndef __MOREFILESX__ DInfo dInfo; #endif newIcon.resID=kCustomIconResource; GetIndString(newIcon.resName,141,2); newIcon.attrs=0; refNum=FSpOpenResFile(&theIconFile,fsWrPerm); UseResFile(refNum); /* save icon family(separated icons) */ if (ipIcon->iconSuite != NULL) { addIconUPP = NewIconActionUPP(AddIconToFile); err=ForEachIconDo(ipIcon->iconSuite,kSelectorMyData,addIconUPP,&newIcon); DisposeIconActionUPP(addIconUPP); } /* save icns(single icon) */ if (isIconServicesAvailable) { IconFamilyHandle iconFamily; err=IPIconToIconFamily(ipIcon,&iconFamily); if (err==noErr) { SaveDataToResource(*iconFamily,GetHandleSize((Handle)iconFamily), kIconFamilyType,newIcon.resID,newIcon.resName,newIcon.attrs); DisposeHandle((Handle)iconFamily); } } else /* delete icns resource */ DeleteIconFamilyResource(); CloseResFile(refNum); UseResFile(gApplRefNum); /* set flag for custom icons */ #ifdef __MOREFILESX__ err = FSSetHasCustomIcon(&fsRef); err = FSClearHasBeenInited(&fsRef); #else err=FSpGetDInfo(theFolder,&dInfo); dInfo.frFlags |= kHasCustomIcon; dInfo.frFlags &= ~kHasBeenInited; err=FSpSetDInfo(theFolder,&dInfo); #endif gUsedCount.exportNum++; } FlushVol(0L,theFolder->vRefNum); /* update folder icon */ UpdateFinderIcon(theFolder); return err; }
static int WriteTextResource( ClientData clientData, /* Not used. */ Tcl_Interp *interp, /* Current interpreter. */ int argc, /* Number of arguments. */ char **argv) /* Argument strings. */ { char *errNum = "wrong # args: "; char *errBad = "bad argument: "; char *errStr; char *fileName = NULL, *rsrcName = NULL; char *data = NULL; int rsrcID = -1, i, protectIt = 0; short fileRef = -1; OSErr err; Handle dataHandle; Str255 resourceName; FSSpec fileSpec; /* * Process the arguments. */ for (i = 1 ; i < argc ; i++) { if (!strcmp(argv[i], "-rsrc")) { rsrcName = argv[i + 1]; i++; } else if (!strcmp(argv[i], "-rsrcid")) { rsrcID = atoi(argv[i + 1]); i++; } else if (!strcmp(argv[i], "-file")) { fileName = argv[i + 1]; i++; } else if (!strcmp(argv[i], "-protected")) { protectIt = 1; } else { data = argv[i]; } } if ((rsrcName == NULL && rsrcID < 0) || (fileName == NULL) || (data == NULL)) { errStr = errBad; goto sourceFmtErr; } /* * Open the resource file. */ err = FSpLocationFromPath(strlen(fileName), fileName, &fileSpec); if (!(err == noErr || err == fnfErr)) { Tcl_AppendResult(interp, "couldn't validate file name", (char *) NULL); return TCL_ERROR; } if (err == fnfErr) { FSpCreateResFile(&fileSpec, 'WIsH', 'rsrc', smSystemScript); } fileRef = FSpOpenResFile(&fileSpec, fsRdWrPerm); if (fileRef == -1) { Tcl_AppendResult(interp, "couldn't open resource file", (char *) NULL); return TCL_ERROR; } UseResFile(fileRef); /* * Prepare data needed to create resource. */ if (rsrcID < 0) { rsrcID = UniqueID('TEXT'); } strcpy((char *) resourceName, rsrcName); c2pstr((char *) resourceName); dataHandle = NewHandle(strlen(data)); HLock(dataHandle); strcpy(*dataHandle, data); HUnlock(dataHandle); /* * Add the resource to the file and close it. */ AddResource(dataHandle, 'TEXT', rsrcID, resourceName); UpdateResFile(fileRef); if (protectIt) { SetResAttrs(Get1Resource('TEXT', rsrcID), resProtected); } CloseResFile(fileRef); return TCL_OK; sourceFmtErr: Tcl_AppendResult(interp, errStr, "error in \"", argv[0], "\"", (char *) NULL); return TCL_ERROR; }
OSErr PAS_decodeMisc(PASEntry *entry, FSSpec *outFile, short inRefNum) { OSErr err = noErr; short outRefNum; PASMiscInfo info; SInt32 infoSize; FInfo theFInfo; infoSize = sizeof(PASMiscInfo); err = SetFPos(inRefNum, fsFromStart, (*entry).entryOffset ); if (err != noErr) return err; err = FSRead( inRefNum, &infoSize, &info); if (err != noErr) return err; if(infoSize != sizeof(PASMiscInfo)) { return -1; } err = FSpOpenDF(outFile, fsRdWrPerm, &outRefNum); if (err != noErr) return err; memset(&theFInfo, 0, sizeof(FInfo)); theFInfo.fdType = info.fileType; theFInfo.fdCreator = info.fileCreator; theFInfo.fdFlags = info.fileFlags; err = FSpSetFInfo(outFile, &theFInfo); if (err != noErr) return err; FSClose(outRefNum); if (info.fileHasResFork) { outRefNum = FSpOpenResFile(outFile, fsRdWrPerm); if (outRefNum < noErr) { // maybe it does not have one! FSpCreateResFile(outFile, info.fileCreator, info.fileType, smSystemScript); outRefNum = FSpOpenResFile(outFile, fsRdWrPerm); if (outRefNum < noErr) { return outRefNum; } } SetResFileAttrs(outRefNum, info.fileResAttrs); CloseResFile(outRefNum); } if(info.fileType == 'APPL') { // we need to add applications to the desktop database. /* FIX :: need to find DTSetAPPL() function err = DTSetAPPL( NULL, outFile->vRefNum, info.fileCreator, outFile->parID, outFile->name); */ } return err; }
/* create file with IPIcon */ OSErr MakeFileWithIPIcon(const FSSpec *theFile,const IPIconRec *ipIcon) { OSErr err; FInfo fndrInfo; short refNum; IconActionUPP addIconUPP; MyIconResRec newIcon; /* create a file */ err=FSpGetFInfo(theFile,&fndrInfo); if (err==fnfErr) FSpCreateResFile(theFile,kResEditCreator,kResourceFileType,smSystemScript); if (err!=fnfErr && err!=noErr) return err; /* open the file */ refNum=FSpOpenResFile(theFile,fsWrPerm); if (refNum < 0) /* could not open -> the file has no resource fork */ { FSpCreateResFile(theFile,fndrInfo.fdCreator,fndrInfo.fdType,smSystemScript); refNum=FSpOpenResFile(theFile,fsWrPerm); } if (refNum < 0) /* could not open -> error */ return refNum; UseResFile(refNum); /* information for icon */ newIcon.resID=kCustomIconResource; GetIndString(newIcon.resName,141,2); newIcon.attrs=0; /* save icon family(separated icons) */ if (ipIcon->iconSuite != NULL) { addIconUPP=NewIconActionUPP(AddIconToFile); err=ForEachIconDo(ipIcon->iconSuite,GetMySelector(),addIconUPP,&newIcon); DisposeIconActionUPP(addIconUPP); } /* save icns(single icon) */ if (isIconServicesAvailable) { IconFamilyHandle iconFamily; err=IPIconToIconFamily(ipIcon,&iconFamily); if (err==noErr) { SaveDataToResource(*iconFamily,GetHandleSize((Handle)iconFamily), kIconFamilyType,newIcon.resID,newIcon.resName,newIcon.attrs); DisposeHandle((Handle)iconFamily); } } else /* delete icns resource */ DeleteIconFamilyResource(); CloseResFile(refNum); UseResFile(gApplRefNum); /* set flag for custom icons */ err=FSpGetFInfo(theFile,&fndrInfo); fndrInfo.fdFlags |= kHasCustomIcon; fndrInfo.fdFlags &= ~kHasBeenInited; err=FSpSetFInfo(theFile,&fndrInfo); FlushVol(0L,theFile->vRefNum); /* update file icon */ UpdateFinderIcon(theFile); return err; }
OSErr PAS_decodeMisc(PASEntry *entry, FSSpec *outFile, short inRefNum) { OSErr err; short outRefNum; PASMiscInfo info; SInt32 infoSize; FInfo theFInfo; infoSize = sizeof(PASMiscInfo); err = SetFPos(inRefNum, fsFromStart, (*entry).entryOffset ); if (err != noErr) return err; err = FSRead( inRefNum, &infoSize, &info); if (err != noErr) return err; if(infoSize != sizeof(PASMiscInfo)) { return -1; } err = FSpOpenDF(outFile, fsRdWrPerm, &outRefNum); if (err != noErr) return err; memset(&theFInfo, 0, sizeof(FInfo)); theFInfo.fdType = info.fileType; theFInfo.fdCreator = info.fileCreator; theFInfo.fdFlags = info.fileFlags; err = FSpSetFInfo(outFile, &theFInfo); if (err != noErr) return err; FSClose(outRefNum); if (info.fileHasResFork) { outRefNum = FSpOpenResFile(outFile, fsRdWrPerm); if (outRefNum < noErr) { // maybe it does not have one! FSpCreateResFile(outFile, info.fileCreator, info.fileType, smSystemScript); outRefNum = FSpOpenResFile(outFile, fsRdWrPerm); if (outRefNum < noErr) { return err; } } SetResFileAttrs(outRefNum, info.fileResAttrs); CloseResFile(outRefNum); } return noErr; }
bool ExportPCM(AudacityProject *project, wxString format, bool stereo, wxString fName, bool selectionOnly, double t0, double t1) { wxMessageBox("In process of being rewritten, sorry..."); #if 0 double rate = project->GetRate(); wxWindow *parent = project; TrackList *tracks = project->GetTracks(); int header = SND_HEAD_NONE; #ifdef __WXMAC__ bool trackMarkers = false; #endif if (format == "WAV") header = SND_HEAD_WAVE; else if (format == "AIFF") header = SND_HEAD_AIFF; else if (format == "IRCAM") header = SND_HEAD_IRCAM; else if (format == "AU") header = SND_HEAD_NEXT; #ifdef __WXMAC__ else if (format == "AIFF with track markers") { header = SND_HEAD_AIFF; trackMarkers = true; } #endif // Use snd library to export file snd_node sndfile; snd_node sndbuffer; sndfile.device = SND_DEVICE_FILE; sndfile.write_flag = SND_WRITE; strcpy(sndfile.u.file.filename, (const char *) fName); sndfile.u.file.file = 0; sndfile.u.file.header = header; sndfile.u.file.byte_offset = 0; sndfile.u.file.end_offset = 0; sndfile.u.file.swap = 0; sndfile.format.channels = stereo ? 2 : 1; sndfile.format.mode = SND_MODE_PCM; // SND_MODE_FLOAT sndfile.format.bits = 16; sndfile.format.srate = int (rate + 0.5); int err; long flags = 0; err = snd_open(&sndfile, &flags); if (err) { wxMessageBox("Could not write to file."); return false; } sndbuffer.device = SND_DEVICE_MEM; sndbuffer.write_flag = SND_READ; sndbuffer.u.mem.buffer_max = 0; sndbuffer.u.mem.buffer = 0; sndbuffer.u.mem.buffer_len = 0; sndbuffer.u.mem.buffer_pos = 0; sndbuffer.format.channels = stereo ? 2 : 1; sndbuffer.format.mode = SND_MODE_PCM; // SND_MODE_FLOAT sndbuffer.format.bits = 16; sndbuffer.format.srate = int (rate + 0.5); double timeStep = 10.0; // write in blocks of 10 secs wxProgressDialog *progress = NULL; wxYield(); wxStartTimer(); wxBusyCursor busy; bool cancelling = false; double t = t0; while (t < t1 && !cancelling) { double deltat = timeStep; if (t + deltat > t1) deltat = t1 - t; sampleCount numSamples = int (deltat * rate + 0.5); Mixer *mixer = new Mixer(stereo ? 2 : 1, numSamples, true, rate); wxASSERT(mixer); mixer->Clear(); char *buffer = new char[numSamples * 2 * sndbuffer.format.channels]; wxASSERT(buffer); TrackListIterator iter(tracks); VTrack *tr = iter.First(); while (tr) { if (tr->GetKind() == VTrack::Wave) { if (tr->selected || !selectionOnly) { if (tr->channel == VTrack::MonoChannel) mixer->MixMono((WaveTrack *) tr, t, t + deltat); if (tr->channel == VTrack::LeftChannel) mixer->MixLeft((WaveTrack *) tr, t, t + deltat); if (tr->channel == VTrack::RightChannel) mixer->MixRight((WaveTrack *) tr, t, t + deltat); } } tr = iter.Next(); } sampleType *mixed = mixer->GetBuffer(); long b2 = snd_convert(&sndfile, buffer, // to &sndbuffer, mixed, numSamples); // from snd_write(&sndfile, buffer, b2); t += deltat; if (!progress && wxGetElapsedTime(false) > 500) { wxString message; if (selectionOnly) message = wxString:: Format("Exporting the selected audio as a %s file", (const char *) format); else message = wxString:: Format("Exporting the entire project as a %s file", (const char *) format); progress = new wxProgressDialog("Export", message, 1000, parent, wxPD_CAN_ABORT | wxPD_REMAINING_TIME | wxPD_AUTO_HIDE); } if (progress) { cancelling = !progress->Update(int (((t - t0) * 1000) / (t1 - t0) + 0.5)); } delete mixer; delete[]buffer; } snd_close(&sndfile); #ifdef __WXMAC__ FSSpec spec; wxMacFilename2FSSpec(fName, &spec); if (trackMarkers) { // Export the label track as "CD Spin Doctor" files LabelTrack *labels = NULL; TrackListIterator iter(tracks); VTrack *t = iter.First(); while (t && !labels) { if (t->GetKind() == VTrack::Label) labels = (LabelTrack *) t; t = iter.Next(); } if (labels) { FSpCreateResFile(&spec, 'AIFF', AUDACITY_CREATOR, 0); int resFile = FSpOpenResFile(&spec, fsWrPerm); if (resFile == -1) { int x = ResError(); } if (resFile != -1) { UseResFile(resFile); int numLabels = labels->mLabels.Count(); for (int i = 0; i < numLabels; i++) { int startBlock = (int) (labels->mLabels[i]->t * 75); int lenBlock; if (i < numLabels - 1) lenBlock = (int) ((labels->mLabels[i + 1]->t - labels->mLabels[i]->t) * 75); else lenBlock = (int) ((tracks->GetMaxLen() - labels->mLabels[i]->t) * 75); int startSample = startBlock * 1176 + 54; int lenSample = lenBlock * 1176 + 54; Handle theHandle = NewHandle(50); HLock(theHandle); char *data = (char *) (*theHandle); *(int *) &data[0] = startSample; *(int *) &data[4] = lenSample; *(int *) &data[8] = startBlock; *(int *) &data[12] = lenBlock; *(short *) &data[16] = i + 1; wxString title = labels->mLabels[i]->title; if (title.Length() > 31) title = title.Left(31); data[18] = title.Length(); strcpy(&data[19], (const char *) title); HUnlock(theHandle); AddResource(theHandle, 'SdCv', 128 + i, "\p"); } CloseResFile(resFile); wxMessageBox("Saved track information with file."); } } } FInfo finfo; if (FSpGetFInfo(&spec, &finfo) == noErr) { switch (header) { case SND_HEAD_AIFF: finfo.fdType = 'AIFF'; break; case SND_HEAD_IRCAM: finfo.fdType = 'IRCA'; break; case SND_HEAD_NEXT: finfo.fdType = 'AU '; break; case SND_HEAD_WAVE: finfo.fdType = 'WAVE'; break; } finfo.fdCreator = AUDACITY_CREATOR; FSpSetFInfo(&spec, &finfo); } #endif if (progress) delete progress; return true; #endif return false; }