Browse Source

Implement audio device discovery via juce

tags/1.9.4
falkTX 11 years ago
parent
commit
d39dedfb9b
10 changed files with 202 additions and 109 deletions
  1. +0
    -11
      source/backend/CarlaBackend.h
  2. +7
    -3
      source/backend/Makefile.mk
  3. +4
    -8
      source/backend/engine/CarlaEngine.cpp
  4. +6
    -0
      source/backend/engine/CarlaEngineInternal.hpp
  5. +6
    -6
      source/backend/engine/CarlaEngineJack.cpp
  6. +127
    -30
      source/backend/engine/CarlaEngineJuce.cpp
  7. +18
    -27
      source/backend/engine/CarlaEngineRtAudio.cpp
  8. +4
    -4
      source/backend/engine/Makefile
  9. +5
    -3
      source/backend/plugin/JucePlugin.cpp
  10. +25
    -17
      source/backend/standalone/Makefile

+ 0
- 11
source/backend/CarlaBackend.h View File

@@ -1363,17 +1363,6 @@ typedef struct {
*/
const double* sampleRates;

#ifdef __cplusplus
/*!
* Clear data.
*/
void clear() noexcept
{
hints = 0x0;
bufferSizes = nullptr;
sampleRates = nullptr;
}
#endif
} EngineDriverDeviceInfo;

/** @} */


+ 7
- 3
source/backend/Makefile.mk View File

@@ -18,9 +18,13 @@ ifeq ($(HAVE_FFMPEG),true)
BUILD_CXX_FLAGS += -DHAVE_FFMPEG
endif

# ifeq ($(HAVE_JUCE),true)
# BUILD_CXX_FLAGS += -DHAVE_JUCE
# endif
ifeq ($(HAVE_JUCE),true)
BUILD_CXX_FLAGS += -DHAVE_JUCE
endif

ifeq ($(HAVE_OPENGL),true)
BUILD_CXX_FLAGS += -DHAVE_OPENGL
endif

# --------------------------------------------------------------



+ 4
- 8
source/backend/engine/CarlaEngine.cpp View File

@@ -30,10 +30,6 @@
#include "CarlaStateUtils.hpp"
#include "CarlaMIDI.h"

#include <QtCore/QFile>
#include <QtCore/QFileInfo>
#include <QtCore/QTextStream>

#ifdef HAVE_JUCE
# include "juce_audio_basics.h"
using juce::FloatVectorOperations;
@@ -41,16 +37,16 @@ using juce::FloatVectorOperations;
# include <cmath>
#endif

#include <QtCore/QFile>
#include <QtCore/QFileInfo>
#include <QtCore/QTextStream>

CARLA_BACKEND_START_NAMESPACE

#if 0
} // Fix editor indentation
#endif

// Engine helper macro, sets lastError and returns false/NULL
#define CARLA_SAFE_ASSERT_RETURN_ERR(cond, err) if (cond) pass(); else { carla_safe_assert(#cond, __FILE__, __LINE__); setLastError(err); return false; }
#define CARLA_SAFE_ASSERT_RETURN_ERRN(cond, err) if (cond) pass(); else { carla_safe_assert(#cond, __FILE__, __LINE__); setLastError(err); return nullptr; }

// -----------------------------------------------------------------------
// Fallback data



+ 6
- 0
source/backend/engine/CarlaEngineInternal.hpp View File

@@ -33,6 +33,12 @@ CARLA_BACKEND_START_NAMESPACE

// -----------------------------------------------------------------------

// Engine helper macro, sets lastError and returns false/NULL
#define CARLA_SAFE_ASSERT_RETURN_ERR(cond, err) if (cond) pass(); else { carla_safe_assert(#cond, __FILE__, __LINE__); setLastError(err); return false; }
#define CARLA_SAFE_ASSERT_RETURN_ERRN(cond, err) if (cond) pass(); else { carla_safe_assert(#cond, __FILE__, __LINE__); setLastError(err); return nullptr; }

// -----------------------------------------------------------------------

