X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fbackends%2Fdummy%2Fdummy_audiobackend.h;h=95f079c4b95e8c0527b1caf52e92018f7997aaeb;hb=10140a8e68c3e6d105f89c7085ce8f44118ad95c;hp=149fba871de2d9cc6255330be01bbc35444eb319;hpb=5424119b559fc6f68ca0d85c22a4866739c2ab73;p=ardour.git diff --git a/libs/backends/dummy/dummy_audiobackend.h b/libs/backends/dummy/dummy_audiobackend.h index 149fba871d..95f079c4b9 100644 --- a/libs/backends/dummy/dummy_audiobackend.h +++ b/libs/backends/dummy/dummy_audiobackend.h @@ -32,11 +32,21 @@ #include "ardour/types.h" #include "ardour/audio_backend.h" +#include "ardour/dsp_load_calculator.h" namespace ARDOUR { class DummyAudioBackend; +namespace DummyMidiData { + typedef struct _MIDISequence { + float beat_time; + uint8_t size; + uint8_t event[3]; + } MIDISequence; +}; + + class DummyMidiEvent { public: DummyMidiEvent (const pframes_t timestamp, const uint8_t* data, size_t size); @@ -62,9 +72,11 @@ class DummyPort { virtual ~DummyPort (); const std::string& name () const { return _name; } + const std::string& pretty_name () const { return _pretty_name; } PortFlags flags () const { return _flags; } int set_name (const std::string &name) { _name = name; return 0; } + int set_pretty_name (const std::string &name) { _pretty_name = name; return 0; } virtual DataType type () const = 0; @@ -83,8 +95,9 @@ class DummyPort { void disconnect_all (); virtual void* get_buffer (pframes_t nframes) = 0; + void next_period () { _gen_cycle = false; } - const LatencyRange& latency_range (bool for_playback) const + const LatencyRange latency_range (bool for_playback) const { return for_playback ? _playback_latency_range : _capture_latency_range; } @@ -104,6 +117,7 @@ class DummyPort { private: DummyAudioBackend &_dummy_backend; std::string _name; + std::string _pretty_name; const PortFlags _flags; LatencyRange _capture_latency_range; LatencyRange _playback_latency_range; @@ -112,6 +126,17 @@ class DummyPort { void _connect (DummyPort* , bool); void _disconnect (DummyPort* , bool); + protected: + // random number generator + void setup_random_number_generator (); + inline float randf (); + inline uint32_t randi (); + uint32_t _rseed; + + // signal generator + volatile bool _gen_cycle; + Glib::Threads::Mutex generator_lock; + }; // class DummyPort class DummyAudioPort : public DummyPort { @@ -132,9 +157,17 @@ class DummyAudioPort : public DummyPort { PinkNoise, PonyNoise, SineWave, + SquareWave, + KronekerDelta, + SineSweep, + SineSweepSwell, + SquareSweep, + SquareSweepSwell, + Loopback, }; - void next_period () { _gen_cycle = false; } void setup_generator (GeneratorType const, float const); + void fill_wavetable (const float* d, size_t n_samples) { assert(_wavetable != 0); memcpy(_wavetable, d, n_samples * sizeof(float)); } + void midi_to_wavetable (DummyMidiBuffer const * const src, size_t n_samples); private: Sample _buffer[8192]; @@ -142,21 +175,16 @@ class DummyAudioPort : public DummyPort { // signal generator ('fake' physical inputs) void generate (const pframes_t n_samples); GeneratorType _gen_type; - Glib::Threads::Mutex generator_lock; - volatile bool _gen_cycle; // generator buffers // pink-noise filters float _b0, _b1, _b2, _b3, _b4, _b5, _b6; // generated sinf() samples Sample * _wavetable; - uint32_t _tbl_length; - uint32_t _tbl_offset; - - // random number generator - inline float randf (); - inline uint32_t randi (); - uint32_t _rseed; + uint32_t _gen_period; + uint32_t _gen_offset; + uint32_t _gen_perio2; + uint32_t _gen_count2; // gaussian noise generator float grandf (); @@ -173,10 +201,21 @@ class DummyMidiPort : public DummyPort { DataType type () const { return DataType::MIDI; }; void* get_buffer (pframes_t nframes); - const DummyMidiBuffer const_buffer () const { return _buffer; } + const DummyMidiBuffer * const_buffer () const { return &_buffer; } + + void setup_generator (int, float const); + void set_loopback (DummyMidiBuffer const * const src); private: DummyMidiBuffer _buffer; + DummyMidiBuffer _loopback; + + // midi event generator ('fake' physical inputs) + void midi_generate (const pframes_t n_samples); + float _midi_seq_spb; // samples per beat + int32_t _midi_seq_time; + uint32_t _midi_seq_pos; + DummyMidiData::MIDISequence const * _midi_seq_dat; }; // class DummyMidiPort class DummyAudioBackend : public AudioBackend { @@ -185,11 +224,18 @@ class DummyAudioBackend : public AudioBackend { DummyAudioBackend (AudioEngine& e, AudioBackendInfo& info); ~DummyAudioBackend (); + bool is_running () const { return _running; } + /* AUDIOBACKEND API */ std::string name () const; bool is_realtime () const; + bool requires_driver_selection() const { return true; } + std::string driver_name () const; + std::vector enumerate_drivers () const; + int set_driver (const std::string&); + std::vector enumerate_devices () const; std::vector available_sample_rates (const std::string& device) const; std::vector available_buffer_sizes (const std::string& device) const; @@ -210,6 +256,8 @@ class DummyAudioBackend : public AudioBackend { int set_systemic_midi_input_latency (std::string const, uint32_t) { return 0; } int set_systemic_midi_output_latency (std::string const, uint32_t) { return 0; } + int reset_device () { return 0; }; + /* Retrieving parameters */ std::string device_name () const; float sample_rate () const; @@ -254,8 +302,8 @@ class DummyAudioBackend : public AudioBackend { size_t raw_buffer_size (DataType t); /* Process time */ - pframes_t sample_time (); - pframes_t sample_time_at_cycle_start (); + framepos_t sample_time (); + framepos_t sample_time_at_cycle_start (); pframes_t samples_since_cycle_start (); int create_process_thread (boost::function func); @@ -276,6 +324,9 @@ class DummyAudioBackend : public AudioBackend { std::string get_port_name (PortHandle) const; PortHandle get_port_by_name (const std::string&) const; + int get_port_property (PortHandle, const std::string& key, std::string& value, std::string& type) const; + int set_port_property (PortHandle, const std::string& key, const std::string& value, const std::string& type); + int get_ports (const std::string& port_name_pattern, DataType type, PortFlags flags, std::vector&) const; DataType port_data_type (PortHandle) const; @@ -326,19 +377,38 @@ class DummyAudioBackend : public AudioBackend { void* main_process_thread (); + static size_t max_buffer_size() {return _max_buffer_size;} + private: + enum MidiPortMode { + MidiNoEvents, + MidiGenerator, + MidiLoopback, + MidiToAudio, + }; + + struct DriverSpeed { + std::string name; + float speedup; + DriverSpeed (const std::string& n, float s) : name (n), speedup (s) {} + }; + std::string _instance_name; static std::vector _midi_options; static std::vector _device_status; + static std::vector _driver_speed; bool _running; + bool _freewheel; bool _freewheeling; + float _speedup; std::string _device; float _samplerate; size_t _samples_per_period; float _dsp_load; + DSPLoadCalculator _dsp_load_calc; static size_t _max_buffer_size; uint32_t _n_inputs; @@ -346,11 +416,12 @@ class DummyAudioBackend : public AudioBackend { uint32_t _n_midi_inputs; uint32_t _n_midi_outputs; + MidiPortMode _midi_mode; uint32_t _systemic_input_latency; uint32_t _systemic_output_latency; - uint64_t _processed_samples; + framecnt_t _processed_samples; pthread_t _main_thread; @@ -370,12 +441,14 @@ class DummyAudioBackend : public AudioBackend { /* port engine */ PortHandle add_port (const std::string& shortname, ARDOUR::DataType, ARDOUR::PortFlags); int register_system_ports (); - void unregister_system_ports (); + void unregister_ports (bool system_only = false); std::vector _system_inputs; + std::vector _system_outputs; + std::vector _system_midi_in; + std::vector _system_midi_out; std::vector _ports; - struct PortConnectData { std::string a; std::string b;