📄 exportmultiple.cpp
字号:
int numLeft = 0, numRight = 0, numMono = 0; TrackListIterator iter1(tracks); Track *tr = iter1.First(); while (tr) { if (tr->GetKind() == Track::Wave) { if (tr->GetChannel() == Track::LeftChannel) numLeft++; else if (tr->GetChannel() == Track::RightChannel) numRight++; else if (tr->GetChannel() == Track::MonoChannel) { // It's a mono channel, but it may be panned float pan = ((WaveTrack*)tr)->GetPan(); if (pan == -1.0) numLeft++; else if (pan == 1.0) numRight++; else if (pan == 0) numMono++; else { numLeft++; numRight++; } } } tr = iter1.Next(); } bool stereo = false; if (numRight > 0 || numLeft > 0) stereo = true; if (format==3 && forceMono) stereo = false; wxArrayString otherNames; wxString name; double t0, t1; int count = 0; bool ok = true; while(l < numLabels) { const LabelStruct *info = 0; if (l < 0) { name = firstFileName; t0 = 0.0; } else { info = labels->GetLabel(l); name = info->title; t0 = info->t; } if (info && info->t < info->t1) { t1 = info->t1; } else if (l < numLabels-1) { const LabelStruct *info1 = labels->GetLabel(l+1); t1 = info1->t; } else t1 = tracks->GetEndTime(); if (!byName) { if (numFiles > 9) name.Printf(wxT("%s-%02d"), prefix.c_str(), count+1); else name.Printf(wxT("%s-%d"), prefix.c_str(), count+1); } MakeNameUnique(otherNames, name); ok = DoExport(project, format, dir, stereo, name, false, t0, t1, overwrite, count+1); if (!ok) break; otherNames.Add(name); count++; l++; } ::wxMessageBox(wxString::Format(_("Successfully exported %d files."), count), _("Export Multiple"), wxOK | wxCENTRE, project); return ok;}bool ExportMultiple(AudacityProject *project){ TrackList *tracks = project->GetTracks(); int numTracks = CountNumExportableTracks(tracks); int numLabels = CountNumLabels(tracks); if (numTracks < 2 && numLabels < 1) { ::wxMessageBox(_("If you have more than one Audio Track, you can export each track as a separate file,\nor if you have a Label Track, you can export a new file for each label.\n\nThis project does not have multiple tracks or a Label Track, so you cannot export multiple files."), _("Can't export multiple files"), wxOK | wxCENTRE, project); return false; } ExportMultipleDialog dlog(project, -1); dlog.byLabelsAllowed = (numLabels > 0); dlog.byTracksAllowed = (numTracks > 1); dlog.firstFileName = project->GetName(); dlog.prefix = project->GetName(); dlog.CopyDataToControls(); dlog.CentreOnParent(); dlog.ShowModal(); if (!dlog.GetReturnCode()) return false; if (dlog.format == 1) { // MP3 Tags *tags = project->GetTags(); if (tags->IsEmpty()) { wxString saveTitle = tags->GetTitle(); int saveTrackNumber = tags->GetTrackNumber(); tags->SetTitle(wxT("(automatic)")); tags->SetTrackNumber(0); tags->AllowEditTitle(false); tags->AllowEditTrackNumber(false); bool rval = tags->ShowEditDialog(project, _("Edit the ID3 tags for all MP3 files")); tags->AllowEditTitle(true); tags->AllowEditTrackNumber(true); if (!rval) { tags->SetTitle(saveTitle); tags->SetTrackNumber(saveTrackNumber); return false; } } } if (dlog.byLabels) return ExportMultipleByLabel(project, dlog.dir, dlog.format, dlog.byName, dlog.prefix, dlog.includeFirst, dlog.firstFileName, dlog.overwrite,dlog.forceMono); else return ExportMultipleByTrack(project, dlog.dir, dlog.format, dlog.byName, dlog.prefix, dlog.overwrite, dlog.forceMono);}//// ExportMultipleDialog methods//BEGIN_EVENT_TABLE(ExportMultipleDialog, wxDialog) EVT_CHOICE(FormatID, ExportMultipleDialog::OnFormat) EVT_BUTTON(wxID_OK, ExportMultipleDialog::OnExport) EVT_BUTTON(wxID_CANCEL, ExportMultipleDialog::OnCancel) EVT_BUTTON(ChooseID, ExportMultipleDialog::OnChoose) EVT_RADIOBUTTON(LabelID, ExportMultipleDialog::OnLabel) EVT_RADIOBUTTON(TrackID, ExportMultipleDialog::OnTrack) EVT_RADIOBUTTON(ByNameID, ExportMultipleDialog::OnByName) EVT_RADIOBUTTON(ByNumberID, ExportMultipleDialog::OnByNumber) EVT_CHECKBOX(FirstID, ExportMultipleDialog::OnFirst) EVT_TEXT(FirstFileNameID, ExportMultipleDialog::OnFirstFileName) EVT_TEXT(PrefixID, ExportMultipleDialog::OnPrefix)END_EVENT_TABLE()ExportMultipleDialog::ExportMultipleDialog(wxWindow *parent, wxWindowID id): wxDialog(parent, id, (wxString)_("Export Multiple")){ wxBoxSizer *vSizer, *hSizer, *bigHSizer; wxStaticBoxSizer *group; wxStaticBox *staticBox; vSizer = new wxBoxSizer(wxVERTICAL); // // Format and location // hSizer = new wxBoxSizer(wxHORIZONTAL); hSizer->Add(new wxStaticText(this, -1, _("Export format:")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 5); int numFormats = 4; wxString formatList[4]; int format = ReadExportFormatPref(); formatList[0] = sf_header_shortname(format & SF_FORMAT_TYPEMASK); formatList[1] = wxT("MP3"); formatList[2] = wxT("Ogg Vorbis"); formatList[3] = wxT("MP3_mpg"); mFormat = new wxChoice(this, FormatID, wxDefaultPosition, wxDefaultSize, numFormats, formatList); int selFormat = gPrefs->Read(wxT("/FileFormats/ExportMultipleFormat"), format); mFormat->SetSelection(selFormat); hSizer->Add(mFormat, 0, wxALL | wxALIGN_CENTER_VERTICAL, 5); vSizer->Add(hSizer, 0, wxALL, 5); hSizer = new wxBoxSizer(wxHORIZONTAL); hSizer->Add(new wxStaticText(this, -1, _("Export location:")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 5); mDir = new wxTextCtrl(this, DirID); hSizer->Add(mDir, 1, wxALL | wxEXPAND, 5); mChoose = new wxButton(this, ChooseID, _("Choose...")); hSizer->Add(mChoose, 0, wxALL, 5); vSizer->Add(hSizer, 0, wxLEFT | wxRIGHT | wxEXPAND, 5); // bit rate display and stereo/mono selection hSizer = new wxBoxSizer(wxHORIZONTAL); long mp3Bitrate = gPrefs->Read(wxT("/FileFormats/MP3Bitrate"), 128); wxString mp3BitrateString = wxString::Format(wxT("%ld"), mp3Bitrate); hSizer->Add(new wxStaticText(this, -1, _("MP3 Bit Rate: " + mp3BitrateString)), 0, wxALL | wxALIGN_CENTER_VERTICAL, 5); hSizer->Add(20, 5); // indent mForceMono = new wxCheckBox(this, ForceMonoID, _("Force Mono")); long mono = gPrefs->Read(wxT("/FileFormats/MpgForceMono"), (long)0); mForceMono->SetValue(mono!=0); mForceMono->Enable(selFormat == 3); hSizer->Add(mForceMono, 0, wxALL | wxALIGN_CENTER_VERTICAL, 5); vSizer->Add(hSizer, 0, wxALL, 5); // // By labels or by tracks? // bigHSizer = new wxBoxSizer(wxHORIZONTAL); staticBox = new wxStaticBox(this, -1, _("Split files based on:")); group = new wxStaticBoxSizer(staticBox, wxVERTICAL); mLabel = new wxRadioButton(this, LabelID, _("Labels"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP); group->Add(mLabel, 0, wxALL, 5); hSizer = new wxBoxSizer(wxHORIZONTAL); hSizer->Add(20, 5); // indent mFirst = new wxCheckBox(this, FirstID, _("Include audio before first label")); hSizer->Add(mFirst, 0, wxLEFT | wxRIGHT, 5); group->Add(hSizer, 0, wxLEFT | wxRIGHT, 5); hSizer = new wxBoxSizer(wxHORIZONTAL); hSizer->Add(20, 5); // indent hSizer->Add(new wxStaticText(this, -1, _("First file name:")), 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 5); mFirstFileName = new wxTextCtrl(this, FirstFileNameID); hSizer->Add(mFirstFileName, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 5); group->Add(hSizer, 0, wxLEFT | wxRIGHT, 5); mTrack = new wxRadioButton(this, TrackID, _("Tracks")); group->Add(mTrack, 0, wxALL, 5); bigHSizer->Add(group, 0, wxALL, 5); // // How to name files? // staticBox = new wxStaticBox(this, -1, _("Name files:")); group = new wxStaticBoxSizer(staticBox, wxVERTICAL); mByName= new wxRadioButton(this, ByNameID, _("Using Label/Track Name"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP); group->Add(mByName, 0, wxALL, 5); mByNumber = new wxRadioButton(this, ByNumberID, _("Numbering consecutively")); group->Add(mByNumber, 0, wxALL, 5); hSizer = new wxBoxSizer(wxHORIZONTAL); hSizer->Add(20, 5); // indent hSizer->Add(new wxStaticText(this, -1, _("File name prefix:")), 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 5); mPrefix = new wxTextCtrl(this, PrefixID); hSizer->Add(mPrefix, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 5); group->Add(hSizer, 0, wxLEFT | wxRIGHT, 5); bigHSizer->Add(group, 0, wxALL, 5); vSizer->Add(bigHSizer, 0); // // Overwrite existing files? // hSizer = new wxBoxSizer(wxHORIZONTAL); mOverwrite = new wxCheckBox(this, ExplanationID, _("Overwrite existing files")); mOverwrite->SetValue(true); hSizer->Add(mOverwrite, 1, wxALL | wxEXPAND, 5); vSizer->Add(hSizer, 0, wxALL | wxEXPAND, 5); // // Explanation area // //hSizer = new wxBoxSizer(wxHORIZONTAL); //mExplanation = new wxTextCtrl(this, ExplanationID, "Text\nText\nText"); //hSizer->Add(mExplanation, 1, wxALL | wxEXPAND, 5); //vSizer->Add(hSizer, 0, wxALL | wxEXPAND, 5); // // Cancel / Export // hSizer = new wxBoxSizer(wxHORIZONTAL); mCancel = new wxButton(this, wxID_CANCEL, _("Cancel")); hSizer->Add(mCancel, 0, wxALL, 5); mExport = new wxButton(this, wxID_OK, _("Export")); mExport->SetDefault(); hSizer->Add(mExport, 0, wxALL, 5); vSizer->Add(hSizer, 0, wxALL | wxALIGN_CENTER, 5); // // Finish // SetAutoLayout(true); SetSizer(vSizer); vSizer->Fit(this); vSizer->SetSizeHints(this); EnableControls();}void ExportMultipleDialog::EnableControls(){ mFirst->Enable(mLabel->GetValue() && mByName->GetValue()); mFirstFileName->Enable(mLabel->GetValue() && mByName->GetValue() && mFirst->GetValue()); mPrefix->Enable(mByNumber->GetValue()); bool ok = true; if (mLabel->GetValue() && mFirst->GetValue() && mFirstFileName->GetValue() == wxT("")) ok = false; if (mByNumber->GetValue() && mPrefix->GetValue() == wxT("")) ok = false; mExport->Enable(ok);}void ExportMultipleDialog::CopyDataToControls(){ wxString defaultPath = gPrefs->Read(wxT("/DefaultExportPath"), FROMFILENAME(::wxGetCwd())); wxString path = gPrefs->Read(wxT("/DefaultMultiplExportPath"), defaultPath); mDir->SetValue(path); mFirstFileName->SetValue(firstFileName); mPrefix->SetValue(prefix); if (!byLabelsAllowed) { mLabel->Enable(false); mTrack->SetValue(true); mLabel->SetValue(false); } if (!byTracksAllowed) { mTrack->Enable(false); mLabel->SetValue(true); mTrack->SetValue(false); } EnableControls();}void ExportMultipleDialog::OnFormat(wxCommandEvent& event) { if (mFormat->GetSelection()==3) { mForceMono->Enable(true); } else { mForceMono->Enable(false); } gPrefs->Write(wxT("/FileFormats/ExportMultipleFormat"), mFormat->GetSelection()); EnableControls(); }void ExportMultipleDialog::OnChoose(wxCommandEvent& event){ wxDirDialog dlog(this, _("Choose a location to save the exported files"), mDir->GetValue()); dlog.ShowModal(); if (dlog.GetPath() != wxT("")) mDir->SetValue(dlog.GetPath());}void ExportMultipleDialog::OnLabel(wxCommandEvent& event){ EnableControls();}void ExportMultipleDialog::OnFirst(wxCommandEvent& event){ EnableControls();}void ExportMultipleDialog::OnFirstFileName(wxCommandEvent& event){ EnableControls();}void ExportMultipleDialog::OnTrack(wxCommandEvent& event){ EnableControls();} //void ExportMultipleDialog::OnByName(wxCommandEvent& event){ EnableControls();}void ExportMultipleDialog::OnByNumber(wxCommandEvent& event){ EnableControls();} //void ExportMultipleDialog::OnPrefix(wxCommandEvent& event){ EnableControls();} //void ExportMultipleDialog::OnCancel(wxCommandEvent& event){ EndModal(0);}void ExportMultipleDialog::OnExport(wxCommandEvent& event){ format = mFormat->GetSelection(); forceMono = mForceMono->GetValue(); dir = mDir->GetValue(); byLabels = mLabel->GetValue(); includeFirst = mFirst->GetValue(); byName = mByName->GetValue(); firstFileName = mFirstFileName->GetValue(); prefix = mPrefix->GetValue(); overwrite = mOverwrite->GetValue(); gPrefs->Write(wxT("/DefaultMultiplExportPath"), dir); gPrefs->Write(wxT("/FileFormats/MpgForceMono"), forceMono); EndModal(1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -