bool (*available)();
};
+/** AudioBackend is an high-level abstraction for interacting with the operating system's
+ * audio and midi I/O.
+ */
class LIBARDOUR_API AudioBackend : public PortEngine {
public:
*/
virtual bool use_separate_input_and_output_devices () const { return false; }
+ /* Return true if the backend uses separate I/O devices only for the case
+ * of allowing one to be "None".
+ *
+ * ie. Input Device must match Output Device, except if either of them
+ * is get_standard_device_name (DeviceNone).
+ */
+ virtual bool match_input_output_devices_or_none () const { return false; }
+
/** Returns a collection of DeviceStatuses identifying devices discovered
* by this backend since the start of the process.
*
virtual std::vector<DeviceStatus> enumerate_output_devices () const
{ return std::vector<DeviceStatus>(); }
+
+ /** An interface to set buffers/period for playback latency.
+ * useful for ALSA or JACK/ALSA on Linux.
+ *
+ * @return true if the backend supports period-size configuration
+ */
+ virtual bool can_set_period_size () const { return false; }
+
+ /** Returns a vector of supported period-sizes for the given driver */
+ virtual std::vector<uint32_t> available_period_sizes (const std::string& driver) const { return std::vector<uint32_t>(); }
+
+ /** Set the period size to be used.
+ * must be called before starting the backend.
+ */
+ virtual int set_peridod_size (uint32_t) { return -1; }
+
/**
* @return true if backend supports requesting an update to the device list
* and any cached properties associated with the devices.
*/
virtual bool update_devices () { return false; }
+ /**
+ * @return true if backend supports a blocking or buffered mode, false by
+ * default unless implemented by a derived class.
+ */
+ virtual bool can_use_buffered_io () { return false; }
+
+ /**
+ * Set the backend to use a blocking or buffered I/O mode
+ */
+ virtual void set_use_buffered_io (bool) { }
+
+ /**
+ * @return Set the backend to use a blocking or buffered I/O mode, false by
+ * default unless implemented by a derived class.
+ */
+ virtual bool get_use_buffered_io () { return false; }
+
/** Returns a collection of float identifying sample rates that are
* potentially usable with the hardware identified by @param device.
* Any of these values may be supplied in other calls to this backend
*/
virtual bool can_change_buffer_size_when_running () const = 0;
+ /** return true if the backend can measure and update
+ * systemic latencies without restart.
+ */
+ virtual bool can_change_systemic_latency_when_running () const { return false; }
+
/* Set the hardware parameters.
*
* If called when the current state is stopped or paused,
virtual uint32_t systemic_output_latency () const = 0;
virtual uint32_t systemic_midi_input_latency (std::string const) const = 0;
virtual uint32_t systemic_midi_output_latency (std::string const) const = 0;
+ virtual uint32_t period_size () const { return 0; }
/** override this if this implementation returns true from
* requires_driver_selection()