summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-12-05 13:56:18 +0100
committerRobin Gareus <robin@gareus.org>2015-12-05 13:56:18 +0100
commit7ad8ad8823b4eb05660a73411c071f4d5083dc1f (patch)
tree2391321db44f1d1248cb3d3d2d67da177c0be987
parentfed6c9f3adef6e77055f6ef2d767869bbf40d348 (diff)
JACK: expose --nperiods option
-rw-r--r--libs/backends/jack/jack_audiobackend.cc30
-rw-r--r--libs/backends/jack/jack_audiobackend.h7
2 files changed, 36 insertions, 1 deletions
diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc
index 944fa4111c..32c9f203fa 100644
--- a/libs/backends/jack/jack_audiobackend.cc
+++ b/libs/backends/jack/jack_audiobackend.cc
@@ -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
{
@@ -247,6 +259,16 @@ JACKAudioBackend::set_sample_rate (float sr)
}
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)
{
if (!available()) {
@@ -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) {
diff --git a/libs/backends/jack/jack_audiobackend.h b/libs/backends/jack/jack_audiobackend.h
index 530e3fdfd7..54eea35f02 100644
--- a/libs/backends/jack/jack_audiobackend.h
+++ b/libs/backends/jack/jack_audiobackend.h
@@ -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;