@@ -93,12 +93,8 @@ carla-discovery-native | |||
carla-discovery-posix32 | |||
carla-discovery-posix64 | |||
carla-frontend | |||
carla-lv2-export | |||
zita-at1-ui | |||
zita-bls1-ui | |||
zita-rev1-ui | |||
carla-rest-server | |||
zynaddsubfx-ui | |||
stoat-output.png | |||
@@ -0,0 +1,64 @@ | |||
#!/usr/bin/env python3 | |||
# -*- coding: utf-8 -*- | |||
# Carla plugin host | |||
# Copyright (C) 2011-2018 Filipe Coelho <falktx@falktx.com> | |||
# | |||
# This program is free software; you can redistribute it and/or | |||
# modify it under the terms of the GNU General Public License as | |||
# published by the Free Software Foundation; either version 2 of | |||
# the License, or any later version. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
# ---------------------------------------------------------------------------------------------------------------------- | |||
# Imports (Custom Stuff) | |||
from carla_backend_qtweb import CarlaHostQtWeb | |||
from carla_host import ( | |||
CarlaApplication, | |||
HostWindow, | |||
setUpSignals, | |||
initHost, | |||
loadHostSettings, | |||
) | |||
# ---------------------------------------------------------------------------------------------------------------------- | |||
# Main | |||
if __name__ == '__main__': | |||
# ------------------------------------------------------------------------------------------------------------------ | |||
# App initialization | |||
app = CarlaApplication("Carla2-REST") | |||
# ------------------------------------------------------------------------------------------------------------------ | |||
# Set-up custom signal handling | |||
setUpSignals() | |||
# ------------------------------------------------------------------------------------------------------------------ | |||
# Init host backend | |||
host = initHost("Carla-REST", None, False, False, False, CarlaHostQtWeb) | |||
loadHostSettings(host) | |||
# ------------------------------------------------------------------------------------------------------------------ | |||
# Create GUI | |||
gui = HostWindow(host, True) | |||
# ------------------------------------------------------------------------------------------------------------------ | |||
# Show GUI | |||
gui.show() | |||
# ------------------------------------------------------------------------------------------------------------------ | |||
# App-Loop | |||
app.exit_exec() |
@@ -1911,7 +1911,7 @@ class CarlaHostNull(CarlaHostMeta): | |||
return | |||
def is_engine_running(self): | |||
return False | |||
return self.fEngineRunning | |||
def set_engine_about_to_close(self): | |||
return True | |||
@@ -0,0 +1,74 @@ | |||
#!/usr/bin/env python3 | |||
# -*- coding: utf-8 -*- | |||
# Carla Backend code (Web stuff) | |||
# Copyright (C) 2018 Filipe Coelho <falktx@falktx.com> | |||
# | |||
# This program is free software; you can redistribute it and/or | |||
# modify it under the terms of the GNU General Public License as | |||
# published by the Free Software Foundation; either version 2 of | |||
# the License, or any later version. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
# Imports (Global) | |||
import requests | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
# Imports (Custom) | |||
from carla_backend_qt import * | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
# Carla Host object for connecting to the REST API | |||
class CarlaHostQtWeb(CarlaHostQtNull): | |||
def __init__(self): | |||
CarlaHostQtNull.__init__(self) | |||
self.baseurl = "http://localhost:2228" | |||
def get_engine_driver_count(self): | |||
# FIXME | |||
return int(requests.get("{}/get_engine_driver_count".format(self.baseurl)).text) - 1 | |||
def get_engine_driver_name(self, index): | |||
return requests.get("{}/get_engine_driver_name/{}".format(self.baseurl, index)).text | |||
def get_engine_driver_device_names(self, index): | |||
# FIXME strip should not be needed | |||
return requests.get("{}/get_engine_driver_device_names/{}".format(self.baseurl, index)).text.strip().split("\n") | |||
def get_engine_driver_device_info(self, index, name): | |||
return requests.get("{}/get_engine_driver_device_info/{}/{}".format(self.baseurl, index, name)).json() | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
# TESTING | |||
if __name__ == '__main__': | |||
baseurl = "http://localhost:2228" | |||
driver_count = int(requests.get("{}/get_engine_driver_count".format(baseurl)).text) | |||
# FIXME | |||
driver_count -= 1 | |||
print("Driver names:") | |||
for index in range(driver_count): | |||
print("\t -", requests.get("{}/get_engine_driver_name/{}".format(baseurl, index)).text) | |||
print("Driver device names:") | |||
# FIXME strip should not be needed | |||
for index in range(driver_count): | |||
for name in requests.get("{}/get_engine_driver_device_names/{}".format(baseurl, index)).text.strip().split("\n"): | |||
print("\t {}:".format(name), requests.get("{}/get_engine_driver_device_info/{}/{}".format(baseurl, index, name)).json()) | |||
# --------------------------------------------------------------------------------------------------------------------- |
@@ -23,7 +23,7 @@ endif | |||
BUILD_CXX_FLAGS += -I$(CWD) -I$(CWD)/backend -I$(CWD)/includes -I$(CWD)/modules -I$(CWD)/utils | |||
LINK_FLAGS += -L$(BINDIR) -lcarla_utils -lrestbed -Wl,-rpath=$(shell realpath $(CWD)/../bin) | |||
LINK_FLAGS += -L$(BINDIR) -lcarla_standalone2 -lcarla_utils -lrestbed -Wl,-rpath=$(shell realpath $(CWD)/../bin) | |||
# ---------------------------------------------------------------------------------------------------------------------- | |||
@@ -44,14 +44,14 @@ debug: | |||
# ---------------------------------------------------------------------------------------------------------------------- | |||
$(BINDIR)/carla-rest-server: $(OBJDIR)/rest-server.cpp.o | |||
$(BINDIR)/carla-rest-server: $(OBJDIR)/rest-server.cpp.o $(OBJDIR)/buffers.cpp.o | |||
-@mkdir -p $(BINDIR) | |||
@echo "Linking carla-rest-server" | |||
@$(CXX) $< $(LINK_FLAGS) -o $@ | |||
@$(CXX) $^ $(LINK_FLAGS) -o $@ | |||
# ---------------------------------------------------------------------------------------------------------------------- | |||
$(OBJDIR)/rest-server.cpp.o: rest-server.cpp | |||
$(OBJDIR)/%.cpp.o: %.cpp | |||
-@mkdir -p $(OBJDIR) | |||
@echo "Compiling $<" | |||
@$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
@@ -0,0 +1,138 @@ | |||
/* | |||
* Carla REST API Server | |||
* Copyright (C) 2018 Filipe Coelho <falktx@falktx.com> | |||
* | |||
* This program is free software; you can redistribute it and/or | |||
* modify it under the terms of the GNU General Public License as | |||
* published by the Free Software Foundation; either version 2 of | |||
* the License, or any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU General Public License for more details. | |||
* | |||
* For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
*/ | |||
#include "buffers.hpp" | |||
#include <cstdio> | |||
#include <cstring> | |||
// ------------------------------------------------------------------------------------------------------------------- | |||
enum { | |||
kJsonBufSize = 4095, | |||
kStrBufSize = 1023, | |||
kSizeBufSize = 31, | |||
}; | |||
// static buffer to return json | |||
// NOTE size is never checked for json, the buffer is big enough in order to assume it all always fits | |||
static char jsonBuf[kJsonBufSize+1]; | |||
// static buffer to return size | |||
static char sizeBuf[kSizeBufSize+1]; | |||
// static buffer to return regular strings | |||
static char strBuf[kStrBufSize+1]; | |||
// ------------------------------------------------------------------------------------------------------------------- | |||
const char* size_buf(const char* const buf) | |||
{ | |||
const std::size_t size = std::strlen(buf); | |||
std::snprintf(sizeBuf, kSizeBufSize, P_SIZE, size); | |||
sizeBuf[kSizeBufSize] = '\0'; | |||
return sizeBuf; | |||
} | |||
// ------------------------------------------------------------------------------------------------------------------- | |||
const char* str_buf_string(const char* const string) | |||
{ | |||
std::strncpy(strBuf, string, kStrBufSize); | |||
strBuf[kStrBufSize] = '\0'; | |||
return strBuf; | |||
} | |||
const char* str_buf_string_array(const char* const* const array) | |||
{ | |||
size_t bytesRead = 0; | |||
for (int i=0; array[i] != nullptr && bytesRead < kStrBufSize; ++i) | |||
{ | |||
const std::size_t size = std::strlen(array[i]); | |||
if (bytesRead + size > kStrBufSize) | |||
break; | |||
std::strncpy(strBuf+bytesRead, array[i], kStrBufSize); | |||
bytesRead += size; | |||
strBuf[bytesRead] = '\n'; | |||
bytesRead += 1; | |||
} | |||
strBuf[bytesRead] = '\0'; | |||
return strBuf; | |||
} | |||
const char* str_buf_uint(const uint value) | |||
{ | |||
std::snprintf(strBuf, kStrBufSize, "%u", value); | |||
strBuf[kStrBufSize] = '\0'; | |||
return strBuf; | |||
} | |||
// ------------------------------------------------------------------------------------------------------------------- | |||
char* json_buf_start() | |||
{ | |||
std::strcpy(jsonBuf, "{"); | |||
return jsonBuf + 1; | |||
} | |||
template <typename T, typename Fn> | |||
char* json_buf_add(char* jsonBufPtr, const char* const key, const T value, const Fn fn) | |||
{ | |||
fn(value); | |||
if (jsonBufPtr != jsonBuf+1) | |||
{ | |||
*jsonBufPtr = ','; | |||
jsonBufPtr += 1; | |||
} | |||
*jsonBufPtr++ = '"'; | |||
std::strcpy(jsonBufPtr, key); | |||
jsonBufPtr += std::strlen(key); | |||
*jsonBufPtr++ = '"'; | |||
*jsonBufPtr++ = ':'; | |||
std::strcpy(jsonBufPtr, strBuf); | |||
jsonBufPtr += std::strlen(strBuf); | |||
return jsonBufPtr; | |||
} | |||
char* json_buf_add_string(char* jsonBufPtr, const char* const key, const char* const value) | |||
{ | |||
return json_buf_add(jsonBufPtr, key, value, str_buf_string); | |||
} | |||
char* json_buf_add_uint(char* jsonBufPtr, const char* const key, const uint value) | |||
{ | |||
return json_buf_add(jsonBufPtr, key, value, str_buf_uint); | |||
} | |||
const char* json_buf_end(char* jsonBufPtr) | |||
{ | |||
*jsonBufPtr++ = '}'; | |||
*jsonBufPtr++ = '\0'; | |||
return jsonBuf; | |||
} | |||
// ------------------------------------------------------------------------------------------------------------------- |
@@ -0,0 +1,37 @@ | |||
/* | |||
* Carla REST API Server | |||
* Copyright (C) 2018 Filipe Coelho <falktx@falktx.com> | |||
* | |||
* This program is free software; you can redistribute it and/or | |||
* modify it under the terms of the GNU General Public License as | |||
* published by the Free Software Foundation; either version 2 of | |||
* the License, or any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU General Public License for more details. | |||
* | |||
* For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
*/ | |||
#ifndef REST_BUFFERS_HPP_INCLUDED | |||
#define REST_BUFFERS_HPP_INCLUDED | |||
#include "CarlaDefines.h" | |||
// size buf | |||
const char* size_buf(const char* const buf); | |||
// base types | |||
const char* str_buf_string(const char* const string); | |||
const char* str_buf_string_array(const char* const* const array); | |||
const char* str_buf_uint(const uint value); | |||
// json | |||
char* json_buf_start(); | |||
char* json_buf_add_string(char* jsonBufPtr, const char* const key, const char* const value); | |||
char* json_buf_add_uint(char* jsonBufPtr, const char* const key, const uint value); | |||
const char* json_buf_end(char* jsonBufPtr); | |||
#endif // REST_BUFFERS_HPP_INCLUDED |
@@ -0,0 +1,77 @@ | |||
/* | |||
* Carla REST API Server | |||
* Copyright (C) 2018 Filipe Coelho <falktx@falktx.com> | |||
* | |||
* This program is free software; you can redistribute it and/or | |||
* modify it under the terms of the GNU General Public License as | |||
* published by the Free Software Foundation; either version 2 of | |||
* the License, or any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU General Public License for more details. | |||
* | |||
* For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
*/ | |||
#include "common.hpp" | |||
#include "CarlaHost.h" | |||
// ------------------------------------------------------------------------------------------------------------------- | |||
void handle_carla_get_engine_driver_count(const std::shared_ptr<Session> session) | |||
{ | |||
const char* const buf = str_buf_uint(carla_get_engine_driver_count()); | |||
session->close(OK, buf, { { "Content-Length", size_buf(buf) } } ); | |||
} | |||
void handle_carla_get_engine_driver_name(const std::shared_ptr<Session> session) | |||
{ | |||
const std::shared_ptr<const Request> request = session->get_request(); | |||
const int index = std::atoi(request->get_path_parameter("index").c_str()); | |||
CARLA_SAFE_ASSERT_RETURN(index >= 0 /*&& index < INT_MAX*/,) | |||
const char* const buf = str_buf_string(carla_get_engine_driver_name(index)); | |||
session->close(OK, buf, { { "Content-Length", size_buf(buf) } } ); | |||
} | |||
void handle_carla_get_engine_driver_device_names(const std::shared_ptr<Session> session) | |||
{ | |||
const std::shared_ptr<const Request> request = session->get_request(); | |||
const int index = std::atoi(request->get_path_parameter("index").c_str()); | |||
CARLA_SAFE_ASSERT_RETURN(index >= 0 /*&& index < INT_MAX*/,) | |||
const char* const buf = str_buf_string_array(carla_get_engine_driver_device_names(index)); | |||
session->close(OK, buf, { { "Content-Length", size_buf(buf) } } ); | |||
} | |||
void handle_carla_get_engine_driver_device_info(const std::shared_ptr<Session> session) | |||
{ | |||
const std::shared_ptr<const Request> request = session->get_request(); | |||
const int index = std::atoi(request->get_path_parameter("index").c_str()); | |||
CARLA_SAFE_ASSERT_RETURN(index >= 0 /*&& index < INT_MAX*/,) | |||
const std::string name = request->get_path_parameter("name"); | |||
const EngineDriverDeviceInfo* const info = carla_get_engine_driver_device_info(index, name.c_str()); | |||
char* jsonBuf; | |||
jsonBuf = json_buf_start(); | |||
jsonBuf = json_buf_add_uint(jsonBuf, "hints", info->hints); | |||
// TODO | |||
//jsonBuf = json_buf_add_uint(jsonBuf, "bufferSizes", info->bufferSizes); | |||
//jsonBuf = json_buf_add_uint(jsonBuf, "sampleRates", info->sampleRates); | |||
const char* const buf = json_buf_end(jsonBuf); | |||
session->close(OK, buf, { { "Content-Length", size_buf(buf) } } ); | |||
} | |||
// ------------------------------------------------------------------------------------------------------------------- | |||
// ------------------------------------------------------------------------------------------------------------------- |
@@ -0,0 +1,91 @@ | |||
/* | |||
* Carla REST API Server | |||
* Copyright (C) 2018 Filipe Coelho <falktx@falktx.com> | |||
* | |||
* This program is free software; you can redistribute it and/or | |||
* modify it under the terms of the GNU General Public License as | |||
* published by the Free Software Foundation; either version 2 of | |||
* the License, or any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU General Public License for more details. | |||
* | |||
* For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
*/ | |||
#include "common.hpp" | |||
#include "CarlaUtils.h" | |||
// ------------------------------------------------------------------------------------------------------------------- | |||
void handle_carla_get_complete_license_text(const std::shared_ptr<Session> session) | |||
{ | |||
const char* const buf = str_buf_string(carla_get_complete_license_text()); | |||
session->close(OK, buf, { { "Content-Length", size_buf(buf) } } ); | |||
} | |||
void handle_carla_get_supported_file_extensions(const std::shared_ptr<Session> session) | |||
{ | |||
const char* const buf = str_buf_string_array(carla_get_supported_file_extensions()); | |||
session->close(OK, buf, { { "Content-Length", size_buf(buf) } } ); | |||
} | |||
void handle_carla_get_supported_features(const std::shared_ptr<Session> session) | |||
{ | |||
const char* const buf = str_buf_string_array(carla_get_supported_features()); | |||
session->close(OK, buf, { { "Content-Length", size_buf(buf) } } ); | |||
} | |||
void handle_carla_get_cached_plugin_count(const std::shared_ptr<Session> session) | |||
{ | |||
const std::shared_ptr<const Request> request = session->get_request(); | |||
const int ptype = std::atoi(request->get_path_parameter("ptype").c_str()); | |||
CARLA_SAFE_ASSERT_RETURN(ptype >= PLUGIN_NONE && ptype <= PLUGIN_JACK,) | |||
const std::string pluginPath = request->get_path_parameter("pluginPath"); | |||
const char* const buf = str_buf_uint(carla_get_cached_plugin_count(static_cast<PluginType>(ptype), | |||
pluginPath.c_str())); | |||
session->close(OK, buf, { { "Content-Length", size_buf(buf) } } ); | |||
} | |||
void handle_carla_get_cached_plugin_info(const std::shared_ptr<Session> session) | |||
{ | |||
const std::shared_ptr<const Request> request = session->get_request(); | |||
const int ptype = std::atoi(request->get_path_parameter("ptype").c_str()); | |||
CARLA_SAFE_ASSERT_RETURN(ptype >= PLUGIN_NONE && ptype <= PLUGIN_JACK,) | |||
const int index = std::atoi(request->get_path_parameter("index").c_str()); | |||
CARLA_SAFE_ASSERT_RETURN(index >= 0 /*&& index < INT_MAX*/,) | |||
// REMOVE THIS | |||
carla_get_cached_plugin_count(static_cast<PluginType>(ptype), nullptr); | |||
const CarlaCachedPluginInfo* const info = carla_get_cached_plugin_info(static_cast<PluginType>(ptype), | |||
static_cast<uint>(index)); | |||
char* jsonBuf; | |||
jsonBuf = json_buf_start(); | |||
jsonBuf = json_buf_add_uint(jsonBuf, "category", info->category); | |||
jsonBuf = json_buf_add_uint(jsonBuf, "hints", info->hints); | |||
jsonBuf = json_buf_add_uint(jsonBuf, "audioIns", info->audioIns); | |||
jsonBuf = json_buf_add_uint(jsonBuf, "audioOuts", info->audioOuts); | |||
jsonBuf = json_buf_add_uint(jsonBuf, "midiIns", info->midiIns); | |||
jsonBuf = json_buf_add_uint(jsonBuf, "midiOuts", info->midiOuts); | |||
jsonBuf = json_buf_add_uint(jsonBuf, "parameterIns", info->parameterIns); | |||
jsonBuf = json_buf_add_uint(jsonBuf, "parameterOuts", info->parameterOuts); | |||
jsonBuf = json_buf_add_string(jsonBuf, "name", info->name); | |||
jsonBuf = json_buf_add_string(jsonBuf, "label", info->label); | |||
jsonBuf = json_buf_add_string(jsonBuf, "maker", info->maker); | |||
jsonBuf = json_buf_add_string(jsonBuf, "copyright", info->copyright); | |||
const char* const buf = json_buf_end(jsonBuf); | |||
session->close(OK, buf, { { "Content-Length", size_buf(buf) } } ); | |||
} | |||
// ------------------------------------------------------------------------------------------------------------------- |
@@ -0,0 +1,37 @@ | |||
/* | |||
* Carla REST API Server | |||
* Copyright (C) 2018 Filipe Coelho <falktx@falktx.com> | |||
* | |||
* This program is free software; you can redistribute it and/or | |||
* modify it under the terms of the GNU General Public License as | |||
* published by the Free Software Foundation; either version 2 of | |||
* the License, or any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU General Public License for more details. | |||
* | |||
* For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
*/ | |||
#ifndef REST_COMMON_HPP_INCLUDED | |||
#define REST_COMMON_HPP_INCLUDED | |||
#include "buffers.hpp" | |||
#include "CarlaBackend.h" | |||
#include "CarlaUtils.hpp" | |||
#include <restbed> | |||
using restbed::Request; | |||
using restbed::Resource; | |||
using restbed::Service; | |||
using restbed::Session; | |||
using restbed::Settings; | |||
using restbed::OK; | |||
CARLA_BACKEND_USE_NAMESPACE; | |||
#endif // REST_COMMON_HPP_INCLUDED |
@@ -21,188 +21,12 @@ | |||
* Take this into consideration before deploying it to any servers. | |||
*/ | |||
#include "CarlaHost.h" | |||
#include "CarlaUtils.h" | |||
#include "CarlaUtils.hpp" | |||
#include "common.hpp" | |||
#include <cstring> | |||
#include <restbed> | |||
#include "carla-host.cpp" | |||
#include "carla-utils.cpp" | |||
// #include <memory> | |||
// #include <cstdlib> | |||
// using namespace std; | |||
using namespace restbed; | |||
#if 0 | |||
void post_method_handler(const std::shared_ptr<Session> session) | |||
{ | |||
const std::shared_ptr<const Request> request = session->get_request(); | |||
const string body = "Hello, " + request->get_path_parameter("id"); | |||
session->close(OK, body, { { "Content-Length", ::to_string( body.size( ) ) } } ); | |||
} | |||
#endif | |||
CARLA_BACKEND_START_NAMESPACE | |||
enum { | |||
kStrBufSize = 1023, | |||
kJsonBufSize = 4095, | |||
kSizeBufSize = 31, | |||
}; | |||
// static buffer to returned content | |||
static char strBuf[kStrBufSize+1]; | |||
static char jsonBuf[kJsonBufSize+1]; | |||
// static buffer to returned content size | |||
static char sizeBuf[kSizeBufSize+1]; | |||
void prepare_size() | |||
{ | |||
const std::size_t size = std::strlen(strBuf); | |||
std::snprintf(sizeBuf, kSizeBufSize, P_SIZE, size); | |||
sizeBuf[kSizeBufSize] = '\0'; | |||
} | |||
void prepare_buffer_uint(const uint value) | |||
{ | |||
std::snprintf(strBuf, kStrBufSize, "%u", value); | |||
strBuf[kStrBufSize] = '\0'; | |||
} | |||
void prepare_buffer_string(const char* const string) | |||
{ | |||
std::strncpy(strBuf, string, kStrBufSize); | |||
strBuf[kStrBufSize] = '\0'; | |||
} | |||
void prepare_buffer_string_array(const char* const* const array) | |||
{ | |||
size_t bytesRead = 0; | |||
strBuf[0] = '\0'; | |||
for (int i=0; array[i] != nullptr && bytesRead < kStrBufSize; ++i) | |||
{ | |||
const std::size_t size = std::strlen(array[i]); | |||
if (bytesRead + size > kStrBufSize) | |||
break; | |||
std::strncpy(strBuf+bytesRead, array[i], kStrBufSize); | |||
bytesRead += size; | |||
strBuf[bytesRead] = '\n'; | |||
bytesRead += 1; | |||
} | |||
strBuf[bytesRead] = '\0'; | |||
} | |||
char* prepare_buffer_json_start() | |||
{ | |||
std::strcpy(jsonBuf, "{"); | |||
return jsonBuf + 1; | |||
} | |||
char* prepare_buffer_json_add_uint(char* bufPtr, const char* const key, const uint value) | |||
{ | |||
prepare_buffer_uint(value); | |||
if (bufPtr != jsonBuf+1) | |||
{ | |||
*bufPtr = ','; | |||
bufPtr += 1; | |||
} | |||
*bufPtr++ = '"'; | |||
std::strcpy(bufPtr, key); | |||
bufPtr += std::strlen(key); | |||
*bufPtr++ = '"'; | |||
*bufPtr++ = ':'; | |||
std::strcpy(bufPtr, strBuf); | |||
bufPtr += std::strlen(strBuf); | |||
return bufPtr; | |||
} | |||
void prepare_buffer_json_end(char* const bufPtr) | |||
{ | |||
std::strcpy(bufPtr, "}"); | |||
const std::size_t size = std::strlen(jsonBuf); | |||
std::snprintf(sizeBuf, kSizeBufSize, P_SIZE, size); | |||
sizeBuf[kSizeBufSize] = '\0'; | |||
} | |||
void handle_carla_get_complete_license_text(const std::shared_ptr<Session> session) | |||
{ | |||
prepare_buffer_string(carla_get_complete_license_text()); | |||
prepare_size(); | |||
session->close(OK, strBuf, { { "Content-Length", sizeBuf } } ); | |||
} | |||
void handle_carla_get_supported_file_extensions(const std::shared_ptr<Session> session) | |||
{ | |||
prepare_buffer_string_array(carla_get_supported_file_extensions()); | |||
prepare_size(); | |||
session->close(OK, strBuf, { { "Content-Length", sizeBuf } } ); | |||
} | |||
void handle_carla_get_supported_features(const std::shared_ptr<Session> session) | |||
{ | |||
prepare_buffer_string_array(carla_get_supported_features()); | |||
prepare_size(); | |||
session->close(OK, strBuf, { { "Content-Length", sizeBuf } } ); | |||
} | |||
void handle_carla_get_cached_plugin_count(const std::shared_ptr<Session> session) | |||
{ | |||
PluginType ptype = PLUGIN_LV2; | |||
const char* pluginPath = nullptr; | |||
prepare_buffer_uint(carla_get_cached_plugin_count(ptype, pluginPath)); | |||
prepare_size(); | |||
session->close(OK, strBuf, { { "Content-Length", sizeBuf } } ); | |||
} | |||
void handle_carla_get_cached_plugin_info(const std::shared_ptr<Session> session) | |||
{ | |||
PluginType ptype = PLUGIN_LV2; | |||
const uint index = 0; | |||
// REMOVE THIS | |||
carla_get_cached_plugin_count(ptype, nullptr); | |||
const CarlaCachedPluginInfo* const info = carla_get_cached_plugin_info(ptype, index); | |||
char* bufPtr; | |||
bufPtr = prepare_buffer_json_start(); | |||
bufPtr = prepare_buffer_json_add_uint(bufPtr, "category", info->category); | |||
bufPtr = prepare_buffer_json_add_uint(bufPtr, "hints", info->hints); | |||
bufPtr = prepare_buffer_json_add_uint(bufPtr, "audioIns", info->audioIns); | |||
bufPtr = prepare_buffer_json_add_uint(bufPtr, "audioOuts", info->audioOuts); | |||
bufPtr = prepare_buffer_json_add_uint(bufPtr, "midiIns", info->midiIns); | |||
bufPtr = prepare_buffer_json_add_uint(bufPtr, "midiOuts", info->midiOuts); | |||
bufPtr = prepare_buffer_json_add_uint(bufPtr, "parameterIns", info->parameterIns); | |||
bufPtr = prepare_buffer_json_add_uint(bufPtr, "parameterOuts", info->parameterOuts); | |||
// const char* name; | |||
// const char* label; | |||
// const char* maker; | |||
// const char* copyright; | |||
prepare_buffer_json_end(bufPtr); | |||
session->close(OK, jsonBuf, { { "Content-Length", sizeBuf } } ); | |||
} | |||
// CARLA_EXPORT const CarlaCachedPluginInfo* carla_get_cached_plugin_info(PluginType ptype, uint index); | |||
CARLA_BACKEND_END_NAMESPACE | |||
// ------------------------------------------------------------------------------------------------------------------- | |||
void make_resource(Service& service, | |||
const char* const path, | |||
@@ -214,16 +38,24 @@ void make_resource(Service& service, | |||
service.publish(resource); | |||
} | |||
// ------------------------------------------------------------------------------------------------------------------- | |||
int main(int, const char**) | |||
{ | |||
CARLA_BACKEND_USE_NAMESPACE; | |||
Service service; | |||
make_resource(service, "/get_complete_license_text", handle_carla_get_complete_license_text); | |||
// carla-host | |||
make_resource(service, "/get_engine_driver_count", handle_carla_get_engine_driver_count); | |||
make_resource(service, "/get_engine_driver_name/{index: .*}", handle_carla_get_engine_driver_name); | |||
make_resource(service, "/get_engine_driver_device_names/{index: .*}", handle_carla_get_engine_driver_device_names); | |||
make_resource(service, "/get_engine_driver_device_info/{index: .*}/{name: .*}", handle_carla_get_engine_driver_device_info); | |||
// carla-utils | |||
make_resource(service, "/get_complete_license_text", handle_carla_get_complete_license_text); | |||
make_resource(service, "/get_supported_file_extensions", handle_carla_get_supported_file_extensions); | |||
make_resource(service, "/get_supported_features", handle_carla_get_supported_features); | |||
make_resource(service, "/get_cached_plugin_count", handle_carla_get_cached_plugin_count); | |||
make_resource(service, "/get_cached_plugin_info", handle_carla_get_cached_plugin_info); | |||
make_resource(service, "/get_supported_features", handle_carla_get_supported_features); | |||
make_resource(service, "/get_cached_plugin_count/{ptype: .*}/{pluginPath: .*}", handle_carla_get_cached_plugin_count); | |||
make_resource(service, "/get_cached_plugin_info/{ptype: .*}/{index: .*}", handle_carla_get_cached_plugin_info); | |||
std::shared_ptr<Settings> settings = std::make_shared<Settings>(); | |||
settings->set_port(2228); | |||
@@ -233,3 +65,5 @@ int main(int, const char**) | |||
service.start(settings); | |||
return 0; | |||
} | |||
// ------------------------------------------------------------------------------------------------------------------- |