Cog/Frameworks/OpenMPT/OpenMPT/soundlib/AudioCriticalSection.h
Christopher Snowhill 731e52c440 Build libOpenMPT from source once again
Bundle libOpenMPT as a dynamic framework, which should be safe once
again, now that there is only one version to bundle. Also, now it is
using the versions of libvorbisfile and libmpg123 that are bundled with
the player, instead of compiling minimp3 and stbvorbis.

Signed-off-by: Christopher Snowhill <kode54@gmail.com>
2022-06-30 22:57:30 -07:00

100 lines
2 KiB
C++

/*
* AudioCriticalSection.h
* ---------
* 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.
*/
#pragma once
#include "openmpt/all/BuildSettings.hpp"
#if defined(MODPLUG_TRACKER)
#include "../misc/mptMutex.h"
#endif
OPENMPT_NAMESPACE_BEGIN
#if defined(MODPLUG_TRACKER)
namespace mpt {
class recursive_mutex_with_lock_count;
} // namespace mpt
namespace Tracker { // implemented in mptrack/Mptrack.cpp
mpt::recursive_mutex_with_lock_count & GetGlobalMutexRef();
} // namespace Tracker
// Critical section handling done in (safe) RAII style.
// Create a CriticalSection object whenever you need exclusive access to CSoundFile.
// One object = one lock / critical section.
// The critical section is automatically left when the object is destroyed, but
// Enter() and Leave() can also be called manually if needed.
class CriticalSection
{
private:
mpt::recursive_mutex_with_lock_count & m_refGlobalMutex;
protected:
bool inSection;
public:
enum class InitialState
{
Locked = 0,
Unlocked = 1,
};
public:
#if MPT_COMPILER_MSVC
_Acquires_lock_(m_refGlobalMutex.mutex)
#endif // MPT_COMPILER_MSVC
CriticalSection();
CriticalSection(CriticalSection &&other) noexcept;
explicit CriticalSection(InitialState state);
#if MPT_COMPILER_MSVC
_Acquires_lock_(m_refGlobalMutex.mutex)
#endif // MPT_COMPILER_MSVC
void Enter();
#if MPT_COMPILER_MSVC
_Requires_lock_held_(m_refGlobalMutex.mutex) _Releases_lock_(m_refGlobalMutex.mutex)
#endif // MPT_COMPILER_MSVC
void Leave();
~CriticalSection();
};
#else // !MODPLUG_TRACKER
class CriticalSection
{
public:
enum class InitialState
{
Locked = 0,
Unlocked = 1,
};
public:
CriticalSection() {}
CriticalSection(CriticalSection &&) noexcept {}
explicit CriticalSection(InitialState) {}
void Enter() {}
void Leave() {}
~CriticalSection() {}
};
#endif // MODPLUG_TRACKER
OPENMPT_NAMESPACE_END