From 87610cea39e6e236024594427cb47fc10e25a10f Mon Sep 17 00:00:00 2001 From: "v.audacity" Date: Mon, 25 Jun 2012 01:41:57 +0000 Subject: [PATCH] Benjamin Drung's disable-dynamic-lame.patch for http://bugzilla.audacityteam.org/show_bug.cgi?id=233 --- configure.in | 3 +- m4/audacity_checklib_lame.m4 | 41 +++++++++++++++++++ src/configtemplate.h | 3 ++ src/export/ExportMP3.cpp | 62 ++++++++++++++++++++++++++++- src/ondemand/ODDecodeFFmpegTask.cpp | 2 +- src/prefs/LibraryPrefs.cpp | 8 +++- src/prefs/PrefsDialog.cpp | 2 + 7 files changed, 116 insertions(+), 5 deletions(-) create mode 100644 m4/audacity_checklib_lame.m4 diff --git a/configure.in b/configure.in index f1ea1bb59..70f3979eb 100644 --- a/configure.in +++ b/configure.in @@ -333,7 +333,7 @@ dnl can do without if they aren't available. dnl------------------------------------------------------------- dnl LIBRARIES="LIBVORBIS LIBMAD LIBSNDFILE LIBFLAC LIBID3TAG LIBSAMPLERATE LIBRESAMPLE LIBSBSMS LIBSOUNDTOUCH LIBNYQUIST LIBVAMP LIBEXPAT LIBTWOLAME FFMPEG LIBLRDF SLV2 REDLAND PORTSMF TAGLIB" dnl disable plugin categorisation and LV2 libs for 1.3.7 release -LIBRARIES="LIBVORBIS LIBMAD LIBSNDFILE LIBFLAC LIBID3TAG LIBSAMPLERATE LIBRESAMPLE LIBSBSMS LIBSOUNDTOUCH LIBNYQUIST LIBVAMP LIBEXPAT LIBTWOLAME FFMPEG PORTSMF PORTAUDIO" +LIBRARIES="LIBVORBIS LIBMAD LIBSNDFILE LIBFLAC LIBID3TAG LIBSAMPLERATE LIBRESAMPLE LIBSBSMS LIBSOUNDTOUCH LIBNYQUIST LIBVAMP LIBEXPAT LIBTWOLAME FFMPEG PORTSMF PORTAUDIO LAME" AC_MSG_NOTICE([Determining what libraries are available in this tree and on the system]) @@ -357,6 +357,7 @@ dnl AUDACITY_CHECKLIB_LIBLRDF AUDACITY_CHECKLIB_PORTSMF dnl AUDACITY_CHECKLIB_TAGLIB AUDACITY_CHECKLIB_PORTAUDIO +AUDACITY_CHECKLIB_LAME dnl Decide what libraries to build with, and whether to use system or local libraries dnl Set variables based on choices. diff --git a/m4/audacity_checklib_lame.m4 b/m4/audacity_checklib_lame.m4 new file mode 100644 index 000000000..0111d25e6 --- /dev/null +++ b/m4/audacity_checklib_lame.m4 @@ -0,0 +1,41 @@ +dnl Todo: Add Audacity / LAME license +dnl +dnl Please increment the serial number below whenever you alter this macro +dnl for the benefit of automatic macro update systems +# audacity_checklib_lame.m4 serial 1 + +dnl Check for a copy of lame, whoose headers we will use for the importer +AC_DEFUN([AUDACITY_CHECKLIB_LAME], [ + AC_ARG_WITH(lame, + [AS_HELP_STRING([--with-lame], + [use lame for import and export support])], + LAME_ARGUMENT=$withval, + LAME_ARGUMENT="unspecified") + + dnl See if LAME is installed in the system + + AC_CHECK_LIB(mp3lame, + lame_set_VBR_q, + lib_found="yes", + lib_found="no") + + AC_CHECK_HEADER(lame/lame.h, + header_found="yes", + header_found="no") + + if test "x$lib_found" = "xyes" && test "x$header_found" = "xyes" ; then + LAME_SYSTEM_AVAILABLE="yes" + AC_MSG_NOTICE([LAME library is available as system library.]) + if test "x$dynamic_loading" = "xno"; then + LAME_SYSTEM_LIBS="-lmp3lame" + LAME_SYSTEM_CPPSYMBOLS="DISABLE_DYNAMIC_LOADING_LAME" + fi + else + LAME_SYSTEM_AVAILABLE="no" + AC_MSG_NOTICE([LAME library is NOT available as system library.]) + fi + + dnl see if LAME is available in the source dir + + LAME_LOCAL_AVAILABLE="yes" +]) diff --git a/src/configtemplate.h b/src/configtemplate.h index 10ba8398d..a6182e07d 100644 --- a/src/configtemplate.h +++ b/src/configtemplate.h @@ -84,6 +84,9 @@ */ #undef USE_FFMPEG +/* Use system LAME library and disable dynamic loading of it. */ +#undef DISABLE_DYNAMIC_LOADING_LAME + /* Define if LADSPA plug-ins are enabled */ #undef USE_LADSPA diff --git a/src/export/ExportMP3.cpp b/src/export/ExportMP3.cpp index f123f4e37..669fc60b6 100644 --- a/src/export/ExportMP3.cpp +++ b/src/export/ExportMP3.cpp @@ -90,7 +90,11 @@ #include "Export.h" +#if defined(DISABLE_DYNAMIC_LOADING_LAME) +#include +#else #include "lame.h" +#endif #ifdef USE_LIBID3TAG #include @@ -562,6 +566,8 @@ class FindDialog : public wxDialog { public: +#ifndef DISABLE_DYNAMIC_LOADING_LAME + FindDialog(wxWindow *parent, wxString path, wxString name, wxString type) : wxDialog(parent, wxID_ANY, /* i18n-hint: LAME is the name of an MP3 converter and should not be translated*/ @@ -659,28 +665,36 @@ public: return mLibPath.GetFullPath(); } +#endif // DISABLE_DYNAMIC_LOADING_LAME + private: +#ifndef DISABLE_DYNAMIC_LOADING_LAME wxFileName mLibPath; wxString mPath; wxString mName; wxString mType; +#endif // DISABLE_DYNAMIC_LOADING_LAME wxTextCtrl *mPathText; DECLARE_EVENT_TABLE() }; +#ifndef DISABLE_DYNAMIC_LOADING_LAME BEGIN_EVENT_TABLE(FindDialog, wxDialog) EVT_BUTTON(ID_BROWSE, FindDialog::OnBrowse) EVT_BUTTON(ID_DLOAD, FindDialog::OnDownload) END_EVENT_TABLE() +#endif // DISABLE_DYNAMIC_LOADING_LAME //---------------------------------------------------------------------------- // MP3Exporter //---------------------------------------------------------------------------- +#ifndef DISABLE_DYNAMIC_LOADING_LAME + typedef lame_global_flags *lame_init_t(void); typedef int lame_init_params_t(lame_global_flags*); typedef const char* get_lame_version_t(void); @@ -724,6 +738,8 @@ typedef int lame_set_bWriteVbrTag_t(lame_global_flags *, int); typedef size_t lame_get_lametag_frame_t(const lame_global_flags *, unsigned char* buffer, size_t size); typedef void lame_mp3_tags_fid_t(lame_global_flags *, FILE *); +#endif // DISABLE_DYNAMIC_LOADING_LAME + #if defined(__WXMSW__) // An alternative solution to give Windows an additional chance of writing the tag before // falling bato to lame_mp3_tag_fid(). The latter can have DLL sharing issues when mixing @@ -776,9 +792,11 @@ public: MP3Exporter(); virtual ~MP3Exporter(); +#ifndef DISABLE_DYNAMIC_LOADING_LAME bool FindLibrary(wxWindow *parent); bool LoadLibrary(wxWindow *parent, AskUser askuser); bool ValidLibraryLoaded(); +#endif // DISABLE_DYNAMIC_LOADING_LAME /* These global settings keep state over the life of the object */ void SetMode(int mode); @@ -820,9 +838,11 @@ public: private: +#ifndef DISABLE_DYNAMIC_LOADING_LAME wxString mLibPath; wxDynamicLibrary lame_lib; bool mLibraryLoaded; +#endif // DISABLE_DYNAMIC_LOADING_LAME #if defined(__WXMSW__) wxString mBladeVersion; @@ -835,6 +855,7 @@ private: int mRoutine; int mChannel; +#ifndef DISABLE_DYNAMIC_LOADING_LAME /* function pointers to the symbols we get from the library */ lame_init_t* lame_init; lame_init_params_t* lame_init_params; @@ -864,6 +885,7 @@ private: beWriteInfoTag_t *beWriteInfoTag; beVersion_t *beVersion; #endif +#endif // DISABLE_DYNAMIC_LOADING_LAME lame_global_flags *mGF; @@ -880,13 +902,17 @@ private: MP3Exporter::MP3Exporter() { +#ifndef DISABLE_DYNAMIC_LOADING_LAME mLibraryLoaded = false; +#endif // DISABLE_DYNAMIC_LOADING_LAME mEncoding = false; mGF = NULL; +#ifndef DISABLE_DYNAMIC_LOADING_LAME if (gPrefs) { mLibPath = gPrefs->Read(wxT("/MP3/MP3LibPath"), wxT("")); } +#endif // DISABLE_DYNAMIC_LOADING_LAME mBitrate = 128; mQuality = QUALITY_2; @@ -900,6 +926,8 @@ MP3Exporter::~MP3Exporter() FreeLibrary(); } +#ifndef DISABLE_DYNAMIC_LOADING_LAME + bool MP3Exporter::FindLibrary(wxWindow *parent) { wxString path; @@ -998,6 +1026,8 @@ bool MP3Exporter::ValidLibraryLoaded() return mLibraryLoaded; } +#endif // DISABLE_DYNAMIC_LOADING_LAME + void MP3Exporter::SetMode(int mode) { mMode = mode; @@ -1023,6 +1053,7 @@ bool MP3Exporter::InitLibrary(wxString libpath) { wxLogMessage(wxT("Loading LAME from %s"), libpath.c_str()); +#ifndef DISABLE_DYNAMIC_LOADING_LAME if (!lame_lib.Load(libpath, wxDL_LAZY)) { wxLogMessage(wxT("load failed")); return false; @@ -1126,6 +1157,7 @@ bool MP3Exporter::InitLibrary(wxString libpath) lame_lib.Unload(); return false; } +#endif // DISABLE_DYNAMIC_LOADING_LAME mGF = lame_init(); if (mGF == NULL) { @@ -1142,25 +1174,31 @@ void MP3Exporter::FreeLibrary() mGF = NULL; } +#ifndef DISABLE_DYNAMIC_LOADING_LAME lame_lib.Unload(); +#endif // DISABLE_DYNAMIC_LOADING_LAME return; } wxString MP3Exporter::GetLibraryVersion() { +#ifndef DISABLE_DYNAMIC_LOADING_LAME if (!mLibraryLoaded) { return wxT(""); } +#endif // DISABLE_DYNAMIC_LOADING_LAME return wxString::Format(wxT("LAME %hs"), get_lame_version()); } int MP3Exporter::InitializeStream(int channels, int sampleRate) { +#ifndef DISABLE_DYNAMIC_LOADING_LAME if (!mLibraryLoaded) { return -1; } +#endif // DISABLE_DYNAMIC_LOADING_LAME if (channels > 2) { return -1; @@ -1171,7 +1209,10 @@ int MP3Exporter::InitializeStream(int channels, int sampleRate) lame_set_in_samplerate(mGF, sampleRate); lame_set_out_samplerate(mGF, sampleRate); lame_set_disable_reservoir(mGF, false); +#ifndef DISABLE_DYNAMIC_LOADING_LAME +// TODO: Make this configurable (detect the existance of this function) lame_set_padding_type(mGF, PAD_NO); +#endif // DISABLE_DYNAMIC_LOADING_LAME // Add the VbrTag for all types. For ABR/VBR, a Xing tag will be created. // For CBR, it will be a Lame Info tag. @@ -1316,9 +1357,13 @@ int MP3Exporter::FinishStream(unsigned char outbuffer[]) int result = lame_encode_flush(mGF, outbuffer, mOutBufferSize); +#if defined(DISABLE_DYNAMIC_LOADING_LAME) + mInfoTagLen = lame_get_lametag_frame(mGF, mInfoTagBuf, sizeof(mInfoTagBuf)); +#else if (lame_get_lametag_frame) { mInfoTagLen = lame_get_lametag_frame(mGF, mInfoTagBuf, sizeof(mInfoTagBuf)); } +#endif return result; } @@ -1571,10 +1616,20 @@ int ExportMP3::Export(AudacityProject *project, int subformat) { int rate = lrint(project->GetRate()); +#ifndef DISABLE_DYNAMIC_LOADING_LAME wxWindow *parent = project; +#endif // DISABLE_DYNAMIC_LOADING_LAME TrackList *tracks = project->GetTracks(); MP3Exporter exporter; +#ifdef DISABLE_DYNAMIC_LOADING_LAME + if (!exporter.InitLibrary(wxT(""))) { + wxMessageBox(_("Could not initialize MP3 encoding library!")); + gPrefs->Write(wxT("/MP3/MP3LibPath"), wxString(wxT(""))); + + return false; + } +#else if (!exporter.LoadLibrary(parent, MP3Exporter::Maybe)) { wxMessageBox(_("Could not open MP3 encoding library!")); gPrefs->Write(wxT("/MP3/MP3LibPath"), wxString(wxT(""))); @@ -1588,7 +1643,8 @@ int ExportMP3::Export(AudacityProject *project, return false; } - +#endif // DISABLE_DYNAMIC_LOADING_LAME + // Retrieve preferences int highrate = 48000; int lowrate = 8000; @@ -2018,13 +2074,17 @@ wxString GetMP3Version(wxWindow *parent, bool prompt) MP3Exporter exporter; wxString versionString = _("MP3 export library not found"); +#ifndef DISABLE_DYNAMIC_LOADING_LAME if (prompt) { exporter.FindLibrary(parent); } if (exporter.LoadLibrary(parent, prompt ? MP3Exporter::Yes : MP3Exporter::No)) { +#endif // DISABLE_DYNAMIC_LOADING_LAME versionString = exporter.GetLibraryVersion(); +#ifndef DISABLE_DYNAMIC_LOADING_LAME } +#endif // DISABLE_DYNAMIC_LOADING_LAME return versionString; } diff --git a/src/ondemand/ODDecodeFFmpegTask.cpp b/src/ondemand/ODDecodeFFmpegTask.cpp index b2ad133aa..6c2bacdc1 100644 --- a/src/ondemand/ODDecodeFFmpegTask.cpp +++ b/src/ondemand/ODDecodeFFmpegTask.cpp @@ -349,7 +349,7 @@ int ODFFmpegDecoder::Decode(samplePtr & data, sampleFormat & format, sampleCount } } if(mCurrentPos>start){ - mSeekingAllowedStatus = ODFFMPEG_SEEKING_TEST_FAILED; + mSeekingAllowedStatus = (bool)ODFFMPEG_SEEKING_TEST_FAILED; // url_fseek(mFormatContext->pb,sc->m_pkt.pos,SEEK_SET); printf("seek fail, reverting to previous pos\n"); return -1; diff --git a/src/prefs/LibraryPrefs.cpp b/src/prefs/LibraryPrefs.cpp index 26caa1f50..31ddbe180 100644 --- a/src/prefs/LibraryPrefs.cpp +++ b/src/prefs/LibraryPrefs.cpp @@ -89,13 +89,17 @@ void LibraryPrefs::PopulateOrExchange(ShuttleGui & S) S.AddVariableText(_("MP3 Library:"), true, wxALL | wxALIGN_RIGHT | wxALIGN_CENTRE_VERTICAL); - S.Id(ID_MP3_FIND_BUTTON).AddButton(_("&Locate..."), + wxButton *locate_button = S.Id(ID_MP3_FIND_BUTTON).AddButton(_("&Locate..."), wxALL | wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL); S.AddVariableText(_("LAME MP3 Library:"), true, wxALL | wxALIGN_RIGHT | wxALIGN_CENTRE_VERTICAL); - S.Id(ID_MP3_DOWN_BUTTON).AddButton(_("&Download"), + wxButton *download_button = S.Id(ID_MP3_DOWN_BUTTON).AddButton(_("&Download"), wxALL | wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL); +#ifdef DISABLE_DYNAMIC_LOADING_LAME + locate_button->Enable(FALSE); + download_button->Enable(FALSE); +#endif // DISABLE_DYNAMIC_LOADING_LAME } S.EndTwoColumn(); } diff --git a/src/prefs/PrefsDialog.cpp b/src/prefs/PrefsDialog.cpp index e1989762f..f26470e48 100644 --- a/src/prefs/PrefsDialog.cpp +++ b/src/prefs/PrefsDialog.cpp @@ -131,7 +131,9 @@ PrefsDialog::PrefsDialog(wxWindow * parent) w = new ImportExportPrefs(mCategories);mCategories->AddPage(w, w->GetName(), false, 0); w = new ExtImportPrefs(mCategories); mCategories->AddPage(w, w->GetName(), false, 0); w = new ProjectsPrefs(mCategories); mCategories->AddPage(w, w->GetName(), false, 0); +#if !defined(DISABLE_DYNAMIC_LOADING_FFMPEG) || !defined(DISABLE_DYNAMIC_LOADING_LAME) w = new LibraryPrefs(mCategories); mCategories->AddPage(w, w->GetName(), false, 0); +#endif w = new SpectrumPrefs(mCategories); mCategories->AddPage(w, w->GetName(), false, 0); w = new DirectoriesPrefs(mCategories); mCategories->AddPage(w, w->GetName(), false, 0); w = new WarningsPrefs(mCategories); mCategories->AddPage(w, w->GetName(), false, 0);