Convert the WASAPI backend factory
This commit is contained in:
@@ -62,6 +62,9 @@
|
||||
#ifdef HAVE_PULSEAUDIO
|
||||
#include "backends/pulseaudio.h"
|
||||
#endif
|
||||
#ifdef HAVE_WASAPI
|
||||
#include "backends/wasapi.h"
|
||||
#endif
|
||||
|
||||
|
||||
namespace {
|
||||
@@ -78,6 +81,9 @@ struct BackendInfo BackendList[] = {
|
||||
#ifdef HAVE_PULSEAUDIO
|
||||
{ "pulse", PulseBackendFactory::getFactory },
|
||||
#endif
|
||||
#ifdef HAVE_WASAPI
|
||||
{ "wasapi", WasapiBackendFactory::getFactory },
|
||||
#endif
|
||||
#if 0
|
||||
{ "jack", ALCjackBackendFactory_getFactory },
|
||||
{ "pulse", ALCpulseBackendFactory_getFactory },
|
||||
|
||||
@@ -140,7 +140,6 @@ static const struct ALCbackendFactoryVtable T##_ALCbackendFactory_vtable = { \
|
||||
}
|
||||
|
||||
|
||||
ALCbackendFactory *ALCpulseBackendFactory_getFactory(void);
|
||||
ALCbackendFactory *ALCalsaBackendFactory_getFactory(void);
|
||||
ALCbackendFactory *ALCcoreAudioBackendFactory_getFactory(void);
|
||||
ALCbackendFactory *ALCossBackendFactory_getFactory(void);
|
||||
@@ -148,7 +147,6 @@ ALCbackendFactory *ALCjackBackendFactory_getFactory(void);
|
||||
ALCbackendFactory *ALCsolarisBackendFactory_getFactory(void);
|
||||
ALCbackendFactory *SndioBackendFactory_getFactory(void);
|
||||
ALCbackendFactory *ALCqsaBackendFactory_getFactory(void);
|
||||
ALCbackendFactory *ALCwasapiBackendFactory_getFactory(void);
|
||||
ALCbackendFactory *ALCdsoundBackendFactory_getFactory(void);
|
||||
ALCbackendFactory *ALCwinmmBackendFactory_getFactory(void);
|
||||
ALCbackendFactory *ALCportBackendFactory_getFactory(void);
|
||||
|
||||
+53
-77
@@ -20,6 +20,8 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "backends/wasapi.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <memory.h>
|
||||
@@ -50,8 +52,6 @@
|
||||
#include "compat.h"
|
||||
#include "converter.h"
|
||||
|
||||
#include "backends/base.h"
|
||||
|
||||
|
||||
/* Some headers seem to define these as macros for __uuidof, which is annoying
|
||||
* since some headers don't declare them at all. Hopefully the ifdef is enough
|
||||
@@ -153,7 +153,7 @@ struct ThreadRequest {
|
||||
#define WM_USER_Enumerate (WM_USER+5)
|
||||
#define WM_USER_Last (WM_USER+5)
|
||||
|
||||
static const char MessageStr[WM_USER_Last+1-WM_USER][20] = {
|
||||
constexpr char MessageStr[WM_USER_Last+1-WM_USER][20] = {
|
||||
"Open Device",
|
||||
"Reset Device",
|
||||
"Start Device",
|
||||
@@ -489,8 +489,6 @@ DWORD CALLBACK WasapiProxy_messageHandler(void *ptr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
|
||||
struct ALCwasapiPlayback final : public ALCbackend, WasapiProxy {
|
||||
HRESULT openProxy() override;
|
||||
@@ -515,32 +513,32 @@ struct ALCwasapiPlayback final : public ALCbackend, WasapiProxy {
|
||||
std::thread mThread;
|
||||
};
|
||||
|
||||
static int ALCwasapiPlayback_mixerProc(ALCwasapiPlayback *self);
|
||||
int ALCwasapiPlayback_mixerProc(ALCwasapiPlayback *self);
|
||||
|
||||
static void ALCwasapiPlayback_Construct(ALCwasapiPlayback *self, ALCdevice *device);
|
||||
static void ALCwasapiPlayback_Destruct(ALCwasapiPlayback *self);
|
||||
static ALCenum ALCwasapiPlayback_open(ALCwasapiPlayback *self, const ALCchar *name);
|
||||
static ALCboolean ALCwasapiPlayback_reset(ALCwasapiPlayback *self);
|
||||
static ALCboolean ALCwasapiPlayback_start(ALCwasapiPlayback *self);
|
||||
static void ALCwasapiPlayback_stop(ALCwasapiPlayback *self);
|
||||
static DECLARE_FORWARD2(ALCwasapiPlayback, ALCbackend, ALCenum, captureSamples, ALCvoid*, ALCuint)
|
||||
static DECLARE_FORWARD(ALCwasapiPlayback, ALCbackend, ALCuint, availableSamples)
|
||||
static ClockLatency ALCwasapiPlayback_getClockLatency(ALCwasapiPlayback *self);
|
||||
static DECLARE_FORWARD(ALCwasapiPlayback, ALCbackend, void, lock)
|
||||
static DECLARE_FORWARD(ALCwasapiPlayback, ALCbackend, void, unlock)
|
||||
void ALCwasapiPlayback_Construct(ALCwasapiPlayback *self, ALCdevice *device);
|
||||
void ALCwasapiPlayback_Destruct(ALCwasapiPlayback *self);
|
||||
ALCenum ALCwasapiPlayback_open(ALCwasapiPlayback *self, const ALCchar *name);
|
||||
ALCboolean ALCwasapiPlayback_reset(ALCwasapiPlayback *self);
|
||||
ALCboolean ALCwasapiPlayback_start(ALCwasapiPlayback *self);
|
||||
void ALCwasapiPlayback_stop(ALCwasapiPlayback *self);
|
||||
DECLARE_FORWARD2(ALCwasapiPlayback, ALCbackend, ALCenum, captureSamples, ALCvoid*, ALCuint)
|
||||
DECLARE_FORWARD(ALCwasapiPlayback, ALCbackend, ALCuint, availableSamples)
|
||||
ClockLatency ALCwasapiPlayback_getClockLatency(ALCwasapiPlayback *self);
|
||||
DECLARE_FORWARD(ALCwasapiPlayback, ALCbackend, void, lock)
|
||||
DECLARE_FORWARD(ALCwasapiPlayback, ALCbackend, void, unlock)
|
||||
DECLARE_DEFAULT_ALLOCATORS(ALCwasapiPlayback)
|
||||
|
||||
DEFINE_ALCBACKEND_VTABLE(ALCwasapiPlayback);
|
||||
|
||||
|
||||
static void ALCwasapiPlayback_Construct(ALCwasapiPlayback *self, ALCdevice *device)
|
||||
void ALCwasapiPlayback_Construct(ALCwasapiPlayback *self, ALCdevice *device)
|
||||
{
|
||||
new (self) ALCwasapiPlayback{};
|
||||
SET_VTABLE2(ALCwasapiPlayback, ALCbackend, self);
|
||||
ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device);
|
||||
}
|
||||
|
||||
static void ALCwasapiPlayback_Destruct(ALCwasapiPlayback *self)
|
||||
void ALCwasapiPlayback_Destruct(ALCwasapiPlayback *self)
|
||||
{
|
||||
if(self->mMsgEvent)
|
||||
{
|
||||
@@ -565,7 +563,7 @@ static void ALCwasapiPlayback_Destruct(ALCwasapiPlayback *self)
|
||||
}
|
||||
|
||||
|
||||
FORCE_ALIGN static int ALCwasapiPlayback_mixerProc(ALCwasapiPlayback *self)
|
||||
FORCE_ALIGN int ALCwasapiPlayback_mixerProc(ALCwasapiPlayback *self)
|
||||
{
|
||||
ALCdevice *device{STATIC_CAST(ALCbackend, self)->mDevice};
|
||||
IAudioClient *client{self->mClient};
|
||||
@@ -637,7 +635,7 @@ FORCE_ALIGN static int ALCwasapiPlayback_mixerProc(ALCwasapiPlayback *self)
|
||||
}
|
||||
|
||||
|
||||
static ALCboolean MakeExtensible(WAVEFORMATEXTENSIBLE *out, const WAVEFORMATEX *in)
|
||||
ALCboolean MakeExtensible(WAVEFORMATEXTENSIBLE *out, const WAVEFORMATEX *in)
|
||||
{
|
||||
memset(out, 0, sizeof(*out));
|
||||
if(in->wFormatTag == WAVE_FORMAT_EXTENSIBLE)
|
||||
@@ -676,7 +674,7 @@ static ALCboolean MakeExtensible(WAVEFORMATEXTENSIBLE *out, const WAVEFORMATEX *
|
||||
return ALC_TRUE;
|
||||
}
|
||||
|
||||
static ALCenum ALCwasapiPlayback_open(ALCwasapiPlayback *self, const ALCchar *deviceName)
|
||||
ALCenum ALCwasapiPlayback_open(ALCwasapiPlayback *self, const ALCchar *deviceName)
|
||||
{
|
||||
HRESULT hr = S_OK;
|
||||
|
||||
@@ -805,7 +803,7 @@ void ALCwasapiPlayback::closeProxy()
|
||||
}
|
||||
|
||||
|
||||
static ALCboolean ALCwasapiPlayback_reset(ALCwasapiPlayback *self)
|
||||
ALCboolean ALCwasapiPlayback_reset(ALCwasapiPlayback *self)
|
||||
{
|
||||
ThreadRequest req{ self->mMsgEvent, 0 };
|
||||
HRESULT hr{E_FAIL};
|
||||
@@ -1076,7 +1074,7 @@ HRESULT ALCwasapiPlayback::resetProxy()
|
||||
}
|
||||
|
||||
|
||||
static ALCboolean ALCwasapiPlayback_start(ALCwasapiPlayback *self)
|
||||
ALCboolean ALCwasapiPlayback_start(ALCwasapiPlayback *self)
|
||||
{
|
||||
ThreadRequest req{ self->mMsgEvent, 0 };
|
||||
HRESULT hr{E_FAIL};
|
||||
@@ -1123,7 +1121,7 @@ HRESULT ALCwasapiPlayback::startProxy()
|
||||
}
|
||||
|
||||
|
||||
static void ALCwasapiPlayback_stop(ALCwasapiPlayback *self)
|
||||
void ALCwasapiPlayback_stop(ALCwasapiPlayback *self)
|
||||
{
|
||||
ThreadRequest req{ self->mMsgEvent, 0 };
|
||||
auto proxy = static_cast<WasapiProxy*>(self);
|
||||
@@ -1145,7 +1143,7 @@ void ALCwasapiPlayback::stopProxy()
|
||||
}
|
||||
|
||||
|
||||
static ClockLatency ALCwasapiPlayback_getClockLatency(ALCwasapiPlayback *self)
|
||||
ClockLatency ALCwasapiPlayback_getClockLatency(ALCwasapiPlayback *self)
|
||||
{
|
||||
ClockLatency ret;
|
||||
|
||||
@@ -1185,32 +1183,32 @@ struct ALCwasapiCapture final : public ALCbackend, WasapiProxy {
|
||||
std::thread mThread;
|
||||
};
|
||||
|
||||
static int ALCwasapiCapture_recordProc(ALCwasapiCapture *self);
|
||||
int ALCwasapiCapture_recordProc(ALCwasapiCapture *self);
|
||||
|
||||
static void ALCwasapiCapture_Construct(ALCwasapiCapture *self, ALCdevice *device);
|
||||
static void ALCwasapiCapture_Destruct(ALCwasapiCapture *self);
|
||||
static ALCenum ALCwasapiCapture_open(ALCwasapiCapture *self, const ALCchar *name);
|
||||
static DECLARE_FORWARD(ALCwasapiCapture, ALCbackend, ALCboolean, reset)
|
||||
static ALCboolean ALCwasapiCapture_start(ALCwasapiCapture *self);
|
||||
static void ALCwasapiCapture_stop(ALCwasapiCapture *self);
|
||||
static ALCenum ALCwasapiCapture_captureSamples(ALCwasapiCapture *self, ALCvoid *buffer, ALCuint samples);
|
||||
static ALuint ALCwasapiCapture_availableSamples(ALCwasapiCapture *self);
|
||||
static DECLARE_FORWARD(ALCwasapiCapture, ALCbackend, ClockLatency, getClockLatency)
|
||||
static DECLARE_FORWARD(ALCwasapiCapture, ALCbackend, void, lock)
|
||||
static DECLARE_FORWARD(ALCwasapiCapture, ALCbackend, void, unlock)
|
||||
void ALCwasapiCapture_Construct(ALCwasapiCapture *self, ALCdevice *device);
|
||||
void ALCwasapiCapture_Destruct(ALCwasapiCapture *self);
|
||||
ALCenum ALCwasapiCapture_open(ALCwasapiCapture *self, const ALCchar *name);
|
||||
DECLARE_FORWARD(ALCwasapiCapture, ALCbackend, ALCboolean, reset)
|
||||
ALCboolean ALCwasapiCapture_start(ALCwasapiCapture *self);
|
||||
void ALCwasapiCapture_stop(ALCwasapiCapture *self);
|
||||
ALCenum ALCwasapiCapture_captureSamples(ALCwasapiCapture *self, ALCvoid *buffer, ALCuint samples);
|
||||
ALuint ALCwasapiCapture_availableSamples(ALCwasapiCapture *self);
|
||||
DECLARE_FORWARD(ALCwasapiCapture, ALCbackend, ClockLatency, getClockLatency)
|
||||
DECLARE_FORWARD(ALCwasapiCapture, ALCbackend, void, lock)
|
||||
DECLARE_FORWARD(ALCwasapiCapture, ALCbackend, void, unlock)
|
||||
DECLARE_DEFAULT_ALLOCATORS(ALCwasapiCapture)
|
||||
|
||||
DEFINE_ALCBACKEND_VTABLE(ALCwasapiCapture);
|
||||
|
||||
|
||||
static void ALCwasapiCapture_Construct(ALCwasapiCapture *self, ALCdevice *device)
|
||||
void ALCwasapiCapture_Construct(ALCwasapiCapture *self, ALCdevice *device)
|
||||
{
|
||||
new (self) ALCwasapiCapture{};
|
||||
SET_VTABLE2(ALCwasapiCapture, ALCbackend, self);
|
||||
ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device);
|
||||
}
|
||||
|
||||
static void ALCwasapiCapture_Destruct(ALCwasapiCapture *self)
|
||||
void ALCwasapiCapture_Destruct(ALCwasapiCapture *self)
|
||||
{
|
||||
if(self->mMsgEvent)
|
||||
{
|
||||
@@ -1343,7 +1341,7 @@ FORCE_ALIGN int ALCwasapiCapture_recordProc(ALCwasapiCapture *self)
|
||||
}
|
||||
|
||||
|
||||
static ALCenum ALCwasapiCapture_open(ALCwasapiCapture *self, const ALCchar *deviceName)
|
||||
ALCenum ALCwasapiCapture_open(ALCwasapiCapture *self, const ALCchar *deviceName)
|
||||
{
|
||||
HRESULT hr{S_OK};
|
||||
|
||||
@@ -1730,7 +1728,7 @@ HRESULT ALCwasapiCapture::resetProxy()
|
||||
}
|
||||
|
||||
|
||||
static ALCboolean ALCwasapiCapture_start(ALCwasapiCapture *self)
|
||||
ALCboolean ALCwasapiCapture_start(ALCwasapiCapture *self)
|
||||
{
|
||||
ThreadRequest req{ self->mMsgEvent, 0 };
|
||||
HRESULT hr{E_FAIL};
|
||||
@@ -1780,7 +1778,7 @@ HRESULT ALCwasapiCapture::startProxy()
|
||||
}
|
||||
|
||||
|
||||
static void ALCwasapiCapture_stop(ALCwasapiCapture *self)
|
||||
void ALCwasapiCapture_stop(ALCwasapiCapture *self)
|
||||
{
|
||||
ThreadRequest req{ self->mMsgEvent, 0 };
|
||||
auto proxy = static_cast<WasapiProxy*>(self);
|
||||
@@ -1803,12 +1801,12 @@ void ALCwasapiCapture::stopProxy()
|
||||
}
|
||||
|
||||
|
||||
static ALuint ALCwasapiCapture_availableSamples(ALCwasapiCapture *self)
|
||||
ALuint ALCwasapiCapture_availableSamples(ALCwasapiCapture *self)
|
||||
{
|
||||
return (ALuint)ll_ringbuffer_read_space(self->mRing);
|
||||
}
|
||||
|
||||
static ALCenum ALCwasapiCapture_captureSamples(ALCwasapiCapture *self, ALCvoid *buffer, ALCuint samples)
|
||||
ALCenum ALCwasapiCapture_captureSamples(ALCwasapiCapture *self, ALCvoid *buffer, ALCuint samples)
|
||||
{
|
||||
if(ALCwasapiCapture_availableSamples(self) < samples)
|
||||
return ALC_INVALID_VALUE;
|
||||
@@ -1816,27 +1814,10 @@ static ALCenum ALCwasapiCapture_captureSamples(ALCwasapiCapture *self, ALCvoid *
|
||||
return ALC_NO_ERROR;
|
||||
}
|
||||
|
||||
|
||||
struct ALCwasapiBackendFactory final : public ALCbackendFactory {
|
||||
ALCwasapiBackendFactory() noexcept;
|
||||
};
|
||||
#define ALCWASAPIBACKENDFACTORY_INITIALIZER GET_VTABLE2(ALCwasapiBackendFactory, ALCbackendFactory)
|
||||
|
||||
static ALCboolean ALCwasapiBackendFactory_init(ALCwasapiBackendFactory *self);
|
||||
static void ALCwasapiBackendFactory_deinit(ALCwasapiBackendFactory *self);
|
||||
static ALCboolean ALCwasapiBackendFactory_querySupport(ALCwasapiBackendFactory *self, ALCbackend_Type type);
|
||||
static void ALCwasapiBackendFactory_probe(ALCwasapiBackendFactory *self, enum DevProbe type, std::string *outnames);
|
||||
static ALCbackend* ALCwasapiBackendFactory_createBackend(ALCwasapiBackendFactory *self, ALCdevice *device, ALCbackend_Type type);
|
||||
|
||||
DEFINE_ALCBACKENDFACTORY_VTABLE(ALCwasapiBackendFactory);
|
||||
|
||||
ALCwasapiBackendFactory::ALCwasapiBackendFactory() noexcept
|
||||
: ALCbackendFactory{ALCWASAPIBACKENDFACTORY_INITIALIZER}
|
||||
{
|
||||
}
|
||||
} // namespace
|
||||
|
||||
|
||||
static ALCboolean ALCwasapiBackendFactory_init(ALCwasapiBackendFactory* UNUSED(self))
|
||||
bool WasapiBackendFactory::init()
|
||||
{
|
||||
static HRESULT InitResult;
|
||||
|
||||
@@ -1860,7 +1841,7 @@ static ALCboolean ALCwasapiBackendFactory_init(ALCwasapiBackendFactory* UNUSED(s
|
||||
return SUCCEEDED(InitResult) ? ALC_TRUE : ALC_FALSE;
|
||||
}
|
||||
|
||||
static void ALCwasapiBackendFactory_deinit(ALCwasapiBackendFactory* UNUSED(self))
|
||||
void WasapiBackendFactory::deinit()
|
||||
{
|
||||
PlaybackDevices.clear();
|
||||
CaptureDevices.clear();
|
||||
@@ -1874,14 +1855,10 @@ static void ALCwasapiBackendFactory_deinit(ALCwasapiBackendFactory* UNUSED(self)
|
||||
}
|
||||
}
|
||||
|
||||
static ALCboolean ALCwasapiBackendFactory_querySupport(ALCwasapiBackendFactory* UNUSED(self), ALCbackend_Type type)
|
||||
{
|
||||
if(type == ALCbackend_Playback || type == ALCbackend_Capture)
|
||||
return ALC_TRUE;
|
||||
return ALC_FALSE;
|
||||
}
|
||||
bool WasapiBackendFactory::querySupport(ALCbackend_Type type)
|
||||
{ return (type == ALCbackend_Playback || type == ALCbackend_Capture); }
|
||||
|
||||
static void ALCwasapiBackendFactory_probe(ALCwasapiBackendFactory* UNUSED(self), enum DevProbe type, std::string *outnames)
|
||||
void WasapiBackendFactory::probe(enum DevProbe type, std::string *outnames)
|
||||
{
|
||||
ThreadRequest req{ nullptr, 0 };
|
||||
|
||||
@@ -1915,7 +1892,7 @@ static void ALCwasapiBackendFactory_probe(ALCwasapiBackendFactory* UNUSED(self),
|
||||
}
|
||||
}
|
||||
|
||||
static ALCbackend* ALCwasapiBackendFactory_createBackend(ALCwasapiBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type)
|
||||
ALCbackend *WasapiBackendFactory::createBackend(ALCdevice *device, ALCbackend_Type type)
|
||||
{
|
||||
if(type == ALCbackend_Playback)
|
||||
{
|
||||
@@ -1935,9 +1912,8 @@ static ALCbackend* ALCwasapiBackendFactory_createBackend(ALCwasapiBackendFactory
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
ALCbackendFactory *ALCwasapiBackendFactory_getFactory(void)
|
||||
BackendFactory &WasapiBackendFactory::getFactory()
|
||||
{
|
||||
static ALCwasapiBackendFactory factory{};
|
||||
return STATIC_CAST(ALCbackendFactory, &factory);
|
||||
static WasapiBackendFactory factory{};
|
||||
return factory;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
#ifndef BACKENDS_WASAPI_H
|
||||
#define BACKENDS_WASAPI_H
|
||||
|
||||
#include "backends/base.h"
|
||||
|
||||
struct WasapiBackendFactory final : public BackendFactory {
|
||||
public:
|
||||
bool init() override;
|
||||
void deinit() override;
|
||||
|
||||
bool querySupport(ALCbackend_Type type) override;
|
||||
|
||||
void probe(enum DevProbe type, std::string *outnames) override;
|
||||
|
||||
ALCbackend *createBackend(ALCdevice *device, ALCbackend_Type type) override;
|
||||
|
||||
static BackendFactory &getFactory();
|
||||
};
|
||||
|
||||
#endif /* BACKENDS_WASAPI_H */
|
||||
+1
-1
@@ -1125,7 +1125,7 @@ IF(HAVE_WINDOWS_H)
|
||||
IF(ALSOFT_BACKEND_WASAPI)
|
||||
SET(HAVE_WASAPI 1)
|
||||
SET(BACKENDS "${BACKENDS} WASAPI,")
|
||||
SET(ALC_OBJS ${ALC_OBJS} Alc/backends/wasapi.cpp)
|
||||
SET(ALC_OBJS ${ALC_OBJS} Alc/backends/wasapi.cpp Alc/backends/wasapi.h)
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user