void LOFImportFileHandle::doDurationAndScrollOffset() { if (!mProject) return; bool doSomething = callDurationFactor || callScrollOffset; if (callDurationFactor) { double longestDuration = mProject->GetTracks()->GetEndTime(); mProject->ZoomBy(longestDuration / durationFactor); callDurationFactor = false; } if (callScrollOffset && (scrollOffset != 0)) { mProject->TP_ScrollWindow(scrollOffset); callScrollOffset = false; } if (doSomething) // Amend last undo state mProject->ModifyState(false); }
/** @brief Processes a single line from a LOF text file, doing whatever is * indicated on the line. * * This function should just return for lines it cannot deal with, and the * caller will continue to the next line of the input file */ void LOFImportFileHandle::lofOpenFiles(wxString* ln) { wxStringTokenizer tok(*ln, wxT(" ")); wxStringTokenizer temptok1(*ln, wxT("\"")); wxStringTokenizer temptok2(*ln, wxT(" ")); int tokenplace = 0; wxString targetfile; wxString tokenholder = tok.GetNextToken(); if (tokenholder.IsSameAs(wxT("window"), false)) { // set any duration/offset factors for last window, as all files were called doDurationAndScrollOffset(); if (windowCalledOnce) // Cause a project to be created with the next import mProject = nullptr; else // Apply any offset and duration directives of the first "window" line // to the previously open project, not a NEW one. ; windowCalledOnce = true; while (tok.HasMoreTokens()) { tokenholder = tok.GetNextToken(); if (tokenholder.IsSameAs(wxT("offset"), false)) { if (tok.HasMoreTokens()) tokenholder = tok.GetNextToken(); if (Internat::CompatibleToDouble(tokenholder, &scrollOffset)) { callScrollOffset = true; } else { /* i18n-hint: You do not need to translate "LOF" */ AudacityMessageBox(_("Invalid window offset in LOF file."), /* i18n-hint: You do not need to translate "LOF" */ _("LOF Error"), wxOK | wxCENTRE); } if (tok.HasMoreTokens()) tokenholder = tok.GetNextToken(); } if (tokenholder.IsSameAs(wxT("duration"), false)) { if (tok.HasMoreTokens()) tokenholder = tok.GetNextToken(); if (Internat::CompatibleToDouble(tokenholder, &durationFactor)) { callDurationFactor = true; } else { /* i18n-hint: You do not need to translate "LOF" */ AudacityMessageBox(_("Invalid duration in LOF file."), /* i18n-hint: You do not need to translate "LOF" */ _("LOF Error"), wxOK | wxCENTRE); } } // End if statement if (tokenholder == wxT("#")) { // # indicates comments; ignore line tok = wxStringTokenizer(wxT(""), wxT(" ")); } } // End while loop } // End if statement handling "window" lines else if (tokenholder.IsSameAs(wxT("file"), false)) { // To identify filename and open it tokenholder = temptok1.GetNextToken(); wxString targettoken = temptok1.GetNextToken(); targetfile = targettoken; // If path is relative, make absolute path from LOF path if(!wxIsAbsolutePath(targetfile)) { wxFileName fName(targetfile); fName.Normalize(wxPATH_NORM_ALL, mLOFFileName.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR)); if(fName.FileExists()) { targetfile = fName.GetFullPath(); } } // Do recursive call to import #ifdef USE_MIDI // If file is a midi if (Importer::IsMidi(targetfile)) { mProject = FileActions::DoImportMIDI(mProject, targetfile); } // If not a midi, open audio file else #else // !USE_MIDI /* if we don't have midi support, go straight on to opening as an * audio file. TODO: Some sort of message here? */ #endif // USE_MIDI mProject = AudacityProject::OpenProject( mProject, targetfile ); // Set tok to right after filename temptok2.SetString(targettoken); tokenplace = temptok2.CountTokens(); for (int i = 0; i < tokenplace; i++) tokenholder = tok.GetNextToken(); if (tok.HasMoreTokens()) { tokenholder = tok.GetNextToken(); if (tokenholder == wxT("#")) { // # indicates comments; ignore line tok = wxStringTokenizer(wxT(""), wxT(" ")); } if (tokenholder.IsSameAs(wxT("offset"), false)) { if (tok.HasMoreTokens()) tokenholder = tok.GetNextToken(); double offset; // handle an "offset" specifier if (!mProject) // there was an import error, // presumably with its own error message ; else if (Internat::CompatibleToDouble(tokenholder, &offset)) { auto tracks = mProject->GetTracks(); auto t = *tracks->Leaders().rbegin(); // t is now the last track in the project, unless the import of // all tracks failed, in which case it will be null. In that // case we return because we cannot offset a non-existent track. if (t == NULL) return; #ifdef USE_MIDI if (targetfile.AfterLast(wxT('.')).IsSameAs(wxT("mid"), false) || targetfile.AfterLast(wxT('.')).IsSameAs(wxT("midi"), false)) { AudacityMessageBox(_("MIDI tracks cannot be offset individually, only audio files can be."), _("LOF Error"), wxOK | wxCENTRE); } else #endif { for (auto channel : TrackList::Channels(t)) channel->SetOffset(offset); } // Amend the undo transaction made by import mProject->ModifyState(false); } // end of converting "offset" argument else { /* i18n-hint: You do not need to translate "LOF" */ AudacityMessageBox(_("Invalid track offset in LOF file."), _("LOF Error"), wxOK | wxCENTRE); } } // End if statement for "offset" parameters } // End if statement (more tokens after file name) } // End if statement "file" lines else if (tokenholder == wxT("#")) { // # indicates comments; ignore line tok = wxStringTokenizer(wxT(""), wxT(" ")); } else { // Couldn't parse a line } }