1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-07-09 00:47:44 +02:00
audacity/src/Project.cpp
Paul Licameli ba7ebbb032 Reviewed the ODLocks removed at cbf1bb5, restored just two of them...
... as std::mutex instead.

One is the mutex for the set of all files.

Another is in Profiler.h, which is now back into CMakeLists because the header
is included in one place.  Maybe this utility will find more use again.

Restored one other but commented out, as not necessary now, but need might be
found to put it back again.

The class ODLock was a misnamed thing not specific to the on-demand manager but
used more widely as a thread synchronization utility, functioning as a mutex
object.  It was a mistake to remove all uses of it along with the rest of the
on-demand system.
2020-07-07 16:34:25 -04:00

183 lines
4.0 KiB
C++

/**********************************************************************
Audacity: A Digital Audio Editor
Project.cpp
Dominic Mazzoni
Vaughan Johnson
*//*******************************************************************/
#include "Audacity.h" // for USE_* macros
#include "Project.h"
#include "KeyboardCapture.h"
#include <wx/display.h>
#include <wx/frame.h>
wxDEFINE_EVENT(EVT_TRACK_PANEL_TIMER, wxCommandEvent);
wxDEFINE_EVENT(EVT_PROJECT_ACTIVATION, wxCommandEvent);
size_t AllProjects::size() const
{
return gAudacityProjects.size();
}
auto AllProjects::begin() const -> const_iterator
{
return gAudacityProjects.begin();
}
auto AllProjects::end() const -> const_iterator
{
return gAudacityProjects.end();
}
auto AllProjects::rbegin() const -> const_reverse_iterator
{
return gAudacityProjects.rbegin();
}
auto AllProjects::rend() const -> const_reverse_iterator
{
return gAudacityProjects.rend();
}
auto AllProjects::Remove( AudacityProject &project ) -> value_type
{
std::lock_guard<std::mutex> guard{ Mutex() };
auto start = begin(), finish = end(), iter = std::find_if(
start, finish,
[&]( const value_type &ptr ){ return ptr.get() == &project; }
);
if (iter == finish)
return nullptr;
auto result = *iter;
gAudacityProjects.erase( iter );
return result;
}
void AllProjects::Add( const value_type &pProject )
{
std::lock_guard<std::mutex> guard{ Mutex() };
gAudacityProjects.push_back( pProject );
}
bool AllProjects::sbClosing = false;
bool AllProjects::Close( bool force )
{
ValueRestorer<bool> cleanup{ sbClosing, true };
while (AllProjects{}.size())
{
// Closing the project has global side-effect
// of deletion from gAudacityProjects
if ( force )
{
GetProjectFrame( **AllProjects{}.begin() ).Close(true);
}
else
{
if (! GetProjectFrame( **AllProjects{}.begin() ).Close())
return false;
}
}
return true;
}
std::mutex &AllProjects::Mutex()
{
static std::mutex theMutex;
return theMutex;
}
int AudacityProject::mProjectCounter=0;// global counter.
/* Define Global Variables */
//This is a pointer to the currently-active project.
static AudacityProject *gActiveProject;
//This array holds onto all of the projects currently open
AllProjects::Container AllProjects::gAudacityProjects;
AUDACITY_DLL_API AudacityProject *GetActiveProject()
{
return gActiveProject;
}
void SetActiveProject(AudacityProject * project)
{
if ( gActiveProject != project ) {
gActiveProject = project;
KeyboardCapture::Capture( nullptr );
wxTheApp->QueueEvent( safenew wxCommandEvent{ EVT_PROJECT_ACTIVATION } );
}
wxTheApp->SetTopWindow( FindProjectFrame( project ) );
}
AudacityProject::AudacityProject()
{
mProjectNo = mProjectCounter++; // Bug 322
AttachedObjects::BuildAll();
// But not for the attached windows. They get built only on demand, such as
// from menu items.
}
AudacityProject::~AudacityProject()
{
}
void AudacityProject::SetFrame( wxFrame *pFrame )
{
mFrame = pFrame;
}
void AudacityProject::SetPanel( wxWindow *pPanel )
{
mPanel = pPanel;
}
const wxString &AudacityProject::GetProjectName() const
{
return mName;
}
void AudacityProject::SetProjectName(const wxString &name)
{
mName = name;
}
AUDACITY_DLL_API wxFrame &GetProjectFrame( AudacityProject &project )
{
auto ptr = project.GetFrame();
if ( !ptr )
THROW_INCONSISTENCY_EXCEPTION;
return *ptr;
}
AUDACITY_DLL_API const wxFrame &GetProjectFrame( const AudacityProject &project )
{
auto ptr = project.GetFrame();
if ( !ptr )
THROW_INCONSISTENCY_EXCEPTION;
return *ptr;
}
AUDACITY_DLL_API wxWindow &GetProjectPanel( AudacityProject &project )
{
auto ptr = project.GetPanel();
if ( !ptr )
THROW_INCONSISTENCY_EXCEPTION;
return *ptr;
}
AUDACITY_DLL_API const wxWindow &GetProjectPanel(
const AudacityProject &project )
{
auto ptr = project.GetPanel();
if ( !ptr )
THROW_INCONSISTENCY_EXCEPTION;
return *ptr;
}