Skip to content

Commit

Permalink
Improve jack audio engine latency
Browse files Browse the repository at this point in the history
Listen to the jack server latency callback
  • Loading branch information
fgo-ableton committed Jun 17, 2020
1 parent aba21b3 commit f7432a4
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 9 deletions.
31 changes: 22 additions & 9 deletions examples/linkaudio/AudioPlatform_Jack.cpp
Expand Up @@ -49,6 +49,20 @@ int AudioPlatform::audioCallback(jack_nframes_t nframes, void* pvUserData)
return pAudioPlatform->audioCallback(nframes);
}

void AudioPlatform::latencyCallback(jack_latency_callback_mode_t, void* pvUserData)
{
AudioPlatform* pAudioPlatform = static_cast<AudioPlatform*>(pvUserData);
pAudioPlatform->updateLatency();
}

void AudioPlatform::updateLatency()
{
jack_latency_range_t latencyRange;
jack_port_get_latency_range(mpJackPorts[0], JackPlaybackLatency, &latencyRange);
mEngine.mOutputLatency.store(
std::chrono::microseconds(llround(1.0e6 * latencyRange.max / mEngine.mSampleRate)));
}

int AudioPlatform::audioCallback(jack_nframes_t nframes)
{
using namespace std::chrono;
Expand Down Expand Up @@ -106,7 +120,15 @@ void AudioPlatform::initialize()
std::terminate();
};

const double bufferSize = jack_get_buffer_size(mpJackClient);
const double sampleRate = jack_get_sample_rate(mpJackClient);
mEngine.setBufferSize(static_cast<std::size_t>(bufferSize));
mEngine.setSampleRate(sampleRate);

jack_set_latency_callback(mpJackClient, AudioPlatform::latencyCallback, this);

mpJackPorts = new jack_port_t*[2];

for (int k = 0; k < 2; ++k)
{
const std::string port_name = "out_" + std::to_string(k + 1);
Expand All @@ -121,15 +143,6 @@ void AudioPlatform::initialize()
}

jack_set_process_callback(mpJackClient, AudioPlatform::audioCallback, this);

const double bufferSize = jack_get_buffer_size(mpJackClient);
const double sampleRate = jack_get_sample_rate(mpJackClient);

mEngine.setBufferSize(static_cast<std::size_t>(bufferSize));
mEngine.setSampleRate(sampleRate);

mEngine.mOutputLatency =
std::chrono::microseconds(llround(1.0e6 * bufferSize / sampleRate));
}

void AudioPlatform::uninitialize()
Expand Down
2 changes: 2 additions & 0 deletions examples/linkaudio/AudioPlatform_Jack.hpp
Expand Up @@ -40,6 +40,8 @@ class AudioPlatform
private:
static int audioCallback(jack_nframes_t nframes, void* pvUserData);
int audioCallback(jack_nframes_t nframes);
static void latencyCallback(jack_latency_callback_mode_t mode, void* pvUserData);
void updateLatency();

void initialize();
void uninitialize();
Expand Down

0 comments on commit f7432a4

Please sign in to comment.