#include "pbd/enumwriter.h"
#include "pbd/convert.h"
-#include "ardour/midi_buffer.h"
-
-#include "ardour/debug.h"
-#include "ardour/delivery.h"
-#include "ardour/audio_buffer.h"
-#include "ardour/audio_port.h"
#include "ardour/amp.h"
+#include "ardour/audioengine.h"
#include "ardour/buffer_set.h"
-#include "ardour/configuration.h"
+#include "ardour/debug.h"
+#include "ardour/delivery.h"
#include "ardour/io.h"
-#include "ardour/meter.h"
#include "ardour/mute_master.h"
-#include "ardour/panner.h"
-#include "ardour/panner_shell.h"
#include "ardour/pannable.h"
+#include "ardour/panner_shell.h"
#include "ardour/port.h"
#include "ardour/session.h"
-#include "ardour/audioengine.h"
#include "i18n.h"
+namespace ARDOUR { class Panner; }
+
using namespace std;
using namespace PBD;
using namespace ARDOUR;
-PBD::Signal1<void, pframes_t> Delivery::CycleStart;
-PBD::Signal0<int> Delivery::PannersLegal;
+PBD::Signal0<void> Delivery::PannersLegal;
bool Delivery::panners_legal = false;
/* deliver to an existing IO object */
, _current_gain (1.0)
, _no_outs_cuz_we_no_monitor (false)
, _mute_master (mm)
- , no_panner_reset (false)
- , scnt (0)
+ , _no_panner_reset (false)
{
if (pannable) {
_panshell = boost::shared_ptr<PannerShell>(new PannerShell (_name, _session, pannable));
if (_output) {
_output->changed.connect_same_thread (*this, boost::bind (&Delivery::output_changed, this, _1, _2));
}
-
- CycleStart.connect_same_thread (*this, boost::bind (&Delivery::cycle_start, this, _1));
}
/* deliver to a new IO object */
, _current_gain (1.0)
, _no_outs_cuz_we_no_monitor (false)
, _mute_master (mm)
- , no_panner_reset (false)
- , scnt (0)
+ , _no_panner_reset (false)
{
if (pannable) {
_panshell = boost::shared_ptr<PannerShell>(new PannerShell (_name, _session, pannable));
if (_output) {
_output->changed.connect_same_thread (*this, boost::bind (&Delivery::output_changed, this, _1, _2));
}
-
- CycleStart.connect_same_thread (*this, boost::bind (&Delivery::cycle_start, this, _1));
}
Delivery::~Delivery()
{
- DEBUG_TRACE (DEBUG::Destruction, string_compose ("delivery %1 destructor\n", _name));
+ DEBUG_TRACE (DEBUG::Destruction, string_compose ("delivery %1 destructor\n", _name));
+
+ /* this object should vanish from any signal callback lists
+ that it is on before we get any further. The full qualification
+ of the method name is not necessary, but is here to make it
+ clear that this call is about signals, not data flow connections.
+ */
+
+ ScopedConnectionList::drop_connections ();
+
delete _output_buffers;
}
}
}
-void
-Delivery::cycle_start (pframes_t /*nframes*/)
-{
- _no_outs_cuz_we_no_monitor = false;
-}
-
bool
Delivery::can_support_io_configuration (const ChanCount& in, ChanCount& out) const
{
Delivery::reset_panner ()
{
if (panners_legal) {
- if (!no_panner_reset) {
+ if (!_no_panner_reset) {
if (_panshell) {
_panshell->configure_io (ChanCount (DataType::AUDIO, pans_required()), ChanCount (DataType::AUDIO, pan_outs()));
}
}
-int
+void
Delivery::panners_became_legal ()
{
if (_panshell) {
}
panner_legal_c.disconnect ();
- return 0;
}
void
Delivery::defer_pan_reset ()
{
- no_panner_reset = true;
+ _no_panner_reset = true;
}
void
Delivery::allow_pan_reset ()
{
- no_panner_reset = false;
+ _no_panner_reset = false;
reset_panner ();
}
int
-Delivery::disable_panners (void)
+Delivery::disable_panners ()
{
panners_legal = false;
return 0;
}
-int
+void
Delivery::reset_panners ()
{
panners_legal = true;
- return *PannersLegal ();
+ PannersLegal ();
}
void
-Delivery::flush_buffers (framecnt_t nframes, framepos_t time)
+Delivery::flush_buffers (framecnt_t nframes)
{
/* io_lock, not taken: function must be called from Session::process() calltree */
PortSet& ports (_output->ports());
for (PortSet::iterator i = ports.begin(); i != ports.end(); ++i) {
- i->flush_buffers (nframes, time);
+ i->flush_buffers (nframes);
}
}