| @@ -40,7 +40,7 @@ CARLA_BACKEND_START_NAMESPACE | |||||
| * @defgroup CarlaBackendAPI Carla Backend API | * @defgroup CarlaBackendAPI Carla Backend API | ||||
| * | * | ||||
| * The Carla Backend API.\n | * The Carla Backend API.\n | ||||
| * This is the base definitions for everything in the Carla code. | |||||
| * This is the base definitions for everything in the Carla backend code. | |||||
| * @{ | * @{ | ||||
| */ | */ | ||||
| @@ -53,6 +53,7 @@ const unsigned int MAX_DEFAULT_PARAMETERS = 200; //!< Maximum default number of | |||||
| * @defgroup EngineDriverHints Engine Driver Hints | * @defgroup EngineDriverHints Engine Driver Hints | ||||
| * | * | ||||
| * Various engine driver hints. | * Various engine driver hints. | ||||
| * \see CarlaEngine::hints() | |||||
| * @{ | * @{ | ||||
| */ | */ | ||||
| const unsigned int ENGINE_DRIVER_HAS_CONTROL_PANEL = 0x1; //!< Engine driver has custom control-panel. | const unsigned int ENGINE_DRIVER_HAS_CONTROL_PANEL = 0x1; //!< Engine driver has custom control-panel. | ||||
| @@ -864,6 +865,22 @@ struct CustomData { | |||||
| #endif | #endif | ||||
| }; | }; | ||||
| /*! | |||||
| * Engine driver device information. | |||||
| */ | |||||
| struct EngineDriverDeviceInfo { | |||||
| unsigned int hints; | |||||
| const uint32_t* bufferSizes; // terminated with 0 | |||||
| const double* sampleRates; // terminated with 0.0 | |||||
| #ifndef DOXYGEN | |||||
| EngineDriverDeviceInfo() | |||||
| : hints(0x0), | |||||
| bufferSizes(nullptr), | |||||
| sampleRates(nullptr) {} | |||||
| #endif | |||||
| }; | |||||
| /**@}*/ | /**@}*/ | ||||
| // forward declarations of commonly used Carla classes | // forward declarations of commonly used Carla classes | ||||
| @@ -696,7 +696,7 @@ class CarlaEngine | |||||
| protected: | protected: | ||||
| /*! | /*! | ||||
| * The constructor, protected.\n | * The constructor, protected.\n | ||||
| * \note This only initializes engine data, it doesn't initialize the engine itself. | |||||
| * \note This only initializes engine data, it doesn't start the engine (audio). | |||||
| */ | */ | ||||
| CarlaEngine(); | CarlaEngine(); | ||||
| @@ -721,10 +721,14 @@ public: | |||||
| static const char* getDriverName(const unsigned int index); | static const char* getDriverName(const unsigned int index); | ||||
| /*! | /*! | ||||
| * Get the device names of driver at \a index (for use in non-JACK drivers).\n | |||||
| * May return NULL. | |||||
| * Get the device names of driver at \a index. | |||||
| */ | |||||
| static const char* const* getDriverDeviceNames(const unsigned int index); | |||||
| /*! | |||||
| * Get the device names of driver at \a index. | |||||
| */ | */ | ||||
| static const char** getDriverDeviceNames(const unsigned int index); | |||||
| static const EngineDriverDeviceInfo* getDriverDeviceInfo(const unsigned int index, const char* const driverName); | |||||
| /*! | /*! | ||||
| * Create a new engine, using driver \a driverName. \n | * Create a new engine, using driver \a driverName. \n | ||||
| @@ -893,7 +897,15 @@ public: | |||||
| // Information (base) | // Information (base) | ||||
| /*! | /*! | ||||
| * Get current buffer size. | |||||
| * Get the current engine driver hints. | |||||
| */ | |||||
| unsigned int getHints() const noexcept | |||||
| { | |||||
| return fHints; | |||||
| } | |||||
| /*! | |||||
| * Get the current buffer size. | |||||
| */ | */ | ||||
| uint32_t getBufferSize() const noexcept | uint32_t getBufferSize() const noexcept | ||||
| { | { | ||||
| @@ -901,7 +913,7 @@ public: | |||||
| } | } | ||||
| /*! | /*! | ||||
| * Get current sample rate. | |||||
| * Get the current sample rate. | |||||
| */ | */ | ||||
| double getSampleRate() const noexcept | double getSampleRate() const noexcept | ||||
| { | { | ||||
| @@ -909,7 +921,7 @@ public: | |||||
| } | } | ||||
| /*! | /*! | ||||
| * Get engine name. | |||||
| * Get the current engine name. | |||||
| */ | */ | ||||
| const char* getName() const noexcept | const char* getName() const noexcept | ||||
| { | { | ||||
| @@ -917,23 +929,23 @@ public: | |||||
| } | } | ||||
| /*! | /*! | ||||
| * Get the engine options (read-only). | |||||
| * Get the current engine proccess mode. | |||||
| */ | */ | ||||
| const EngineOptions& getOptions() const noexcept | |||||
| EngineProcessMode getProccessMode() const noexcept | |||||
| { | { | ||||
| return fOptions; | |||||
| return fOptions.processMode; | |||||
| } | } | ||||
| /*! | /*! | ||||
| * Get the engine proccess mode. | |||||
| * Get the current engine options (read-only). | |||||
| */ | */ | ||||
| EngineProcessMode getProccessMode() const noexcept | |||||
| const EngineOptions& getOptions() const noexcept | |||||
| { | { | ||||
| return fOptions.processMode; | |||||
| return fOptions; | |||||
| } | } | ||||
| /*! | /*! | ||||
| * Get current Time information (read-only). | |||||
| * Get the current Time information (read-only). | |||||
| */ | */ | ||||
| const EngineTimeInfo& getTimeInfo() const noexcept | const EngineTimeInfo& getTimeInfo() const noexcept | ||||
| { | { | ||||
| @@ -1089,6 +1101,12 @@ public: | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| protected: | protected: | ||||
| /*! | |||||
| * Current engine driver hints. | |||||
| * \see getHints() | |||||
| */ | |||||
| unsigned int fHints; | |||||
| /*! | /*! | ||||
| * Current buffer size. | * Current buffer size. | ||||
| * \see getBufferSize() | * \see getBufferSize() | ||||
| @@ -1199,20 +1217,23 @@ private: | |||||
| AUDIO_API_DS = 7 | AUDIO_API_DS = 7 | ||||
| }; | }; | ||||
| static CarlaEngine* newJuce(const AudioApi api); | |||||
| static size_t getJuceApiCount(); | |||||
| static const char* getJuceApiName(const unsigned int index); | |||||
| static const char** getJuceApiDeviceNames(const unsigned int index); | |||||
| static CarlaEngine* newRtAudio(const AudioApi api); | |||||
| static size_t getRtAudioApiCount(); | |||||
| static const char* getRtAudioApiName(const unsigned int index); | |||||
| static const char** getRtAudioApiDeviceNames(const unsigned int index); | |||||
| static CarlaEngine* newRtAudio(const AudioApi api); | |||||
| static size_t getRtAudioApiCount(); | |||||
| static const char* getRtAudioApiName(const unsigned int index); | |||||
| static const char* const* getRtAudioApiDeviceNames(const unsigned int index); | |||||
| static const EngineDriverDeviceInfo* getRtAudioDeviceInfo(const unsigned int index, const char* const deviceName); | |||||
| # ifdef USE_JUCE | |||||
| static CarlaEngine* newJuce(const AudioApi api); | |||||
| static size_t getJuceApiCount(); | |||||
| static const char* getJuceApiName(const unsigned int index); | |||||
| static const char* const* getJuceApiDeviceNames(const unsigned int index); | |||||
| static const EngineDriverDeviceInfo* getJuceDeviceInfo(const unsigned int index, const char* const deviceName); | |||||
| # endif | |||||
| #endif | #endif | ||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Bridge/Controller OSC stuff | // Bridge/Controller OSC stuff | ||||
| public: | public: | ||||
| #ifdef BUILD_BRIDGE | #ifdef BUILD_BRIDGE | ||||
| void oscSend_bridge_audio_count(const int32_t ins, const int32_t outs, const int32_t total); | void oscSend_bridge_audio_count(const int32_t ins, const int32_t outs, const int32_t total); | ||||
| @@ -40,18 +40,19 @@ | |||||
| * Basic typedefs to help make code cleaner. | * Basic typedefs to help make code cleaner. | ||||
| * @{ | * @{ | ||||
| */ | */ | ||||
| typedef CarlaBackend::BinaryType CarlaBinaryType; | |||||
| typedef CarlaBackend::PluginType CarlaPluginType; | |||||
| typedef CarlaBackend::PluginCategory CarlaPluginCategory; | |||||
| typedef CarlaBackend::EngineCallbackFunc CarlaEngineCallbackFunc; | |||||
| typedef CarlaBackend::EngineCallbackOpcode CarlaEngineCallbackOpcode; | |||||
| typedef CarlaBackend::EngineOption CarlaEngineOption; | |||||
| typedef CarlaBackend::FileCallbackFunc CarlaFileCallbackFunc; | |||||
| typedef CarlaBackend::FileCallbackOpcode CarlaFileCallbackOpcode; | |||||
| typedef CarlaBackend::ParameterData CarlaParameterData; | |||||
| typedef CarlaBackend::ParameterRanges CarlaParameterRanges; | |||||
| typedef CarlaBackend::MidiProgramData CarlaMidiProgramData; | |||||
| typedef CarlaBackend::CustomData CarlaCustomData; | |||||
| typedef CarlaBackend::BinaryType CarlaBinaryType; | |||||
| typedef CarlaBackend::PluginType CarlaPluginType; | |||||
| typedef CarlaBackend::PluginCategory CarlaPluginCategory; | |||||
| typedef CarlaBackend::EngineCallbackFunc CarlaEngineCallbackFunc; | |||||
| typedef CarlaBackend::EngineCallbackOpcode CarlaEngineCallbackOpcode; | |||||
| typedef CarlaBackend::EngineOption CarlaEngineOption; | |||||
| typedef CarlaBackend::FileCallbackFunc CarlaFileCallbackFunc; | |||||
| typedef CarlaBackend::FileCallbackOpcode CarlaFileCallbackOpcode; | |||||
| typedef CarlaBackend::ParameterData CarlaParameterData; | |||||
| typedef CarlaBackend::ParameterRanges CarlaParameterRanges; | |||||
| typedef CarlaBackend::MidiProgramData CarlaMidiProgramData; | |||||
| typedef CarlaBackend::CustomData CarlaCustomData; | |||||
| typedef CarlaBackend::EngineDriverDeviceInfo CarlaEngineDriverDeviceInfo; | |||||
| /**@}*/ | /**@}*/ | ||||
| /*! | /*! | ||||
| @@ -249,21 +250,6 @@ struct CarlaTransportInfo { | |||||
| #endif | #endif | ||||
| }; | }; | ||||
| /*! | |||||
| * Engine driver information. | |||||
| * \see carla_get_engine_driver_info() | |||||
| */ | |||||
| struct CarlaEngineDriverInfo { | |||||
| const char* name; | |||||
| unsigned int hints; | |||||
| #ifndef DOXYGEN | |||||
| CarlaEngineDriverInfo() | |||||
| : name(nullptr), | |||||
| hints(0x0) {} | |||||
| #endif | |||||
| }; | |||||
| /*! | /*! | ||||
| * Get the complete license text of used third-party code and features.\n | * Get the complete license text of used third-party code and features.\n | ||||
| * Returned string is in basic html format. | * Returned string is in basic html format. | ||||
| @@ -287,13 +273,17 @@ CARLA_EXPORT unsigned int carla_get_engine_driver_count(); | |||||
| /*! | /*! | ||||
| * Get the engine driver info for \a index. | * Get the engine driver info for \a index. | ||||
| */ | */ | ||||
| CARLA_EXPORT const CarlaEngineDriverInfo* carla_get_engine_driver_info(unsigned int index); | |||||
| CARLA_EXPORT const char* carla_get_engine_driver_name(unsigned int index); | |||||
| /*! | |||||
| * Get the device names of the engine driver at \a index. | |||||
| */ | |||||
| CARLA_EXPORT const char* const* carla_get_engine_driver_device_names(unsigned int index); | |||||
| /*! | /*! | ||||
| * Get the device names of the engine driver at \a index (for use in non-JACK drivers).\n | |||||
| * May return NULL. | |||||
| * Get a device driver info. | |||||
| */ | */ | ||||
| CARLA_EXPORT const char** carla_get_engine_driver_device_names(unsigned int index); | |||||
| CARLA_EXPORT const CarlaEngineDriverDeviceInfo* carla_get_engine_driver_device_info(unsigned int index, const char* driverName); | |||||
| /*! | /*! | ||||
| * Get how many internal plugins are available to use. | * Get how many internal plugins are available to use. | ||||
| @@ -878,6 +878,11 @@ protected: | |||||
| */ | */ | ||||
| unsigned int fOptions; | unsigned int fOptions; | ||||
| /*! | |||||
| * Patchbay client Id that matches this plugin, 0 if unused. | |||||
| */ | |||||
| int fPatchbayClientId; | |||||
| /*! | /*! | ||||
| * Wherever the plugin is ready for usage.\n | * Wherever the plugin is ready for usage.\n | ||||
| * When a plugin is disabled, it will never be processed or managed in any way. | * When a plugin is disabled, it will never be processed or managed in any way. | ||||
| @@ -340,7 +340,8 @@ CarlaEnginePort* CarlaEngineClient::addPort(const EnginePortType portType, const | |||||
| // Carla Engine | // Carla Engine | ||||
| CarlaEngine::CarlaEngine() | CarlaEngine::CarlaEngine() | ||||
| : fBufferSize(0), | |||||
| : fHints(0x0), | |||||
| fBufferSize(0), | |||||
| fSampleRate(0.0), | fSampleRate(0.0), | ||||
| pData(new CarlaEngineProtectedData(this)) | pData(new CarlaEngineProtectedData(this)) | ||||
| { | { | ||||
| @@ -398,7 +399,7 @@ const char* CarlaEngine::getDriverName(const unsigned int index) | |||||
| return nullptr; | return nullptr; | ||||
| } | } | ||||
| const char** CarlaEngine::getDriverDeviceNames(const unsigned int index) | |||||
| const char* const* CarlaEngine::getDriverDeviceNames(const unsigned int index) | |||||
| { | { | ||||
| carla_debug("CarlaEngine::getDriverDeviceNames(%i)", index); | carla_debug("CarlaEngine::getDriverDeviceNames(%i)", index); | ||||
| @@ -426,6 +427,37 @@ const char** CarlaEngine::getDriverDeviceNames(const unsigned int index) | |||||
| return nullptr; | return nullptr; | ||||
| } | } | ||||
| const EngineDriverDeviceInfo* CarlaEngine::getDriverDeviceInfo(const unsigned int index, const char* const deviceName) | |||||
| { | |||||
| carla_debug("CarlaEngine::getDriverDeviceInfo(%i, \"%s\")", index, deviceName); | |||||
| if (index == 0) | |||||
| { | |||||
| static uint32_t bufSizes[11] = { 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 0 }; | |||||
| static EngineDriverDeviceInfo devInfo; | |||||
| devInfo.hints |= ENGINE_DRIVER_VARIABLE_BUFFER_SIZE; | |||||
| devInfo.bufferSizes = bufSizes; | |||||
| return &devInfo; | |||||
| } | |||||
| #ifndef BUILD_BRIDGE | |||||
| const unsigned int rtAudioIndex(index-1); | |||||
| if (rtAudioIndex < getRtAudioApiCount()) | |||||
| return getRtAudioDeviceInfo(rtAudioIndex, deviceName); | |||||
| # ifdef USE_JUCE | |||||
| const unsigned int juceIndex(index-rtAudioIndex-1); | |||||
| if (juceIndex < getJuceApiCount()) | |||||
| return getJuceDeviceInfo(juceIndex, deviceName); | |||||
| # endif | |||||
| #endif | |||||
| carla_stderr("CarlaEngine::getDriverDeviceNames(%i, \"%s\") - invalid index", index, deviceName); | |||||
| return nullptr; | |||||
| } | |||||
| CarlaEngine* CarlaEngine::newDriverByName(const char* const driverName) | CarlaEngine* CarlaEngine::newDriverByName(const char* const driverName) | ||||
| { | { | ||||
| CARLA_SAFE_ASSERT_RETURN(driverName != nullptr && driverName[0] != '\0', nullptr); | CARLA_SAFE_ASSERT_RETURN(driverName != nullptr && driverName[0] != '\0', nullptr); | ||||
| @@ -141,7 +141,7 @@ const char* CarlaEngine::getJuceApiName(const unsigned int /*index*/) | |||||
| return nullptr; | return nullptr; | ||||
| } | } | ||||
| const char** CarlaEngine::getJuceApiDeviceNames(const unsigned int /*index*/) | |||||
| const char* const* CarlaEngine::getJuceApiDeviceNames(const unsigned int /*index*/) | |||||
| { | { | ||||
| #if 0 | #if 0 | ||||
| juce::ScopedPointer<juce::AudioIODeviceType> deviceType; | juce::ScopedPointer<juce::AudioIODeviceType> deviceType; | ||||
| @@ -1455,21 +1455,22 @@ const char* CarlaEngine::getRtAudioApiName(const unsigned int index) | |||||
| { | { | ||||
| initRtApis(); | initRtApis(); | ||||
| if (index < gRtAudioApis.size()) | |||||
| { | |||||
| const RtAudio::Api& api(gRtAudioApis[index]); | |||||
| if (index >= gRtAudioApis.size()) | |||||
| return nullptr; | |||||
| switch (api) | |||||
| { | |||||
| case RtAudio::UNSPECIFIED: | |||||
| return "Unspecified"; | |||||
| case RtAudio::LINUX_ALSA: | |||||
| return "ALSA"; | |||||
| case RtAudio::LINUX_PULSE: | |||||
| return "PulseAudio"; | |||||
| case RtAudio::LINUX_OSS: | |||||
| return "OSS"; | |||||
| case RtAudio::UNIX_JACK: | |||||
| const RtAudio::Api& api(gRtAudioApis[index]); | |||||
| switch (api) | |||||
| { | |||||
| case RtAudio::UNSPECIFIED: | |||||
| return "Unspecified"; | |||||
| case RtAudio::LINUX_ALSA: | |||||
| return "ALSA"; | |||||
| case RtAudio::LINUX_PULSE: | |||||
| return "PulseAudio"; | |||||
| case RtAudio::LINUX_OSS: | |||||
| return "OSS"; | |||||
| case RtAudio::UNIX_JACK: | |||||
| #if defined(CARLA_OS_WIN) | #if defined(CARLA_OS_WIN) | ||||
| return "JACK with WinMM"; | return "JACK with WinMM"; | ||||
| #elif defined(CARLA_OS_MAC) | #elif defined(CARLA_OS_MAC) | ||||
| @@ -1479,68 +1480,128 @@ const char* CarlaEngine::getRtAudioApiName(const unsigned int index) | |||||
| #else | #else | ||||
| return "JACK (RtAudio)"; | return "JACK (RtAudio)"; | ||||
| #endif | #endif | ||||
| case RtAudio::MACOSX_CORE: | |||||
| return "CoreAudio"; | |||||
| case RtAudio::WINDOWS_ASIO: | |||||
| return "ASIO"; | |||||
| case RtAudio::WINDOWS_DS: | |||||
| return "DirectSound"; | |||||
| case RtAudio::RTAUDIO_DUMMY: | |||||
| return "Dummy"; | |||||
| } | |||||
| case RtAudio::MACOSX_CORE: | |||||
| return "CoreAudio"; | |||||
| case RtAudio::WINDOWS_ASIO: | |||||
| return "ASIO"; | |||||
| case RtAudio::WINDOWS_DS: | |||||
| return "DirectSound"; | |||||
| case RtAudio::RTAUDIO_DUMMY: | |||||
| return "Dummy"; | |||||
| } | } | ||||
| return nullptr; | return nullptr; | ||||
| } | } | ||||
| const char** CarlaEngine::getRtAudioApiDeviceNames(const unsigned int index) | |||||
| const char* const* CarlaEngine::getRtAudioApiDeviceNames(const unsigned int index) | |||||
| { | { | ||||
| initRtApis(); | initRtApis(); | ||||
| if (index < gRtAudioApis.size()) | |||||
| if (index >= gRtAudioApis.size()) | |||||
| return nullptr; | |||||
| const RtAudio::Api& api(gRtAudioApis[index]); | |||||
| RtAudio rtAudio(api); | |||||
| if (gRetNames != nullptr) | |||||
| { | { | ||||
| const RtAudio::Api& api(gRtAudioApis[index]); | |||||
| int i=0; | |||||
| while (gRetNames[i] != nullptr) | |||||
| delete[] gRetNames[i++]; | |||||
| delete[] gRetNames; | |||||
| gRetNames = nullptr; | |||||
| } | |||||
| RtAudio rtAudio(api); | |||||
| const unsigned int devCount(rtAudio.getDeviceCount()); | |||||
| if (gRetNames != nullptr) | |||||
| { | |||||
| int i=0; | |||||
| while (gRetNames[i] != nullptr) | |||||
| delete[] gRetNames[i++]; | |||||
| delete[] gRetNames; | |||||
| gRetNames = nullptr; | |||||
| } | |||||
| if (devCount == 0) | |||||
| return nullptr; | |||||
| const unsigned int devCount(rtAudio.getDeviceCount()); | |||||
| List<const char*> devNames; | |||||
| if (devCount > 0) | |||||
| { | |||||
| List<const char*> devNames; | |||||
| for (unsigned int i=0; i < devCount; ++i) | |||||
| { | |||||
| RtAudio::DeviceInfo devInfo(rtAudio.getDeviceInfo(i)); | |||||
| for (unsigned int i=0; i < devCount; ++i) | |||||
| { | |||||
| RtAudio::DeviceInfo devInfo(rtAudio.getDeviceInfo(i)); | |||||
| if (devInfo.probed && devInfo.outputChannels > 0 /*&& (devInfo.nativeFormats & RTAUDIO_FLOAT32) != 0*/) | |||||
| devNames.append(carla_strdup(devInfo.name.c_str())); | |||||
| } | |||||
| if (devInfo.probed && devInfo.outputChannels > 0 /*&& (devInfo.nativeFormats & RTAUDIO_FLOAT32) != 0*/) | |||||
| devNames.append(carla_strdup(devInfo.name.c_str())); | |||||
| } | |||||
| const unsigned int realDevCount(devNames.count()); | |||||
| const unsigned int realDevCount(devNames.count()); | |||||
| gRetNames = new const char*[realDevCount+1]; | |||||
| gRetNames = new const char*[realDevCount+1]; | |||||
| for (unsigned int i=0; i < realDevCount; ++i) | |||||
| gRetNames[i] = devNames.getAt(i); | |||||
| for (unsigned int i=0; i < realDevCount; ++i) | |||||
| gRetNames[i] = devNames.getAt(i); | |||||
| gRetNames[realDevCount] = nullptr; | |||||
| devNames.clear(); | |||||
| gRetNames[realDevCount] = nullptr; | |||||
| devNames.clear(); | |||||
| return gRetNames; | |||||
| } | |||||
| return gRetNames; | |||||
| } | |||||
| const EngineDriverDeviceInfo* CarlaEngine::getRtAudioDeviceInfo(const unsigned int index, const char* const deviceName) | |||||
| { | |||||
| initRtApis(); | |||||
| if (index >= gRtAudioApis.size()) | |||||
| return nullptr; | |||||
| const RtAudio::Api& api(gRtAudioApis[index]); | |||||
| RtAudio rtAudio(api); | |||||
| const unsigned int devCount(rtAudio.getDeviceCount()); | |||||
| if (devCount == 0) | |||||
| return nullptr; | |||||
| unsigned int i; | |||||
| RtAudio::DeviceInfo rtAudioDevInfo; | |||||
| for (i=0; i < devCount; ++i) | |||||
| { | |||||
| rtAudioDevInfo = rtAudio.getDeviceInfo(i); | |||||
| if (rtAudioDevInfo.name == deviceName) | |||||
| break; | |||||
| } | } | ||||
| return nullptr; | |||||
| 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 }; | |||||
| // reset | |||||
| devInfo.hints = 0x0; | |||||
| devInfo.bufferSizes = dummyBufferSizes; | |||||
| // cleanup | |||||
| if (devInfo.sampleRates != nullptr && devInfo.sampleRates != dummySampleRates) | |||||
| { | |||||
| delete[] devInfo.sampleRates; | |||||
| devInfo.sampleRates = nullptr; | |||||
| } | |||||
| if (size_t sampleRatesCount = rtAudioDevInfo.sampleRates.size()) | |||||
| { | |||||
| double* sampleRates(new double[sampleRatesCount+1]); | |||||
| for (size_t i=0; i < sampleRatesCount; ++i) | |||||
| sampleRates[i] = rtAudioDevInfo.sampleRates[i]; | |||||
| sampleRates[sampleRatesCount] = 0.0; | |||||
| devInfo.sampleRates = sampleRates; | |||||
| } | |||||
| else | |||||
| { | |||||
| devInfo.sampleRates = dummySampleRates; | |||||
| } | |||||
| return &devInfo; | |||||
| } | } | ||||
| // ----------------------------------------- | // ----------------------------------------- | ||||
| @@ -225,6 +225,7 @@ CarlaPlugin::CarlaPlugin(CarlaEngine* const engine, const unsigned int id) | |||||
| : fId(id), | : fId(id), | ||||
| fHints(0x0), | fHints(0x0), | ||||
| fOptions(0x0), | fOptions(0x0), | ||||
| fPatchbayClientId(0), | |||||
| fEnabled(false), | fEnabled(false), | ||||
| fIconName("plugin"), | fIconName("plugin"), | ||||
| pData(new CarlaPluginProtectedData(engine, this)) | pData(new CarlaPluginProtectedData(engine, this)) | ||||
| @@ -307,23 +307,27 @@ unsigned int carla_get_engine_driver_count() | |||||
| return CarlaEngine::getDriverCount(); | return CarlaEngine::getDriverCount(); | ||||
| } | } | ||||
| const CarlaEngineDriverInfo* carla_get_engine_driver_info(unsigned int index) | |||||
| const char* carla_get_engine_driver_name(unsigned int index) | |||||
| { | { | ||||
| carla_debug("carla_get_engine_driver_info(%i)", index); | carla_debug("carla_get_engine_driver_info(%i)", index); | ||||
| static CarlaEngineDriverInfo info; | |||||
| info.name = CarlaEngine::getDriverName(index); | |||||
| return &info; | |||||
| return CarlaEngine::getDriverName(index); | |||||
| } | } | ||||
| const char** carla_get_engine_driver_device_names(unsigned int index) | |||||
| const char* const* carla_get_engine_driver_device_names(unsigned int index) | |||||
| { | { | ||||
| carla_debug("carla_get_engine_driver_device_names(%i)", index); | carla_debug("carla_get_engine_driver_device_names(%i)", index); | ||||
| return CarlaEngine::getDriverDeviceNames(index); | return CarlaEngine::getDriverDeviceNames(index); | ||||
| } | } | ||||
| const CarlaEngineDriverDeviceInfo* carla_get_engine_driver_device_info(unsigned int index, const char* deviceName) | |||||
| { | |||||
| carla_debug("carla_get_engine_driver_device_info(%i, \"%s\")", index, deviceName); | |||||
| return CarlaEngine::getDriverDeviceInfo(index, deviceName); | |||||
| } | |||||
| // ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
| unsigned int carla_get_internal_plugin_count() | unsigned int carla_get_internal_plugin_count() | ||||
| @@ -343,6 +343,13 @@ class CustomData(Structure): | |||||
| ("value", c_char_p) | ("value", c_char_p) | ||||
| ] | ] | ||||
| class EngineDriverDeviceInfo(Structure): | |||||
| _fields_ = [ | |||||
| ("hints", c_uint), | |||||
| ("bufferSizes", POINTER(c_uint32)), | |||||
| ("sampleRates", POINTER(c_double)) | |||||
| ] | |||||
| # ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
| # Host C++ -> Python variables | # Host C++ -> Python variables | ||||
| @@ -410,12 +417,6 @@ class CarlaTransportInfo(Structure): | |||||
| ("bpm", c_double) | ("bpm", c_double) | ||||
| ] | ] | ||||
| class CarlaEngineDriverInfo(Structure): | |||||
| _fields_ = [ | |||||
| ("name", c_char_p), | |||||
| ("hints", c_uint) | |||||
| ] | |||||
| # ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
| # Python object dicts compatible with ctypes struct | # Python object dicts compatible with ctypes struct | ||||
| @@ -515,12 +516,15 @@ class Host(object): | |||||
| self.lib.carla_get_engine_driver_count.argtypes = None | self.lib.carla_get_engine_driver_count.argtypes = None | ||||
| self.lib.carla_get_engine_driver_count.restype = c_uint | self.lib.carla_get_engine_driver_count.restype = c_uint | ||||
| self.lib.carla_get_engine_driver_info.argtypes = [c_uint] | |||||
| self.lib.carla_get_engine_driver_info.restype = POINTER(CarlaEngineDriverInfo) | |||||
| self.lib.carla_get_engine_driver_name.argtypes = [c_uint] | |||||
| self.lib.carla_get_engine_driver_name.restype = c_char_p | |||||
| self.lib.carla_get_engine_driver_device_names.argtypes = [c_uint] | self.lib.carla_get_engine_driver_device_names.argtypes = [c_uint] | ||||
| self.lib.carla_get_engine_driver_device_names.restype = POINTER(c_char_p) | self.lib.carla_get_engine_driver_device_names.restype = POINTER(c_char_p) | ||||
| self.lib.carla_get_engine_driver_device_info.argtypes = [c_uint, c_char_p] | |||||
| self.lib.carla_get_engine_driver_device_info.restype = POINTER(EngineDriverDeviceInfo) | |||||
| self.lib.carla_get_internal_plugin_count.argtypes = None | self.lib.carla_get_internal_plugin_count.argtypes = None | ||||
| self.lib.carla_get_internal_plugin_count.restype = c_uint | self.lib.carla_get_internal_plugin_count.restype = c_uint | ||||
| @@ -542,7 +546,7 @@ class Host(object): | |||||
| self.lib.carla_set_engine_about_to_close.argtypes = None | self.lib.carla_set_engine_about_to_close.argtypes = None | ||||
| self.lib.carla_set_engine_about_to_close.restype = None | self.lib.carla_set_engine_about_to_close.restype = None | ||||
| self.lib.carla_set_engine_callback.argtypes = [CallbackFunc, c_void_p] | |||||
| self.lib.carla_set_engine_callback.argtypes = [EngineCallbackFunc, c_void_p] | |||||
| self.lib.carla_set_engine_callback.restype = None | self.lib.carla_set_engine_callback.restype = None | ||||
| self.lib.carla_set_engine_option.argtypes = [c_enum, c_int, c_char_p] | self.lib.carla_set_engine_option.argtypes = [c_enum, c_int, c_char_p] | ||||
| @@ -773,12 +777,15 @@ class Host(object): | |||||
| def get_engine_driver_count(self): | def get_engine_driver_count(self): | ||||
| return self.lib.carla_get_engine_driver_count() | return self.lib.carla_get_engine_driver_count() | ||||
| def get_engine_driver_info(self, index): | |||||
| return structToDict(self.lib.carla_get_engine_driver_info(index)) | |||||
| def get_engine_driver_name(self, index): | |||||
| return self.lib.carla_get_engine_driver_name(index) | |||||
| def get_engine_driver_device_names(self, index): | def get_engine_driver_device_names(self, index): | ||||
| return charStringList(self.lib.carla_get_engine_driver_device_names(index)) | return charStringList(self.lib.carla_get_engine_driver_device_names(index)) | ||||
| def get_engine_driver_device_info(self, index, deviceName): | |||||
| return structToDict(self.lib.carla_get_engine_driver_device_info(index, deviceName)) | |||||
| def get_internal_plugin_count(self): | def get_internal_plugin_count(self): | ||||
| return self.lib.carla_get_internal_plugin_count() | return self.lib.carla_get_internal_plugin_count() | ||||
| @@ -81,8 +81,8 @@ | |||||
| #define LV2_OSC__OscEvent "http://kxstudio.sf.net/ns/lv2ext/osc#OscEvent" | #define LV2_OSC__OscEvent "http://kxstudio.sf.net/ns/lv2ext/osc#OscEvent" | ||||
| #define LV2_UI__Qt5UI LV2_UI_PREFIX "Qt5UI" | |||||
| #define LV2_UI__NtkUI LV2_UI_PREFIX "NtkUI" | #define LV2_UI__NtkUI LV2_UI_PREFIX "NtkUI" | ||||
| #define LV2_UI__Qt5UI LV2_UI_PREFIX "Qt5UI" | |||||
| #define LV2_UI__idle LV2_UI_PREFIX "idle" | #define LV2_UI__idle LV2_UI_PREFIX "idle" | ||||
| #define LV2_UI__makeResident LV2_UI_PREFIX "makeResident" | #define LV2_UI__makeResident LV2_UI_PREFIX "makeResident" | ||||