static inline
const char* EngineType2Str(const EngineType type)
{


+ 6
- 6
source/backend/engine/CarlaEngineJack.cpp View File

@@ -22,14 +22,14 @@
#include "List.hpp"
#include "jackbridge/JackBridge.hpp"

#include <cmath>
#include <QtCore/QStringList>

#ifdef HAVE_JUCE
# include "juce_audio_basics.h"
using juce::FloatVectorOperations;
#endif

#include <cmath>
#include <QtCore/QStringList>

#define URI_CANVAS_ICON "http://kxstudio.sf.net/ns/canvas/icon"

CARLA_BACKEND_START_NAMESPACE
@@ -1960,11 +1960,11 @@ private:
bool portIsCV = (jackPortFlags & JackPortIsControlVoltage);

unsigned int canvasPortFlags = 0x0;
canvasPortFlags |= portIsInput ? PATCHBAY_PORT_IS_INPUT : PATCHBAY_PORT_IS_OUTPUT;
canvasPortFlags |= portIsAudio ? PATCHBAY_PORT_IS_AUDIO : PATCHBAY_PORT_IS_MIDI;
canvasPortFlags |= portIsInput ? PATCHBAY_PORT_IS_INPUT : 0x0;
canvasPortFlags |= portIsAudio ? PATCHBAY_PORT_TYPE_AUDIO : PATCHBAY_PORT_TYPE_MIDI;

if (portIsAudio && portIsCV)
canvasPortFlags |= PATCHBAY_PORT_IS_CV;
canvasPortFlags |= PATCHBAY_PORT_TYPE_CV;

PortNameToId portNameToId(groupId, fLastPortId++, portName, fullPortName);
fUsedPortNames.append(portNameToId);


+ 127
- 30
source/backend/engine/CarlaEngineJuce.cpp View File

@@ -22,9 +22,11 @@
#include "CarlaEngineInternal.hpp"
#include "CarlaBackendUtils.hpp"
#include "CarlaMIDI.h"
#include "RtList.hpp"

#include "juce_audio_basics.h"
// #include "RtList.hpp"

#include "juce_audio_devices.h"
using namespace juce;

CARLA_BACKEND_START_NAMESPACE

@@ -33,12 +35,23 @@ CARLA_BACKEND_START_NAMESPACE
#endif

// -------------------------------------------------------------------------------------------------------------------
// Juce Engine

static const char** gRetNames = nullptr;
static OwnedArray<AudioIODeviceType> gJuceDeviceTypes;

static void initJuceDevices()
{
static AudioDeviceManager manager;

if (gJuceDeviceTypes.size() == 0)
manager.createAudioDeviceTypes(gJuceDeviceTypes);
}

// -------------------------------------------------------------------------------------------------------------------
// Juce Engine

class CarlaEngineJuce : public CarlaEngine/*,
public juce::AudioIODeviceCallback*/
public AudioIODeviceCallback*/
{
public:
CarlaEngineJuce()
@@ -121,7 +134,7 @@ protected:
private:
//juce::AudioIODeviceType* fDeviceType;

JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJuce)
//JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJuce)
};

// -----------------------------------------
@@ -133,54 +146,138 @@ CarlaEngine* CarlaEngine::newJuce(const AudioApi /*api*/)

size_t CarlaEngine::getJuceApiCount()
{
return 0;
initJuceDevices();

return gJuceDeviceTypes.size();
}

const char* CarlaEngine::getJuceApiName(const unsigned int /*index*/)
const char* CarlaEngine::getJuceApiName(const unsigned int index)
{
return nullptr;
initJuceDevices();

if ((int)index >= gJuceDeviceTypes.size())
return nullptr;

AudioIODeviceType* const deviceType(gJuceDeviceTypes[index]);

if (deviceType == nullptr)
return nullptr;

return deviceType->getTypeName().toRawUTF8();
}

const char* const* CarlaEngine::getJuceApiDeviceNames(const unsigned int /*index*/)
const char* const* CarlaEngine::getJuceApiDeviceNames(const unsigned int index)
{
#if 0
juce::ScopedPointer<juce::AudioIODeviceType> deviceType;
initJuceDevices();

switch(index)
{
case 0:
deviceType = juce::AudioIODeviceType::createAudioIODeviceType_JACK();
break;
default:
//setLastError("");
if ((int)index >= gJuceDeviceTypes.size())
return nullptr;
}

AudioIODeviceType* const deviceType(gJuceDeviceTypes[index]);

if (deviceType == nullptr)
{
//setLastError("");
return nullptr;
}

deviceType->scanForDevices();

const juce::StringArray devNames(deviceType->getDeviceNames());
const int devNameCount(devNames.size());
StringArray deviceNames(deviceType->getDeviceNames());
const int deviceNameCount(deviceNames.size());

if (devNameCount <= 0)
if (deviceNameCount <= 0)
return nullptr;

gRetNames = new const char*[devNameCount+1];
if (gRetNames != nullptr)
{
for (int i=0; gRetNames[i] != nullptr; ++i)
delete[] gRetNames[i];
delete[] gRetNames;
}

gRetNames = new const char*[deviceNameCount+1];

for (unsigned int i=0; i < devNameCount; ++i)
gRetNames[i] = carla_strdup(devNames[i].toRawUTF8());
for (int i=0; i < deviceNameCount; ++i)
gRetNames[i] = carla_strdup(deviceNames[i].toRawUTF8());

gRetNames[devNameCount] = nullptr;
#endif
gRetNames[deviceNameCount] = nullptr;

return gRetNames;
}

