bool Generator::Process() { if (GetDuration() < 0.0) return false; // Set up mOutputTracks. // This effect needs Track::All for sync-lock grouping. this->CopyInputTracks(Track::All); // Iterate over the tracks bool bGoodResult = true; int ntrack = 0; TrackListIterator iter(mOutputTracks); Track* t = iter.First(); while (t != NULL) { if (t->GetKind() == Track::Wave && t->GetSelected()) { WaveTrack* track = (WaveTrack*)t; bool editClipCanMove; gPrefs->Read(wxT("/GUI/EditClipCanMove"), &editClipCanMove, true); //if we can't move clips, and we're generating into an empty space, //make sure there's room. if (!editClipCanMove && track->IsEmpty(mT0, mT1+1.0/track->GetRate()) && !track->IsEmpty(mT0, mT0+GetDuration()-(mT1-mT0)-1.0/track->GetRate())) { wxMessageBox( _("There is not enough room available to generate the audio"), _("Error"), wxICON_STOP); Failure(); return false; } if (GetDuration() > 0.0) { AudacityProject *p = GetActiveProject(); // Create a temporary track std::unique_ptr<WaveTrack> tmp( mFactory->NewWaveTrack(track->GetSampleFormat(), track->GetRate()) ); BeforeTrack(*track); BeforeGenerate(); // Fill it with data if (!GenerateTrack(&*tmp, *track, ntrack)) bGoodResult = false; else { // Transfer the data from the temporary track to the actual one tmp->Flush(); SetTimeWarper(new StepTimeWarper(mT0+GetDuration(), GetDuration()-(mT1-mT0))); bGoodResult = track->ClearAndPaste(p->GetSel0(), p->GetSel1(), &*tmp, true, false, GetTimeWarper()); } if (!bGoodResult) { Failure(); return false; } } else { // If the duration is zero, there's no need to actually // generate anything track->Clear(mT0, mT1); } ntrack++; } else if (t->IsSyncLockSelected()) { t->SyncLockAdjust(mT1, mT0 + GetDuration()); } // Move on to the next track t = iter.Next(); } Success(); this->ReplaceProcessedTracks(bGoodResult); mT1 = mT0 + GetDuration(); // Update selection. return true; }
//------------------------- Processing methods ------------------------- bool EffectSineSweepGenerator::Process() { // taken `as is` from Audacity`s Generator.cpp to resolve // a vc++ linking problem... if (mDuration < 0.0) return false; BeforeGenerate(); // Set up mOutputTracks. This effect needs Track::All for grouping this->CopyInputTracks(Track::All); // Iterate over the tracks bool bGoodResult = true; int ntrack = 0; TrackListIterator iter(mOutputTracks); Track* t = iter.First(); while (t != NULL) { if (t->GetKind() == Track::Wave && t->GetSelected()) { WaveTrack* track = (WaveTrack*)t; bool editClipCanMove = true; //gPrefs->Read(wxT("/GUI/EditClipCanMove"), &editClipCanMove, true); //if we can't move clips, and we're generating into an empty space, //make sure there's room. if (!editClipCanMove && track->IsEmpty(mT0, mT1+1.0/track->GetRate()) && !track->IsEmpty(mT0, mT0+mDuration-(mT1-mT0)-1.0/track->GetRate())) { wxMessageBox(_("There is not enough room available to generate the audio"), _("Error"), wxICON_STOP); Failure(); return false; } if (mDuration > 0.0) { // Create a temporary track WaveTrack *tmp = mFactory->NewWaveTrack(track->GetSampleFormat(), track->GetRate()); //BeforeTrack(*track); // Fill it with data if (!GenerateTrack(tmp, *track, ntrack)) bGoodResult = false; else { // Transfer the data from the temporary track to the actual one tmp->Flush(); SetTimeWarper(new AFStepTimeWarper(mT0+mDuration, mDuration-(mT1-mT0))); bGoodResult = track->ClearAndPaste(mT0, mT1, tmp, true, false, GetTimeWarper()); delete tmp; } if (!bGoodResult) { Failure(); return false; } } else { // If the duration is zero, there's no need to actually // generate anything track->Clear(mT0, mT1); } ntrack++; } else if (t->IsSyncLockSelected()) { t->SyncLockAdjust(mT1, mT0 + mDuration); } // Move on to the next track t = iter.Next(); } Success(); this->ReplaceProcessedTracks(bGoodResult); mT1 = mT0 + mDuration; // Update selection. return true; }
void Application::generate() { const char *extName; FILE *outfd = NULL; // Get the trackgen paramaters. sprintf(buf, "%s", CFG_FILE); CfgHandle = GfParmReadFile(buf, GFPARM_RMODE_STD | GFPARM_RMODE_CREAT); // Load and initialize the track loader module. GfLogInfo("Loading Track Loader ...\n"); std::ostringstream ossModLibName; ossModLibName << GfLibDir() << "modules/track/" << "track" << '.' << DLLEXT; GfModule* pmodTrkLoader = GfModule::load(ossModLibName.str()); // Check that it implements ITrackLoader. ITrackLoader* PiTrackLoader = 0; if (pmodTrkLoader) PiTrackLoader = pmodTrkLoader->getInterface<ITrackLoader>(); if (!PiTrackLoader) return; // This is the track definition. sprintf(trackdef, "%stracks/%s/%s/%s.xml", GfDataDir(), TrackCategory, TrackName, TrackName); TrackHandle = GfParmReadFile(trackdef, GFPARM_RMODE_STD); if (!TrackHandle) { fprintf(stderr, "Cannot find %s\n", trackdef); ::exit(1); } // Build the track structure with graphic extensions. Track = PiTrackLoader->load(trackdef, true); if (!JustCalculate) { // Get the output file radix. sprintf(buf2, "%stracks/%s/%s/%s", GfDataDir(), Track->category, Track->internalname, Track->internalname); OutputFileName = strdup(buf2); // Number of groups for the complete track. if (TrackOnly) { sprintf(buf2, "%s.ac", OutputFileName); // Track. outfd = Ac3dOpen(buf2, 1); } else if (MergeAll) { sprintf(buf2, "%s.ac", OutputFileName); // track + terrain + objects. outfd = Ac3dOpen(buf2, 2 + GetObjectsNb(TrackHandle)); } // Main Track. if (Bump) { extName = "trk-bump"; } else { extName = "trk"; } sprintf(buf2, "%s-%s.ac", OutputFileName, extName); OutTrackName = strdup(buf2); } if (JustCalculate){ CalculateTrack(Track, TrackHandle, Bump); return; } GenerateTrack(Track, TrackHandle, OutTrackName, outfd, Bump); if (TrackOnly) { return; } // Terrain. if (MergeTerrain && !MergeAll) { sprintf(buf2, "%s.ac", OutputFileName); /* terrain + objects */ outfd = Ac3dOpen(buf2, 1 + GetObjectsNb(TrackHandle)); } extName = "msh"; sprintf(buf2, "%s-%s.ac", OutputFileName, extName); OutMeshName = strdup(buf2); GenerateTerrain(Track, TrackHandle, OutMeshName, outfd, DoSaveElevation); if (DoSaveElevation != -1) { if (outfd) { Ac3dClose(outfd); } switch (DoSaveElevation) { case 0: case 1: sprintf(buf2, "%s.ac", OutputFileName); sprintf(buf, "%s-elv.png", OutputFileName); SaveElevation(Track, TrackHandle, buf, buf2, 1); if (DoSaveElevation) { break; } case 2: sprintf(buf, "%s-elv2.png", OutputFileName); SaveElevation(Track, TrackHandle, buf, OutMeshName, 1); if (DoSaveElevation) { break; } case 3: sprintf(buf, "%s-elv3.png", OutputFileName); SaveElevation(Track, TrackHandle, buf, OutMeshName, 0); if (DoSaveElevation) { break; } case 4: sprintf(buf, "%s-elv4.png", OutputFileName); SaveElevation(Track, TrackHandle, buf, OutTrackName, 2); break; } return; } GenerateObjects(Track, TrackHandle, CfgHandle, outfd, OutMeshName); }
static void Generate(void) { char *trackdllname; char *extName; FILE *outfd = NULL; // Get the trackgen paramaters. sprintf(buf, "%s", CFG_FILE); CfgHandle = GfParmReadFile(buf, GFPARM_RMODE_STD | GFPARM_RMODE_CREAT); trackdllname = GfParmGetStr(CfgHandle, "Modules", "track", "track"); sprintf(buf, "%smodules/track/%s.%s", GetLibDir (), trackdllname, DLLEXT); if (GfModLoad(TRK_IDENT, buf, &modlist) < 0) { GfFatal("Failed to find the track module %s", buf); } if (modlist->modInfo->fctInit(modlist->modInfo->index, &TrackItf)) { GfFatal("Failed to init the track module %s", buf); } // This is the track definition. sprintf(trackdef, "tracks/%s/%s/%s.xml", TrackCategory, TrackName, TrackName); TrackHandle = GfParmReadFile(trackdef, GFPARM_RMODE_STD); if (!TrackHandle) { fprintf(stderr, "Cannot find %s\n", trackdef); exit(1); } // Build the track structure with graphic extensions. Track = TrackItf.trkBuildEx(trackdef); if (!JustCalculate) { // Get the output file radix. sprintf(buf2, "tracks/%s/%s/%s", Track->category, Track->internalname, Track->internalname); OutputFileName = strdup(buf2); // Number of goups for the complete track. if (TrackOnly) { sprintf(buf2, "%s.ac", OutputFileName); // Track. outfd = Ac3dOpen(buf2, 1); } else if (MergeAll) { sprintf(buf2, "%s.ac", OutputFileName); // track + terrain + objects. outfd = Ac3dOpen(buf2, 2 + GetObjectsNb(TrackHandle)); } // Main Track. if (bump) { extName = "trk-bump"; } else { extName = "trk"; } sprintf(buf2, "%s-%s.ac", OutputFileName, extName); OutTrackName = strdup(buf2); } if (JustCalculate){ CalculateTrack(Track, TrackHandle, bump); return; } GenerateTrack(Track, TrackHandle, OutTrackName, outfd, bump); if (TrackOnly) { return; } // Terrain. if (MergeTerrain && !MergeAll) { sprintf(buf2, "%s.ac", OutputFileName); /* terrain + objects */ outfd = Ac3dOpen(buf2, 1 + GetObjectsNb(TrackHandle)); } extName = "msh"; sprintf(buf2, "%s-%s.ac", OutputFileName, extName); OutMeshName = strdup(buf2); GenerateTerrain(Track, TrackHandle, OutMeshName, outfd, saveElevation); if (saveElevation != -1) { if (outfd) { Ac3dClose(outfd); } switch (saveElevation) { case 0: case 1: sprintf(buf2, "%s.ac", OutputFileName); sprintf(buf, "%s-elv.png", OutputFileName); SaveElevation(Track, TrackHandle, buf, buf2, 1); if (saveElevation) { break; } case 2: sprintf(buf, "%s-elv2.png", OutputFileName); SaveElevation(Track, TrackHandle, buf, OutMeshName, 1); if (saveElevation) { break; } case 3: sprintf(buf, "%s-elv3.png", OutputFileName); SaveElevation(Track, TrackHandle, buf, OutMeshName, 0); if (saveElevation) { break; } case 4: sprintf(buf, "%s-elv4.png", OutputFileName); SaveElevation(Track, TrackHandle, buf, OutTrackName, 2); break; } return; } GenerateObjects(Track, TrackHandle, CfgHandle, outfd, OutMeshName); }
int ProcessMessage ( char *buf , int nread ) { char command[50] , data[200] ; buf[nread] = '\0' ; sscanf ( buf , "%s %s" , command , data ) ; if ( ! strcmp ( command , "path" ) ) { char *str , *token ; int j ; str = data ; token = strtok ( str , "," ) ; if ( token == NULL ) { return - 1 ; } sscanf ( token , "%lf" , &T_p_planning ) ; str = NULL ; token = strtok ( str , "," ) ; if ( token == NULL ) { return - 1 ; } sscanf ( token , "%lf" , &K_planning ) ; str = NULL ; token = strtok ( str , "," ) ; if ( token == NULL ) { return - 1 ; } sscanf ( token , "%s" , save_file ) ; str = NULL ; for ( j = 0 ; ; j ++ ) { token = strtok ( str , "," ) ; if ( token == NULL ) { break ; } sscanf ( token , "%lf" , &X_planning[j] ) ; str = NULL ; token = strtok ( str , "," ) ; if ( token == NULL ) { return - 1 ; } sscanf ( token , "%lf" , &Y_planning[j] ) ; str = NULL ; token = strtok ( str , "," ) ; if ( token == NULL ) { return - 1 ; } sscanf ( token , "%lf" , &Z_planning[j] ) ; str = NULL ; } planning_points = j ; smooth_flag = 0 ; if ( GenerateTrackCubic ( ) < 0 ) { return - 1 ; } if ( finished ) { send_message_safe ( "path begin" ) ; InitExperiment ( ) ; } else { send_message_safe ( "path in_curse" ) ; } return 0 ; } if ( ! strcmp ( command , "points" ) ) { char *str , *token ; int j ; str = data ; token = strtok ( str , "," ) ; if ( token == NULL ) { return - 1 ; } sscanf ( token , "%s" , save_file ) ; str = NULL ; for ( j = 0 ; ; j ++ ) { token = strtok ( str , "," ) ; if ( token == NULL ) { break ; } sscanf ( token , "%lf" , &X_planning[j] ) ; str = NULL ; token = strtok ( str , "," ) ; if ( token == NULL ) { return - 1 ; } sscanf ( token , "%lf" , &Y_planning[j] ) ; str = NULL ; token = strtok ( str , "," ) ; if ( token == NULL ) { return - 1 ; } sscanf ( token , "%lf" , &T_planning[j] ) ; str = NULL ; } planning_points = j ; smooth_flag = 0 ; if ( GenerateTrack ( ) < 0 ) { return - 1 ; } if ( finished ) { send_message_safe ( "points begin" ) ; InitExperiment ( ) ; } else { send_message_safe ( "points in_curse" ) ; } return 0 ; } if ( ! strcmp ( command , "reference" ) ) { char *str , *token ; int j ; str = data ; token = strtok ( str , "," ) ; if ( token == NULL ) { return - 1 ; } sscanf ( token , "%s" , save_file ) ; str = NULL ; for ( j = 0 ; ; j ++ ) { token = strtok ( str , "," ) ; if ( token == NULL ) { break ; } sscanf ( token , "%lf" , &X_planning[j] ) ; str = NULL ; token = strtok ( str , "," ) ; if ( token == NULL ) { return - 1 ; } sscanf ( token , "%lf" , &Y_planning[j] ) ; str = NULL ; token = strtok ( str , "," ) ; if ( token == NULL ) { return - 1 ; } sscanf ( token , "%lf" , &T_planning[j] ) ; str = NULL ; } planning_points = j ; smooth_flag = 1 ; if ( GenerateTrack ( ) < 0 ) { return - 1 ; } if ( finished ) { send_message_safe ( "reference begin" ) ; InitExperiment ( ) ; } else { send_message_safe ( "reference in_curse" ) ; } return 0 ; } return - 1 ; }