diff options
-rw-r--r-- | drumgizmo/Makefile.am | 7 | ||||
-rw-r--r-- | drumgizmo/drumgizmoc.cc | 6 | ||||
-rw-r--r-- | drumgizmo/enginefactory.cc | 16 | ||||
-rw-r--r-- | drumgizmo/enginefactory.h | 8 | ||||
-rw-r--r-- | drumgizmo/input/jackmidi/jackmidi.cc | 2 | ||||
-rw-r--r-- | drumgizmo/jackclient.cc | 112 | ||||
-rw-r--r-- | drumgizmo/jackclient.h | 72 | ||||
-rw-r--r-- | drumgizmo/output/jackaudio/jackaudio.cc | 2 |
8 files changed, 136 insertions, 89 deletions
diff --git a/drumgizmo/Makefile.am b/drumgizmo/Makefile.am index bdf36c4..4eb770c 100644 --- a/drumgizmo/Makefile.am +++ b/drumgizmo/Makefile.am @@ -58,6 +58,13 @@ drumgizmo_SOURCES += output/alsa.cc drumgizmo_CXXFLAGS += -DHAVE_OUTPUT_ALSA endif # HAVE_OUTPUT_ALSA +if HAVE_OUTPUT_JACKAUDIO +drumgizmo_CXXFLAGS += $(JACK_CFLAGS) +drumgizmo_LDFLAGS += $(JACK_LIBS) +drumgizmo_SOURCES += output/jackaudio.cc +drumgizmo_CXXFLAGS += -DHAVE_OUTPUT_JACKAUDIO +endif # HAVE_OUTPUT_JACKAUDIO + EXTRA_DIST = \ drumgizmoc.h \ jackclient.h \ diff --git a/drumgizmo/drumgizmoc.cc b/drumgizmo/drumgizmoc.cc index 978b0cc..14ebe64 100644 --- a/drumgizmo/drumgizmoc.cc +++ b/drumgizmo/drumgizmoc.cc @@ -226,7 +226,9 @@ int CliMain::run(int argc, char *argv[]) return 1; } - auto ie = createInputEngine(inputengine); + JackClientPtr client{nullptr}; + + auto ie = createInputEngine(client, inputengine); if(ie == NULL) { printf("Invalid input engine: %s\n", inputengine.c_str()); @@ -265,7 +267,7 @@ int CliMain::run(int argc, char *argv[]) return 1; } - auto oe = createOutputEngine(outputengine); + auto oe = createOutputEngine(client, outputengine); if(oe == NULL) { printf("Invalid output engine: %s\n", outputengine.c_str()); diff --git a/drumgizmo/enginefactory.cc b/drumgizmo/enginefactory.cc index c9f2ef3..8c40a28 100644 --- a/drumgizmo/enginefactory.cc +++ b/drumgizmo/enginefactory.cc @@ -49,7 +49,11 @@ #include "output/alsa.h" #endif -InputEnginePtr createInputEngine(std::string const & name) { +#ifdef HAVE_OUTPUT_JACKAUDIO +#include "output/jackaudio.h" +#endif + +InputEnginePtr createInputEngine(JackClientPtr& jack, std::string const & name) { #ifdef HAVE_INPUT_DUMMY if (name == "dummy") { return std::make_unique<DummyInputEngine>(); @@ -67,7 +71,7 @@ InputEnginePtr createInputEngine(std::string const & name) { return nullptr; } -OutputEnginePtr createOutputEngine(std::string const & name) { +OutputEnginePtr createOutputEngine(JackClientPtr& jack, std::string const & name) { #ifdef HAVE_OUTPUT_DUMMY if (name == "dummy") { return std::make_unique<DummyOutputEngine>(); @@ -83,6 +87,14 @@ OutputEnginePtr createOutputEngine(std::string const & name) { return std::make_unique<AlsaOutputEngine>(); } #endif +#ifdef HAVE_OUTPUT_JACKAUDIO + if (name == "jackaudio") { + if (jack.get() == nullptr) { + jack = std::make_unique<JackClient>(); + } + return std::make_unique<JackaudioOutputEngine>(*jack); + } +#endif // todo: add more engines diff --git a/drumgizmo/enginefactory.h b/drumgizmo/enginefactory.h index 613e49f..93ce67b 100644 --- a/drumgizmo/enginefactory.h +++ b/drumgizmo/enginefactory.h @@ -31,8 +31,12 @@ #include "audioinputengine.h" #include "audiooutputengine.h" +// todo: ifdef jack enabled +#include "jackclient.h" + +using JackClientPtr = std::unique_ptr<JackClient>; using InputEnginePtr = std::unique_ptr<AudioInputEngine>; using OutputEnginePtr = std::unique_ptr<AudioOutputEngine>; -InputEnginePtr createInputEngine(std::string const & name); -OutputEnginePtr createOutputEngine(std::string const & name); +InputEnginePtr createInputEngine(JackClientPtr& jack, std::string const & name); +OutputEnginePtr createOutputEngine(JackClientPtr& jack, std::string const & name); diff --git a/drumgizmo/input/jackmidi/jackmidi.cc b/drumgizmo/input/jackmidi/jackmidi.cc index a6b49b7..e632484 100644 --- a/drumgizmo/input/jackmidi/jackmidi.cc +++ b/drumgizmo/input/jackmidi/jackmidi.cc @@ -24,6 +24,7 @@ * along with DrumGizmo; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +/* #include <stdlib.h> #include <event.h> @@ -231,6 +232,7 @@ extern "C" { jackmidi->post(); } } +*/ #ifdef TEST_AUDIOINPUTENGINEJACKMIDI //Additional dependency files diff --git a/drumgizmo/jackclient.cc b/drumgizmo/jackclient.cc index e4af141..8d422cb 100644 --- a/drumgizmo/jackclient.cc +++ b/drumgizmo/jackclient.cc @@ -24,77 +24,85 @@ * along with DrumGizmo; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#include "jackclient.h" +#include <cassert> -extern "C" -{ - int _wrap_jack_process(jack_nframes_t nframes, void *arg){ - return ((JackClient*)arg)->process(nframes);} -} // extern "C" +#include "jackclient.h" -JackClient::JackClient() - : refcnt(0) -{ - jack_status_t status; +JackProcess::~JackProcess() { +} - jack_client = jack_client_open("DrumGizmo", JackNullOption, &status); +// -------------------------------------------------------------------- - jack_set_process_callback(jack_client, _wrap_jack_process, this); +JackChannel::JackChannel() + : samples{} + , client{nullptr} + , port{nullptr} { +} - active = false; +JackChannel::JackChannel(JackClient& client, std::size_t buffer_size, + std::string const & name) + : samples{} + , client{client.client} + // register jack port for given client + , port{jack_port_register(this->client, name.c_str(), + JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0)} { + samples.resize(buffer_size); } -JackClient::~JackClient() -{ - jack_client_close(jack_client); +JackChannel::~JackChannel() { + if (port != nullptr) { + assert(client != nullptr); + jack_port_unregister(client, port); + } } -/* -void JackClient::addJackProcess(JackProcess *process) -{ - jack_processes.insert(process); +// -------------------------------------------------------------------- + +int _wrap_jack_process(jack_nframes_t nframes, void* arg){ + return static_cast<JackClient*>(arg)->process(nframes); } -*/ -void JackClient::removeJackProcess(JackProcess *process) -{ - jack_processes.erase(process); +JackClient::JackClient() + : client{nullptr} + , processes{} + , is_active{false} { + jack_status_t status; + client = jack_client_open("DrumGizmo", JackNullOption, &status); + jack_set_process_callback(client, _wrap_jack_process, this); } -void JackClient::activate() -{ - if(!active) jack_activate(jack_client); - active = true; +JackClient::~JackClient() { + if (client != nullptr) { + jack_client_close(client); + } } -int JackClient::process(jack_nframes_t nframes) -{ - std::set<JackProcess *>::iterator i = jack_processes.begin(); - while(i != jack_processes.end()) { - JackProcess *jp = *i; - jp->jack_process(nframes); - i++; - } +void JackClient::add(JackProcess& process) { + processes.insert(&process); +} - return 0; +void JackClient::remove(JackProcess& process) { + processes.erase(&process); } -JackClient *jackclient = NULL; +void JackClient::activate() { + if (!is_active) { + jack_activate(client); + } + is_active = true; +} -JackClient *init_jack_client() -{ - if(jackclient == NULL) jackclient = new JackClient(); - jackclient->refcnt++; - return jackclient; +int JackClient::process(jack_nframes_t num_frames) { + for (auto& ptr: processes) { + ptr->process(num_frames); + } + return 0; +} +std::size_t JackClient::getBufferSize() const { + return jack_get_buffer_size(client); } -void close_jack_client() -{ - if(jackclient) { - jackclient->refcnt--; - if(jackclient->refcnt == 0) { - delete jackclient; - jackclient = NULL; - } - } + +std::size_t JackClient::getSampleRate() const { + return jack_get_sample_rate(client); } diff --git a/drumgizmo/jackclient.h b/drumgizmo/jackclient.h index f093220..ef7abf1 100644 --- a/drumgizmo/jackclient.h +++ b/drumgizmo/jackclient.h @@ -24,44 +24,54 @@ * along with DrumGizmo; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#ifndef __DRUMGIZMO_JACKCLIENT_H__ -#define __DRUMGIZMO_JACKCLIENT_H__ - -#include <jack/jack.h> +#pragma once +#include <vector> +#include <string> #include <set> -class JackProcess { -public: - virtual ~JackProcess() {} - virtual void jack_process(jack_nframes_t nframes) = 0; -}; - -class JackClient { -public: - JackClient(); - ~JackClient(); - - void addJackProcess(JackProcess *process) - { - jack_processes.insert(process); - } +#include <jack/jack.h> - void removeJackProcess(JackProcess *process); +#include <audiotypes.h> - void activate(); - int process(jack_nframes_t nframes); +class JackClient; - jack_client_t *jack_client; +class JackProcess { + public: + virtual ~JackProcess(); + virtual void process(jack_nframes_t num_frames) = 0; +}; - // Sort of private... - int refcnt; +// -------------------------------------------------------------------- -private: - std::set<JackProcess *> jack_processes; - bool active; +struct JackChannel { + std::vector<sample_t> samples; + jack_client_t* const client; + jack_port_t* const port; + + JackChannel(); + JackChannel(JackClient& client, std::size_t buffer_size, + std::string const & name); + ~JackChannel(); }; -JackClient *init_jack_client(); -void close_jack_client(); +// -------------------------------------------------------------------- -#endif/*__DRUMGIZMO_JACKCLIENT_H__*/ +class JackClient { + friend struct JackChannel; + + public: + JackClient(); + ~JackClient(); + + void add(JackProcess& process); + void remove(JackProcess& process); + void activate(); + int process(jack_nframes_t num_frames); + std::size_t getBufferSize() const; + std::size_t getSampleRate() const; + + private: + jack_client_t* client; + std::set<JackProcess*> processes; + bool is_active; +}; diff --git a/drumgizmo/output/jackaudio/jackaudio.cc b/drumgizmo/output/jackaudio/jackaudio.cc index 511c145..3e489a9 100644 --- a/drumgizmo/output/jackaudio/jackaudio.cc +++ b/drumgizmo/output/jackaudio/jackaudio.cc @@ -24,6 +24,7 @@ * along with DrumGizmo; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +/* #include <stdlib.h> #include <string> @@ -218,3 +219,4 @@ extern "C" { return jack->samplerate(); } } +*/ |