#include "libardour-config.h"
#endif
-#define __STDC_FORMAT_MACROS 1
#include <stdint.h>
#include <algorithm>
#include "ardour/audioplaylist.h"
#include "ardour/audioregion.h"
#include "ardour/auditioner.h"
+#include "ardour/automation_control.h"
#include "ardour/buffer.h"
#include "ardour/butler.h"
#include "ardour/configuration.h"
#include "ardour/midi_source.h"
#include "ardour/midi_track.h"
#include "ardour/named_selection.h"
+#include "ardour/panner.h"
#include "ardour/processor.h"
#include "ardour/port.h"
#include "ardour/region_factory.h"
post_export_sync = false;
midi_control_ui = 0;
_step_editors = 0;
+ no_questions_about_missing_files = false;
+ _speakers = 0;
AudioDiskstream::allocate_working_buffers();
/* default short fade = 15ms */
- Crossfade::set_short_xfade_length ((nframes_t) floor (config.get_short_xfade_seconds() * frame_rate()));
+ Crossfade::set_short_xfade_length ((framecnt_t) floor (config.get_short_xfade_seconds() * frame_rate()));
SndFileSource::setup_standard_crossfades (*this, frame_rate());
last_mmc_step.tv_sec = 0;
}
last_timecode_when = 0;
- _timecode_offset = 0;
- _timecode_offset_negative = true;
last_timecode_valid = false;
sync_time_vars ();
midi_search_path += sdir.midi_path ();
}
- // set the search path for each data type
- FileSource::set_search_path (DataType::AUDIO, sound_search_path.to_string ());
- SMFSource::set_search_path (DataType::MIDI, midi_search_path.to_string ());
-
// reset the round-robin soundfile path thingie
last_rr_session_dir = session_dirs.begin();
}
return -1;
}
+ dir = plugins_dir ();
+
+ if (g_mkdir_with_parents (dir.c_str(), 0755) < 0) {
+ error << string_compose(_("Session: cannot create session plugins folder \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
+ return -1;
+ }
+
return 0;
}
+/** Caller must not hold process lock */
int
Session::create (const string& mix_template, BusProfile* bus_profile)
{
}
boost_debug_shared_ptr_mark_interesting (rt, "Route");
boost::shared_ptr<Route> r (rt);
- r->input()->ensure_io (count, false, this);
- r->output()->ensure_io (count, false, this);
+ {
+ Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
+ r->input()->ensure_io (count, false, this);
+ r->output()->ensure_io (count, false, this);
+ }
r->set_remote_control_id (control_id++);
rl.push_back (r);
}
boost_debug_shared_ptr_mark_interesting (rt, "Route");
boost::shared_ptr<Route> r (rt);
- r->input()->ensure_io (count, false, this);
- r->output()->ensure_io (count, false, this);
+ {
+ Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
+ r->input()->ensure_io (count, false, this);
+ r->output()->ensure_io (count, false, this);
+ }
r->set_remote_control_id (control_id);
rl.push_back (r);
if (full_state) {
node->add_property ("name", _name);
- snprintf (buf, sizeof (buf), "%" PRId32, _nominal_frame_rate);
+ snprintf (buf, sizeof (buf), "%" PRId64, _nominal_frame_rate);
node->add_property ("sample-rate", buf);
if (session_dirs.size() > 1) {
set_dirty();
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
+ retry:
try {
if ((source = XMLSourceFactory (**niter)) == 0) {
error << _("Session: cannot create Source from XML description.") << endmsg;
}
+
} catch (MissingSource& err) {
- warning << _("A sound file is missing. It will be replaced by silence.") << endmsg;
- source = SourceFactory::createSilent (*this, **niter, max_framecnt, _current_frame_rate);
+
+ int user_choice;
+
+ if (!no_questions_about_missing_files) {
+ user_choice = MissingFile (this, err.path, err.type).get_value_or (-1);
+ } else {
+ user_choice = -2;
+ }
+
+ switch (user_choice) {
+ case 0:
+ /* user added a new search location, so try again */
+ goto retry;
+
+
+ case 1:
+ /* user asked to quit the entire session load
+ */
+ return -1;
+
+ case 2:
+ no_questions_about_missing_files = true;
+ goto retry;
+
+ case 3:
+ no_questions_about_missing_files = true;
+ /* fallthru */
+
+ case -1:
+ default:
+ warning << _("A sound file is missing. It will be replaced by silence.") << endmsg;
+ source = SourceFactory::createSilent (*this, **niter, max_framecnt, _current_frame_rate);
+ break;
+ }
}
}
return Glib::build_filename (_path, "analysis");
}
+string
+Session::plugins_dir () const
+{
+ return Glib::build_filename (_path, "plugins");
+}
+
int
Session::load_bundles (XMLNode const & node)
{
bool is_new;
uint16_t chan;
- if (FileSource::find (type, prop->value(), true, is_new, chan, found_path)) {
+ if (FileSource::find (*this, type, prop->value(), true, is_new, chan, found_path)) {
result.insert (found_path);
}
}
break;
}
- case ControllableDescriptor::Pan:
- /* XXX pan control */
+ case ControllableDescriptor::PanDirection:
+ {
+ boost::shared_ptr<Panner> p = r->panner();
+ if (p) {
+ c = p->direction_control();
+ }
+ break;
+ }
+
+ case ControllableDescriptor::PanWidth:
+ {
+ boost::shared_ptr<Panner> p = r->panner();
+ if (p) {
+ c = p->width_control();
+ }
break;
+ }
case ControllableDescriptor::Balance:
/* XXX simple pan control */
ut->add_command(c);
}
- } else if (n->name() == "DiffCommand") {
- PBD::ID id(n->property("midi-source")->value());
+ } else if (n->name() == "NoteDiffCommand") {
+ PBD::ID id (n->property("midi-source")->value());
boost::shared_ptr<MidiSource> midi_source =
boost::dynamic_pointer_cast<MidiSource, Source>(source_by_id(id));
if (midi_source) {
- ut->add_command(new MidiModel::DiffCommand(midi_source->model(), *n));
+ ut->add_command (new MidiModel::NoteDiffCommand(midi_source->model(), *n));
} else {
- error << _("Failed to downcast MidiSource for DiffCommand") << endmsg;
+ error << _("Failed to downcast MidiSource for NoteDiffCommand") << endmsg;
}
} else if (n->name() == "StatefulDiffCommand") {
listen_position_changed ();
} else if (p == "solo-control-is-listen-control") {
solo_control_mode_changed ();
+ } else if (p == "timecode-offset" || p == "timecode-offset-negative") {
+ last_timecode_valid = false;
}
-
set_dirty ();
}