75 lines
1.2 KiB
C++
75 lines
1.2 KiB
C++
/*
|
|
* AudioCriticalSection.cpp
|
|
* -----------
|
|
* Purpose: Implementation of OpenMPT's critical section for access to CSoundFile.
|
|
* Notes : (currently none)
|
|
* Authors: OpenMPT Devs
|
|
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
|
|
*/
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "AudioCriticalSection.h"
|
|
|
|
#if defined(MODPLUG_TRACKER)
|
|
#include "../common/mptMutex.h"
|
|
#endif
|
|
|
|
OPENMPT_NAMESPACE_BEGIN
|
|
|
|
#if defined(MODPLUG_TRACKER)
|
|
|
|
CriticalSection::CriticalSection()
|
|
: m_refGlobalMutex(Tracker::GetGlobalMutexRef())
|
|
, inSection(false)
|
|
{
|
|
Enter();
|
|
}
|
|
|
|
CriticalSection::CriticalSection(CriticalSection &&other) noexcept
|
|
: m_refGlobalMutex(other.m_refGlobalMutex)
|
|
, inSection(other.inSection)
|
|
{
|
|
other.inSection = false;
|
|
}
|
|
|
|
CriticalSection::CriticalSection(InitialState state)
|
|
: m_refGlobalMutex(Tracker::GetGlobalMutexRef())
|
|
, inSection(false)
|
|
{
|
|
if(state == InitialLocked)
|
|
{
|
|
Enter();
|
|
}
|
|
}
|
|
|
|
void CriticalSection::Enter()
|
|
{
|
|
if(!inSection)
|
|
{
|
|
inSection = true;
|
|
m_refGlobalMutex.lock();
|
|
}
|
|
}
|
|
|
|
void CriticalSection::Leave()
|
|
{
|
|
if(inSection)
|
|
{
|
|
inSection = false;
|
|
m_refGlobalMutex.unlock();
|
|
}
|
|
}
|
|
CriticalSection::~CriticalSection()
|
|
{
|
|
Leave();
|
|
}
|
|
|
|
#else
|
|
|
|
MPT_MSVC_WORKAROUND_LNK4221(AudioCriticalSection)
|
|
|
|
#endif
|
|
|
|
OPENMPT_NAMESPACE_END
|