Ardour  9.0-pre0-582-g084a23a80d
ARDOUR::AudioBackend Class Referenceabstract

#include <audio_backend.h>

Inheritance diagram for ARDOUR::AudioBackend:
[legend]

Classes

struct  DeviceStatus
 

Public Types

enum  ErrorCode {
  NoError = 0 , BackendInitializationError = -64 , BackendDeinitializationError , BackendReinitializationError ,
  AudioDeviceOpenError , AudioDeviceCloseError , AudioDeviceInvalidError , AudioDeviceNotAvailableError ,
  AudioDeviceNotConnectedError , AudioDeviceReservationError , AudioDeviceIOError , MidiDeviceOpenError ,
  MidiDeviceCloseError , MidiDeviceNotAvailableError , MidiDeviceNotConnectedError , MidiDeviceIOError ,
  SampleFormatNotSupportedError , SampleRateNotSupportedError , RequestedInputLatencyNotSupportedError , RequestedOutputLatencyNotSupportedError ,
  PeriodSizeNotSupportedError , PeriodCountNotSupportedError , DeviceConfigurationNotSupportedError , ChannelCountNotSupportedError ,
  InputChannelCountNotSupportedError , OutputChannelCountNotSupportedError , AquireRealtimePermissionError , SettingAudioThreadPriorityError ,
  SettingMIDIThreadPriorityError , ProcessThreadStartError , FreewheelThreadStartError , PortRegistrationError ,
  PortReconnectError , OutOfMemoryError
}
 
enum  StandardDeviceName { DeviceNone , DeviceDefault }
 
enum  TimingTypes { DeviceWait = 0 , RunLoop , NTT }
 
- Public Types inherited from ARDOUR::PortEngine
typedef std::shared_ptr< ProtoPortPortPtr
 
typedef PortPtr const & PortHandle
 

Public Member Functions

 AudioBackend (AudioEngine &e, AudioBackendInfo &i)
 
virtual ~AudioBackend ()
 
AudioBackendInfoinfo () const
 
virtual std::string name () const =0
 
virtual bool is_realtime () const =0
 
virtual bool is_jack () const
 
virtual int client_real_time_priority ()
 
virtual bool requires_driver_selection () const
 
virtual std::vector< std::string > enumerate_drivers () const
 
virtual int set_driver (const std::string &drivername)
 
virtual bool use_separate_input_and_output_devices () const
 
virtual bool match_input_output_devices_or_none () const
 
virtual std::vector< DeviceStatusenumerate_devices () const =0
 
virtual std::vector< DeviceStatusenumerate_input_devices () const
 
virtual std::vector< DeviceStatusenumerate_output_devices () const
 
virtual bool can_set_period_size () const
 
virtual std::vector< uint32_t > available_period_sizes (const std::string &driver, const std::string &device) const
 
virtual int set_peridod_size (uint32_t)
 
virtual bool can_request_update_devices ()
 
virtual bool update_devices ()
 
virtual bool can_use_buffered_io ()
 
virtual void set_use_buffered_io (bool)
 
virtual bool get_use_buffered_io ()
 
virtual std::vector< float > available_sample_rates (const std::string &device) const =0
 
virtual std::vector< float > available_sample_rates2 (const std::string &input_device, const std::string &output_device) const
 
virtual float default_sample_rate () const
 
virtual std::vector< uint32_t > available_buffer_sizes (const std::string &device) const =0
 
virtual std::vector< uint32_t > available_buffer_sizes2 (const std::string &input_device, const std::string &output_device) const
 
virtual uint32_t default_buffer_size (const std::string &device) const
 
virtual bool can_change_sample_rate_when_running () const =0
 
virtual bool can_change_buffer_size_when_running () const =0
 
virtual bool can_measure_systemic_latency () const =0
 
virtual bool can_change_systemic_latency_when_running () const
 
virtual int set_device_name (const std::string &)=0
 
virtual int set_input_device_name (const std::string &)
 
virtual int set_output_device_name (const std::string &)
 
virtual int drop_device ()
 
virtual int set_sample_rate (float)=0
 
virtual int set_buffer_size (uint32_t)=0
 
virtual int set_interleaved (bool yn)=0
 
virtual int set_systemic_input_latency (uint32_t)=0
 
virtual int set_systemic_output_latency (uint32_t)=0
 
virtual int set_systemic_midi_input_latency (std::string const, uint32_t)=0
 
virtual int set_systemic_midi_output_latency (std::string const, uint32_t)=0
 
virtual std::string device_name () const =0
 
virtual std::string input_device_name () const
 
virtual std::string output_device_name () const
 
virtual float sample_rate () const =0
 
virtual uint32_t buffer_size () const =0
 
virtual bool interleaved () const =0
 
virtual uint32_t systemic_input_latency () const =0
 
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
 
virtual std::string driver_name () const
 
