diff options
author | Robin Gareus <robin@gareus.org> | 2017-10-30 17:27:13 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-10-30 17:27:13 +0100 |
commit | b54db1cab79e25c39eccb4667bc7c44efb4ccb02 (patch) | |
tree | 8664de71fb64b23dcf0bac1014f09655ea744f5c /libs/ardour/port_manager.cc | |
parent | d6e96a688dda3a9fa8fbb4c3a60526475aabb7bc (diff) |
Fix fade-out at quit.
Diffstat (limited to 'libs/ardour/port_manager.cc')
-rw-r--r-- | libs/ardour/port_manager.cc | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/libs/ardour/port_manager.cc b/libs/ardour/port_manager.cc index eae1654543..2b038142f8 100644 --- a/libs/ardour/port_manager.cc +++ b/libs/ardour/port_manager.cc @@ -869,13 +869,26 @@ PortManager::check_monitoring () } void -PortManager::fade_out (gain_t base_gain, gain_t gain_step, pframes_t nframes) +PortManager::cycle_end_fade_out (gain_t base_gain, gain_t gain_step, pframes_t nframes, Session* s) { - for (Ports::iterator i = _cycle_ports->begin(); i != _cycle_ports->end(); ++i) { + if (s && s->rt_tasklist ()) { + RTTaskList::TaskList tl; + for (Ports::iterator p = _cycle_ports->begin(); p != _cycle_ports->end(); ++p) { + tl.push_back (boost::bind (&Port::cycle_end, p->second, nframes)); + } + s->rt_tasklist()->process (tl); + } else { + for (Ports::iterator p = _cycle_ports->begin(); p != _cycle_ports->end(); ++p) { + p->second->cycle_end (nframes); + } + } - if (i->second->sends_output()) { + for (Ports::iterator p = _cycle_ports->begin(); p != _cycle_ports->end(); ++p) { + p->second->flush_buffers (nframes); + + if (p->second->sends_output()) { - boost::shared_ptr<AudioPort> ap = boost::dynamic_pointer_cast<AudioPort> (i->second); + boost::shared_ptr<AudioPort> ap = boost::dynamic_pointer_cast<AudioPort> (p->second); if (ap) { Sample* s = ap->engine_get_whole_audio_buffer (); gain_t g = base_gain; @@ -887,6 +900,8 @@ PortManager::fade_out (gain_t base_gain, gain_t gain_step, pframes_t nframes) } } } + _cycle_ports.reset (); + /* we are done */ } PortEngine& |