From 10c55c8db495488ef8f570dcee9b9a154bf7bdcb Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 17 Nov 2012 01:12:47 +0100 Subject: [PATCH] added: frame timing --- src/bitvis.cpp | 14 +++++++++++--- src/jackclient.cpp | 8 +++++++- src/jackclient.h | 4 +++- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/bitvis.cpp b/src/bitvis.cpp index 46e936c..ba31da7 100644 --- a/src/bitvis.cpp +++ b/src/bitvis.cpp @@ -181,11 +181,12 @@ void CBitVis::ProcessSignalfd() void CBitVis::ProcessAudio() { const int bins = 1024; - const int lines = 46; + const int lines = 40; const float decay = 0.5; int samplerate; int samples; - if ((samples = m_jackclient.GetAudio(m_buf, m_bufsize, samplerate)) > 0) + int64_t audiotime; + if ((samples = m_jackclient.GetAudio(m_buf, m_bufsize, samplerate, audiotime)) > 0) { m_fft.Allocate(bins * 2); if (!m_fftbuf) @@ -248,7 +249,14 @@ void CBitVis::ProcessAudio() start = next; add += increase; } - printf("start\n%send\n", out.c_str()); + + int64_t sleeptime = audiotime + Round64(1000000.0 / (double)samplerate * (double)i) - GetTimeUs(); + USleep(sleeptime); + static int64_t prev; + int64_t now = GetTimeUs(); + int64_t interval = now - prev; + prev = now; + printf("samples:%i\nsleeptime:%" PRIi64"\ninterval:%" PRIi64 "\nstart\n%send\n", samples, sleeptime, interval, out.c_str()); fflush(stdout); memset(m_fftbuf, 0, bins * sizeof(float)); diff --git a/src/jackclient.cpp b/src/jackclient.cpp index b723484..5160dd6 100644 --- a/src/jackclient.cpp +++ b/src/jackclient.cpp @@ -50,6 +50,7 @@ CJackClient::CJackClient() m_bufsize = 0; m_srcstate = NULL; m_outsamples = 0; + m_audiotime = 0; if (pipe2(m_pipe, O_NONBLOCK) == -1) { @@ -249,6 +250,9 @@ void CJackClient::PJackProcessCallback(jack_nframes_t nframes) CLock lock(m_condition); + if (m_outsamples == 0) + m_audiotime = GetTimeUs(); + float* jackptr = (float*)jack_port_get_buffer(m_jackport, nframes); SRC_DATA srcdata = {}; @@ -265,7 +269,7 @@ void CJackClient::PJackProcessCallback(jack_nframes_t nframes) m_condition.Signal(); } -int CJackClient::GetAudio(float*& buf, int& bufsize, int& samplerate) +int CJackClient::GetAudio(float*& buf, int& bufsize, int& samplerate, int64_t& audiotime) { CLock lock(m_condition); m_condition.Wait(1000000, m_outsamples, 0); @@ -286,6 +290,8 @@ int CJackClient::GetAudio(float*& buf, int& bufsize, int& samplerate) int outsamples = m_outsamples; m_outsamples = 0; + audiotime = m_audiotime; + return outsamples; } diff --git a/src/jackclient.h b/src/jackclient.h index 9a1b234..1ca7c46 100644 --- a/src/jackclient.h +++ b/src/jackclient.h @@ -27,6 +27,7 @@ #include "fft.h" #include "clientmessage.h" #include "util/condition.h" +#include "util/inclstdint.h" class CJackClient { @@ -44,7 +45,7 @@ class CJackClient const std::string& ExitReason() { return m_exitreason; } int Samplerate() { return m_samplerate; } - int GetAudio(float*& buf, int& bufsize, int& samplerate); + int GetAudio(float*& buf, int& bufsize, int& samplerate, int64_t& audiotime); private: bool m_connected; @@ -63,6 +64,7 @@ class CJackClient unsigned int m_bufsize; SRC_STATE* m_srcstate; int m_outsamples; + int64_t m_audiotime; bool ConnectInternal(); void CheckMessages();