summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2017-03-20 20:37:06 +0100
committerDavid Robillard <d@drobilla.net>2017-03-20 20:37:06 +0100
commit7e58577eb0474f304defeff0400e84477a7e88d5 (patch)
tree7f3a27d927b53b9a0af9c0fab8d4440613422b25
parent1453cdcceedf1f368b6a0835e84c33f7c3d0f09f (diff)
downloadingen-7e58577eb0474f304defeff0400e84477a7e88d5.tar.gz
ingen-7e58577eb0474f304defeff0400e84477a7e88d5.tar.bz2
ingen-7e58577eb0474f304defeff0400e84477a7e88d5.zip
Revert removal of DirectDriver and fix test suite
-rw-r--r--ingen/EngineBase.hpp10
-rw-r--r--src/server/DirectDriver.hpp108
-rw-r--r--src/server/Engine.cpp7
-rw-r--r--src/server/Engine.hpp1
4 files changed, 126 insertions, 0 deletions
diff --git a/ingen/EngineBase.hpp b/ingen/EngineBase.hpp
index c52ee559..a57743fe 100644
--- a/ingen/EngineBase.hpp
+++ b/ingen/EngineBase.hpp
@@ -39,6 +39,16 @@ public:
virtual ~EngineBase() {}
/**
+ Initialise the engine for local use (e.g. without a Jack driver).
+ @param sample_rate Audio sampling rate in Hz.
+ @param block_length Audio block length (i.e. buffer size) in frames.
+ @param seq_size Sequence buffer size in bytes.
+ */
+ virtual void init(double sample_rate,
+ uint32_t block_length,
+ size_t seq_size) = 0;
+
+ /**
Activate the engine.
*/
virtual bool activate() = 0;
diff --git a/src/server/DirectDriver.hpp b/src/server/DirectDriver.hpp
new file mode 100644
index 00000000..706adda8
--- /dev/null
+++ b/src/server/DirectDriver.hpp
@@ -0,0 +1,108 @@
+/*
+ This file is part of Ingen.
+ Copyright 2007-2017 David Robillard <http://drobilla.net/>
+
+ Ingen is free software: you can redistribute it and/or modify it under the
+ terms of the GNU Affero General Public License as published by the Free
+ Software Foundation, either version 3 of the License, or any later version.
+
+ Ingen 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 Affero General Public License for details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with Ingen. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef INGEN_ENGINE_DIRECT_DRIVER_HPP
+#define INGEN_ENGINE_DIRECT_DRIVER_HPP
+
+#include <boost/intrusive/slist.hpp>
+
+#include "Driver.hpp"
+#include "Engine.hpp"
+
+namespace Ingen {
+namespace Server {
+
+/** Driver for running Ingen directly as a library.
+ * \ingroup engine
+ */
+class DirectDriver : public Driver {
+public:
+ DirectDriver(Engine& engine,
+ double sample_rate,
+ SampleCount block_length,
+ size_t seq_size)
+ : _engine(engine)
+ , _sample_rate(sample_rate)
+ , _block_length(block_length)
+ , _seq_size(seq_size)
+ {}
+
+ virtual ~DirectDriver() {
+ _ports.clear_and_dispose([](EnginePort* p) { delete p; });
+ }
+
+ bool dynamic_ports() const { return true; }
+
+ virtual EnginePort* create_port(DuplexPort* graph_port) {
+ return new EnginePort(graph_port);
+ }
+
+ virtual EnginePort* get_port(const Raul::Path& path) {
+ for (auto& p : _ports) {
+ if (p.graph_port()->path() == path) {
+ return &p;
+ }
+ }
+
+ return NULL;
+ }
+
+ virtual void add_port(RunContext& context, EnginePort* port) {
+ _ports.push_back(*port);
+ }
+
+ virtual void remove_port(RunContext& context, EnginePort* port) {
+ _ports.erase(_ports.iterator_to(*port));
+ }
+
+ virtual void rename_port(const Raul::Path& old_path,
+ const Raul::Path& new_path) {}
+
+ virtual void port_property(const Raul::Path& path,
+ const Raul::URI& uri,
+ const Atom& value) {}
+
+ virtual void register_port(EnginePort& port) {}
+ virtual void unregister_port(EnginePort& port) {}
+
+ virtual SampleCount block_length() const { return _block_length; }
+
+ virtual size_t seq_size() const { return _seq_size; }
+
+ virtual SampleCount sample_rate() const { return _sample_rate; }
+
+ virtual SampleCount frame_time() const { return _engine.run_context().start(); }
+
+ virtual void append_time_events(RunContext& context, Buffer& buffer) {}
+
+ virtual int real_time_priority() { return 60; }
+
+private:
+ typedef boost::intrusive::slist<EnginePort,
+ boost::intrusive::cache_last<true>
+ > Ports;
+
+ Engine& _engine;
+ Ports _ports;
+ SampleCount _sample_rate;
+ SampleCount _block_length;
+ size_t _seq_size;
+};
+
+} // namespace Server
+} // namespace Ingen
+
+#endif // INGEN_ENGINE_DIRECT_DRIVER_HPP
diff --git a/src/server/Engine.cpp b/src/server/Engine.cpp
index 9a7f9e54..5f5c53d0 100644
--- a/src/server/Engine.cpp
+++ b/src/server/Engine.cpp
@@ -40,6 +40,7 @@
#include "Broadcaster.hpp"
#include "BufferFactory.hpp"
#include "ControlBindings.hpp"
+#include "DirectDriver.hpp"
#include "Driver.hpp"
#include "Engine.hpp"
#include "Event.hpp"
@@ -392,6 +393,12 @@ Engine::reset_load()
_reset_load_flag = true;
}
+void
+Engine::init(double sample_rate, uint32_t block_length, size_t seq_size)
+{
+ set_driver(SPtr<Driver>(new DirectDriver(*this, sample_rate, block_length, seq_size)));
+}
+
bool
Engine::activate()
{
diff --git a/src/server/Engine.hpp b/src/server/Engine.hpp
index 96648afe..ab69586c 100644
--- a/src/server/Engine.hpp
+++ b/src/server/Engine.hpp
@@ -76,6 +76,7 @@ public:
virtual ~Engine();
// EngineBase methods
+ virtual void init(double sample_rate, uint32_t block_length, size_t seq_size);
virtual bool activate();
virtual void deactivate();
virtual bool pending_events();