diff --git a/locale/POTFILES.in b/locale/POTFILES.in index c9fa34f0c..ec8538881 100644 --- a/locale/POTFILES.in +++ b/locale/POTFILES.in @@ -127,6 +127,8 @@ src/MemoryX.h src/Menus.cpp src/Menus.h src/MenusMac.cpp +src/MissingAliasFileDialog.cpp +src/MissingAliasFileDialog.h src/Mix.cpp src/Mix.h src/MixerBoard.cpp diff --git a/mac/Audacity.xcodeproj/project.pbxproj b/mac/Audacity.xcodeproj/project.pbxproj index 444f3f8bd..79ee98af8 100644 --- a/mac/Audacity.xcodeproj/project.pbxproj +++ b/mac/Audacity.xcodeproj/project.pbxproj @@ -1274,6 +1274,7 @@ 5EBD243D1F74C50800132E0A /* eu_ES.po in Sources */ = {isa = PBXBuildFile; fileRef = 5EBD243C1F74C50800132E0A /* eu_ES.po */; }; 5EBD35861F78D37A0084D13F /* pt_PT.po in Sources */ = {isa = PBXBuildFile; fileRef = 5EBD35851F78D37A0084D13F /* pt_PT.po */; }; 5EC7ED061E101C5C0052CAE2 /* NotYetAvailableException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EC7ED041E101C5C0052CAE2 /* NotYetAvailableException.cpp */; }; + 5ECF728A22887B3B007F2A35 /* MissingAliasFileDialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5ECF728822887B3B007F2A35 /* MissingAliasFileDialog.cpp */; }; 5ED1D0AD1CDE55BD00471E3C /* Overlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5ED1D0A91CDE55BD00471E3C /* Overlay.cpp */; }; 5ED1D0AE1CDE55BD00471E3C /* OverlayPanel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5ED1D0AB1CDE55BD00471E3C /* OverlayPanel.cpp */; }; 5ED1D0B11CDE560C00471E3C /* BackedPanel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5ED1D0AF1CDE560C00471E3C /* BackedPanel.cpp */; }; @@ -3285,6 +3286,8 @@ 5EC7ED041E101C5C0052CAE2 /* NotYetAvailableException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NotYetAvailableException.cpp; sourceTree = ""; }; 5EC7ED051E101C5C0052CAE2 /* NotYetAvailableException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NotYetAvailableException.h; sourceTree = ""; }; 5ECCE7651DE49834009900E9 /* AudacityException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudacityException.h; sourceTree = ""; }; + 5ECF728822887B3B007F2A35 /* MissingAliasFileDialog.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MissingAliasFileDialog.cpp; sourceTree = ""; }; + 5ECF728922887B3B007F2A35 /* MissingAliasFileDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MissingAliasFileDialog.h; sourceTree = ""; }; 5ED18DB61CC16B1E00FAFE95 /* Reverb_libSoX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reverb_libSoX.h; sourceTree = ""; }; 5ED18DB71CC290AB00FAFE95 /* wxFileNameWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wxFileNameWrapper.h; sourceTree = ""; }; 5ED1D0A91CDE55BD00471E3C /* Overlay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Overlay.cpp; sourceTree = ""; }; @@ -4319,6 +4322,7 @@ 1865A9B61004490500946EE6 /* LyricsWindow.cpp */, 28EBA7FF0A78FAF800C8BB1F /* Matrix.cpp */, 1790B0A709883BFD008A330A /* Menus.cpp */, + 5ECF728822887B3B007F2A35 /* MissingAliasFileDialog.cpp */, 1790B0AB09883BFD008A330A /* Mix.cpp */, 289E75081006D0BD00CEF79B /* MixerBoard.cpp */, 280A8B4519F4403B0091DE70 /* ModuleManager.cpp */, @@ -4425,6 +4429,7 @@ 28EBA8000A78FAF800C8BB1F /* Matrix.h */, 5E61EE0C1CBAA6BB0009FCF1 /* MemoryX.h */, 1790B0A809883BFD008A330A /* Menus.h */, + 5ECF728922887B3B007F2A35 /* MissingAliasFileDialog.h */, 1790B0AC09883BFD008A330A /* Mix.h */, 289E75091006D0BD00CEF79B /* MixerBoard.h */, 280A8B4619F4403B0091DE70 /* ModuleManager.h */, @@ -8528,6 +8533,7 @@ 28884949131B6CF600B59735 /* ca.po in Sources */, 2888494A131B6CF600B59735 /* ca_ES@valencia.po in Sources */, 2888494B131B6CF600B59735 /* cs.po in Sources */, + 5ECF728A22887B3B007F2A35 /* MissingAliasFileDialog.cpp in Sources */, 2888494C131B6CF600B59735 /* cy.po in Sources */, 2888494D131B6CF600B59735 /* da.po in Sources */, 2888494E131B6CF600B59735 /* de.po in Sources */, diff --git a/src/AudacityApp.cpp b/src/AudacityApp.cpp index dd741d278..78764f69f 100644 --- a/src/AudacityApp.cpp +++ b/src/AudacityApp.cpp @@ -83,6 +83,7 @@ It handles initialization and termination by subclassing wxApp. #include "LangChoice.h" #include "Languages.h" #include "Menus.h" +#include "MissingAliasFileDialog.h" #include "PluginManager.h" #include "Project.h" #include "Screenshot.h" @@ -881,18 +882,13 @@ void AudacityApp::OnTimer(wxTimerEvent& WXUNUSED(event)) } // Check if a warning for missing aliased files should be displayed - if (ShouldShowMissingAliasFilesWarning()) { + if (MissingAliasFilesDialog::ShouldShow()) { // find which project owns the blockfile // note: there may be more than 1, but just go with the first one. //size_t numProjects = gAudacityProjects.size(); - AProjectHolder offendingProject; - wxString missingFileName; - - { - ODLocker locker { &m_LastMissingBlockFileLock }; - offendingProject = m_LastMissingBlockFileProject.lock(); - missingFileName = m_LastMissingBlockFilePath; - } + auto marked = MissingAliasFilesDialog::Marked(); + AProjectHolder offendingProject = marked.second; + wxString missingFileName = marked.first; // if there are no projects open, don't show the warning (user has closed it) if (offendingProject) { @@ -914,57 +910,15 @@ locations of the missing files."), missingFileName); if (offendingProject->GetMissingAliasFileDialog()) { offendingProject->GetMissingAliasFileDialog()->Raise(); } else { - ShowMissingAliasFilesDialog(offendingProject.get(), _("Files Missing"), + MissingAliasFilesDialog::Show(offendingProject.get(), _("Files Missing"), errorMessage, wxT(""), true); } } // Only show this warning once per event (playback/menu item/etc). - SetMissingAliasFilesWarningShouldShow(false); + MissingAliasFilesDialog::SetShouldShow(false); } } -void AudacityApp::MarkMissingAliasFilesWarning(const AliasBlockFile *b) -{ - ODLocker locker { &m_LastMissingBlockFileLock }; - if (b) { - size_t numProjects = gAudacityProjects.size(); - for (size_t ii = 0; ii < numProjects; ++ii) { - // search each project for the blockfile - if (gAudacityProjects[ii]->GetDirManager()->ContainsBlockFile(b)) { - m_LastMissingBlockFileProject = gAudacityProjects[ii]; - break; - } - } - } - else - m_LastMissingBlockFileProject = {}; - - if (b) - m_LastMissingBlockFilePath = b->GetAliasedFileName().GetFullPath(); - else - m_LastMissingBlockFilePath = wxString{}; -} - -void AudacityApp::SetMissingAliasFilesWarningShouldShow(bool b) -{ - // Note that this is can be called by both the main thread and other threads. - // I don't believe we need a mutex because we are checking zero vs non-zero, - // and the setting from other threads will always be non-zero (true), and the - // setting from the main thread is always false. - m_missingAliasFilesWarningShouldShow = b; - // reset the warnings as they were probably marked by a previous run - if (m_missingAliasFilesWarningShouldShow) { - MarkMissingAliasFilesWarning( nullptr ); - } -} - -bool AudacityApp::ShouldShowMissingAliasFilesWarning() -{ - ODLocker locker { &m_LastMissingBlockFileLock }; - auto ptr = m_LastMissingBlockFileProject.lock(); - return ptr && m_missingAliasFilesWarningShouldShow; -} - AudacityLogger *AudacityApp::GetLogger() { // Use dynamic_cast so that we get a NULL ptr if we haven't yet @@ -1284,8 +1238,6 @@ bool AudacityApp::OnInit() mLocale = NULL; - m_missingAliasFilesWarningShouldShow = true; - #if defined(__WXMAC__) // Disable window animation wxSystemOptions::SetOption(wxMAC_WINDOW_PLAIN_TRANSITION, 1); diff --git a/src/AudacityApp.h b/src/AudacityApp.h index 7c5e31a87..3f59f00e4 100644 --- a/src/AudacityApp.h +++ b/src/AudacityApp.h @@ -23,12 +23,12 @@ #include // for wxDIR_FILES #include // member variable -#include "ondemand/ODTaskThread.h" - #if defined(EXPERIMENTAL_CRASH_REPORT) #include // for wxDebugReport::Context #endif +#include "MemoryX.h" + class wxSingleInstanceChecker; class wxSocketEvent; class wxSocketServer; @@ -47,7 +47,6 @@ void QuitAudacity(); extern bool gIsQuitting; -class BlockFile; class AliasBlockFile; class AudacityApp final : public wxApp { @@ -103,22 +102,6 @@ class AudacityApp final : public wxApp { void OnServerEvent(wxSocketEvent & evt); void OnSocketEvent(wxSocketEvent & evt); - /** \brief Mark playback as having missing aliased blockfiles - * - * Playback will continue, but the missing files will be silenced - * ShouldShowMissingAliasFilesWarning can be called to determine - * if the user should be notified - */ - void MarkMissingAliasFilesWarning(const AliasBlockFile *b); - - /** \brief Changes the behavior of missing aliased blockfiles warnings - */ - void SetMissingAliasFilesWarningShouldShow(bool b); - - /** \brief Returns true if the user should be notified of missing alias warnings - */ - bool ShouldShowMissingAliasFilesWarning(); - #ifdef __WXMAC__ // In response to Apple Events void MacOpenFile(const wxString &fileName) override; @@ -185,12 +168,6 @@ class AudacityApp final : public wxApp { wxTimer mTimer; - bool m_missingAliasFilesWarningShouldShow; - std::weak_ptr< AudacityProject > m_LastMissingBlockFileProject; - wxString m_LastMissingBlockFilePath; - - ODLock m_LastMissingBlockFileLock; - void InitCommandHandler(); bool InitTempDir(); diff --git a/src/AudioIO.cpp b/src/AudioIO.cpp index 0b5d6f834..fc0d5255a 100644 --- a/src/AudioIO.cpp +++ b/src/AudioIO.cpp @@ -438,6 +438,7 @@ TimeTrack and AudioIOListener and whether the playback is looped. #include "portmixer.h" #endif +#include #include #include #include @@ -447,7 +448,7 @@ TimeTrack and AudioIOListener and whether the playback is looped. #include #include -#include "AudacityApp.h" +#include "MissingAliasFileDialog.h" #include "Mix.h" #include "Resample.h" #include "RingBuffer.h" @@ -2058,7 +2059,7 @@ int AudioIO::StartStream(const TransportTracks &tracks, } // Enable warning popups for unfound aliased blockfiles. - wxGetApp().SetMissingAliasFilesWarningShouldShow(true); + MissingAliasFilesDialog::SetShouldShow(true); commit = true; return mStreamToken; diff --git a/src/BlockFile.cpp b/src/BlockFile.cpp index ecf2694dd..10fd14263 100644 --- a/src/BlockFile.cpp +++ b/src/BlockFile.cpp @@ -53,7 +53,7 @@ out. #include "sndfile.h" #include "FileException.h" #include "FileFormats.h" -#include "AudacityApp.h" +#include "MissingAliasFileDialog.h" // msmeyer: Define this to add debug output via wxPrintf() //#define DEBUG_BLOCKFILE @@ -537,8 +537,8 @@ size_t BlockFile::CommonReadData( if (pAliasFile) { // Set a marker to display an error message for the silence - if (!wxGetApp().ShouldShowMissingAliasFilesWarning()) - wxGetApp().MarkMissingAliasFilesWarning(pAliasFile); + if (!MissingAliasFilesDialog::ShouldShow()) + MissingAliasFilesDialog::Mark(pAliasFile); } } } diff --git a/src/DirManager.cpp b/src/DirManager.cpp index b3385109b..19932ed45 100644 --- a/src/DirManager.cpp +++ b/src/DirManager.cpp @@ -68,7 +68,6 @@ #include #include -#include #include #include #include @@ -86,7 +85,6 @@ #include #endif -#include "AudacityApp.h" #include "Clipboard.h" #include "FileNames.h" #include "blockfile/LegacyBlockFile.h" @@ -95,6 +93,7 @@ #include "blockfile/ODPCMAliasBlockFile.h" #include "blockfile/ODDecodeBlockFile.h" #include "InconsistencyException.h" +#include "MissingAliasFileDialog.h" #include "Project.h" #include "Prefs.h" #include "Sequence.h" @@ -1702,7 +1701,7 @@ int DirManager::ProjectFSCK(const bool bForceError, const bool bAutoRecoverMode) // // MISSING ALIASED AUDIO FILES // - wxGetApp().SetMissingAliasFilesWarningShouldShow(false); + MissingAliasFilesDialog::SetShouldShow(false); BlockHash missingAliasFilesAUFHash; // (.auf) AliasBlockFiles whose aliased files are missing BlockHash missingAliasFilesPathHash; // full paths of missing aliased files this->FindMissingAliasFiles(missingAliasFilesAUFHash, missingAliasFilesPathHash); @@ -2006,7 +2005,7 @@ other projects. \ wxOK | wxICON_EXCLAMATION); } - wxGetApp().SetMissingAliasFilesWarningShouldShow(true); + MissingAliasFilesDialog::SetShouldShow(true); return nResult; } diff --git a/src/Makefile.am b/src/Makefile.am index 8f4eb364d..6c55efc30 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -182,6 +182,8 @@ audacity_SOURCES = \ MemoryX.h \ Menus.cpp \ Menus.h \ + MissingAliasFileDialog.cpp \ + MissingAliasFileDialog.h \ Mix.cpp \ Mix.h \ MixerBoard.cpp \ diff --git a/src/Makefile.in b/src/Makefile.in index 51714145c..1d301e816 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -312,7 +312,8 @@ am__audacity_SOURCES_DIST = BlockFile.cpp BlockFile.h DirManager.cpp \ LangChoice.h Languages.cpp Languages.h Legacy.cpp Legacy.h \ Lyrics.cpp Lyrics.h LyricsWindow.cpp LyricsWindow.h \ MacroMagic.h Matrix.cpp Matrix.h MemoryX.h Menus.cpp Menus.h \ - Mix.cpp Mix.h MixerBoard.cpp MixerBoard.h ModuleManager.cpp \ + MissingAliasFileDialog.cpp MissingAliasFileDialog.h Mix.cpp \ + Mix.h MixerBoard.cpp MixerBoard.h ModuleManager.cpp \ ModuleManager.h NumberScale.h PitchName.cpp PitchName.h \ PlatformCompatibility.cpp PlatformCompatibility.h \ PluginManager.cpp PluginManager.h Printing.cpp Printing.h \ @@ -648,9 +649,10 @@ am_audacity_OBJECTS = $(am__objects_1) audacity-AboutDialog.$(OBJEXT) \ audacity-LangChoice.$(OBJEXT) audacity-Languages.$(OBJEXT) \ audacity-Legacy.$(OBJEXT) audacity-Lyrics.$(OBJEXT) \ audacity-LyricsWindow.$(OBJEXT) audacity-Matrix.$(OBJEXT) \ - audacity-Menus.$(OBJEXT) audacity-Mix.$(OBJEXT) \ - audacity-MixerBoard.$(OBJEXT) audacity-ModuleManager.$(OBJEXT) \ - audacity-PitchName.$(OBJEXT) \ + audacity-Menus.$(OBJEXT) \ + audacity-MissingAliasFileDialog.$(OBJEXT) \ + audacity-Mix.$(OBJEXT) audacity-MixerBoard.$(OBJEXT) \ + audacity-ModuleManager.$(OBJEXT) audacity-PitchName.$(OBJEXT) \ audacity-PlatformCompatibility.$(OBJEXT) \ audacity-PluginManager.$(OBJEXT) audacity-Printing.$(OBJEXT) \ audacity-Profiler.$(OBJEXT) audacity-Project.$(OBJEXT) \ @@ -1243,7 +1245,6 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ -runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -1362,7 +1363,8 @@ audacity_SOURCES = $(libaudacity_la_SOURCES) AboutDialog.cpp \ LangChoice.h Languages.cpp Languages.h Legacy.cpp Legacy.h \ Lyrics.cpp Lyrics.h LyricsWindow.cpp LyricsWindow.h \ MacroMagic.h Matrix.cpp Matrix.h MemoryX.h Menus.cpp Menus.h \ - Mix.cpp Mix.h MixerBoard.cpp MixerBoard.h ModuleManager.cpp \ + MissingAliasFileDialog.cpp MissingAliasFileDialog.h Mix.cpp \ + Mix.h MixerBoard.cpp MixerBoard.h ModuleManager.cpp \ ModuleManager.h NumberScale.h PitchName.cpp PitchName.h \ PlatformCompatibility.cpp PlatformCompatibility.h \ PluginManager.cpp PluginManager.h Printing.cpp Printing.h \ @@ -2522,6 +2524,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-LyricsWindow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-Matrix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-Menus.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-MissingAliasFileDialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-Mix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-MixerBoard.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-ModuleManager.Po@am__quote@ @@ -3764,6 +3767,20 @@ audacity-Menus.obj: Menus.cpp @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o audacity-Menus.obj `if test -f 'Menus.cpp'; then $(CYGPATH_W) 'Menus.cpp'; else $(CYGPATH_W) '$(srcdir)/Menus.cpp'; fi` +audacity-MissingAliasFileDialog.o: MissingAliasFileDialog.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT audacity-MissingAliasFileDialog.o -MD -MP -MF $(DEPDIR)/audacity-MissingAliasFileDialog.Tpo -c -o audacity-MissingAliasFileDialog.o `test -f 'MissingAliasFileDialog.cpp' || echo '$(srcdir)/'`MissingAliasFileDialog.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audacity-MissingAliasFileDialog.Tpo $(DEPDIR)/audacity-MissingAliasFileDialog.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='MissingAliasFileDialog.cpp' object='audacity-MissingAliasFileDialog.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o audacity-MissingAliasFileDialog.o `test -f 'MissingAliasFileDialog.cpp' || echo '$(srcdir)/'`MissingAliasFileDialog.cpp + +audacity-MissingAliasFileDialog.obj: MissingAliasFileDialog.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT audacity-MissingAliasFileDialog.obj -MD -MP -MF $(DEPDIR)/audacity-MissingAliasFileDialog.Tpo -c -o audacity-MissingAliasFileDialog.obj `if test -f 'MissingAliasFileDialog.cpp'; then $(CYGPATH_W) 'MissingAliasFileDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/MissingAliasFileDialog.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audacity-MissingAliasFileDialog.Tpo $(DEPDIR)/audacity-MissingAliasFileDialog.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='MissingAliasFileDialog.cpp' object='audacity-MissingAliasFileDialog.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o audacity-MissingAliasFileDialog.obj `if test -f 'MissingAliasFileDialog.cpp'; then $(CYGPATH_W) 'MissingAliasFileDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/MissingAliasFileDialog.cpp'; fi` + audacity-Mix.o: Mix.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT audacity-Mix.o -MD -MP -MF $(DEPDIR)/audacity-Mix.Tpo -c -o audacity-Mix.o `test -f 'Mix.cpp' || echo '$(srcdir)/'`Mix.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audacity-Mix.Tpo $(DEPDIR)/audacity-Mix.Po diff --git a/src/MissingAliasFileDialog.cpp b/src/MissingAliasFileDialog.cpp new file mode 100644 index 000000000..ee895ad5d --- /dev/null +++ b/src/MissingAliasFileDialog.cpp @@ -0,0 +1,133 @@ +/********************************************************************* + +\class MissingAliasFileDialog +\brief Special case of ErrorDialog for reporting missing alias files. + +*//*******************************************************************/ + +#include "MissingAliasFileDialog.h" + +#include + +#include "BlockFile.h" +#include "DirManager.h" +#include "Project.h" +#include "widgets/ErrorDialog.h" + +// special case for alias missing dialog because we keep track of if it exists. +class MissingAliasFileDialog final : public ErrorDialog +{ + public: + MissingAliasFileDialog(AudacityProject *parent, + const wxString & dlogTitle, + const wxString & message, + const wxString & helpURL, + const bool Close = true, const bool modal = true); + virtual ~MissingAliasFileDialog(); +}; + + +MissingAliasFileDialog::MissingAliasFileDialog(AudacityProject *parent, + const wxString & dlogTitle, + const wxString & message, + const wxString & helpURL, + const bool Close, const bool modal): +ErrorDialog(parent, dlogTitle, message, helpURL, Close, modal) +{ + parent->SetMissingAliasFileDialog(this); +} + +MissingAliasFileDialog::~MissingAliasFileDialog() +{ + static_cast(GetParent()) + ->SetMissingAliasFileDialog( nullptr ); +} + +namespace MissingAliasFilesDialog { + + namespace{ + bool m_missingAliasFilesWarningShouldShow{ true }; + std::weak_ptr< AudacityProject > m_LastMissingBlockFileProject; + wxString m_LastMissingBlockFilePath; + std::mutex m_LastMissingBlockFileLock; + } + + using Lock = std::unique_lock< std::mutex >; + + void Show(AudacityProject *parent, + const wxString &dlogTitle, + const wxString &message, + const wxString &helpPage, + const bool Close) + { + wxASSERT(parent); // to justify safenew + ErrorDialog *dlog = safenew MissingAliasFileDialog(parent, dlogTitle, message, helpPage, Close, false); + // Don't center because in many cases (effect, export, etc) there will be a progress bar in the center that blocks this. + // instead put it just above or on the top of the project. + wxPoint point; + point.x = 0; + + point.y = parent ? parent->GetPosition().y - 200 : 100; + + if (point.y < 100) + point.y = 100; + dlog->SetPosition(point); + dlog->CentreOnParent(wxHORIZONTAL); + + // This needs to be modeless because user may need to + // stop playback AND read dialog's instructions. + dlog->Show(); + // ANSWER-ME: Vigilant Sentry flags this method as not deleting dlog, so a mem leak. + // PRL: answer is that the parent window guarantees destruction of the dialog + // but in practice Destroy() in OnOK does that + } + + void Mark(const AliasBlockFile *b) + { + Lock lock{ m_LastMissingBlockFileLock }; + if (b) { + size_t numProjects = gAudacityProjects.size(); + for (size_t ii = 0; ii < numProjects; ++ii) { + // search each project for the blockfile + if (gAudacityProjects[ii]->GetDirManager()->ContainsBlockFile(b)) { + m_LastMissingBlockFileProject = gAudacityProjects[ii]; + break; + } + } + } + else + m_LastMissingBlockFileProject = {}; + + if (b) + m_LastMissingBlockFilePath = b->GetAliasedFileName().GetFullPath(); + else + m_LastMissingBlockFilePath = wxString{}; + } + + std::pair< wxString, std::shared_ptr > Marked() + { + Lock lock{ m_LastMissingBlockFileLock }; + return { m_LastMissingBlockFilePath, m_LastMissingBlockFileProject.lock() }; + } + + bool ShouldShow() + { + Lock lock{ m_LastMissingBlockFileLock }; + auto ptr = m_LastMissingBlockFileProject.lock(); + return ptr && m_missingAliasFilesWarningShouldShow; + } + + void SetShouldShow(bool b) + { + // Note that this is can be called by both the main thread and other threads. + // I don't believe we need a mutex because we are checking zero vs non-zero, + // and the setting from other threads will always be non-zero (true), and the + // setting from the main thread is always false. + m_missingAliasFilesWarningShouldShow = b; + // reset the warnings as they were probably marked by a previous run + if (m_missingAliasFilesWarningShouldShow) { + Mark( nullptr ); + } + } + +} diff --git a/src/MissingAliasFileDialog.h b/src/MissingAliasFileDialog.h new file mode 100644 index 000000000..8c2d15e8b --- /dev/null +++ b/src/MissingAliasFileDialog.h @@ -0,0 +1,42 @@ +#ifndef __AUDACITY_MISSING_ALIAS_FILES_DIALOG__ +#define __AUDACITY_MISSING_ALIAS_FILES_DIALOG__ + +class AliasBlockFile; +class AudacityProject; +class wxDialog; + +#include +#include +#include + +namespace MissingAliasFilesDialog { + +/** \brief Mark playback as having missing aliased blockfiles + * + * Playback will continue, but the missing files will be silenced + * ShouldShow can be called to determine + * if the user should be notified + */ +void Mark(const AliasBlockFile *b); + +// Retrieve information left by Mark +std::pair< wxString, std::shared_ptr > Marked(); + +/** \brief Changes the behavior of missing aliased blockfiles warnings + */ +void SetShouldShow(bool b); + +/** \brief Returns true if the user should be notified of missing alias warnings + */ +bool ShouldShow(); + +/// Displays a custom modeless error dialog for aliased file errors +void Show(AudacityProject *parent, + const wxString &dlogTitle, + const wxString &message, + const wxString &helpPage, + const bool Close = true); + +} + +#endif diff --git a/src/Project.cpp b/src/Project.cpp index e10734b75..2e9833a48 100644 --- a/src/Project.cpp +++ b/src/Project.cpp @@ -113,6 +113,7 @@ scroll information. It also has some status flags. #include "Legacy.h" #include "LyricsWindow.h" #include "Menus.h" +#include "MissingAliasFileDialog.h" #include "Mix.h" #include "NoteTrack.h" #include "Prefs.h" @@ -1023,7 +1024,7 @@ AudacityProject::AudacityProject(wxWindow * parent, wxWindowID id, mStatusBar->SetName(wxT("status_line")); // not localized mProjectNo = mProjectCounter++; // Bug 322 - wxGetApp().SetMissingAliasFilesWarningShouldShow(true); + MissingAliasFilesDialog::SetShouldShow(true); // MM: DirManager is created dynamically, freed on demand via ref-counting // MM: We don't need to Ref() here because it start with refcount=1 @@ -5278,7 +5279,7 @@ bool AudacityProject::ExportFromTimerRecording(wxFileName fnFile, int iFormat, i { Exporter e; - wxGetApp().SetMissingAliasFilesWarningShouldShow(true); + MissingAliasFilesDialog::SetShouldShow(true); return e.ProcessFromTimerRecording(this, false, 0.0, mTracks->GetEndTime(), fnFile, iFormat, iSubFormat, iFilterIndex); } diff --git a/src/menus/FileMenus.cpp b/src/menus/FileMenus.cpp index 4f9dc6678..fdb9b4b54 100644 --- a/src/menus/FileMenus.cpp +++ b/src/menus/FileMenus.cpp @@ -1,10 +1,10 @@ #include "../Audacity.h" // for USE_* macros #include "../Experimental.h" -#include "../AudacityApp.h" #include "../BatchCommands.h" #include "../FileNames.h" #include "../LabelTrack.h" +#include "../MissingAliasFileDialog.h" #include "../NoteTrack.h" #include "../Prefs.h" #include "../Printing.h" @@ -33,7 +33,7 @@ void DoExport Exporter e; - wxGetApp().SetMissingAliasFilesWarningShouldShow(true); + MissingAliasFilesDialog::SetShouldShow(true); double t0 = 0.0; double t1 = tracks->GetEndTime(); @@ -231,7 +231,7 @@ void OnExportSelection(const CommandContext &context) auto &selectedRegion = project.GetViewInfo().selectedRegion; Exporter e; - wxGetApp().SetMissingAliasFilesWarningShouldShow(true); + MissingAliasFilesDialog::SetShouldShow(true); e.SetFileDialogTitle( _("Export Selected Audio") ); e.Process(&project, true, selectedRegion.t0(), selectedRegion.t1()); @@ -303,7 +303,7 @@ void OnExportMultiple(const CommandContext &context) auto &project = context.project; ExportMultiple em(&project); - wxGetApp().SetMissingAliasFilesWarningShouldShow(true); + MissingAliasFilesDialog::SetShouldShow(true); em.ShowModal(); } @@ -396,7 +396,7 @@ void OnImport(const CommandContext &context) // An import trigger for the alias missing dialog might not be intuitive, but // this serves to track the file if the users zooms in and such. - wxGetApp().SetMissingAliasFilesWarningShouldShow(true); + MissingAliasFilesDialog::SetShouldShow(true); wxArrayString selectedFiles = project.ShowOpenDialog(wxT("")); if (selectedFiles.size() == 0) { diff --git a/src/menus/PluginMenus.cpp b/src/menus/PluginMenus.cpp index 37706c81a..3ac19bb54 100644 --- a/src/menus/PluginMenus.cpp +++ b/src/menus/PluginMenus.cpp @@ -1,12 +1,12 @@ #include "../Audacity.h" #include "../Experimental.h" -#include "../AudacityApp.h" #include "../AudioIO.h" #include "../BatchProcessDialog.h" #include "../Benchmark.h" #include "../FreqWindow.h" #include "../Menus.h" +#include "../MissingAliasFileDialog.h" #include "../PluginManager.h" #include "../Prefs.h" #include "../Project.h" @@ -412,7 +412,7 @@ bool DoEffect( project.SelectAllIfNone(); } - wxGetApp().SetMissingAliasFilesWarningShouldShow(true); + MissingAliasFilesDialog::SetShouldShow(true); auto nTracksOriginally = project.GetTrackCount(); wxWindow *focus = wxWindow::FindFocus(); diff --git a/src/menus/TrackMenus.cpp b/src/menus/TrackMenus.cpp index fe2fe66af..16064833d 100644 --- a/src/menus/TrackMenus.cpp +++ b/src/menus/TrackMenus.cpp @@ -1,9 +1,9 @@ #include "../Audacity.h" #include "../Experimental.h" -#include "../AudacityApp.h" #include "../LabelTrack.h" #include "../Menus.h" +#include "../MissingAliasFileDialog.h" #include "../Mix.h" #include "../Prefs.h" @@ -43,7 +43,7 @@ void DoMixAndRender auto defaultFormat = project.GetDefaultFormat(); auto trackPanel = project.GetTrackPanel(); - wxGetApp().SetMissingAliasFilesWarningShouldShow(true); + MissingAliasFilesDialog::SetShouldShow(true); WaveTrack::Holder uNewLeft, uNewRight; ::MixAndRender( diff --git a/src/widgets/ErrorDialog.cpp b/src/widgets/ErrorDialog.cpp index 4cd4b685c..f1e844779 100644 --- a/src/widgets/ErrorDialog.cpp +++ b/src/widgets/ErrorDialog.cpp @@ -12,16 +12,12 @@ \class ErrorDialog \brief Gives an Error message with an option for help. -*//*****************************************************************//** - -\class MissingAliasFileDialog -\brief Special case of ErrorDialog for reporting missing alias files. - *//********************************************************************/ #include "../Audacity.h" #include "ErrorDialog.h" +#include #include #include #include @@ -37,43 +33,14 @@ #include "../AllThemeResources.h" #include "../ShuttleGui.h" #include "../HelpText.h" -#include "../Project.h" #include "../Prefs.h" #include "HelpSystem.h" -// special case for alias missing dialog because we keep track of if it exists. -class MissingAliasFileDialog final : public ErrorDialog -{ - public: - MissingAliasFileDialog(AudacityProject *parent, - const wxString & dlogTitle, - const wxString & message, - const wxString & helpURL, - const bool Close = true, const bool modal = true); - virtual ~MissingAliasFileDialog(); -}; - BEGIN_EVENT_TABLE(ErrorDialog, wxDialogWrapper) EVT_BUTTON( wxID_OK, ErrorDialog::OnOk) EVT_BUTTON( wxID_HELP, ErrorDialog::OnHelp) END_EVENT_TABLE() - -MissingAliasFileDialog::MissingAliasFileDialog(AudacityProject *parent, - const wxString & dlogTitle, - const wxString & message, - const wxString & helpURL, - const bool Close, const bool modal): -ErrorDialog(parent, dlogTitle, message, helpURL, Close, modal) -{ - parent->SetMissingAliasFileDialog(this); -} - -MissingAliasFileDialog::~MissingAliasFileDialog() -{ - ((AudacityProject*)GetParent())->SetMissingAliasFileDialog(NULL); -} - ErrorDialog::ErrorDialog( wxWindow *parent, const wxString & dlogTitle, @@ -202,34 +169,6 @@ void ShowModelessErrorDialog(wxWindow *parent, // but in practice Destroy() in OnOK does that } -void ShowMissingAliasFilesDialog(AudacityProject *parent, - const wxString &dlogTitle, - const wxString &message, - const wxString &helpPage, - const bool Close) -{ - wxASSERT(parent); // to justify safenew - ErrorDialog *dlog = safenew MissingAliasFileDialog(parent, dlogTitle, message, helpPage, Close, false); - // Don't center because in many cases (effect, export, etc) there will be a progress bar in the center that blocks this. - // instead put it just above or on the top of the project. - wxPoint point; - point.x = 0; - - point.y = parent ? parent->GetPosition().y - 200 : 100; - - if (point.y < 100) - point.y = 100; - dlog->SetPosition(point); - dlog->CentreOnParent(wxHORIZONTAL); - - // This needs to be modeless because user may need to - // stop playback AND read dialog's instructions. - dlog->Show(); - // ANSWER-ME: Vigilant Sentry flags this method as not deleting dlog, so a mem leak. - // PRL: answer is that the parent window guarantees destruction of the dialog - // but in practice Destroy() in OnOK does that -} - extern wxString AudacityMessageBoxCaptionStr() { return _("Message"); diff --git a/src/widgets/ErrorDialog.h b/src/widgets/ErrorDialog.h index bb7293337..445382423 100644 --- a/src/widgets/ErrorDialog.h +++ b/src/widgets/ErrorDialog.h @@ -18,6 +18,8 @@ #include // to inherit #include "wxPanelWrapper.h" // to inherit +class AliasBlockFile; + class AudacityProject; class ErrorDialog /* not final */ : public wxDialogWrapper @@ -56,13 +58,6 @@ void ShowModelessErrorDialog(wxWindow *parent, const wxString &helpPage, bool Close = true); -/// Displays a custom modeless error dialog for aliased file errors -void ShowMissingAliasFilesDialog(AudacityProject *parent, - const wxString &dlogTitle, - const wxString &message, - const wxString &helpPage, - const bool Close = true); - extern wxString AudacityMessageBoxCaptionStr(); // Do not use wxMessageBox!! Its default window title does not translate! diff --git a/win/Projects/Audacity/Audacity.vcxproj b/win/Projects/Audacity/Audacity.vcxproj index 68be730b7..9ef382d06 100755 --- a/win/Projects/Audacity/Audacity.vcxproj +++ b/win/Projects/Audacity/Audacity.vcxproj @@ -202,6 +202,7 @@ + @@ -625,6 +626,7 @@ + diff --git a/win/Projects/Audacity/Audacity.vcxproj.filters b/win/Projects/Audacity/Audacity.vcxproj.filters index 081b0a921..dd3bebc57 100755 --- a/win/Projects/Audacity/Audacity.vcxproj.filters +++ b/win/Projects/Audacity/Audacity.vcxproj.filters @@ -221,6 +221,9 @@ src + + src + src @@ -1261,6 +1264,9 @@ src + + src + src