virtual std::string control_app_name () const =0
 
virtual void launch_control_app ()=0
 
virtual std::vector< std::string > enumerate_midi_options () const =0
 
virtual int set_midi_option (const std::string &option)=0
 
virtual std::string midi_option () const =0
 
virtual std::vector< DeviceStatusenumerate_midi_devices () const =0
 
virtual int set_midi_device_enabled (std::string const, bool)=0
 
virtual bool midi_device_enabled (std::string const) const =0
 
virtual bool can_set_systemic_midi_latencies () const =0
 
int start (bool for_latency_measurement=false)
 
virtual int stop ()=0
 
virtual int reset_device ()=0
 
virtual int freewheel (bool start_stop)=0
 
virtual float dsp_load () const =0
 
virtual void transport_start ()
 
virtual void transport_stop ()
 
virtual TransportState transport_state () const
 
virtual void transport_locate (samplepos_t pos)
 
virtual samplepos_t transport_sample () const
 
virtual int set_time_master (bool yn)
 
virtual int usecs_per_cycle () const
 
virtual size_t raw_buffer_size (DataType t)=0
 
virtual samplepos_t sample_time ()=0
 
virtual samplepos_t sample_time_at_cycle_start ()=0
 
virtual pframes_t samples_since_cycle_start ()=0
 
virtual bool get_sync_offset (pframes_t &offset) const
 
virtual int create_process_thread (std::function< void()> func)=0
 
virtual int join_process_threads ()=0
 
virtual bool in_process_thread ()=0
 
virtual uint32_t process_thread_count ()=0
 
virtual void update_latencies ()=0
 
virtual bool speed_and_position (double &speed, samplepos_t &position)
 
- Public Member Functions inherited from ARDOUR::PortEngine
 PortEngine (PortManager &pm)
 
virtual ~PortEngine ()
 
virtual void * private_handle () const =0
 
virtual const std::string & my_name () const =0
 
virtual uint32_t port_name_size () const =0
 
virtual int set_port_name (PortHandle port, const std::string &name)=0
 
virtual std::string get_port_name (PortHandle port) const =0
 
virtual PortFlags get_port_flags (PortHandle port) const =0
 
virtual int get_port_property (PortHandle, const std::string &key, std::string &value, std::string &type) const
 
virtual int set_port_property (PortHandle, const std::string &key, const std::string &value, const std::string &type)
 
virtual PortPtr get_port_by_name (const std::string &name) const =0
 
virtual int get_ports (const std::string &port_name_pattern, DataType type, PortFlags flags, std::vector< std::string > &ports) const =0
 
virtual DataType port_data_type (PortHandle port) const =0
 
virtual PortPtr register_port (const std::string &shortname, ARDOUR::DataType type, ARDOUR::PortFlags flags)=0
 
virtual void unregister_port (PortHandle port)=0
 
virtual int connect (const std::string &src, const std::string &dst)=0
 
virtual int disconnect (const std::string &src, const std::string &dst)=0
 
virtual int connect (PortHandle src, const std::string &dst)=0
 
virtual int disconnect (PortHandle src, const std::string &dst)=0
 
virtual int disconnect_all (PortHandle port)=0
 
virtual bool connected (PortHandle port, bool process_callback_safe=true)=0
 
virtual bool connected_to (PortHandle port, const std::string &name, bool process_callback_safe=true)=0
 
virtual bool physically_connected (PortHandle port, bool process_callback_safe=true)=0
 
virtual bool externally_connected (PortHandle port, bool process_callback_safe=true)
 
virtual int get_connections (PortHandle port, std::vector< std::string > &names, bool process_callback_safe=true)=0
 
virtual int midi_event_get (pframes_t &timestamp, size_t &size, uint8_t const **buf, void *port_buffer, uint32_t event_index)=0
 
virtual int midi_event_put (void *port_buffer, pframes_t timestamp, const uint8_t *buffer, size_t size)=0
 
virtual uint32_t get_midi_event_count (void *port_buffer)=0
 
virtual void midi_clear (void *port_buffer)=0
 
virtual bool can_monitor_input () const =0
 
virtual int request_input_monitoring (PortHandle port, bool yn)=0
 
virtual int ensure_input_monitoring (PortHandle port, bool yn)=0
 
virtual bool monitoring_input (PortHandle port)=0
 
virtual void set_latency_range (PortHandle port, bool for_playback, LatencyRange r)=0
 
virtual LatencyRange get_latency_range (PortHandle port, bool for_playback)=0
 
virtual bool port_is_physical (PortHandle port) const =0
 
virtual void get_physical_outputs (DataType type, std::vector< std::string > &names)=0
 
virtual void get_physical_inputs (DataType type, std::vector< std::string > &names)=0
 
virtual ChanCount n_physical_outputs () const =0
 
virtual ChanCount n_physical_inputs () const =0
 
