Convert the JACK backend factory

This commit is contained in:
Chris Robinson
2018-11-15 22:03:20 -08:00
parent d4928d4e7d
commit 2a839e5762
4 changed files with 46 additions and 38 deletions
+7 -4
View File
@@ -59,6 +59,9 @@
#include "backends/base.h"
#include "backends/null.h"
#include "backends/loopback.h"
#ifdef HAVE_JACK
#include "backends/jack.h"
#endif
#ifdef HAVE_PULSEAUDIO
#include "backends/pulseaudio.h"
#endif
@@ -90,6 +93,9 @@ struct BackendInfo {
};
struct BackendInfo BackendList[] = {
#ifdef HAVE_JACK
{ "jack", JackBackendFactory::getFactory },
#endif
#ifdef HAVE_PULSEAUDIO
{ "pulse", PulseBackendFactory::getFactory },
#endif
@@ -105,11 +111,8 @@ struct BackendInfo BackendList[] = {
#ifdef HAVE_OPENSL
{ "opensl", OSLBackendFactory::getFactory },
#endif
#if 0
{ "jack", ALCjackBackendFactory_getFactory },
{ "pulse", ALCpulseBackendFactory_getFactory },
{ "alsa", ALCalsaBackendFactory_getFactory },
{ "core", ALCcoreAudioBackendFactory_getFactory },
{ "solaris", ALCsolarisBackendFactory_getFactory },
{ "sndio", SndioBackendFactory_getFactory },
{ "oss", ALCossBackendFactory_getFactory },
+18 -33
View File
@@ -20,6 +20,8 @@
#include "config.h"
#include "backends/jack.h"
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
@@ -31,8 +33,6 @@
#include "threads.h"
#include "compat.h"
#include "backends/base.h"
#include <jack/jack.h>
#include <jack/ringbuffer.h>
@@ -520,18 +520,14 @@ static void jack_msg_handler(const char *message)
WARN("%s\n", message);
}
struct ALCjackBackendFactory final : public ALCbackendFactory {
ALCjackBackendFactory() noexcept;
};
static ALCboolean ALCjackBackendFactory_init(ALCjackBackendFactory* UNUSED(self))
bool JackBackendFactory::init()
{
void (*old_error_cb)(const char*);
jack_client_t *client;
jack_status_t status;
if(!jack_load())
return ALC_FALSE;
return false;
if(!GetConfigValueBool(NULL, "jack", "spawn-server", 0))
ClientOptions = static_cast<jack_options_t>(ClientOptions | JackNoStartServer);
@@ -540,35 +536,31 @@ static ALCboolean ALCjackBackendFactory_init(ALCjackBackendFactory* UNUSED(self)
jack_set_error_function(jack_msg_handler);
client = jack_client_open("alsoft", ClientOptions, &status, NULL);
jack_set_error_function(old_error_cb);
if(client == NULL)
if(!client)
{
WARN("jack_client_open() failed, 0x%02x\n", status);
if((status&JackServerFailed) && !(ClientOptions&JackNoStartServer))
ERR("Unable to connect to JACK server\n");
return ALC_FALSE;
return false;
}
jack_client_close(client);
return ALC_TRUE;
return true;
}
static void ALCjackBackendFactory_deinit(ALCjackBackendFactory* UNUSED(self))
void JackBackendFactory::deinit()
{
#ifdef HAVE_DYNLOAD
if(jack_handle)
CloseLib(jack_handle);
jack_handle = NULL;
jack_handle = nullptr;
#endif
}
static ALCboolean ALCjackBackendFactory_querySupport(ALCjackBackendFactory* UNUSED(self), ALCbackend_Type type)
{
if(type == ALCbackend_Playback)
return ALC_TRUE;
return ALC_FALSE;
}
bool JackBackendFactory::querySupport(ALCbackend_Type type)
{ return (type == ALCbackend_Playback); }
static void ALCjackBackendFactory_probe(ALCjackBackendFactory* UNUSED(self), enum DevProbe type, std::string *outnames)
void JackBackendFactory::probe(enum DevProbe type, std::string *outnames)
{
switch(type)
{
@@ -582,28 +574,21 @@ static void ALCjackBackendFactory_probe(ALCjackBackendFactory* UNUSED(self), enu
}
}
static ALCbackend* ALCjackBackendFactory_createBackend(ALCjackBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type)
ALCbackend *JackBackendFactory::createBackend(ALCdevice *device, ALCbackend_Type type)
{
if(type == ALCbackend_Playback)
{
ALCjackPlayback *backend;
NEW_OBJ(backend, ALCjackPlayback)(device);
if(!backend) return NULL;
if(!backend) return nullptr;
return STATIC_CAST(ALCbackend, backend);
}
return NULL;
return nullptr;
}
DEFINE_ALCBACKENDFACTORY_VTABLE(ALCjackBackendFactory);
ALCjackBackendFactory::ALCjackBackendFactory() noexcept
: ALCbackendFactory{GET_VTABLE2(ALCjackBackendFactory, ALCbackendFactory)}
{ }
ALCbackendFactory *ALCjackBackendFactory_getFactory(void)
BackendFactory &JackBackendFactory::getFactory()
{
static ALCjackBackendFactory factory{};
return STATIC_CAST(ALCbackendFactory, &factory);
static JackBackendFactory factory{};
return factory;
}
+20
View File
@@ -0,0 +1,20 @@
#ifndef BACKENDS_JACK_H
#define BACKENDS_JACK_H
#include "backends/base.h"
struct JackBackendFactory 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_JACK_H */
+1 -1
View File
@@ -1184,7 +1184,7 @@ IF(JACK_FOUND)
IF(ALSOFT_BACKEND_JACK)
SET(HAVE_JACK 1)
SET(BACKENDS "${BACKENDS} JACK${IS_LINKED},")
SET(ALC_OBJS ${ALC_OBJS} Alc/backends/jack.cpp)
SET(ALC_OBJS ${ALC_OBJS} Alc/backends/jack.cpp Alc/backends/jack.h)
ADD_BACKEND_LIBS(${JACK_LIBRARIES})
SET(INC_PATHS ${INC_PATHS} ${JACK_INCLUDE_DIRS})
ENDIF()