diff --git a/locale/POTFILES.in b/locale/POTFILES.in index fcd050d30..1b2eb568c 100644 --- a/locale/POTFILES.in +++ b/locale/POTFILES.in @@ -507,25 +507,17 @@ src/import/FormatClassifier.h src/import/Import.cpp src/import/Import.h src/import/ImportFFmpeg.cpp -src/import/ImportFFmpeg.h src/import/ImportFLAC.cpp -src/import/ImportFLAC.h src/import/ImportForwards.h src/import/ImportGStreamer.cpp -src/import/ImportGStreamer.h src/import/ImportLOF.cpp -src/import/ImportLOF.h src/import/ImportMIDI.cpp src/import/ImportMIDI.h src/import/ImportMP3.cpp -src/import/ImportMP3.h src/import/ImportOGG.cpp -src/import/ImportOGG.h src/import/ImportPCM.cpp -src/import/ImportPCM.h src/import/ImportPlugin.h src/import/ImportQT.cpp -src/import/ImportQT.h src/import/ImportRaw.cpp src/import/ImportRaw.h src/import/MultiFormatReader.cpp diff --git a/mac/Audacity.xcodeproj/project.pbxproj b/mac/Audacity.xcodeproj/project.pbxproj index 03c3e1995..d41aed2f9 100644 --- a/mac/Audacity.xcodeproj/project.pbxproj +++ b/mac/Audacity.xcodeproj/project.pbxproj @@ -2053,17 +2053,12 @@ 1790B07F09883BFD008A330A /* Import.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 3; lastKnownFileType = sourcecode.cpp.cpp; path = Import.cpp; sourceTree = ""; tabWidth = 3; }; 1790B08009883BFD008A330A /* Import.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 3; lastKnownFileType = sourcecode.c.h; path = Import.h; sourceTree = ""; tabWidth = 3; }; 1790B08109883BFD008A330A /* ImportFLAC.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 3; lastKnownFileType = sourcecode.cpp.cpp; path = ImportFLAC.cpp; sourceTree = ""; tabWidth = 3; }; - 1790B08209883BFD008A330A /* ImportFLAC.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 3; lastKnownFileType = sourcecode.c.h; path = ImportFLAC.h; sourceTree = ""; tabWidth = 3; }; 1790B08309883BFD008A330A /* ImportLOF.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 3; lastKnownFileType = sourcecode.cpp.cpp; path = ImportLOF.cpp; sourceTree = ""; tabWidth = 3; }; - 1790B08409883BFD008A330A /* ImportLOF.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 3; lastKnownFileType = sourcecode.c.h; path = ImportLOF.h; sourceTree = ""; tabWidth = 3; }; 1790B08509883BFD008A330A /* ImportMIDI.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 3; lastKnownFileType = sourcecode.cpp.cpp; path = ImportMIDI.cpp; sourceTree = ""; tabWidth = 3; }; 1790B08609883BFD008A330A /* ImportMIDI.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 3; lastKnownFileType = sourcecode.c.h; path = ImportMIDI.h; sourceTree = ""; tabWidth = 3; }; 1790B08709883BFD008A330A /* ImportMP3.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 3; lastKnownFileType = sourcecode.cpp.cpp; path = ImportMP3.cpp; sourceTree = ""; tabWidth = 3; }; - 1790B08809883BFD008A330A /* ImportMP3.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 3; lastKnownFileType = sourcecode.c.h; path = ImportMP3.h; sourceTree = ""; tabWidth = 3; }; 1790B08909883BFD008A330A /* ImportOGG.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 3; lastKnownFileType = sourcecode.cpp.cpp; path = ImportOGG.cpp; sourceTree = ""; tabWidth = 3; }; - 1790B08A09883BFD008A330A /* ImportOGG.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 3; lastKnownFileType = sourcecode.c.h; path = ImportOGG.h; sourceTree = ""; tabWidth = 3; }; 1790B08B09883BFD008A330A /* ImportPCM.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 3; lastKnownFileType = sourcecode.cpp.cpp; path = ImportPCM.cpp; sourceTree = ""; tabWidth = 3; }; - 1790B08C09883BFD008A330A /* ImportPCM.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 3; lastKnownFileType = sourcecode.c.h; path = ImportPCM.h; sourceTree = ""; tabWidth = 3; }; 1790B08D09883BFD008A330A /* ImportPlugin.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 3; lastKnownFileType = sourcecode.c.h; path = ImportPlugin.h; sourceTree = ""; tabWidth = 3; }; 1790B08E09883BFD008A330A /* ImportRaw.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 3; lastKnownFileType = sourcecode.cpp.cpp; path = ImportRaw.cpp; sourceTree = ""; tabWidth = 3; }; 1790B08F09883BFD008A330A /* ImportRaw.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 3; lastKnownFileType = sourcecode.c.h; path = ImportRaw.h; sourceTree = ""; tabWidth = 3; }; @@ -2221,7 +2216,6 @@ 280112791943EE0E00D98A16 /* HelpSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HelpSystem.cpp; sourceTree = ""; }; 2801127A1943EE0E00D98A16 /* HelpSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HelpSystem.h; sourceTree = ""; }; 2801A6430BF9268700648258 /* ImportQT.cpp */ = {isa = PBXFileReference; fileEncoding = 5; indentWidth = 3; lastKnownFileType = sourcecode.cpp.cpp; path = ImportQT.cpp; sourceTree = ""; tabWidth = 3; }; - 2801A6440BF9268700648258 /* ImportQT.h */ = {isa = PBXFileReference; fileEncoding = 5; indentWidth = 3; lastKnownFileType = sourcecode.c.h; path = ImportQT.h; sourceTree = ""; tabWidth = 3; }; 2803810018313B070078452A /* lame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lame.h; path = lame/lame/lame.h; sourceTree = ""; }; 2803C8B519F35AA000278526 /* PluginManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PluginManager.h; sourceTree = ""; }; 2803C8B619F35AA000278526 /* TrackPanelListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackPanelListener.h; sourceTree = ""; }; @@ -2303,7 +2297,6 @@ 282D474A0B9E8D900034BC49 /* Snap.cpp */ = {isa = PBXFileReference; fileEncoding = 5; indentWidth = 3; lastKnownFileType = sourcecode.cpp.cpp; path = Snap.cpp; sourceTree = ""; tabWidth = 3; }; 282D474B0B9E8D900034BC49 /* Snap.h */ = {isa = PBXFileReference; fileEncoding = 5; indentWidth = 3; lastKnownFileType = sourcecode.c.h; path = Snap.h; sourceTree = ""; tabWidth = 3; }; 283135EA0DFB9D110076D551 /* ImportFFmpeg.cpp */ = {isa = PBXFileReference; fileEncoding = 5; indentWidth = 3; lastKnownFileType = sourcecode.cpp.cpp; path = ImportFFmpeg.cpp; sourceTree = ""; tabWidth = 3; }; - 283135EB0DFB9D110076D551 /* ImportFFmpeg.h */ = {isa = PBXFileReference; fileEncoding = 5; indentWidth = 3; lastKnownFileType = sourcecode.c.h; path = ImportFFmpeg.h; sourceTree = ""; tabWidth = 3; }; 283135FD0DFBA2E80076D551 /* FFmpeg.cpp */ = {isa = PBXFileReference; fileEncoding = 5; indentWidth = 3; lastKnownFileType = sourcecode.cpp.cpp; path = FFmpeg.cpp; sourceTree = ""; tabWidth = 3; }; 283135FE0DFBA2E80076D551 /* FFmpeg.h */ = {isa = PBXFileReference; fileEncoding = 5; indentWidth = 3; lastKnownFileType = sourcecode.c.h; path = FFmpeg.h; sourceTree = ""; tabWidth = 3; }; 283506280A3A88ED00EB1EBD /* pa_unix_util.c */ = {isa = PBXFileReference; fileEncoding = 5; indentWidth = 3; lastKnownFileType = sourcecode.c.c; path = pa_unix_util.c; sourceTree = ""; tabWidth = 3; }; @@ -3304,7 +3297,6 @@ 5E78388D1DE4995E003270C0 /* AudacityException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudacityException.cpp; sourceTree = ""; }; 5E7838931DE4BBC2003270C0 /* CommandFlag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommandFlag.h; sourceTree = ""; }; 5E79B33F1D5CC38D001D677D /* ImportGStreamer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ImportGStreamer.cpp; sourceTree = ""; }; - 5E79B3401D5CC38D001D677D /* ImportGStreamer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImportGStreamer.h; sourceTree = ""; }; 5E89EEE91F78D017000F5E82 /* zh_CN.po */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = zh_CN.po; path = ../locale/zh_CN.po; sourceTree = ""; }; 5E94A1B81D1F1C8400A8713A /* wxPanelWrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wxPanelWrapper.cpp; sourceTree = ""; }; 5E94A1B91D1F1C8400A8713A /* wxPanelWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wxPanelWrapper.h; sourceTree = ""; }; @@ -4789,25 +4781,17 @@ 1790B07F09883BFD008A330A /* Import.cpp */, 1790B08009883BFD008A330A /* Import.h */, 283135EA0DFB9D110076D551 /* ImportFFmpeg.cpp */, - 283135EB0DFB9D110076D551 /* ImportFFmpeg.h */, 1790B08109883BFD008A330A /* ImportFLAC.cpp */, - 1790B08209883BFD008A330A /* ImportFLAC.h */, 5EB9EA281D5B81270050AF40 /* ImportForwards.h */, 5E79B33F1D5CC38D001D677D /* ImportGStreamer.cpp */, - 5E79B3401D5CC38D001D677D /* ImportGStreamer.h */, 1790B08309883BFD008A330A /* ImportLOF.cpp */, - 1790B08409883BFD008A330A /* ImportLOF.h */, 1790B08509883BFD008A330A /* ImportMIDI.cpp */, 1790B08609883BFD008A330A /* ImportMIDI.h */, 1790B08709883BFD008A330A /* ImportMP3.cpp */, - 1790B08809883BFD008A330A /* ImportMP3.h */, 1790B08909883BFD008A330A /* ImportOGG.cpp */, - 1790B08A09883BFD008A330A /* ImportOGG.h */, 1790B08B09883BFD008A330A /* ImportPCM.cpp */, - 1790B08C09883BFD008A330A /* ImportPCM.h */, 1790B08D09883BFD008A330A /* ImportPlugin.h */, 2801A6430BF9268700648258 /* ImportQT.cpp */, - 2801A6440BF9268700648258 /* ImportQT.h */, 1790B08E09883BFD008A330A /* ImportRaw.cpp */, 1790B08F09883BFD008A330A /* ImportRaw.h */, 28F67175197DFA1C00075C32 /* MultiFormatReader.cpp */, diff --git a/src/Makefile.am b/src/Makefile.am index 5df7d12c5..c471e5e62 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -495,16 +495,11 @@ audacity_SOURCES = \ import/Import.cpp \ import/Import.h \ import/ImportFLAC.cpp \ - import/ImportFLAC.h \ import/ImportForwards.h \ import/ImportLOF.cpp \ - import/ImportLOF.h \ import/ImportMP3.cpp \ - import/ImportMP3.h \ import/ImportOGG.cpp \ - import/ImportOGG.h \ import/ImportPCM.cpp \ - import/ImportPCM.h \ import/ImportPlugin.h \ import/ImportRaw.cpp \ import/ImportRaw.h \ @@ -776,7 +771,6 @@ audacity_SOURCES += \ export/ExportFFmpegDialogs.cpp \ export/ExportFFmpegDialogs.h \ import/ImportFFmpeg.cpp \ - import/ImportFFmpeg.h \ $(NULL) endif @@ -785,7 +779,6 @@ audacity_CPPFLAGS += $(GSTREAMER_CFLAGS) audacity_LDADD += $(GSTREAMER_LIBS) audacity_SOURCES += \ import/ImportGStreamer.cpp \ - import/ImportGStreamer.h \ $(NULL) endif @@ -881,7 +874,6 @@ audacity_CPPFLAGS += $(QUICKTIME_CFLAGS) audacity_LDADD += $(QUICKTIME_LIBS) audacity_SOURCES += \ import/ImportQT.cpp \ - import/ImportQT.h \ $(NULL) endif diff --git a/src/Makefile.in b/src/Makefile.in index 72bc236bb..3d7ccf0c6 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -105,14 +105,12 @@ bin_PROGRAMS = audacity$(EXEEXT) @USE_FFMPEG_TRUE@ export/ExportFFmpegDialogs.cpp \ @USE_FFMPEG_TRUE@ export/ExportFFmpegDialogs.h \ @USE_FFMPEG_TRUE@ import/ImportFFmpeg.cpp \ -@USE_FFMPEG_TRUE@ import/ImportFFmpeg.h \ @USE_FFMPEG_TRUE@ $(NULL) @USE_GSTREAMER_TRUE@am__append_7 = $(GSTREAMER_CFLAGS) @USE_GSTREAMER_TRUE@am__append_8 = $(GSTREAMER_LIBS) @USE_GSTREAMER_TRUE@am__append_9 = \ @USE_GSTREAMER_TRUE@ import/ImportGStreamer.cpp \ -@USE_GSTREAMER_TRUE@ import/ImportGStreamer.h \ @USE_GSTREAMER_TRUE@ $(NULL) @USE_LADSPA_TRUE@am__append_10 = $(LADSPA_CFLAGS) @@ -175,7 +173,6 @@ bin_PROGRAMS = audacity$(EXEEXT) @USE_QUICKTIME_TRUE@am__append_40 = $(QUICKTIME_LIBS) @USE_QUICKTIME_TRUE@am__append_41 = \ @USE_QUICKTIME_TRUE@ import/ImportQT.cpp \ -@USE_QUICKTIME_TRUE@ import/ImportQT.h \ @USE_QUICKTIME_TRUE@ $(NULL) @USE_SBSMS_TRUE@am__append_42 = $(SBSMS_CFLAGS) @@ -432,18 +429,16 @@ am__audacity_SOURCES_DIST = BlockFile.cpp BlockFile.h DirManager.cpp \ export/ExportMultiple.cpp export/ExportMultiple.h \ export/ExportOGG.cpp export/ExportOGG.h export/ExportPCM.cpp \ export/ExportPCM.h import/Import.cpp import/Import.h \ - import/ImportFLAC.cpp import/ImportFLAC.h \ - import/ImportForwards.h import/ImportLOF.cpp \ - import/ImportLOF.h import/ImportMP3.cpp import/ImportMP3.h \ - import/ImportOGG.cpp import/ImportOGG.h import/ImportPCM.cpp \ - import/ImportPCM.h import/ImportPlugin.h import/ImportRaw.cpp \ - import/ImportRaw.h import/RawAudioGuess.cpp \ - import/RawAudioGuess.h import/FormatClassifier.cpp \ - import/FormatClassifier.h import/MultiFormatReader.cpp \ - import/MultiFormatReader.h import/SpecPowerMeter.cpp \ - import/SpecPowerMeter.h menus/ClipMenus.cpp \ - menus/EditMenus.cpp menus/ExtraMenus.cpp menus/FileMenus.cpp \ - menus/HelpMenus.cpp menus/LabelMenus.cpp \ + import/ImportFLAC.cpp import/ImportForwards.h \ + import/ImportLOF.cpp import/ImportMP3.cpp import/ImportOGG.cpp \ + import/ImportPCM.cpp import/ImportPlugin.h \ + import/ImportRaw.cpp import/ImportRaw.h \ + import/RawAudioGuess.cpp import/RawAudioGuess.h \ + import/FormatClassifier.cpp import/FormatClassifier.h \ + import/MultiFormatReader.cpp import/MultiFormatReader.h \ + import/SpecPowerMeter.cpp import/SpecPowerMeter.h \ + menus/ClipMenus.cpp menus/EditMenus.cpp menus/ExtraMenus.cpp \ + menus/FileMenus.cpp menus/HelpMenus.cpp menus/LabelMenus.cpp \ menus/NavigationMenus.cpp menus/PluginMenus.cpp \ menus/SelectMenus.cpp menus/ToolbarMenus.cpp \ menus/TrackMenus.cpp menus/TransportMenus.cpp \ @@ -585,8 +580,7 @@ am__audacity_SOURCES_DIST = BlockFile.cpp BlockFile.h DirManager.cpp \ effects/audiounits/AudioUnitEffect.h export/ExportFFmpeg.cpp \ export/ExportFFmpeg.h export/ExportFFmpegDialogs.cpp \ export/ExportFFmpegDialogs.h import/ImportFFmpeg.cpp \ - import/ImportFFmpeg.h import/ImportGStreamer.cpp \ - import/ImportGStreamer.h effects/ladspa/ladspa.h \ + import/ImportGStreamer.cpp effects/ladspa/ladspa.h \ effects/ladspa/LadspaEffect.cpp effects/ladspa/LadspaEffect.h \ ondemand/ODDecodeFlacTask.cpp ondemand/ODDecodeFlacTask.h \ effects/nyquist/LoadNyquist.cpp effects/nyquist/LoadNyquist.h \ @@ -594,7 +588,7 @@ am__audacity_SOURCES_DIST = BlockFile.cpp BlockFile.h DirManager.cpp \ effects/lv2/LoadLV2.cpp effects/lv2/LoadLV2.h \ effects/lv2/LV2Effect.cpp effects/lv2/LV2Effect.h \ NoteTrack.cpp NoteTrack.h import/ImportMIDI.cpp \ - import/ImportMIDI.h import/ImportQT.cpp import/ImportQT.h \ + import/ImportMIDI.h import/ImportQT.cpp \ effects/vamp/LoadVamp.cpp effects/vamp/LoadVamp.h \ effects/vamp/VampEffect.cpp effects/vamp/VampEffect.h \ effects/VST/aeffectx.h effects/VST/VSTEffect.cpp \ @@ -1512,18 +1506,16 @@ audacity_SOURCES = $(libaudacity_la_SOURCES) AboutDialog.cpp \ export/ExportMultiple.cpp export/ExportMultiple.h \ export/ExportOGG.cpp export/ExportOGG.h export/ExportPCM.cpp \ export/ExportPCM.h import/Import.cpp import/Import.h \ - import/ImportFLAC.cpp import/ImportFLAC.h \ - import/ImportForwards.h import/ImportLOF.cpp \ - import/ImportLOF.h import/ImportMP3.cpp import/ImportMP3.h \ - import/ImportOGG.cpp import/ImportOGG.h import/ImportPCM.cpp \ - import/ImportPCM.h import/ImportPlugin.h import/ImportRaw.cpp \ - import/ImportRaw.h import/RawAudioGuess.cpp \ - import/RawAudioGuess.h import/FormatClassifier.cpp \ - import/FormatClassifier.h import/MultiFormatReader.cpp \ - import/MultiFormatReader.h import/SpecPowerMeter.cpp \ - import/SpecPowerMeter.h menus/ClipMenus.cpp \ - menus/EditMenus.cpp menus/ExtraMenus.cpp menus/FileMenus.cpp \ - menus/HelpMenus.cpp menus/LabelMenus.cpp \ + import/ImportFLAC.cpp import/ImportForwards.h \ + import/ImportLOF.cpp import/ImportMP3.cpp import/ImportOGG.cpp \ + import/ImportPCM.cpp import/ImportPlugin.h \ + import/ImportRaw.cpp import/ImportRaw.h \ + import/RawAudioGuess.cpp import/RawAudioGuess.h \ + import/FormatClassifier.cpp import/FormatClassifier.h \ + import/MultiFormatReader.cpp import/MultiFormatReader.h \ + import/SpecPowerMeter.cpp import/SpecPowerMeter.h \ + menus/ClipMenus.cpp menus/EditMenus.cpp menus/ExtraMenus.cpp \ + menus/FileMenus.cpp menus/HelpMenus.cpp menus/LabelMenus.cpp \ menus/NavigationMenus.cpp menus/PluginMenus.cpp \ menus/SelectMenus.cpp menus/ToolbarMenus.cpp \ menus/TrackMenus.cpp menus/TransportMenus.cpp \ diff --git a/src/import/Import.cpp b/src/import/Import.cpp index f3e1899ad..1501d4084 100644 --- a/src/import/Import.cpp +++ b/src/import/Import.cpp @@ -38,6 +38,8 @@ and ImportLOF.cpp. #include "../Audacity.h" // for USE_* macros #include "Import.h" +#include "ImportPlugin.h" + #include #include @@ -51,14 +53,6 @@ and ImportLOF.cpp. #include "../Project.h" #include "../WaveTrack.h" -#include "ImportPCM.h" -#include "ImportMP3.h" -#include "ImportOGG.h" -#include "ImportQT.h" -#include "ImportLOF.h" -#include "ImportFLAC.h" -#include "ImportFFmpeg.h" -#include "ImportGStreamer.h" #include "../Prefs.h" #include "../widgets/ProgressDialog.h" @@ -83,30 +77,52 @@ Importer::~Importer() { } +ImportPluginList &Importer::sImportPluginList() +{ + static ImportPluginList theList; + return theList; +} + +Importer::RegisteredImportPlugin::RegisteredImportPlugin( + std::unique_ptr pPlugin ) +{ + if ( pPlugin ) + sImportPluginList().emplace_back( std::move( pPlugin ) ); +} + +UnusableImportPluginList &Importer::sUnusableImportPluginList() +{ + static UnusableImportPluginList theList; + return theList; +} + +Importer::RegisteredUnusableImportPlugin::RegisteredUnusableImportPlugin( + std::unique_ptr pPlugin ) +{ + if ( pPlugin ) + sUnusableImportPluginList().emplace_back( std::move( pPlugin ) ); +} + bool Importer::Initialize() { - ImportPluginList{}.swap(mImportPluginList); - UnusableImportPluginList{}.swap(mUnusableImportPluginList); - ExtImportItems{}.swap(mExtImportItems); - // build the list of import plugin and/or unusableImporters. // order is significant. If none match, they will all be tried // in the order defined here. - GetPCMImportPlugin(mImportPluginList, mUnusableImportPluginList); - GetOGGImportPlugin(mImportPluginList, mUnusableImportPluginList); - GetFLACImportPlugin(mImportPluginList, mUnusableImportPluginList); - GetMP3ImportPlugin(mImportPluginList, mUnusableImportPluginList); - GetLOFImportPlugin(mImportPluginList, mUnusableImportPluginList); - #if defined(USE_FFMPEG) - GetFFmpegImportPlugin(mImportPluginList, mUnusableImportPluginList); - #endif - #ifdef USE_QUICKTIME - GetQTImportPlugin(mImportPluginList, mUnusableImportPluginList); - #endif - #if defined(USE_GSTREAMER) - GetGStreamerImportPlugin(mImportPluginList, mUnusableImportPluginList); - #endif + // They were pushed on the array at static initialization time in an + // unspecified sequence. Sort according to the sequence numbers they + // report to make the order determinate. + auto &list = sImportPluginList(); + std::sort( list.begin(), list.end(), + []( const ImportPluginList::value_type &a, + const ImportPluginList::value_type &b ){ + return a->SequenceNumber() < b->SequenceNumber(); + } + ); + + // Ordering of the unusable plugin list is not important. + + ExtImportItems{}.swap(mExtImportItems); ReadImportItems(); @@ -116,15 +132,13 @@ bool Importer::Initialize() bool Importer::Terminate() { WriteImportItems(); - ImportPluginList{}.swap( mImportPluginList ); - UnusableImportPluginList{}.swap( mUnusableImportPluginList ); return true; } void Importer::GetSupportedImportFormats(FormatList *formatList) { - for(const auto &importPlugin : mImportPluginList) + for(const auto &importPlugin : sImportPluginList()) { formatList->emplace_back(importPlugin->GetPluginFormatDescription(), importPlugin->GetSupportedExtensions()); @@ -206,7 +220,7 @@ void Importer::ReadImportItems() for (size_t i = 0; i < new_item->filters.size(); i++) { bool found = false; - for (const auto &importPlugin : mImportPluginList) + for (const auto &importPlugin : sImportPluginList()) { if (importPlugin->GetPluginStringID() == new_item->filters[i]) { @@ -220,7 +234,7 @@ void Importer::ReadImportItems() new_item->filter_objects.push_back(nullptr); } /* Find all filter objects that are not present in the filter list */ - for (const auto &importPlugin : mImportPluginList) + for (const auto &importPlugin : sImportPluginList()) { bool found = false; for (size_t i = 0; i < new_item->filter_objects.size(); i++) @@ -317,7 +331,7 @@ std::unique_ptr Importer::CreateDefaultImportItem() new_item->extensions.push_back(wxT("*")); new_item->mime_types.push_back(wxT("*")); - for (const auto &importPlugin : mImportPluginList) + for (const auto &importPlugin : sImportPluginList()) { new_item->filters.push_back(importPlugin->GetPluginStringID()); new_item->filter_objects.push_back(importPlugin.get()); @@ -371,7 +385,7 @@ bool Importer::Import(const FilePath &fName, if (usersSelectionOverrides) { - for (const auto &plugin : mImportPluginList) + for (const auto &plugin : sImportPluginList()) { if (plugin->GetPluginFormatDescription().CompareTo(type) == 0) { @@ -441,16 +455,16 @@ bool Importer::Import(const FilePath &fName, // Add all plugins that support the extension - // Here we rely on the fact that the first plugin in mImportPluginList is libsndfile. + // Here we rely on the fact that the first plugin in sImportPluginList() is libsndfile. // We want to save this for later insertion ahead of libmad, if libmad supports the extension. - // The order of plugins in mImportPluginList is determined by the Importer constructor alone and + // The order of plugins in sImportPluginList() is determined by the Importer constructor alone and // is not changed by user selection overrides or any other mechanism, but we include an assert // in case subsequent code revisions to the constructor should break this assumption that // libsndfile is first. - ImportPlugin *libsndfilePlugin = mImportPluginList.begin()->get(); + ImportPlugin *libsndfilePlugin = sImportPluginList().begin()->get(); wxASSERT(libsndfilePlugin->GetPluginStringID() == wxT("libsndfile")); - for (const auto &plugin : mImportPluginList) + for (const auto &plugin : sImportPluginList()) { // Make sure its not already in the list if (importPlugins.end() == @@ -486,7 +500,7 @@ bool Importer::Import(const FilePath &fName, // Otherwise, if FFmpeg (libav) has not been installed, libmad will still be there near the // end of the preference list importPlugins, where it will claim success importing FFmpeg file // formats unsuitable for it, and produce distorted results. - for (const auto &plugin : mImportPluginList) + for (const auto &plugin : sImportPluginList()) { if (!(plugin->GetPluginStringID() == wxT("libmad"))) { @@ -565,7 +579,7 @@ bool Importer::Import(const FilePath &fName, // None of our plugins can handle this file. It might be that // Audacity supports this format, but support was not compiled in. // If so, notify the user of this fact - for (const auto &unusableImportPlugin : mUnusableImportPluginList) + for (const auto &unusableImportPlugin : sUnusableImportPluginList()) { if( unusableImportPlugin->SupportsExtension(extension) ) { diff --git a/src/import/Import.h b/src/import/Import.h index de97937d5..cc9c37d93 100644 --- a/src/import/Import.h +++ b/src/import/Import.h @@ -88,6 +88,19 @@ class ExtImportItem class Importer { public: + + // Objects of this type are statically constructed in files implementing + // subclasses of ImportPlugin + struct RegisteredImportPlugin{ + RegisteredImportPlugin( std::unique_ptr ); + }; + + // Objects of this type are statically constructed in files, to identify + // unsupported import formats; typically in a conditional compilation + struct RegisteredUnusableImportPlugin{ + RegisteredUnusableImportPlugin( std::unique_ptr ); + }; + Importer(); ~Importer(); @@ -148,8 +161,8 @@ private: static Importer mInstance; ExtImportItems mExtImportItems; - ImportPluginList mImportPluginList; - UnusableImportPluginList mUnusableImportPluginList; + static ImportPluginList &sImportPluginList(); + static UnusableImportPluginList &sUnusableImportPluginList(); }; //---------------------------------------------------------------------------- diff --git a/src/import/ImportFFmpeg.cpp b/src/import/ImportFFmpeg.cpp index 420a3377a..46b9197c7 100644 --- a/src/import/ImportFFmpeg.cpp +++ b/src/import/ImportFFmpeg.cpp @@ -21,7 +21,6 @@ Licensed under the GNU General Public License v2 or later *//*******************************************************************/ #include "../Audacity.h" // needed before FFmpeg.h // for USE_* macros -#include "ImportFFmpeg.h" #include "../Experimental.h" @@ -152,6 +151,7 @@ static const auto exts = { }; // all the includes live here by default +#include "Import.h" #include "../Tags.h" #include "../WaveTrack.h" #include "ImportPlugin.h" @@ -182,6 +182,8 @@ public: ///! Probes the file and opens it if appropriate std::unique_ptr Open(const FilePath &Filename) override; + + unsigned SequenceNumber() const override; }; ///! Does acual import, returned by FFmpegImportPlugin::Open @@ -282,13 +284,6 @@ private: }; -void GetFFmpegImportPlugin(ImportPluginList &importPluginList, - UnusableImportPluginList &WXUNUSED(unusableImportPluginList)) -{ - importPluginList.push_back( std::make_unique() ); -} - - wxString FFmpegImportPlugin::GetPluginFormatDescription() { return DESC; @@ -336,6 +331,15 @@ std::unique_ptr FFmpegImportPlugin::Open(const FilePath &filen return std::move(handle); } +unsigned FFmpegImportPlugin::SequenceNumber() const +{ + return 60; +} + +static Importer::RegisteredImportPlugin registered{ + std::make_unique< FFmpegImportPlugin >() +}; + FFmpegImportFileHandle::FFmpegImportFileHandle(const FilePath & name) : ImportFileHandle(name) diff --git a/src/import/ImportFFmpeg.h b/src/import/ImportFFmpeg.h deleted file mode 100644 index e5a48699f..000000000 --- a/src/import/ImportFFmpeg.h +++ /dev/null @@ -1,19 +0,0 @@ -/********************************************************************** - -Audacity: A Digital Audio Editor - -ImportFFmpeg.h - -LRN - -**********************************************************************/ - -#ifndef __AUDACITY_IMPORT_FFMPEG__ -#define __AUDACITY_IMPORT_FFMPEG__ - -#include "ImportForwards.h" - -void GetFFmpegImportPlugin(ImportPluginList &importPluginList, - UnusableImportPluginList &unusableImportPluginList); - -#endif diff --git a/src/import/ImportFLAC.cpp b/src/import/ImportFLAC.cpp index 17f6286c5..9b702f992 100644 --- a/src/import/ImportFLAC.cpp +++ b/src/import/ImportFLAC.cpp @@ -23,7 +23,6 @@ *//*******************************************************************/ #include "../Audacity.h" // for USE_* macros -#include "ImportFLAC.h" #include "../Experimental.h" @@ -39,6 +38,7 @@ #include // needed for _("translated stings") even if we // don't have libflac available +#include "Import.h" #include "ImportPlugin.h" #include "../Tags.h" @@ -56,14 +56,10 @@ static const auto exts = { #ifndef USE_LIBFLAC -void GetFLACImportPlugin(ImportPluginList &importPluginList, - UnusableImportPluginList &unusableImportPluginList) -{ - unusableImportPluginList.push_back( +static Importer::RegisteredUnusableImportPlugin registered{ std::make_unique (DESC, FileExtensions( exts.begin(), exts.end() ) ) - ); -} +}; #else /* USE_LIBFLAC */ @@ -138,6 +134,8 @@ class FLACImportPlugin final : public ImportPlugin wxString GetPluginStringID() override { return wxT("libflac"); } wxString GetPluginFormatDescription() override; std::unique_ptr Open(const FilePath &Filename) override; + + unsigned SequenceNumber() const override; }; @@ -285,14 +283,6 @@ FLAC__StreamDecoderWriteStatus MyFLACFile::write_callback(const FLAC__Frame *fra }, MakeSimpleGuard(FLAC__STREAM_DECODER_WRITE_STATUS_ABORT) ); } - -void GetFLACImportPlugin(ImportPluginList &importPluginList, - UnusableImportPluginList &WXUNUSED(unusableImportPluginList)) -{ - importPluginList.push_back( std::make_unique() ); -} - - wxString FLACImportPlugin::GetPluginFormatDescription() { return DESC; @@ -340,6 +330,14 @@ std::unique_ptr FLACImportPlugin::Open(const FilePath &filenam return std::move(handle); } +unsigned FLACImportPlugin::SequenceNumber() const +{ + return 30; +} + +static Importer::RegisteredImportPlugin registered{ + std::make_unique< FLACImportPlugin >() +}; FLACImportFileHandle::FLACImportFileHandle(const FilePath & name) : ImportFileHandle(name), diff --git a/src/import/ImportFLAC.h b/src/import/ImportFLAC.h deleted file mode 100644 index 75c158e23..000000000 --- a/src/import/ImportFLAC.h +++ /dev/null @@ -1,20 +0,0 @@ -/********************************************************************** - - Audacity: A Digital Audio Editor - - ImportFLAC.h - - Sami Liedes - -**********************************************************************/ - -#ifndef __AUDACITY_IMPORT_FLAC__ -#define __AUDACITY_IMPORT_FLAC__ - -#include "ImportForwards.h" - -void GetFLACImportPlugin(ImportPluginList &importPluginList, - UnusableImportPluginList &unusableImportPluginList); - - -#endif diff --git a/src/import/ImportGStreamer.cpp b/src/import/ImportGStreamer.cpp index 0ade4a33f..258ae04c7 100644 --- a/src/import/ImportGStreamer.cpp +++ b/src/import/ImportGStreamer.cpp @@ -248,6 +248,8 @@ public: ///! Probes the file and opens it if appropriate std::unique_ptr Open(const wxString &Filename) override; + + unsigned SequenceNumber() const override; }; // ============================================================================ @@ -256,10 +258,9 @@ public: // ---------------------------------------------------------------------------- // Instantiate GStreamerImportPlugin and add to the list of known importers -void -GetGStreamerImportPlugin(ImportPluginList &importPluginList, - UnusableImportPluginList & WXUNUSED(unusableImportPluginList)) -{ + +static +Importer::RegisteredImportPlugin{ []() -> std::unique_ptr< ImportPlugin > { wxLogMessage(_TS("Audacity is built against GStreamer version %d.%d.%d-%d"), GST_VERSION_MAJOR, GST_VERSION_MINOR, @@ -281,7 +282,7 @@ GetGStreamerImportPlugin(ImportPluginList &importPluginList, wxLogMessage(wxT("Failed to initialize GStreamer. Error %d: %s"), error.get()->code, wxString::FromUTF8(error.get()->message)); - return; + return {}; } guint major, minor, micro, nano; @@ -297,11 +298,11 @@ GetGStreamerImportPlugin(ImportPluginList &importPluginList, // No supported extensions...no gstreamer plugins installed if (plug->GetSupportedExtensions().size() == 0) - return; + return {}; // Add to list of importers - importPluginList.push_back( std::move(plug) ); -} + return std::move(plug); +}() } registered; // ============================================================================ // GStreamerImportPlugin Class @@ -1145,6 +1146,11 @@ GStreamerImportFileHandle::Import(TrackFactory *trackFactory, return updateResult; } +unsigned GStreamerImportPlugin::SequenceNumber() const +{ + return 80; +} + // ---------------------------------------------------------------------------- // Message handlers // ---------------------------------------------------------------------------- diff --git a/src/import/ImportGStreamer.h b/src/import/ImportGStreamer.h deleted file mode 100644 index 373a352b0..000000000 --- a/src/import/ImportGStreamer.h +++ /dev/null @@ -1,19 +0,0 @@ -/********************************************************************** - -Audacity: A Digital Audio Editor - -ImportGStreamer.h - -LRN - -**********************************************************************/ - -#ifndef __AUDACITY_IMPORT_GSTREAMER__ -#define __AUDACITY_IMPORT_GSTREAMER__ - -#include "ImportPlugin.h" - -void GetGStreamerImportPlugin(ImportPluginList &importPluginList, - UnusableImportPluginList &unusableImportPluginList); - -#endif diff --git a/src/import/ImportLOF.cpp b/src/import/ImportLOF.cpp index 8acdfdebc..9b7d4ef33 100644 --- a/src/import/ImportLOF.cpp +++ b/src/import/ImportLOF.cpp @@ -70,7 +70,6 @@ *//*******************************************************************/ #include "../Audacity.h" // for USE_* macros -#include "ImportLOF.h" #include #include @@ -84,6 +83,7 @@ #include "../FileNames.h" #include "../WaveTrack.h" #include "ImportPlugin.h" +#include "Import.h" #include "../Menus.h" #include "../NoteTrack.h" #include "../Project.h" @@ -116,6 +116,8 @@ public: wxString GetPluginStringID() override { return wxT("lof"); } wxString GetPluginFormatDescription() override; std::unique_ptr Open(const FilePath &Filename) override; + + unsigned SequenceNumber() const override; }; @@ -171,12 +173,6 @@ LOFImportFileHandle::LOFImportFileHandle { } -void GetLOFImportPlugin(ImportPluginList &importPluginList, - UnusableImportPluginList & WXUNUSED(unusableImportPluginList)) -{ - importPluginList.push_back( std::make_unique() ); -} - wxString LOFImportPlugin::GetPluginFormatDescription() { return DESC; @@ -272,6 +268,15 @@ ProgressResult LOFImportFileHandle::Import( return ProgressResult::Success; } +unsigned LOFImportPlugin::SequenceNumber() const +{ + return 50; +} + +static Importer::RegisteredImportPlugin registered{ + std::make_unique< LOFImportPlugin >() +}; + /** @brief Processes a single line from a LOF text file, doing whatever is * indicated on the line. * diff --git a/src/import/ImportLOF.h b/src/import/ImportLOF.h deleted file mode 100644 index 48843382d..000000000 --- a/src/import/ImportLOF.h +++ /dev/null @@ -1,62 +0,0 @@ -/********************************************************************** - - Audacity: A Digital Audio Editor - - ImportLOF.h - - David I. Murray - - Supports the opening of ".lof" files which are text files that contain - a list of individual files to open in audacity in specific formats. - - (In BNF) The syntax for an LOF file, denoted by : - - ::= [ | | <#>]* - ::= window []* - ::= offset