/* This file is part of Ingen. Copyright 2007-2017 David Robillard 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 . */ #ifndef INGEN_ENGINEBASE_HPP #define INGEN_ENGINEBASE_HPP #include "ingen/ingen.h" #include #include #include #include namespace ingen { class Interface; /** The audio engine which executes the graph. @ingroup Ingen */ class INGEN_API EngineBase { public: virtual ~EngineBase() = default; /** 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; /** Return true iff the engine and driver supports dynamic ports. This returns false in situations where top level ports can not be created once the driver is running, which is the case for most environments outside Jack. */ virtual bool supports_dynamic_ports() const = 0; /** Activate the engine. */ virtual bool activate() = 0; /** Deactivate the engine. */ virtual void deactivate() = 0; /** Begin listening on network sockets. */ virtual void listen() = 0; /** Return true iff events are waiting to be processed. */ virtual bool pending_events() const = 0; /** Flush any pending events. This function is only safe to call in sequential contexts, and runs both process thread and main iterations in lock-step. @param sleep_ms Interval in milliseconds to sleep between each block. */ virtual void flush_events(const std::chrono::milliseconds& sleep_ms) = 0; /** Advance audio time by the given number of frames. */ virtual void advance(uint32_t nframes) = 0; /** Locate to a given audio position. */ virtual void locate(uint32_t start, uint32_t sample_count) = 0; /** Process audio for `sample_count` frames. If the return value is non-zero, events have been processed and are awaiting to be finalised (including responding and announcing any changes to clients) via a call to main_iteration(). @return The number of events processed. */ virtual unsigned run(uint32_t sample_count) = 0; /** Indicate that a quit is desired. This function simply sets a flag which affects the return value of main_iteration, it does not actually force the engine to stop running or block. The code driving the engine is responsible for stopping and cleaning up when main_iteration returns false. */ virtual void quit() = 0; /** Run a single iteration of the main context. The main context post-processes events and performs housekeeping duties like collecting garbage. This should be called regularly, e.g. a few times per second. The return value indicates whether execution should continue; i.e. if false is returned, a quit has been requested and the caller should cease calling main_iteration() and stop the engine. */ virtual bool main_iteration() = 0; /** Register a client to receive updates about engine changes. */ virtual void register_client(const std::shared_ptr& client) = 0; /** Unregister a client. */ virtual bool unregister_client(const std::shared_ptr& client) = 0; }; } // namespace ingen #endif // INGEN_ENGINEBASE_HPP