Chris Robinson 61f7e7716c Remove the backend factory deinit method
It was never actually called anywhere, and there's no safe place where it can
be called. It's probably better to let the individual backends worry about
cleaning themselves up anyway.
2019-04-14 04:05:07 -07:00

79 lines
1.8 KiB
C++

#ifndef ALC_BACKENDS_BASE_H
#define ALC_BACKENDS_BASE_H
#include <memory>
#include <chrono>
#include <string>
#include <mutex>
#include "alMain.h"
struct ClockLatency {
std::chrono::nanoseconds ClockTime;
std::chrono::nanoseconds Latency;
};
/* Helper to get the current clock time from the device's ClockBase, and
* SamplesDone converted from the sample rate.
*/
inline std::chrono::nanoseconds GetDeviceClockTime(ALCdevice *device)
{
using std::chrono::seconds;
using std::chrono::nanoseconds;
auto ns = nanoseconds{seconds{device->SamplesDone}} / device->Frequency;
return device->ClockBase + ns;
}
ClockLatency GetClockLatency(ALCdevice *device);
struct BackendBase {
virtual ALCenum open(const ALCchar *name) = 0;
virtual ALCboolean reset();
virtual ALCboolean start() = 0;
virtual void stop() = 0;
virtual ALCenum captureSamples(void *buffer, ALCuint samples);
virtual ALCuint availableSamples();
virtual ClockLatency getClockLatency();
virtual void lock() { mMutex.lock(); }
virtual void unlock() { mMutex.unlock(); }
ALCdevice *mDevice;
std::recursive_mutex mMutex;
BackendBase(ALCdevice *device) noexcept;
virtual ~BackendBase();
};
using BackendPtr = std::unique_ptr<BackendBase>;
using BackendUniqueLock = std::unique_lock<BackendBase>;
using BackendLockGuard = std::lock_guard<BackendBase>;
enum class BackendType {
Playback,
Capture
};
enum class DevProbe {
Playback,
Capture
};
struct BackendFactory {
virtual bool init() = 0;
virtual bool querySupport(BackendType type) = 0;
virtual void probe(DevProbe type, std::string *outnames) = 0;
virtual BackendPtr createBackend(ALCdevice *device, BackendType type) = 0;
};
#endif /* ALC_BACKENDS_BASE_H */