virtual void * get_buffer (PortHandle port, pframes_t off)=0
 

Static Public Member Functions

static std::string get_error_string (ErrorCode)
 
static std::string get_standard_device_name (StandardDeviceName)
 
static size_t thread_stack_size ()
 

Public Attributes

PBD::TimingStats dsp_stats [NTT]
 

Protected Member Functions

virtual int _start (bool for_latency_measurement)=0
 

Protected Attributes

AudioBackendInfo_info
 
AudioEngineengine
 
- Protected Attributes inherited from ARDOUR::PortEngine
PortManagermanager
 

Detailed Description

AudioBackend is an high-level abstraction for interacting with the operating system's audio and midi I/O.

Definition at line 84 of file audio_backend.h.

Member Enumeration Documentation

◆ ErrorCode

Enumerator
NoError 
BackendInitializationError 
BackendDeinitializationError 
BackendReinitializationError 
AudioDeviceOpenError 
AudioDeviceCloseError 
AudioDeviceInvalidError 
AudioDeviceNotAvailableError 
AudioDeviceNotConnectedError 
AudioDeviceReservationError 
AudioDeviceIOError 
MidiDeviceOpenError 
MidiDeviceCloseError 
MidiDeviceNotAvailableError 
MidiDeviceNotConnectedError 
MidiDeviceIOError 
SampleFormatNotSupportedError 
SampleRateNotSupportedError 
RequestedInputLatencyNotSupportedError 
RequestedOutputLatencyNotSupportedError 
PeriodSizeNotSupportedError 
PeriodCountNotSupportedError 
DeviceConfigurationNotSupportedError 
ChannelCountNotSupportedError 
InputChannelCountNotSupportedError 
OutputChannelCountNotSupportedError 
AquireRealtimePermissionError 
SettingAudioThreadPriorityError 
SettingMIDIThreadPriorityError 
ProcessThreadStartError 
FreewheelThreadStartError 
PortRegistrationError 
PortReconnectError 
OutOfMemoryError 

Definition at line 95 of file audio_backend.h.

◆ StandardDeviceName

Enumerator
DeviceNone 
DeviceDefault 

Definition at line 134 of file audio_backend.h.

◆ TimingTypes

Enumerator
DeviceWait 
RunLoop 
NTT 

Definition at line 824 of file audio_backend.h.

Constructor & Destructor Documentation

◆ AudioBackend()

ARDOUR::AudioBackend::AudioBackend ( AudioEngine e,
AudioBackendInfo i 
)
inline

Definition at line 87 of file audio_backend.h.

◆ ~AudioBackend()

virtual ARDOUR::AudioBackend::~AudioBackend ( )
inlinevirtual

Definition at line 93 of file audio_backend.h.

Member Function Documentation

◆ _start()

virtual int ARDOUR::AudioBackend::_start ( bool  for_latency_measurement)
protectedpure virtual

◆ available_buffer_sizes()

virtual std::vector<uint32_t> ARDOUR::AudioBackend::available_buffer_sizes ( const std::string &  device) const
pure virtual

Returns a collection of uint32 identifying buffer sizes that are potentially usable with the hardware identified by device . Any of these values may be supplied in other calls to this backend as the desired buffer size to use with the name device, but the requested buffer size may turn out to be unavailable, or become invalid at any time.

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ available_buffer_sizes2()

virtual std::vector<uint32_t> ARDOUR::AudioBackend::available_buffer_sizes2 ( const std::string &  input_device,
const std::string &  output_device 
) const
inlinevirtual

Reimplemented in ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

Definition at line 390 of file audio_backend.h.

◆ available_period_sizes()

virtual std::vector<uint32_t> ARDOUR::AudioBackend::available_period_sizes ( const std::string &  driver,
const std::string &  device 
) const
inlinevirtual

Returns a vector of supported period-sizes for the given driver

Reimplemented in ARDOUR::JACKAudioBackend, and ARDOUR::AlsaAudioBackend.

Definition at line 286 of file audio_backend.h.

◆ available_sample_rates()

virtual std::vector<float> ARDOUR::AudioBackend::available_sample_rates ( const std::string &  device) const
pure virtual

Returns a collection of float identifying sample rates that are potentially usable with the hardware identified by device . Any of these values may be supplied in other calls to this backend as the desired sample rate to use with the name device, but the requested sample rate may turn out to be unavailable, or become invalid at any time.

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ available_sample_rates2()

virtual std::vector<float> ARDOUR::AudioBackend::available_sample_rates2 ( const std::string &  input_device,
const std::string &  output_device 
) const
inlinevirtual

Reimplemented in ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

Definition at line 355 of file audio_backend.h.

◆ buffer_size()

virtual uint32_t ARDOUR::AudioBackend::buffer_size ( ) const
pure virtual

◆ can_change_buffer_size_when_running()

