JACK: expose --nperiods option
authorRobin Gareus <robin@gareus.org>
Sat, 5 Dec 2015 12:56:18 +0000 (13:56 +0100)
committerRobin Gareus <robin@gareus.org>
Sat, 5 Dec 2015 12:56:18 +0000 (13:56 +0100)
libs/backends/jack/jack_audiobackend.cc
libs/backends/jack/jack_audiobackend.h

index 944fa4111cb426d8372d94ca6c8158da9b93374f..32c9f203fa01fa460a1d23d1590a71c866fd19f8 100644 (file)
@@ -54,6 +54,7 @@ JACKAudioBackend::JACKAudioBackend (AudioEngine& e, AudioBackendInfo& info, boos
        , _freewheeling (false)
        , _target_sample_rate (48000)
        , _target_buffer_size (1024)
+       , _target_num_periods (2)
        , _target_interleaved (false)
        , _target_input_channels (0)
        , _target_output_channels (0)
@@ -203,6 +204,17 @@ JACKAudioBackend::available_buffer_sizes (const string& device) const
        return s;
 }
 
+std::vector<uint32_t>
+JACKAudioBackend::available_period_sizes (const std::string& driver) const
+{
+       vector<uint32_t> s;
+       if (ARDOUR::get_jack_audio_driver_supports_setting_period_count (driver)) {
+               s.push_back (2);
+               s.push_back (3);
+       }
+       return s;
+}
+
 uint32_t
 JACKAudioBackend::available_input_channel_count (const string& /*device*/) const
 {
@@ -246,6 +258,16 @@ JACKAudioBackend::set_sample_rate (float sr)
        return -1;
 }
 
+int
+JACKAudioBackend::set_peridod_size (uint32_t nperiods)
+{
+       if (!available()) {
+               _target_num_periods = nperiods;
+               return 0;
+       }
+       return -1;
+}
+
 int
 JACKAudioBackend::set_buffer_size (uint32_t nframes)
 {
@@ -381,6 +403,12 @@ JACKAudioBackend::buffer_size () const
        return _target_buffer_size;
 }
 
+uint32_t
+JACKAudioBackend::period_size () const
+{
+       return _target_num_periods;
+}
+
 bool
 JACKAudioBackend::interleaved () const
 {
@@ -461,7 +489,7 @@ JACKAudioBackend::setup_jack_startup_command (bool for_latency_measurement)
        options.driver = _target_driver;
        options.samplerate = _target_sample_rate;
        options.period_size = _target_buffer_size;
-       options.num_periods = 2;
+       options.num_periods = _target_num_periods;
        options.input_device = _target_device;
        options.output_device = _target_device;
        if (for_latency_measurement) {
index 530e3fdfd7f0342b2bc7896448e3f6c4bc2859ed..54eea35f02c81bd84d4d0fe52fe45c303857976e 100644 (file)
@@ -58,6 +58,7 @@ class JACKAudioBackend : public AudioBackend {
 
     std::vector<float> available_sample_rates (const std::string& device) const;
     std::vector<uint32_t> available_buffer_sizes (const std::string& device) const;
+    std::vector<uint32_t> available_period_sizes (const std::string& driver) const;
     uint32_t available_input_channel_count (const std::string& device) const;
     uint32_t available_output_channel_count (const std::string& device) const;
 
@@ -67,6 +68,7 @@ class JACKAudioBackend : public AudioBackend {
     int set_device_name (const std::string&);
     int set_sample_rate (float);
     int set_buffer_size (uint32_t);
+    int set_peridod_size (uint32_t);
     int set_interleaved (bool yn);
     int set_input_channels (uint32_t);
     int set_output_channels (uint32_t);
@@ -80,6 +82,7 @@ class JACKAudioBackend : public AudioBackend {
     std::string  device_name () const;
     float        sample_rate () const;
     uint32_t     buffer_size () const;
+    uint32_t     period_size () const;
     bool         interleaved () const;
     uint32_t     input_channels () const;
     uint32_t     output_channels () const;
@@ -167,6 +170,9 @@ class JACKAudioBackend : public AudioBackend {
     bool can_set_systemic_midi_latencies () const {
        return false;
     }
+    bool can_set_period_size () const {
+       return true;
+    }
 
     int      midi_event_get (pframes_t& timestamp, size_t& size, uint8_t** buf, void* port_buffer, uint32_t event_index);
     int      midi_event_put (void* port_buffer, pframes_t timestamp, const uint8_t* buffer, size_t size);
@@ -253,6 +259,7 @@ class JACKAudioBackend : public AudioBackend {
     std::string  _target_device;
     float        _target_sample_rate;
     uint32_t     _target_buffer_size;
+    uint32_t     _target_num_periods;
     SampleFormat _target_sample_format;
     bool         _target_interleaved;
     uint32_t     _target_input_channels;