void ExportMultiple::OnExport(wxCommandEvent& event) { ShuttleGui S(this, eIsSavingToPrefs); PopulateOrExchange(S); // Make sure the output directory is in good shape if (!DirOk()) { return; } mFormatIndex = mFormat->GetSelection(); bool overwrite = mOverwrite->GetValue(); if (mPlugins[mFormatIndex]->GetCanMetaData()) { Tags *tags = mProject->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(mProject, _("Edit the ID3 tags for all MP3 files"), true); tags->AllowEditTitle(true); tags->AllowEditTrackNumber(true); if (!rval) { tags->SetTitle(saveTitle); tags->SetTrackNumber(saveTrackNumber); return; } } } bool ok; if (mLabel->GetValue()) { ok = ExportMultipleByLabel(mByName->GetValue(), mPrefix->GetValue()); } else { ok = ExportMultipleByTrack(mByName->GetValue(), mPrefix->GetValue()); } if (!ok) { return; } EndModal(1); }
bool ExportMP3(AudacityProject *project, bool stereo, wxString fName, bool selectionOnly, double t0, double t1) { double rate = project->GetRate(); wxWindow *parent = project; TrackList *tracks = project->GetTracks(); wxLogNull logNo; /* temporarily disable wxWindows error messages */ bool success = GetMP3Exporter()->FindLibrary(parent); if (!success) return false; success = GetMP3Exporter()->LoadLibrary(); if (!success) { wxMessageBox(_("Could not open MP3 encoding library!")); gPrefs->Write("/MP3/MP3LibPath", wxString("")); return false; } if(!GetMP3Exporter()->ValidLibraryLoaded()) { wxMessageBox(_("Not a valid or supported MP3 encoding library!")); gPrefs->Write("/MP3/MP3LibPath", wxString("")); return false; } /* Open file for writing */ wxFFile outFile(fName, "wb"); if (!outFile.IsOpened()) { wxMessageBox(_("Unable to open target file for writing")); return false; } /* Put ID3 tags at beginning of file */ Tags *tags = project->GetTags(); if (!tags->ShowEditDialog(project, _("Edit the ID3 tags for the MP3 file"))) return false; // used selected "cancel" char *id3buffer; int id3len; bool endOfFile; id3len = tags->ExportID3(&id3buffer, &endOfFile); if (!endOfFile) outFile.Write(id3buffer, id3len); /* Export MP3 using DLL */ long bitrate = gPrefs->Read("/FileFormats/MP3Bitrate", 128); GetMP3Exporter()->SetBitrate(bitrate); sampleCount inSamples = GetMP3Exporter()->InitializeStream(stereo ? 2 : 1, int(rate + 0.5)); double timeStep = (double)inSamples / rate; double t = t0; wxProgressDialog *progress = NULL; wxYield(); wxStartTimer(); wxBusyCursor busy; bool cancelling = false; long bytes; int bufferSize = GetMP3Exporter()->GetOutBufferSize(); unsigned char *buffer = new unsigned char[bufferSize]; wxASSERT(buffer); while (t < t1 && !cancelling) { double deltat = timeStep; bool lastFrame = false; sampleCount numSamples = inSamples; if (t + deltat > t1) { lastFrame = true; deltat = t1 - t; numSamples = int(deltat * rate + 0.5); } Mixer *mixer = new Mixer(stereo ? 2 : 1, numSamples, true, rate, int16Sample); wxASSERT(mixer); mixer->Clear(); TrackListIterator iter(tracks); VTrack *tr = iter.First(); while (tr) { if (tr->GetKind() == VTrack::Wave) { if (tr->GetSelected() || !selectionOnly) { if (tr->GetChannel() == VTrack::MonoChannel) mixer->MixMono((WaveTrack *) tr, t, t + deltat); else if (tr->GetChannel() == VTrack::LeftChannel) mixer->MixLeft((WaveTrack *) tr, t, t + deltat); else if (tr->GetChannel() == VTrack::RightChannel) mixer->MixRight((WaveTrack *) tr, t, t + deltat); } } tr = iter.Next(); } short *mixed = (short *)mixer->GetBuffer(); if(lastFrame) bytes = GetMP3Exporter()->EncodeRemainder(mixed, numSamples, buffer); else bytes = GetMP3Exporter()->EncodeBuffer(mixed, buffer); outFile.Write(buffer, bytes); t += deltat; if (!progress && wxGetElapsedTime(false) > 500) { wxString message; if (selectionOnly) message = wxString::Format(_("Exporting the selected audio as an mp3")); else message = wxString::Format(_("Exporting the entire project as an mp3")); 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; } bytes = GetMP3Exporter()->FinishStream(buffer); if (bytes) outFile.Write(buffer, bytes); /* Write ID3 tag if it was supposed to be at the end of the file */ if (endOfFile) outFile.Write(id3buffer, id3len); delete[] id3buffer; /* Close file */ outFile.Close(); /* MacOS: set the file type/creator so that the OS knows it's an MP3 file which was created by Audacity */ #ifdef __WXMAC__ FSSpec spec; wxMacFilename2FSSpec(fName, &spec); FInfo finfo; if (FSpGetFInfo(&spec, &finfo) == noErr) { finfo.fdType = 'MP3 '; finfo.fdCreator = AUDACITY_CREATOR; FSpSetFInfo(&spec, &finfo); } #endif if (progress) delete progress; delete[]buffer; return true; }