Mercurial > hg > piper-cpp
changeset 243:498f899a91b6
Remove stubber from this repo; it's in piper-vamp-js now
author | Chris Cannam <cannam@all-day-breakfast.com> |
---|---|
date | Wed, 14 Jun 2017 11:27:50 +0100 |
parents | d607ae858682 |
children | f548eb11ae01 |
files | Makefile vamp-stubber/stubber.cpp |
diffstat | 2 files changed, 1 insertions(+), 379 deletions(-) [+] |
line wrap: on
line diff
--- a/Makefile Tue Jun 13 17:16:03 2017 +0100 +++ b/Makefile Wed Jun 14 11:27:50 2017 +0100 @@ -15,7 +15,7 @@ TEST_SRCS := test/main.cpp test/vamp-client/tst_PluginStub.cpp TEST_OBJS := $(TEST_SRCS:.cpp=.o) -all: bin bin/piper-convert bin/piper-vamp-simple-server bin/piper-vamp-stub-generator bin/test-suite +all: bin bin/piper-convert bin/piper-vamp-simple-server bin/test-suite bin: mkdir bin @@ -26,9 +26,6 @@ bin/piper-vamp-simple-server: vamp-server/simple-server.o $(COMMON_OBJS) c++ $(CXXFLAGS) $^ -o $@ $(LDFLAGS) -bin/piper-vamp-stub-generator: vamp-stubber/stubber.o $(COMMON_OBJS) - c++ $(CXXFLAGS) $^ -o $@ $(LDFLAGS) - bin/test-suite: $(TEST_OBJS) c++ $(CXXFLAGS) $^ -o $@ $(LDFLAGS) bin/test-suite @@ -101,23 +98,6 @@ vamp-server/simple-server.o: vamp-support/DefaultPluginOutputIdMapper.h vamp-server/simple-server.o: vamp-support/LoaderRequests.h vamp-server/simple-server.o: vamp-support/RdfTypes.h -vamp-stubber/stubber.o: vamp-json/VampJson.h -vamp-stubber/stubber.o: vamp-support/StaticOutputDescriptor.h -vamp-stubber/stubber.o: vamp-support/PluginStaticData.h -vamp-stubber/stubber.o: vamp-support/StaticOutputDescriptor.h -vamp-stubber/stubber.o: vamp-support/PluginConfiguration.h -vamp-stubber/stubber.o: vamp-support/RequestResponse.h -vamp-stubber/stubber.o: vamp-support/PluginStaticData.h -vamp-stubber/stubber.o: vamp-support/PluginConfiguration.h -vamp-stubber/stubber.o: vamp-support/PluginHandleMapper.h -vamp-stubber/stubber.o: vamp-support/PluginOutputIdMapper.h -vamp-stubber/stubber.o: vamp-support/PluginOutputIdMapper.h -vamp-stubber/stubber.o: vamp-support/RequestResponseType.h -vamp-stubber/stubber.o: vamp-support/RequestOrResponse.h -vamp-stubber/stubber.o: vamp-support/RequestResponseType.h -vamp-stubber/stubber.o: vamp-support/RequestResponse.h -vamp-stubber/stubber.o: vamp-support/LoaderRequests.h vamp-support/RdfTypes.h -vamp-stubber/stubber.o: vamp-support/RdfTypes.h ext/json11/json11.o: ext/json11/json11.hpp ext/json11/test.o: ext/json11/json11.hpp test/vamp-client/tst_PluginStub.o: vamp-client/Loader.h
--- a/vamp-stubber/stubber.cpp Tue Jun 13 17:16:03 2017 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,358 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ -/* - Piper C++ - - An API for audio analysis and feature extraction plugins. - - Centre for Digital Music, Queen Mary, University of London. - Copyright 2006-2016 Chris Cannam and QMUL. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. -*/ - -#include "vamp-json/VampJson.h" -#include "vamp-support/RequestOrResponse.h" -#include "vamp-support/LoaderRequests.h" -#include "vamp-support/RdfTypes.h" - -#include <iostream> -#include <sstream> -#include <stdexcept> - -#include <map> -#include <set> - -// for _setmode stuff and _dup -#ifdef _WIN32 -#include <io.h> -#include <fcntl.h> -#endif - -// for dup, open etc -#ifndef _WIN32 -#include <fcntl.h> -#include <unistd.h> -#endif - -using namespace std; -using namespace json11; -using namespace piper_vamp; -using namespace Vamp; - -static string myname = "piper-vamp-simple-server"; - -static void version() -{ - cout << "1.0" << endl; - exit(0); -} - -static void usage(bool successful = false) -{ - cerr << "\n" << myname << - ": Emit stub version of main code\nfor a Piper Adapter implementation of a Vamp plugin library\n\n" - " Usage: " << myname << " [-d] <libname>\n" - " " << myname << " -v\n" - " " << myname << " -h\n\n" - " where\n" - " <libname>: the Vamp plugin library name to emit stub conversion code for\n" - " -v: print version number to stdout and exit\n" - " -h: print this text to stderr and exit\n\n"; - if (successful) exit(0); - else exit(2); -} - -// We write our output to stdout, but want to ensure that the plugin -// doesn't write anything itself. To do this we open a null file -// descriptor and dup2() it into place of stdout in the gaps between -// our own output activity. - -static int normalFd = -1; -static int suspendedFd = -1; - -static void initFds(bool binary) -{ -#ifdef _WIN32 - if (binary) { - int result = _setmode(0, _O_BINARY); - if (result == -1) { - throw runtime_error("Failed to set binary mode on stdin"); - } - result = _setmode(1, _O_BINARY); - if (result == -1) { - throw runtime_error("Failed to set binary mode on stdout"); - } - } - normalFd = _dup(1); - suspendedFd = _open("NUL", _O_WRONLY); -#else - (void)binary; - normalFd = dup(1); - suspendedFd = open("/dev/null", O_WRONLY); -#endif - - if (normalFd < 0 || suspendedFd < 0) { - throw runtime_error("Failed to initialise fds for stdio suspend/resume"); - } -} - -static void suspendOutput() -{ -#ifdef _WIN32 - _dup2(suspendedFd, 1); -#else - dup2(suspendedFd, 1); -#endif -} - -static void resumeOutput() -{ -#ifdef _WIN32 - _dup2(normalFd, 1); -#else - dup2(normalFd, 1); -#endif -} - -ListResponse -makeRequest(string libname) -{ - ListRequest req; - req.from.push_back(libname); - return LoaderRequests().listPluginData(req); -} - -struct PlausibleMetadata -{ - string className; - string adapterName; -}; - -PlausibleMetadata -inventPlausibleMetadata(string key) -{ - string className, adapterName; - bool initial = true, interCap = false; - - int idIdx = 0; - for (int i = 0; i < int(key.size()); ++i) { - char c = key[i]; - if (c == ':') { - idIdx = i + 1; - break; - } - } - - for (int i = idIdx; i < int(key.size()); ++i) { - char c = key[i]; - if (isalpha(c)) { - if (initial || interCap) { - className += toupper(c); - } else { - className += c; - } - if (interCap) { - adapterName += toupper(c); - } else { - adapterName += c; - } - interCap = false; - } else { - interCap = true; - } - initial = false; - } - adapterName += "Adapter"; - - PlausibleMetadata pm; - pm.className = className; - pm.adapterName = adapterName; - return pm; -} - -void -emitFor(string libname, const ListResponse &resp) -{ - // The same plugin key may appear more than once in the available - // list, if the same plugin is installed in more than one location - // on the Vamp path. To avoid emitting its wrapper definition - // multiple times, we need to keep a record of which ones we've - // emitted for each stage - set<string> emitted; - - cout << - "\n#include \"PiperExport.h\"\n" - "\n" - "// !!! The following #include(s) are guesses. Replace them with the\n" - "// real header files in which your plugin classes are defined.\n" - "//\n"; - - for (const auto &plugin: resp.available) { - - string key = plugin.pluginKey; - if (emitted.find(key) != emitted.end()) { - continue; - } - - PlausibleMetadata pm = inventPlausibleMetadata(key); - - cout << "#include \"" << pm.className << ".h\"\n"; - - emitted.insert(key); - } - - cout << - "\n" - "using piper_vamp_js::PiperAdapter;\n" - "using piper_vamp_js::PiperPluginLibrary;\n" - "\n" - "static std::string libname(\"" << libname << "\");\n" - "\n"; - - emitted.clear(); - for (const auto &plugin: resp.available) { - - string key = plugin.pluginKey; - if (emitted.find(key) != emitted.end()) { - continue; - } - - PlausibleMetadata pm = inventPlausibleMetadata(key); - cout << "// !!! Replace " << pm.className << " in the following line with the real\n" - "// name of the class implementing the \"" << plugin.basic.identifier << "\" plugin.\n" - "//\n"; - cout << "static PiperAdapter<" - << pm.className - << ">\n" << pm.adapterName - << "(\n libname,\n "; - - string catString = "{ "; - bool first = true; - for (auto c: plugin.category) { - if (!first) catString += ", "; - catString += "\"" + c + "\""; - first = false; - } - catString += " }"; - cout << catString << ",\n "; - - cout << "{\n "; - first = true; - for (auto o: plugin.basicOutputInfo) { - if (!first) { - cout << ",\n "; - } - cout << " "; - string outputId = o.identifier; - cout << "{ \"" << outputId << "\",\n { \""; - if (plugin.staticOutputInfo.find(outputId) != - plugin.staticOutputInfo.end()) { - cout << plugin.staticOutputInfo.at(outputId).typeURI; - } - cout << "\" }\n }"; - first = false; - } - cout << "\n }\n"; - cout << " );\n\n"; - emitted.insert(key); - } - - cout << "static PiperPluginLibrary library({\n "; - emitted.clear(); - for (const auto &plugin: resp.available) { - - string key = plugin.pluginKey; - if (emitted.find(key) != emitted.end()) { - continue; - } - - PlausibleMetadata pm = inventPlausibleMetadata(key); - if (!emitted.empty()) { - cout << ",\n "; - } - cout << "&" << pm.adapterName; - emitted.insert(key); - } - cout << "\n});\n\n"; - cout << "PIPER_EXPORT_LIBRARY(library);\n" << endl; -} - -int main(int argc, char **argv) -{ - if (argc != 2 && argc != 3) { - usage(); - } - - string arg = argv[1]; - if (arg == "-h") { - if (argc == 2) { - usage(true); - } else { - usage(); - } - } else if (arg == "-v") { - if (argc == 2) { - version(); - } else { - usage(); - } - } - - string libname = arg; - - auto li = libname.rfind('.'); - if (li != std::string::npos) { - cerr << "NOTE: library name is to be specified without extension, dropping \"" << libname.substr(li) << "\"" << endl; - libname = libname.substr(0, li); - } - - try { - initFds(false); - } catch (exception &e) { - cerr << "ERROR: " << e.what() << endl; - exit(1); - } - - suspendOutput(); - - ListResponse resp = makeRequest(libname); - - resumeOutput(); - - if (resp.available.empty()) { - cerr << "ERROR: No plugin(s) found in library named \"" - << libname << "\"\nCheck that the library name is correct and the right files are in $VAMP_PATH.\nThat would mean either " - << libname << ".so, " << libname << ".dll, or " << libname - << ".dylib (depending on your platform), as well as " - << libname << ".n3 and " << libname << ".cat." - << endl; - exit(1); - } - - emitFor(libname, resp); - - exit(0); -}