const EngineDriverDeviceInfo* CarlaEngine::getJuceDeviceInfo(const unsigned int index, const char* const deviceName)
{
initJuceDevices();

if ((int)index >= gJuceDeviceTypes.size())
return nullptr;

AudioIODeviceType* const deviceType(gJuceDeviceTypes[index]);

if (deviceType == nullptr)
return nullptr;

deviceType->scanForDevices();

ScopedPointer<AudioIODevice> device(deviceType->createDevice(deviceName, deviceName));

if (device == nullptr)
return nullptr;

static EngineDriverDeviceInfo devInfo = { 0x0, nullptr, nullptr };
static uint32_t dummyBufferSizes[11] = { 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 0 };
static double dummySampleRates[14] = { 22050.0, 32000.0, 44100.0, 48000.0, 88200.0, 96000.0, 176400.0, 192000.0, 0.0 };

// reset
devInfo.hints = ENGINE_DRIVER_DEVICE_VARIABLE_BUFFER_SIZE | ENGINE_DRIVER_DEVICE_VARIABLE_SAMPLE_RATE;

// cleanup
if (devInfo.bufferSizes != nullptr && devInfo.bufferSizes != dummyBufferSizes)
{
delete[] devInfo.bufferSizes;
devInfo.bufferSizes = nullptr;
}

if (devInfo.sampleRates != nullptr && devInfo.sampleRates != dummySampleRates)
{
delete[] devInfo.sampleRates;
devInfo.sampleRates = nullptr;
}

if (device->hasControlPanel())
devInfo.hints |= ENGINE_DRIVER_DEVICE_HAS_CONTROL_PANEL;

if (size_t bufferSizesCount = device->getNumBufferSizesAvailable())
{
uint32_t* const bufferSizes(new uint32_t[bufferSizesCount+1]);

for (size_t i=0; i < bufferSizesCount; ++i)
bufferSizes[i] = device->getBufferSizeSamples(i);
bufferSizes[bufferSizesCount] = 0;

devInfo.bufferSizes = bufferSizes;
}
else
{
devInfo.bufferSizes = dummyBufferSizes;
}

if (size_t sampleRatesCount = device->getNumSampleRates())
{
double* const sampleRates(new double[sampleRatesCount+1]);

for (size_t i=0; i < sampleRatesCount; ++i)
sampleRates[i] = device->getSampleRate(i);
sampleRates[sampleRatesCount] = 0.0;

devInfo.sampleRates = sampleRates;
}
else
{
devInfo.sampleRates = dummySampleRates;
}

return &devInfo;
}

// -----------------------------------------

CARLA_BACKEND_END_NAMESPACE

+ 18
- 27
source/backend/engine/CarlaEngineRtAudio.cpp View File

@@ -24,8 +24,7 @@
#include "rtmidi/RtMidi.h"

#ifdef USE_JUCE
#include "juce_audio_basics.h"

# include "juce_audio_basics.h"
using juce::FloatVectorOperations;
#endif

