Ardour  8.12
audio_backend.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2013-2016 Tim Mayberry <mojofunk@gmail.com>
3  * Copyright (C) 2013-2017 Paul Davis <paul@linuxaudiosystems.com>
4  * Copyright (C) 2014-2016 Robin Gareus <robin@gareus.org>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with this program; if not, write to the Free Software Foundation, Inc.,
18  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19  */
20 
21 #ifndef __libardour_audiobackend_h__
22 #define __libardour_audiobackend_h__
23 
24 #include <string>
25 #include <vector>
26 
27 #include <stdint.h>
28 #include <stdlib.h>
29 
30 #include <boost/function.hpp>
31 
32 #include "ardour/audioengine.h"
34 #include "ardour/port_engine.h"
35 #include "ardour/types.h"
36 
37 #ifdef ARDOURBACKEND_DLL_EXPORTS // defined if we are building the ARDOUR Panners DLLs (instead of using them)
38 # define ARDOURBACKEND_API LIBARDOUR_DLL_EXPORT
39 #else
40 # define ARDOURBACKEND_API LIBARDOUR_DLL_IMPORT
41 #endif
42 #define ARDOURBACKEND_LOCAL LIBARDOUR_DLL_LOCAL
43 
44 namespace ARDOUR
45 {
47  const char* name;
48 
53  int (*instantiate) (const std::string& arg1, const std::string& arg2);
54 
56  int (*deinstantiate) (void);
57 
63  std::shared_ptr<AudioBackend> (*factory) (AudioEngine&);
64 
72  bool (*already_configured) ();
73 
80  bool (*available) ();
81 };
82 
87 {
88 public:
90  : PortEngine (e)
91  , _info (i)
92  , engine (e)
93  {}
94 
95  virtual ~AudioBackend () {}
96 
97  enum ErrorCode {
98  NoError = 0,
99  BackendInitializationError = -64,
132  };
133 
134  static std::string get_error_string (ErrorCode);
135 
138  DeviceDefault
139  };
140 
142 
147  {
148  return _info;
149  }
150 
156  virtual std::string name () const = 0;
157 
162  virtual bool is_realtime () const = 0;
163 
165  virtual bool is_jack () const { return false; }
166 
167  virtual int client_real_time_priority () { return 0; }
168 
169  /* Discovering devices and parameters */
170 
179  virtual bool requires_driver_selection () const
180  {
181  return false;
182  }
183 
191  virtual std::vector<std::string> enumerate_drivers () const
192  {
193  return std::vector<std::string> ();
194  }
195 
202  virtual int set_driver (const std::string& drivername)
203  {
204  return 0;
205  }
206 
210  struct DeviceStatus {
211  std::string name;
212  bool available;
213 
214  DeviceStatus (const std::string& s, bool avail)
215  : name (s)
216  , available (avail)
217  {}
218  };
219 
229  {
230  return false;
231  }
232 
233  /* Return true if the backend uses separate I/O devices only for the case
234  * of allowing one to be "None".
235  *
236  * ie. Input Device must match Output Device, except if either of them
237  * is get_standard_device_name (DeviceNone).
238  */
240  {
241  return false;
242  }
243 
251  virtual std::vector<DeviceStatus> enumerate_devices () const = 0;
252 
260  virtual std::vector<DeviceStatus> enumerate_input_devices () const
261  {
262  return std::vector<DeviceStatus> ();
263  }
264 
272  virtual std::vector<DeviceStatus> enumerate_output_devices () const
273  {
274  return std::vector<DeviceStatus> ();
275  }
276 
282  virtual bool can_set_period_size () const
283  {
284  return false;
285  }
286 
288  virtual std::vector<uint32_t> available_period_sizes (const std::string& driver, const std::string& device) const
289  {
290  return std::vector<uint32_t> ();
291  }
292 
296  virtual int set_peridod_size (uint32_t)
297  {
298  return -1;
299  }
300 
306  {
307  return false;
308  }
309 
316  virtual bool update_devices ()
317  {
318  return false;
319  }
320 
325  virtual bool can_use_buffered_io ()
326  {
327  return false;
328  }
329 
333  virtual void set_use_buffered_io (bool) {}
334 
339  virtual bool get_use_buffered_io ()
340  {
341  return false;
342  }
343 
351  virtual std::vector<float> available_sample_rates (const std::string& device) const = 0;
352 
353  /* backends that suppor586t separate input and output devices should
354  * implement this function and return an intersection (not union) of available
355  * sample rates valid for the given input + output device combination.
356  */
357  virtual std::vector<float> available_sample_rates2 (const std::string& input_device, const std::string& output_device) const
358  {
359  std::vector<float> input_sizes = available_sample_rates (input_device);
360  std::vector<float> output_sizes = available_sample_rates (output_device);
361  std::vector<float> rv;
362  std::set_union (input_sizes.begin (), input_sizes.end (),
363  output_sizes.begin (), output_sizes.end (),
364  std::back_inserter (rv));
365  return rv;
366  }
367 
368  /* Returns the default sample rate that will be shown to the user when
369  * configuration options are first presented. If the derived class
370  * needs or wants to override this, it can. It also MUST override this
371  * if there is any chance that an SR of 48kHz is not in the list
372  * returned by available_sample_rates()
373  */
374  virtual float default_sample_rate () const
375  {
376  return 48000.0;
377  }
378 
386  virtual std::vector<uint32_t> available_buffer_sizes (const std::string& device) const = 0;
387 
388  /* backends that support separate input and output devices should
389  * implement this function and return an intersection (not union) of available
390  * buffer sizes valid for the given input + output device combination.
391  */
392  virtual std::vector<uint32_t> available_buffer_sizes2 (const std::string& input_device, const std::string& output_device) const
393  {
394  std::vector<uint32_t> input_rates = available_buffer_sizes (input_device);
395  std::vector<uint32_t> output_rates = available_buffer_sizes (output_device);
396  std::vector<uint32_t> rv;
397  std::set_union (input_rates.begin (), input_rates.end (),
398  output_rates.begin (), output_rates.end (),
399  std::back_inserter (rv));
400  return rv;
401  }
402  /* Returns the default buffer size that will be shown to the user when
403  * configuration options are first presented. If the derived class
404  * needs or wants to override this, it can. It also MUST override this
405  * if there is any chance that a buffer size of 1024 is not in the list
406  * returned by available_buffer_sizes()
407  */
408  virtual uint32_t default_buffer_size (const std::string& device) const
409  {
410  return 1024;
411  }
412  /* Return true if the derived class can change the sample rate of the
413  * device in use while the device is already being used. Return false
414  * otherwise. (example: JACK cannot do this as of September 2013)
415  */
416  virtual bool can_change_sample_rate_when_running () const = 0;
417  /* Return true if the derived class can change the buffer size of the
418  * device in use while the device is already being used. Return false
419  * otherwise.
420  */
421  virtual bool can_change_buffer_size_when_running () const = 0;
422 
427  virtual bool can_measure_systemic_latency () const = 0;
428 
433  {
434  return false;
435  }
436 
437  /* Set the hardware parameters.
438  *
439  * If called when the current state is stopped or paused,
440  * the changes will not take effect until the state changes to running.
441  *
442  * If called while running, the state will change as fast as the
443  * implementation allows.
444  *
445  * All set_*() methods return zero on success, non-zero otherwise.
446  */
447 
449  virtual int set_device_name (const std::string&) = 0;
450 
456  virtual int set_input_device_name (const std::string&)
457  {
458  return 0;
459  }
460 
466  virtual int set_output_device_name (const std::string&)
467  {
468  return 0;
469  }
470 
472  virtual int drop_device ()
473  {
474  return 0;
475  };
476 
478  virtual int set_sample_rate (float) = 0;
479 
488  virtual int set_buffer_size (uint32_t) = 0;
489 
498  virtual int set_interleaved (bool yn) = 0;
499 
504  virtual int set_systemic_input_latency (uint32_t) = 0;
505 
510  virtual int set_systemic_output_latency (uint32_t) = 0;
511 
515  virtual int set_systemic_midi_input_latency (std::string const, uint32_t) = 0;
516 
520  virtual int set_systemic_midi_output_latency (std::string const, uint32_t) = 0;
521 
522  /* Retrieving parameters */
523 
524  virtual std::string device_name () const = 0;
525  virtual std::string input_device_name () const
526  {
527  return std::string ();
528  }
529 
530  virtual std::string output_device_name () const
531  {
532  return std::string ();
533  }
534 
535  virtual float sample_rate () const = 0;
536  virtual uint32_t buffer_size () const = 0;
537  virtual bool interleaved () const = 0;
538  virtual uint32_t systemic_input_latency () const = 0;
539  virtual uint32_t systemic_output_latency () const = 0;
540  virtual uint32_t systemic_midi_input_latency (std::string const) const = 0;
541  virtual uint32_t systemic_midi_output_latency (std::string const) const = 0;
542 
543  virtual uint32_t period_size () const { return 0; }
544 
548  virtual std::string driver_name () const
549  {
550  return std::string ();
551  }
552 
558  virtual std::string control_app_name () const = 0;
559 
564  virtual void launch_control_app () = 0;
565 
566  /* @return a vector of strings that describe the available
567  * MIDI options.
568  *
569  * These can be presented to the user to decide which
570  * MIDI drivers, options etc. can be used. The returned strings
571  * should be thought of as the key to a map of possible
572  * approaches to handling MIDI within the backend. Ensure that
573  * the strings will make sense to the user.
574  */
575  virtual std::vector<std::string> enumerate_midi_options () const = 0;
576 
577  /* Request the use of the MIDI option named \p option, which
578  * should be one of the strings returned by enumerate_midi_options()
579  *
580  * @return zero if successful, non-zero otherwise
581  */
582  virtual int set_midi_option (const std::string& option) = 0;
583 
584  virtual std::string midi_option () const = 0;
585 
587  virtual std::vector<DeviceStatus> enumerate_midi_devices () const = 0;
588 
590  virtual int set_midi_device_enabled (std::string const, bool) = 0;
591 
593  virtual bool midi_device_enabled (std::string const) const = 0;
594 
596  virtual bool can_set_systemic_midi_latencies () const = 0;
597 
598  /* State Control */
599 
628  int start (bool for_latency_measurement = false)
629  {
630  return _start (for_latency_measurement);
631  }
632 
647  virtual int stop () = 0;
648 
653  virtual int reset_device () = 0;
654 
672  virtual int freewheel (bool start_stop) = 0;
673 
684  virtual float dsp_load () const = 0;
685 
686  /* Transport Control (JACK is the only audio API that currently offers
687  * the concept of shared transport control)
688  */
689 
691  virtual void transport_start () {}
692 
694  virtual void transport_stop () {}
695 
698  {
699  return TransportStopped;
700  }
701 
703  virtual void transport_locate (samplepos_t pos) {}
704 
708  virtual samplepos_t transport_sample () const
709  {
710  return 0;
711  }
712 
721  virtual int set_time_master (bool yn)
722  {
723  return 0;
724  }
725 
726  virtual int usecs_per_cycle () const
727  {
728  return 1000000 * (buffer_size () / sample_rate ());
729  }
730  virtual size_t raw_buffer_size (DataType t) = 0;
731 
732  /* Process time */
733 
745  virtual samplepos_t sample_time () = 0;
746 
751 
759 
775  virtual bool get_sync_offset (pframes_t& offset) const
776  {
777  return false;
778  }
779 
788  virtual int create_process_thread (boost::function<void()> func) = 0;
789 
794  virtual int join_process_threads () = 0;
795 
797  virtual bool in_process_thread () = 0;
798 
800  static size_t thread_stack_size ()
801  {
802  return 100000;
803  }
804 
806  virtual uint32_t process_thread_count () = 0;
807 
808  virtual void update_latencies () = 0;
809 
819  virtual bool speed_and_position (double& speed, samplepos_t& position)
820  {
821  speed = 0.0;
822  position = 0;
823  return false;
824  }
825 
826  enum TimingTypes {
827  DeviceWait = 0,
829  /* end */
830  NTT
831  };
832 
833  PBD::TimingStats dsp_stats[NTT];
834 
835 protected:
838 
839  virtual int _start (bool for_latency_measurement) = 0;
840 };
841 
842 } // namespace ARDOUR
843 
844 #endif /* __libardour_audiobackend_h__ */
virtual samplepos_t transport_sample() const
virtual void update_latencies()=0
virtual std::string output_device_name() const
virtual bool interleaved() const =0
virtual int stop()=0
virtual int set_systemic_midi_input_latency(std::string const, uint32_t)=0
virtual int set_sample_rate(float)=0
virtual int _start(bool for_latency_measurement)=0
static std::string get_standard_device_name(StandardDeviceName)
virtual bool match_input_output_devices_or_none() const
virtual void launch_control_app()=0
virtual int set_time_master(bool yn)
virtual bool is_realtime() const =0
virtual int client_real_time_priority()
virtual pframes_t samples_since_cycle_start()=0
virtual uint32_t buffer_size() const =0
virtual uint32_t default_buffer_size(const std::string &device) const
virtual int freewheel(bool start_stop)=0
virtual std::vector< uint32_t > available_buffer_sizes(const std::string &device) const =0
virtual std::vector< uint32_t > available_period_sizes(const std::string &driver, const std::string &device) const
virtual std::vector< uint32_t > available_buffer_sizes2(const std::string &input_device, const std::string &output_device) const
virtual float dsp_load() const =0
virtual std::string control_app_name() const =0
virtual std::vector< std::string > enumerate_midi_options() const =0
virtual std::string name() const =0
virtual bool can_change_sample_rate_when_running() const =0
virtual int set_input_device_name(const std::string &)
virtual std::string input_device_name() const
virtual uint32_t systemic_input_latency() const =0
virtual bool speed_and_position(double &speed, samplepos_t &position)
virtual int set_systemic_midi_output_latency(std::string const, uint32_t)=0
virtual std::string midi_option() const =0
virtual int set_peridod_size(uint32_t)
virtual int set_interleaved(bool yn)=0
virtual void transport_stop()
virtual uint32_t process_thread_count()=0
virtual bool is_jack() const
virtual int set_systemic_input_latency(uint32_t)=0
AudioBackend(AudioEngine &e, AudioBackendInfo &i)
Definition: audio_backend.h:89
virtual TransportState transport_state() const
virtual bool update_devices()
virtual float sample_rate() const =0
virtual std::vector< DeviceStatus > enumerate_input_devices() const
virtual size_t raw_buffer_size(DataType t)=0
virtual uint32_t systemic_midi_output_latency(std::string const) const =0
virtual samplepos_t sample_time_at_cycle_start()=0
virtual bool requires_driver_selection() const
virtual int set_output_device_name(const std::string &)
virtual int drop_device()
virtual std::vector< std::string > enumerate_drivers() const
virtual std::vector< DeviceStatus > enumerate_output_devices() const
AudioBackendInfo & _info
virtual uint32_t period_size() const
virtual bool use_separate_input_and_output_devices() const
virtual bool midi_device_enabled(std::string const) const =0
virtual std::vector< float > available_sample_rates2(const std::string &input_device, const std::string &output_device) const
static size_t thread_stack_size()
virtual std::string driver_name() const
virtual void transport_start()
virtual int usecs_per_cycle() const
virtual bool in_process_thread()=0
virtual void transport_locate(samplepos_t pos)
virtual bool can_set_systemic_midi_latencies() const =0
virtual bool can_change_systemic_latency_when_running() const
virtual int set_midi_option(const std::string &option)=0
virtual std::string device_name() const =0
AudioBackendInfo & info() const
virtual float default_sample_rate() const
virtual bool can_request_update_devices()
virtual int set_device_name(const std::string &)=0
virtual int set_midi_device_enabled(std::string const, bool)=0
virtual int set_driver(const std::string &drivername)
virtual bool get_use_buffered_io()
virtual std::vector< DeviceStatus > enumerate_devices() const =0
virtual int reset_device()=0
virtual samplepos_t sample_time()=0
int start(bool for_latency_measurement=false)
virtual bool can_measure_systemic_latency() const =0
virtual uint32_t systemic_midi_input_latency(std::string const) const =0
virtual std::vector< DeviceStatus > enumerate_midi_devices() const =0
virtual bool can_use_buffered_io()
static std::string get_error_string(ErrorCode)
virtual int set_systemic_output_latency(uint32_t)=0
virtual bool can_change_buffer_size_when_running() const =0
virtual std::vector< float > available_sample_rates(const std::string &device) const =0
virtual int join_process_threads()=0
virtual int set_buffer_size(uint32_t)=0
virtual bool can_set_period_size() const
virtual uint32_t systemic_output_latency() const =0
virtual bool get_sync_offset(pframes_t &offset) const
AudioEngine & engine
virtual int create_process_thread(boost::function< void()> func)=0
virtual void set_use_buffered_io(bool)
GtkImageIconNameData name
Definition: gtkimage.h:6
#define LIBARDOUR_API
uint32_t pframes_t
Temporal::samplepos_t samplepos_t
DeviceStatus(const std::string &s, bool avail)
Definition: getopt.h:74