# HG changeset patch # User František Kučera # Date 1601404870 -7200 # Node ID 7f3ab657dc50eacabd360e5aa2017796b15ce95e # Parent 3bc3b33ccb02ac80af48de43b6c577a9ed2565b4 link to the JACK library, connect to the JACK daemon diff -r 3bc3b33ccb02 -r 7f3ab657dc50 src/CMakeLists.txt --- a/src/CMakeLists.txt Tue Sep 29 20:10:29 2020 +0200 +++ b/src/CMakeLists.txt Tue Sep 29 20:41:10 2020 +0200 @@ -17,7 +17,7 @@ # Relpipe libraries: INCLUDE(FindPkgConfig) -pkg_check_modules (RELPIPE_LIBS relpipe-lib-reader.cpp relpipe-lib-cli.cpp) +pkg_check_modules (RELPIPE_LIBS relpipe-lib-reader.cpp relpipe-lib-cli.cpp jack) include_directories(${RELPIPE_LIBS_INCLUDE_DIRS}) link_directories(${RELPIPE_LIBS_LIBRARY_DIRS}) diff -r 3bc3b33ccb02 -r 7f3ab657dc50 src/JackHandler.h --- a/src/JackHandler.h Tue Sep 29 20:10:29 2020 +0200 +++ b/src/JackHandler.h Tue Sep 29 20:41:10 2020 +0200 @@ -23,6 +23,11 @@ #include #include #include +#include + +#include +#include +#include #include #include @@ -40,9 +45,30 @@ private: Configuration& configuration; std::wstring_convert> convertor; // TODO: local system encoding + + jack_client_t* jackClient = nullptr; + jack_port_t* jackPort = nullptr; + //jack_ringbuffer_t* ringBuffer = nullptr; public: JackHandler(Configuration& configuration) : configuration(configuration) { + // Initialize JACK connection: + std::string clientName = "relpipe-out-jack"; + jackClient = jack_client_open(clientName.c_str(), JackNullOption, nullptr); + if (jackClient == nullptr) throw JackException(L"Could not create JACK client."); + + //ringBuffer = jack_ringbuffer_create(RING_BUFFER_SIZE * sizeof (MidiMessage)); + + //jack_set_process_callback(jackClient, relpipe::in::jack::enqueueMessage, this); + // TODO: report also other events (connections etc.) + + jackPort = jack_port_register(jackClient, "output", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0); + if (jackPort == nullptr) throw JackException(L"Could not register port."); + + if (mlockall(MCL_CURRENT | MCL_FUTURE)) fwprintf(stderr, L"Warning: Can not lock memory.\n"); + + int jackError = jack_activate(jackClient); + if (jackError) throw JackException(L"Could not activate client."); } void startRelation(const relpipe::common::type::StringX name, std::vector attributes) override { @@ -57,6 +83,13 @@ } + virtual ~JackHandler() { + // Close JACK connection: + jack_deactivate(jackClient); + jack_client_close(jackClient); + //jack_ringbuffer_free(ringBuffer); + } + }; }