virtual bool ARDOUR::AudioBackend::can_change_buffer_size_when_running ( ) const
pure virtual

◆ can_change_sample_rate_when_running()

virtual bool ARDOUR::AudioBackend::can_change_sample_rate_when_running ( ) const
pure virtual

◆ can_change_systemic_latency_when_running()

virtual bool ARDOUR::AudioBackend::can_change_systemic_latency_when_running ( ) const
inlinevirtual

return true if the backend can measure and update systemic latencies without restart.

Reimplemented in ARDOUR::AlsaAudioBackend.

Definition at line 430 of file audio_backend.h.

◆ can_measure_systemic_latency()

virtual bool ARDOUR::AudioBackend::can_measure_systemic_latency ( ) const
pure virtual

return true if the backend is configured using a single full-duplex device and measuring systemic latency can produce meaningful results.

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ can_request_update_devices()

virtual bool ARDOUR::AudioBackend::can_request_update_devices ( )
inlinevirtual
Returns
true if backend supports requesting an update to the device list and any cached properties associated with the devices.

Reimplemented in ARDOUR::PortAudioBackend, and ARDOUR::AlsaAudioBackend.

Definition at line 303 of file audio_backend.h.

◆ can_set_period_size()

virtual bool ARDOUR::AudioBackend::can_set_period_size ( ) const
inlinevirtual

An interface to set buffers/period for playback latency. useful for ALSA or JACK/ALSA on Linux.

Returns
true if the backend supports period-size configuration

Reimplemented in ARDOUR::JACKAudioBackend, and ARDOUR::AlsaAudioBackend.

Definition at line 280 of file audio_backend.h.

◆ can_set_systemic_midi_latencies()

virtual bool ARDOUR::AudioBackend::can_set_systemic_midi_latencies ( ) const
pure virtual

◆ can_use_buffered_io()

virtual bool ARDOUR::AudioBackend::can_use_buffered_io ( )
inlinevirtual
Returns
true if backend supports a blocking or buffered mode, false by default unless implemented by a derived class.

Reimplemented in ARDOUR::PortAudioBackend.

Definition at line 323 of file audio_backend.h.

◆ client_real_time_priority()

virtual int ARDOUR::AudioBackend::client_real_time_priority ( )
inlinevirtual

Reimplemented in ARDOUR::JACKAudioBackend.

Definition at line 165 of file audio_backend.h.

◆ control_app_name()

virtual std::string ARDOUR::AudioBackend::control_app_name ( ) const
pure virtual

Return the name of a control application for the selected/in-use device. If no such application exists, or if no device has been selected or is in-use, return an empty string.

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ create_process_thread()

virtual int ARDOUR::AudioBackend::create_process_thread ( std::function< void()>  func)
pure virtual

Create a new thread suitable for running part of the buffer process cycle (i.e. Realtime scheduling, memory allocation, stacksize, etc. are all correctly setup). The thread will begin executing func, and will exit when that function returns.

Parameters
funcprocess function to run

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ default_buffer_size()

virtual uint32_t ARDOUR::AudioBackend::default_buffer_size ( const std::string &  device) const
inlinevirtual

Definition at line 406 of file audio_backend.h.

◆ default_sample_rate()

virtual float ARDOUR::AudioBackend::default_sample_rate ( ) const
inlinevirtual

Definition at line 372 of file audio_backend.h.

◆ device_name()

virtual std::string ARDOUR::AudioBackend::device_name ( ) const
pure virtual

◆ driver_name()

virtual std::string ARDOUR::AudioBackend::driver_name ( ) const
inlinevirtual

override this if this implementation returns true from requires_driver_selection()

Reimplemented in ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, and ARDOUR::DummyAudioBackend.

Definition at line 546 of file audio_backend.h.

◆ drop_device()

virtual int ARDOUR::AudioBackend::drop_device ( )
inlinevirtual

Deinitialize and destroy current device

Definition at line 470 of file audio_backend.h.

◆ dsp_load()

virtual float ARDOUR::AudioBackend::dsp_load ( ) const
pure virtual

return the fraction of the time represented by the current buffer size that is being used for each buffer process cycle, as a value from 0.0 to 1.0

E.g. if the buffer size represents 5msec and current processing takes 1msec, the returned value should be 0.2.

Implementations can feel free to smooth the values returned over time (e.g. high pass filtering, or its equivalent).

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ enumerate_devices()

virtual std::vector<DeviceStatus> ARDOUR::AudioBackend::enumerate_devices ( ) const
pure virtual

Returns a collection of DeviceStatuses identifying devices discovered by this backend since the start of the process.

Any of the names in each DeviceStatus may be used to identify a device in other calls to the backend, though any of them may become invalid at any time.

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ enumerate_drivers()

virtual std::vector<std::string> ARDOUR::AudioBackend::enumerate_drivers ( ) const
inlinevirtual

