diff options
Diffstat (limited to 'alc/backends/base.cpp')
-rw-r--r-- | alc/backends/base.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/alc/backends/base.cpp b/alc/backends/base.cpp new file mode 100644 index 00000000..a7d47c6d --- /dev/null +++ b/alc/backends/base.cpp @@ -0,0 +1,58 @@ + +#include "config.h" + +#include <cstdlib> + +#include <thread> + +#include "alcmain.h" +#include "alu.h" + +#include "backends/base.h" + + +ClockLatency GetClockLatency(ALCdevice *device) +{ + BackendBase *backend{device->Backend.get()}; + ClockLatency ret{backend->getClockLatency()}; + ret.Latency += device->FixedLatency; + return ret; +} + + +/* BackendBase method implementations. */ +BackendBase::BackendBase(ALCdevice *device) noexcept : mDevice{device} +{ } + +BackendBase::~BackendBase() = default; + +ALCboolean BackendBase::reset() +{ return ALC_FALSE; } + +ALCenum BackendBase::captureSamples(void*, ALCuint) +{ return ALC_INVALID_DEVICE; } + +ALCuint BackendBase::availableSamples() +{ return 0; } + +ClockLatency BackendBase::getClockLatency() +{ + ClockLatency ret; + + ALuint refcount; + do { + while(((refcount=mDevice->MixCount.load(std::memory_order_acquire))&1)) + std::this_thread::yield(); + ret.ClockTime = GetDeviceClockTime(mDevice); + std::atomic_thread_fence(std::memory_order_acquire); + } while(refcount != mDevice->MixCount.load(std::memory_order_relaxed)); + + /* NOTE: The device will generally have about all but one periods filled at + * any given time during playback. Without a more accurate measurement from + * the output, this is an okay approximation. + */ + ret.Latency = std::chrono::seconds{maxi(mDevice->BufferSize-mDevice->UpdateSize, 0)}; + ret.Latency /= mDevice->Frequency; + + return ret; +} |