diff options
| author | Carl Hetherington <cth@carlh.net> | 2017-04-18 12:00:30 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2017-04-19 23:04:32 +0100 |
| commit | c31e6b0ecd39f23b949ff5e62da934eca8ccbc46 (patch) | |
| tree | e0f1cf54353f38dd614d32f99099dfa65dfe2191 /src | |
| parent | 575c1882e0b06ee7569d93686440a3bdcf655d58 (diff) | |
Take audio device latency into account.
Diffstat (limited to 'src')
| -rw-r--r-- | src/wx/film_viewer.cc | 32 | ||||
| -rw-r--r-- | src/wx/film_viewer.h | 6 |
2 files changed, 37 insertions, 1 deletions
diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index 56f9c15e8..fb9c5d2ab 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -92,6 +92,7 @@ FilmViewer::FilmViewer (wxWindow* p) , _audio_channels (0) , _audio_block_size (1024) , _playing (false) + , _latency_history_count (0) { #ifndef __WXOSX__ _panel->SetDoubleBuffered (true); @@ -200,6 +201,9 @@ FilmViewer::set_film (shared_ptr<Film> film) _film->Changed.connect (boost::bind (&FilmViewer::film_changed, this, _1)); _player->Changed.connect (boost::bind (&FilmViewer::player_changed, this, _1)); + /* Keep about 1 second's worth of history samples */ + _latency_history_count = _film->audio_frame_rate() / _audio_block_size; + recreate_butler (); calculate_sizes (); @@ -714,7 +718,8 @@ DCPTime FilmViewer::time () const { if (_audio.isStreamRunning ()) { - return DCPTime::from_seconds (const_cast<RtAudio*>(&_audio)->getStreamTime ()); + return DCPTime::from_seconds (const_cast<RtAudio*>(&_audio)->getStreamTime ()) - + DCPTime::from_frames (average_latency(), _film->audio_frame_rate()); } return _video_position; @@ -724,5 +729,30 @@ int FilmViewer::audio_callback (void* out_p, unsigned int frames) { _butler->get_audio (reinterpret_cast<float*> (out_p), frames); + + boost::mutex::scoped_lock lm (_latency_history_mutex, boost::try_to_lock); + if (lm) { + _latency_history.push_back (_audio.getStreamLatency ()); + if (_latency_history.size() > static_cast<size_t> (_latency_history_count)) { + _latency_history.pop_front (); + } + } + return 0; } + +Frame +FilmViewer::average_latency () const +{ + boost::mutex::scoped_lock lm (_latency_history_mutex); + if (_latency_history.empty()) { + return 0; + } + + Frame total = 0; + BOOST_FOREACH (Frame i, _latency_history) { + total += i; + } + + return total / _latency_history.size(); +} diff --git a/src/wx/film_viewer.h b/src/wx/film_viewer.h index ed7795dad..aacede06e 100644 --- a/src/wx/film_viewer.h +++ b/src/wx/film_viewer.h @@ -89,6 +89,7 @@ private: DCPTime time () const; void start (); bool stop (); + Frame average_latency () const; boost::shared_ptr<Film> _film; boost::shared_ptr<Player> _player; @@ -130,5 +131,10 @@ private: bool _playing; boost::shared_ptr<Butler> _butler; + std::list<Frame> _latency_history; + /** Mutex to protect _latency_history */ + mutable boost::mutex _latency_history_mutex; + int _latency_history_count; + boost::signals2::scoped_connection _config_changed_connection; }; |