If the return value of requires_driver_selection() is true, then this function can return the list of known driver names.

If the return value of requires_driver_selection() is false, then this function should not be called. If it is called its return value is an empty vector of strings.

Reimplemented in ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, and ARDOUR::DummyAudioBackend.

Definition at line 189 of file audio_backend.h.

◆ enumerate_input_devices()

virtual std::vector<DeviceStatus> ARDOUR::AudioBackend::enumerate_input_devices ( ) const
inlinevirtual

Returns a collection of DeviceStatuses identifying input devices discovered by this backend since the start of the process.

Any of the names in each DeviceStatus may be used to identify a device in other calls to the backend, though any of them may become invalid at any time.

Reimplemented in ARDOUR::PortAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

Definition at line 258 of file audio_backend.h.

◆ enumerate_midi_devices()

virtual std::vector<DeviceStatus> ARDOUR::AudioBackend::enumerate_midi_devices ( ) const
pure virtual

◆ enumerate_midi_options()

virtual std::vector<std::string> ARDOUR::AudioBackend::enumerate_midi_options ( ) const
pure virtual

◆ enumerate_output_devices()

virtual std::vector<DeviceStatus> ARDOUR::AudioBackend::enumerate_output_devices ( ) const
inlinevirtual

Returns a collection of DeviceStatuses identifying output devices discovered by this backend since the start of the process.

Any of the names in each DeviceStatus may be used to identify a device in other calls to the backend, though any of them may become invalid at any time.

Reimplemented in ARDOUR::PortAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

Definition at line 270 of file audio_backend.h.

◆ freewheel()

virtual int ARDOUR::AudioBackend::freewheel ( bool  start_stop)
pure virtual

While remaining connected to the device, and without changing its configuration, start (or stop) calling the process_callback of the engine without waiting for the device. Once process_callback() has returned, it will be called again immediately, thus allowing for faster-than-realtime processing.

All registered ports remain in existence and all connections remain unaltered. However, any physical ports should NOT be used by the process_callback() during freewheeling - the data behaviour is undefined.

If start_stop is true, begin this behaviour; otherwise cease this behaviour if it currently occuring, and return to calling process_callback() of the engine by waiting for the device.

Parameters
start_stoptrue to engage freewheel processing
Returns
zero on success, non-zero otherwise.

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ get_error_string()

static std::string ARDOUR::AudioBackend::get_error_string ( ErrorCode  )
static

◆ get_standard_device_name()

static std::string ARDOUR::AudioBackend::get_standard_device_name ( StandardDeviceName  )
static

◆ get_sync_offset()

virtual bool ARDOUR::AudioBackend::get_sync_offset ( pframes_t offset) const
inlinevirtual

Return true if it possible to determine the offset in samples of the first video frame that starts within the current buffer process cycle, measured from the first sample of the cycle. If returning true, set offset to that offset.

Eg. if it can be determined that the first video frame within the cycle starts 28 samples after the first sample of the cycle, then this method should return true and set offset to 28.

May be impossible to support outside of JACK, which has specific support (in some cases, hardware support) for this feature.

Can ONLY be called from within a process() callback tree (which implies that it can only be called by a process thread)

Reimplemented in ARDOUR::JACKAudioBackend.

Definition at line 773 of file audio_backend.h.

◆ get_use_buffered_io()

virtual bool ARDOUR::AudioBackend::get_use_buffered_io ( )
inlinevirtual
Returns
Set the backend to use a blocking or buffered I/O mode, false by default unless implemented by a derived class.

Reimplemented in ARDOUR::PortAudioBackend.

Definition at line 337 of file audio_backend.h.

◆ in_process_thread()

virtual bool ARDOUR::AudioBackend::in_process_thread ( )
pure virtual

◆ info()

AudioBackendInfo& ARDOUR::AudioBackend::info ( ) const
inline

Return the AudioBackendInfo object from which this backend was constructed.

Definition at line 144 of file audio_backend.h.

◆ input_device_name()

virtual std::string ARDOUR::AudioBackend::input_device_name ( ) const
inlinevirtual

◆ interleaved()

virtual bool ARDOUR::AudioBackend::interleaved ( ) const
pure virtual

◆ is_jack()

virtual bool ARDOUR::AudioBackend::is_jack ( ) const
inlinevirtual

Return true if the backed is JACK

Reimplemented in ARDOUR::JACKAudioBackend.

Definition at line 163 of file audio_backend.h.

◆ is_realtime()

virtual bool ARDOUR::AudioBackend::is_realtime ( ) const
pure virtual

Return true if the callback from the underlying mechanism/API (CoreAudio, JACK, ASIO etc.) occurs in a thread subject to realtime constraints. Return false otherwise.

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ join_process_threads()

virtual int ARDOUR::AudioBackend::join_process_threads ( )
pure virtual

