+std::pair <samplepos_t,samplepos_t>
+Editor::session_gui_extents (bool use_extra) const
+{
+ if (!_session) {
+ return std::pair <samplepos_t,samplepos_t>(max_samplepos,0);
+ }
+
+ samplecnt_t session_extent_start = _session->current_start_sample();
+ samplecnt_t session_extent_end = _session->current_end_sample();
+
+ /* calculate the extents of all regions in every playlist
+ * NOTE: we should listen to playlists, and cache these values so we don't calculate them every time.
+ */
+ {
+ boost::shared_ptr<RouteList> rl = _session->get_routes();
+ for (RouteList::iterator r = rl->begin(); r != rl->end(); ++r) {
+ boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*r);
+ if (tr) {
+ boost::shared_ptr<Playlist> pl = tr->playlist();
+ if (pl && !pl->all_regions_empty()) {
+ pair<samplepos_t, samplepos_t> e;
+ e = pl->get_extent();
+ if (e.first < session_extent_start) {
+ session_extent_start = e.first;
+ }
+ if (e.second > session_extent_end) {
+ session_extent_end = e.second;
+ }
+ }
+ }
+ }
+ }
+
+ /* ToDo: also incorporate automation regions (in case the session has no audio/midi but is just used for automating plugins or the like) */
+
+ /* add additional time to the ui extents (user-defined in config) */
+ if (use_extra) {
+ samplecnt_t const extra = UIConfiguration::instance().get_extra_ui_extents_time() * 60 * _session->nominal_sample_rate();
+ session_extent_end += extra;
+ session_extent_start -= extra;
+ }
+
+ /* range-check */
+ if (session_extent_end > max_samplepos) {
+ session_extent_end = max_samplepos;
+ }
+ if (session_extent_start < 0) {
+ session_extent_start = 0;
+ }
+
+ std::pair <samplepos_t,samplepos_t> ret (session_extent_start, session_extent_end);
+ return ret;
+}
+