@@ -94,10 +93,6 @@ public:
fAudio(api),
fAudioBufIn(nullptr),
fAudioBufOut(nullptr),
#ifdef CARLA_PROPER_CPP11_SUPPORT
fAudioBufRackIn{nullptr},
fAudioBufRackOut{nullptr},
#endif
fAudioCountIn(0),
fAudioCountOut(0),
fAudioIsInterleaved(false),
@@ -108,10 +103,8 @@ public:
{
carla_debug("CarlaEngineRtAudio::CarlaEngineRtAudio(%i)", api);

#ifndef CARLA_PROPER_CPP11_SUPPORT
fAudioBufRackIn[0] = fAudioBufRackIn[1] = nullptr;
fAudioBufRackIn[0] = fAudioBufRackIn[1] = nullptr;
fAudioBufRackOut[0] = fAudioBufRackOut[1] = nullptr;
#endif

// just to make sure
pData->options.forceStereo = true;
@@ -148,7 +141,7 @@ public:
CARLA_ASSERT(fAudioCountIn == 0);
CARLA_ASSERT(fAudioCountOut == 0);
CARLA_ASSERT(! fAudioIsReady);
CARLA_ASSERT(clientName != nullptr);
CARLA_ASSERT(clientName != nullptr && clientName[0] != '\0');
carla_debug("CarlaEngineRtAudio::init(\"%s\")", clientName);

RtAudio::StreamParameters iParams, oParams;
@@ -396,13 +389,13 @@ public:
return "OSS";
case RtAudio::UNIX_JACK:
#if defined(CARLA_OS_WIN)
return "JACK with WinMM";
return "JACK with WinMM";
#elif defined(CARLA_OS_MAC)
return "JACK with CoreMidi";
return "JACK with CoreMidi";
#elif defined(CARLA_OS_LINUX)
return "JACK with ALSA-MIDI";
return "JACK with ALSA-MIDI";
#else
return "JACK (RtAudio)";
return "JACK (RtAudio)";
#endif
case RtAudio::MACOSX_CORE:
return "CoreAudio";
@@ -1503,15 +1496,6 @@ const char* const* CarlaEngine::getRtAudioApiDeviceNames(const unsigned int inde

RtAudio rtAudio(api);

if (gRetNames != nullptr)
{
int i=0;
while (gRetNames[i] != nullptr)
delete[] gRetNames[i++];
delete[] gRetNames;
gRetNames = nullptr;
}

const unsigned int devCount(rtAudio.getDeviceCount());

if (devCount == 0)
@@ -1529,6 +1513,13 @@ const char* const* CarlaEngine::getRtAudioApiDeviceNames(const unsigned int inde

const unsigned int realDevCount(devNames.count());

if (gRetNames != nullptr)
{
for (int i=0; gRetNames[i] != nullptr; ++i)
delete[] gRetNames[i];
delete[] gRetNames;
}

gRetNames = new const char*[realDevCount+1];

for (unsigned int i=0; i < realDevCount; ++i)
@@ -1570,9 +1561,9 @@ const EngineDriverDeviceInfo* CarlaEngine::getRtAudioDeviceInfo(const unsigned i
if (i == devCount)
return nullptr;

static EngineDriverDeviceInfo devInfo;
static uint32_t dummyBufferSizes[11] = { 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 0 };
static double dummySampleRates[14] = { 22050.0, 32000.0, 44100.0, 48000.0, 88200.0, 96000.0, 176400.0, 192000.0, 0.0 };
static EngineDriverDeviceInfo devInfo = { 0x0, nullptr, nullptr };
static uint32_t dummyBufferSizes[11] = { 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 0 };
static double dummySampleRates[14] = { 22050.0, 32000.0, 44100.0, 48000.0, 88200.0, 96000.0, 176400.0, 192000.0, 0.0 };

// reset
devInfo.hints = 0x0;
@@ -1587,7 +1578,7 @@ const EngineDriverDeviceInfo* CarlaEngine::getRtAudioDeviceInfo(const unsigned i

if (size_t sampleRatesCount = rtAudioDevInfo.sampleRates.size())
{
double* sampleRates(new double[sampleRatesCount+1]);
double* const sampleRates(new double[sampleRatesCount+1]);

for (size_t i=0; i < sampleRatesCount; ++i)
sampleRates[i] = rtAudioDevInfo.sampleRates[i];


+ 4
- 4
source/backend/engine/Makefile View File

@@ -23,10 +23,10 @@ OBJS = $(OBJSp) \
CarlaEngineJack.cpp.o \
CarlaEngineRtAudio.cpp.o

# ifeq ($(HAVE_JUCE),true)
# OBJS += \
# CarlaEngineJuce.cpp.o
# endif
ifeq ($(HAVE_JUCE),true)
OBJS += \
CarlaEngineJuce.cpp.o
endif

HEADERS = \
../CarlaBackend.h ../CarlaEngine.hpp ../CarlaPlugin.hpp \


+ 5
- 3
source/backend/plugin/JucePlugin.cpp View File

@@ -19,12 +19,13 @@

#ifdef HAVE_JUCE

#include "JuceHeader.h"
//#include "JuceHeader.h"

using juce::VSTPluginFormat;
//using juce::VSTPluginFormat;

CARLA_BACKEND_START_NAMESPACE

#if 0
class JucePlugin : public CarlaPlugin
{
public:
@@ -58,6 +59,7 @@ private:

CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(JucePlugin)
};
#endif

CARLA_BACKEND_END_NAMESPACE

@@ -69,7 +71,7 @@ CarlaPlugin* CarlaPlugin::newJuce(const Initializer& init)
{
carla_debug("CarlaPlugin::newJuce({%p, \"%s\", \"%s\", \"%s\"})", init.engine, init.filename, init.name, init.label);

#ifdef HAVE_JUCE
#if 0 //def HAVE_JUCE
JucePlugin* const plugin(new JucePlugin(init.engine, init.id));

//if (! plugin->init(init.filename, init.name, init.label))


+ 25
- 17
source/backend/standalone/Makefile View File

@@ -10,10 +10,21 @@ include ../Makefile.mk
# Common

LINK_FLAGS += $(shell pkg-config --libs liblo)

LINK_FLAGS += $(QTCORE_LIBS)
LINK_FLAGS += $(QTXML_LIBS)
LINK_FLAGS += $(RTMEMPOOL_LIBS)

ifeq ($(HAVE_JUCE),true)
LINK_FLAGS += $(JUCE_AUDIO_BASICS_LIBS)
LINK_FLAGS += $(JUCE_AUDIO_DEVICES_LIBS)
LINK_FLAGS += $(JUCE_CORE_LIBS)
# LINK_FLAGS += $(JUCE_DATA_STRUCTURES_LIBS)
LINK_FLAGS += $(JUCE_EVENTS_LIBS)
# LINK_FLAGS += $(JUCE_GRAPHICS_LIBS)
# LINK_FLAGS += $(JUCE_GUI_BASICS_LIBS)
endif

# --------------------------------------------------------------
# Engine

@@ -22,13 +33,6 @@ LINK_FLAGS += $(RTMIDI_LIBS)

LINK_FLAGS += $(JACKBRIDGE_LIBS)

# LINK_FLAGS += $(JUCE_AUDIO_BASICS_LIBS)
# LINK_FLAGS += $(JUCE_CORE_LIBS)
# LINK_FLAGS += $(JUCE_DATA_STRUCTURES_LIBS)
# LINK_FLAGS += $(JUCE_EVENTS_LIBS)
# LINK_FLAGS += $(JUCE_GRAPHICS_LIBS)
# LINK_FLAGS += $(JUCE_GUI_BASICS_LIBS)

# --------------------------------------------------------------
# Plugin

@@ -79,24 +83,28 @@ LIBS += ../libcarla_plugin.a

LIBS += ../../modules/carla_native.a
LIBS += ../../modules/jackbridge.a
# LIBS += ../../modules/juce_audio_basics.a
# LIBS += ../../modules/juce_core.a
# LIBS += ../../modules/juce_data_structures.a
# LIBS += ../../modules/juce_events.a
# LIBS += ../../modules/juce_graphics.a
# LIBS += ../../modules/juce_gui_basics.a
LIBS += ../../modules/rtaudio.a
LIBS += ../../modules/rtmidi.a
LIBS += ../../modules/rtmempool.a

ifeq ($(HAVE_OPENGL),true)
LIBS += ../../modules/dgl.a
endif

ifeq ($(CARLA_PLUGIN_SUPPORT),true)
LIBS += ../../modules/lilv.a
endif

ifeq ($(HAVE_JUCE),true)
LIBS += ../../modules/juce_audio_basics.a
LIBS += ../../modules/juce_audio_devices.a
LIBS += ../../modules/juce_core.a
# LIBS += ../../modules/juce_data_structures.a
LIBS += ../../modules/juce_events.a
# LIBS += ../../modules/juce_graphics.a
# LIBS += ../../modules/juce_gui_basics.a
endif

ifeq ($(HAVE_OPENGL),true)
LIBS += ../../modules/dgl.a
endif

# --------------------------------------------------------------

OBJS = \


Loading…
Cancel
Save