Wait for all processing threads to exit.

Return zero on success, non-zero on failure.

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ launch_control_app()

virtual void ARDOUR::AudioBackend::launch_control_app ( )
pure virtual

Launch the control app for the currently in-use or selected device. May do nothing if the control app is undefined or cannot be launched.

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ match_input_output_devices_or_none()

virtual bool ARDOUR::AudioBackend::match_input_output_devices_or_none ( ) const
inlinevirtual

Reimplemented in ARDOUR::AlsaAudioBackend.

Definition at line 237 of file audio_backend.h.

◆ midi_device_enabled()

virtual bool ARDOUR::AudioBackend::midi_device_enabled ( std::string const  ) const
pure virtual

◆ midi_option()

virtual std::string ARDOUR::AudioBackend::midi_option ( ) const
pure virtual

◆ name()

virtual std::string ARDOUR::AudioBackend::name ( ) const
pure virtual

Return the name of this backend.

Should use a well-known, unique term. Expected examples might include "JACK", "CoreAudio", "ASIO" etc.

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ output_device_name()

virtual std::string ARDOUR::AudioBackend::output_device_name ( ) const
inlinevirtual

◆ period_size()

virtual uint32_t ARDOUR::AudioBackend::period_size ( ) const
inlinevirtual

Reimplemented in ARDOUR::JACKAudioBackend, and ARDOUR::AlsaAudioBackend.

Definition at line 541 of file audio_backend.h.

◆ process_thread_count()

virtual uint32_t ARDOUR::AudioBackend::process_thread_count ( )
pure virtual

◆ raw_buffer_size()

virtual size_t ARDOUR::AudioBackend::raw_buffer_size ( DataType  t)
pure virtual

◆ requires_driver_selection()

virtual bool ARDOUR::AudioBackend::requires_driver_selection ( ) const
inlinevirtual

Return true if this backend requires the selection of a "driver" before any device can be selected. Return false otherwise.

Intended mainly to differentiate between meta-APIs like JACK which can still expose different backends (such as ALSA or CoreAudio or FFADO or netjack) and those like ASIO or CoreAudio which do not.

Reimplemented in ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, and ARDOUR::DummyAudioBackend.

Definition at line 177 of file audio_backend.h.

◆ reset_device()

virtual int ARDOUR::AudioBackend::reset_device ( )
pure virtual

◆ sample_rate()

virtual float ARDOUR::AudioBackend::sample_rate ( ) const
pure virtual

◆ sample_time()

virtual samplepos_t ARDOUR::AudioBackend::sample_time ( )
pure virtual

return the time according to the sample clock in use, measured in samples since an arbitrary zero time in the past. The value should increase monotonically and linearly, without interruption from any source (including CPU frequency scaling).

It is extremely likely that any implementation will use a DLL, since this function can be called from any thread, at any time, and must be able to accurately determine the correct sample time.

Can be called from any thread.

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ sample_time_at_cycle_start()

virtual samplepos_t ARDOUR::AudioBackend::sample_time_at_cycle_start ( )
pure virtual

Return the time according to the sample clock in use when the most recent buffer process cycle began. Can be called from any thread.

Implements ARDOUR::PortEngine.

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ samples_since_cycle_start()

virtual pframes_t ARDOUR::AudioBackend::samples_since_cycle_start ( )
pure virtual

Return the time since the current buffer process cycle started, in samples, according to the sample clock in use.

Can ONLY be called from within a process() callback tree (which implies that it can only be called by a process thread)

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ set_buffer_size()

virtual int ARDOUR::AudioBackend::set_buffer_size ( uint32_t  )
pure virtual

Set the buffer size to be used.

The device is assumed to use a double buffering scheme, so that one buffer's worth of data can be processed by hardware while software works on the other buffer. All known suitable audio APIs support this model (though ALSA allows for alternate numbers of buffers, and CoreAudio doesn't directly expose the concept).

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ set_device_name()

virtual int ARDOUR::AudioBackend::set_device_name ( const std::string &  )
pure virtual

◆ set_driver()

virtual int ARDOUR::AudioBackend::set_driver ( const std::string &  drivername)
inlinevirtual

Returns zero if the backend can successfully use drivername as the driver, non-zero otherwise.

Should not be used unless the backend returns true from requires_driver_selection()

Reimplemented in ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, and ARDOUR::DummyAudioBackend.

Definition at line 200 of file audio_backend.h.

◆ set_input_device_name()

virtual int ARDOUR::AudioBackend::set_input_device_name ( const std::string &  )
inlinevirtual

Set the name of the input device to be used if using separate input/output devices.

See also
use_separate_input_and_output_devices()

Reimplemented in ARDOUR::PortAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

Definition at line 454 of file audio_backend.h.

◆ set_interleaved()

