#include "i18n.h"
Auditioner::Auditioner (Session& s)
- : AudioTrack (s, "auditioner", Route::Hidden)
+ : AudioTrack (s, "auditioner", Route::Auditioner)
, current_frame (0)
, _auditioning (0)
, length (0)
+ , _seek_frame (-1)
+ , _seeking (false)
+ , _seek_complete (false)
, via_monitor (false)
{
}
if (Track::init ()) {
return -1;
}
+
+ if (connect ()) {
+ return -1;
+ }
+
+ _output->changed.connect_same_thread (*this, boost::bind (&Auditioner::output_changed, this, _1, _2));
+
+ return 0;
+}
+Auditioner::~Auditioner ()
+{
+}
+
+int
+Auditioner::connect ()
+{
string left = Config->get_auditioner_output_left();
string right = Config->get_auditioner_output_right();
vector<string> outputs;
_session.engine().get_physical_outputs (DataType::AUDIO, outputs);
+ via_monitor = false;
+
if (left.empty() || left == "default") {
if (_session.monitor_out()) {
left = _session.monitor_out()->input()->audio (0)->name();
}
}
+ _output->disconnect (this);
+
if (left.empty() && right.empty()) {
- warning << _("no outputs available for auditioner - manual connection required") << endmsg;
+ if (_output->n_ports().n_audio() == 0) {
+ /* ports not set up, so must be during startup */
+ warning << _("no outputs available for auditioner - manual connection required") << endmsg;
+ }
} else {
- _main_outs->defer_pan_reset ();
-
- if (left.length()) {
- _output->add_port (left, this, DataType::AUDIO);
- }
-
- if (right.length()) {
- _output->add_port (right, this, DataType::AUDIO);
- }
-
- _main_outs->allow_pan_reset ();
- _main_outs->reset_panner ();
- }
+ if (_output->n_ports().n_audio() == 0) {
- _output->changed.connect_same_thread (*this, boost::bind (&Auditioner::output_changed, this, _1, _2));
+ /* create (and connect) new ports */
- return 0;
-}
+ _main_outs->defer_pan_reset ();
+
+ if (left.length()) {
+ _output->add_port (left, this, DataType::AUDIO);
+ }
+
+ if (right.length()) {
+ _output->add_port (right, this, DataType::AUDIO);
+ }
+
+ _main_outs->allow_pan_reset ();
+ _main_outs->reset_panner ();
-Auditioner::~Auditioner ()
-{
+ } else {
+
+ /* reconnect existing ports */
+
+ boost::shared_ptr<Port> oleft (_output->nth (0));
+ boost::shared_ptr<Port> oright (_output->nth (1));
+ if (oleft) {
+ oleft->connect (left);
+ }
+ if (oright) {
+ oright->connect (right);
+ }
+ }
+
+ }
+
+ return 0;
}
AudioPlaylist&
_main_outs->reset_panner();
+ _seek_frame = -1;
+ _seeking = false;
length = the_region->length();
int dir;
return 0;
}
- this_nframes = min (nframes, length - current_frame);
+#if 0 // TODO
+ if (_seeking && _seek_complete) {
+ // set FADE-IN
+ } else if (_seek_frame >= 0 && _seek_frame < length && !_seeking) {
+ // set FADE-OUT -- use/override amp? || use region-gain ?
+ }
+#endif
- if ((ret = roll (this_nframes, current_frame, current_frame + nframes, false, need_butler)) != 0) {
+ if (_seeking && _seek_complete) {
+ _seek_complete = false;
+ _seeking = false;
+ _seek_frame = -1;
+ }
+
+ if(!_seeking) {
+ /* process audio */
+ this_nframes = min (nframes, length - current_frame);
+
+ if ((ret = roll (this_nframes, current_frame, current_frame + nframes, false, need_butler)) != 0) {
+ silence (nframes);
+ return ret;
+ }
+
+ current_frame += this_nframes;
+
+ } else {
silence (nframes);
- return ret;
}
- current_frame += this_nframes;
+ if (_seek_frame >= 0 && _seek_frame < length && !_seeking) {
+ _seek_complete = false;
+ _seeking = true;
+ need_butler = true;
+ }
+
+ if (!_seeking) {
+ AuditionProgress(current_frame, length); /* emit */
+ }
if (current_frame >= length) {
_session.cancel_audition ();