virtual int ARDOUR::AudioBackend::set_interleaved ( bool  yn)
pure virtual

Set the preferred underlying hardware data layout. If yn is true, then the hardware will interleave samples for successive channels; otherwise, the hardware will store samples for a single channel contiguously.

Setting this does not change the fact that all data streams to and from Ports are mono (essentially, non-interleaved)

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ set_midi_device_enabled()

virtual int ARDOUR::AudioBackend::set_midi_device_enabled ( std::string const  ,
bool   
)
pure virtual

◆ set_midi_option()

virtual int ARDOUR::AudioBackend::set_midi_option ( const std::string &  option)
pure virtual

◆ set_output_device_name()

virtual int ARDOUR::AudioBackend::set_output_device_name ( const std::string &  )
inlinevirtual

Set the name of the output device to be used if using separate input/output devices.

See also
use_separate_input_and_output_devices()

Reimplemented in ARDOUR::PortAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

Definition at line 464 of file audio_backend.h.

◆ set_peridod_size()

virtual int ARDOUR::AudioBackend::set_peridod_size ( uint32_t  )
inlinevirtual

Set the period size to be used. must be called before starting the backend.

Reimplemented in ARDOUR::JACKAudioBackend, and ARDOUR::AlsaAudioBackend.

Definition at line 294 of file audio_backend.h.

◆ set_sample_rate()

virtual int ARDOUR::AudioBackend::set_sample_rate ( float  )
pure virtual

◆ set_systemic_input_latency()

virtual int ARDOUR::AudioBackend::set_systemic_input_latency ( uint32_t  )
pure virtual

Set the (additional) input latency that cannot be determined via the implementation's underlying code (e.g. latency from external D-A/D-A converters. Units are samples.

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ set_systemic_midi_input_latency()

virtual int ARDOUR::AudioBackend::set_systemic_midi_input_latency ( std::string const  ,
uint32_t   
)
pure virtual

Set the (additional) input latency for a specific midi device, or if the identifier is empty, apply to all midi devices.

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ set_systemic_midi_output_latency()

virtual int ARDOUR::AudioBackend::set_systemic_midi_output_latency ( std::string const  ,
uint32_t   
)
pure virtual

Set the (additional) output latency for a specific midi device, or if the identifier is empty, apply to all midi devices.

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ set_systemic_output_latency()

virtual int ARDOUR::AudioBackend::set_systemic_output_latency ( uint32_t  )
pure virtual

Set the (additional) output latency that cannot be determined via the implementation's underlying code (e.g. latency from external D-A/D-A converters. Units are samples.

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ set_time_master()

virtual int ARDOUR::AudioBackend::set_time_master ( bool  yn)
inlinevirtual

If yn is true, become the time master for any inter-application transport timebase, otherwise cease to be the time master for the same.

Return zero on success, non-zero otherwise

JACK is the only currently known audio API with the concept of a shared transport timebase.

Reimplemented in ARDOUR::JACKAudioBackend.

Definition at line 719 of file audio_backend.h.

◆ set_use_buffered_io()

virtual void ARDOUR::AudioBackend::set_use_buffered_io ( bool  )
inlinevirtual

Set the backend to use a blocking or buffered I/O mode

Reimplemented in ARDOUR::PortAudioBackend.

Definition at line 331 of file audio_backend.h.

◆ speed_and_position()

virtual bool ARDOUR::AudioBackend::speed_and_position ( double &  speed,
samplepos_t position 
)
inlinevirtual

Set speed and position to the current speed and position indicated by some transport sync signal. Return whether the current transport state is pending, or finalized.

Derived classes only need implement this if they provide some way to sync to a transport sync signal (e.g. Sony 9 Pin) that is not handled by Ardour itself (LTC and MTC are both handled by Ardour). The canonical example is JACK Transport.

Reimplemented in ARDOUR::JACKAudioBackend.

Definition at line 817 of file audio_backend.h.

◆ start()

int ARDOUR::AudioBackend::start ( bool  for_latency_measurement = false)
inline

Start using the device named in the most recent call to set_device(), with the parameters set by various the most recent calls to set_sample_rate() etc. etc.

At some undetermined time after this function is successfully called, the backend will start calling the process_callback method of the AudioEngine referenced by engine. These calls will occur in a thread created by and/or under the control of the backend.

Parameters
for_latency_measurementif true, the device is being started to carry out latency measurements and the backend should this take care to return latency numbers that do not reflect any existing systemic latency settings.

Return zero if successful, negative values otherwise.

Why is this non-virtual but _start() is virtual ? Virtual methods with default parameters create possible ambiguity because a derived class may implement the same method with a different type or value of default parameter.

So we make this non-virtual method to avoid possible overrides of default parameters. See Scott Meyers or other books on C++ to understand this pattern, or possibly just this:

http://stackoverflow.com/questions/12139786/good-pratice-default-arguments-for-pure-virtual-method

Definition at line 626 of file audio_backend.h.

◆ stop()

virtual int ARDOUR::AudioBackend::stop ( )
pure virtual

Stop using the device currently in use.

If the function is successfully called, no subsequent calls to the process_callback() of engine will be made after the function returns, until parameters are reset and start() are called again.

The backend is considered to be un-configured after a successful return, and requires calls to set hardware parameters before it can be start()-ed again. See pause() for a way to avoid this. stop() should only be used when reconfiguration is required OR when there are no plans to use the backend in the future with a reconfiguration.

Return zero if successful, 1 if the device is not in use, negative values on error

Implemented in ARDOUR::PulseAudioBackend, ARDOUR::PortAudioBackend, ARDOUR::JACKAudioBackend, ARDOUR::DummyAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

◆ systemic_input_latency()

virtual uint32_t ARDOUR::AudioBackend::systemic_input_latency ( ) const
pure virtual

◆ systemic_midi_input_latency()

virtual uint32_t ARDOUR::AudioBackend::systemic_midi_input_latency ( std::string const  ) const
pure virtual

◆ systemic_midi_output_latency()

virtual uint32_t ARDOUR::AudioBackend::systemic_midi_output_latency ( std::string const  ) const
pure virtual

◆ systemic_output_latency()

virtual uint32_t ARDOUR::AudioBackend::systemic_output_latency ( ) const
pure virtual

◆ thread_stack_size()

static size_t ARDOUR::AudioBackend::thread_stack_size ( )
inlinestatic

Return the minimum stack size of audio threads in bytes

Definition at line 798 of file audio_backend.h.

◆ transport_locate()

virtual void ARDOUR::AudioBackend::transport_locate ( samplepos_t  pos)
inlinevirtual

Attempt to locate the transport to pos

Reimplemented in ARDOUR::JACKAudioBackend.

Definition at line 701 of file audio_backend.h.

◆ transport_sample()

virtual samplepos_t ARDOUR::AudioBackend::transport_sample ( ) const
inlinevirtual

Return the current transport location, in samples measured from the origin (defined by the transport time master)

Reimplemented in ARDOUR::JACKAudioBackend.

Definition at line 706 of file audio_backend.h.

◆ transport_start()

virtual void ARDOUR::AudioBackend::transport_start ( )
inlinevirtual

Attempt to change the transport state to TransportRolling.

Reimplemented in ARDOUR::JACKAudioBackend.

Definition at line 689 of file audio_backend.h.

◆ transport_state()

virtual TransportState ARDOUR::AudioBackend::transport_state ( ) const
inlinevirtual

return the current transport state

Reimplemented in ARDOUR::JACKAudioBackend.

Definition at line 695 of file audio_backend.h.

◆ transport_stop()

virtual void ARDOUR::AudioBackend::transport_stop ( )
inlinevirtual

Attempt to change the transport state to TransportStopped.

Reimplemented in ARDOUR::JACKAudioBackend.

Definition at line 692 of file audio_backend.h.

◆ update_devices()

virtual bool ARDOUR::AudioBackend::update_devices ( )
inlinevirtual

Request an update to the list of devices returned in the enumerations. The Backend must return true from can_request_update_devices to support this interface.

Returns
true if the devices were updated

Reimplemented in ARDOUR::PortAudioBackend, and ARDOUR::AlsaAudioBackend.

Definition at line 314 of file audio_backend.h.

◆ update_latencies()

virtual void ARDOUR::AudioBackend::update_latencies ( )
pure virtual

◆ use_separate_input_and_output_devices()

virtual bool ARDOUR::AudioBackend::use_separate_input_and_output_devices ( ) const
inlinevirtual

An optional alternate interface for backends to provide a facility to select separate input and output devices.

If a backend returns true then enumerate_input_devices() and enumerate_output_devices() will be used instead of enumerate_devices() to enumerate devices. Similarly set_input/output_device_name() should be used to set devices instead of set_device_name().

Reimplemented in ARDOUR::PortAudioBackend, ARDOUR::CoreAudioBackend, and ARDOUR::AlsaAudioBackend.

Definition at line 226 of file audio_backend.h.

◆ usecs_per_cycle()

virtual int ARDOUR::AudioBackend::usecs_per_cycle ( ) const
inlinevirtual

Definition at line 724 of file audio_backend.h.

Member Data Documentation

◆ _info

AudioBackendInfo& ARDOUR::AudioBackend::_info
protected

Definition at line 834 of file audio_backend.h.

◆ dsp_stats

PBD::TimingStats ARDOUR::AudioBackend::dsp_stats[NTT]

Definition at line 831 of file audio_backend.h.

◆ engine

AudioEngine& ARDOUR::AudioBackend::engine
protected

Definition at line 835 of file audio_backend.h.


The documentation for this class was generated from the following file: