the BIG CONFIG patch

git-svn-id: svn://localhost/ardour2/trunk@926 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2006-09-25 21:24:00 +00:00
parent 7b99808a57
commit ac1272c0d4
45 changed files with 996 additions and 1949 deletions

View file

@ -172,9 +172,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
shuttle_fract = 0.0;
shuttle_max_speed = 8.0f;
set_shuttle_units (Percentage);
set_shuttle_behaviour (Sprung);
shuttle_style_menu = 0;
shuttle_unit_menu = 0;
@ -935,10 +932,11 @@ restart JACK with more ports."));
void
ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
{
jack_nframes_t _preroll;
jack_nframes_t _preroll = 0;
if (session) {
_preroll = session->convert_to_frames_at (new_position, session->preroll);
// XXX CONFIG_CHANGE FIX - requires AnyTime handling
// _preroll = session->convert_to_frames_at (new_position, Config->get_preroll());
if (new_position > _preroll) {
new_position -= _preroll;
@ -1013,8 +1011,8 @@ ARDOUR_UI::transport_stop ()
return;
}
if (session->get_auto_loop()) {
session->request_auto_loop (false);
if (Config->get_auto_loop()) {
session->request_play_loop (false);
}
session->request_stop ();
@ -1068,8 +1066,8 @@ ARDOUR_UI::transport_roll ()
rolling = session->transport_rolling ();
if (session->get_auto_loop()) {
session->request_auto_loop (false);
if (Config->get_auto_loop()) {
session->request_play_loop (false);
auto_loop_button.set_active (false);
roll_button.set_active (true);
} else if (session->get_play_range ()) {
@ -1086,7 +1084,7 @@ void
ARDOUR_UI::transport_loop()
{
if (session) {
if (session->get_auto_loop()) {
if (Config->get_auto_loop()) {
if (session->transport_rolling()) {
Location * looploc = session->locations()->auto_loop_location();
if (looploc) {
@ -1095,7 +1093,7 @@ ARDOUR_UI::transport_loop()
}
}
else {
session->request_auto_loop (true);
session->request_play_loop (true);
}
}
}
@ -1725,8 +1723,8 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
uint32_t cchns;
uint32_t mchns;
Session::AutoConnectOption iconnect;
Session::AutoConnectOption oconnect;
AutoConnectOption iconnect;
AutoConnectOption oconnect;
if (new_session_dialog->create_control_bus()) {
cchns = (uint32_t) new_session_dialog->control_channel_count();
@ -1741,19 +1739,19 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
}
if (new_session_dialog->connect_inputs()) {
iconnect = Session::AutoConnectPhysical;
iconnect = AutoConnectPhysical;
} else {
iconnect = Session::AutoConnectOption (0);
iconnect = AutoConnectOption (0);
}
/// @todo some minor tweaks.
if (new_session_dialog->connect_outs_to_master()) {
oconnect = Session::AutoConnectMaster;
oconnect = AutoConnectMaster;
} else if (new_session_dialog->connect_outs_to_physical()) {
oconnect = Session::AutoConnectPhysical;
oconnect = AutoConnectPhysical;
} else {
oconnect = Session::AutoConnectOption (0);
oconnect = AutoConnectOption (0);
}
uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count();
@ -1822,6 +1820,8 @@ This prevents the session from being loaded."));
connect_to_session (new_session);
Config->set_current_owner (ConfigVariableBase::Interface);
session_loaded = true;
return 0;
}
@ -1842,8 +1842,8 @@ int
ARDOUR_UI::build_session (const string & path, const string & snap_name,
uint32_t control_channels,
uint32_t master_channels,
Session::AutoConnectOption input_connect,
Session::AutoConnectOption output_connect,
AutoConnectOption input_connect,
AutoConnectOption output_connect,
uint32_t nphysin,
uint32_t nphysout,
jack_nframes_t initial_length)
@ -2127,9 +2127,9 @@ ARDOUR_UI::add_route ()
string name_template = add_route_dialog->name_template ();
bool track = add_route_dialog->track ();
Session::AutoConnectOption oac = session->get_output_auto_connect();
AutoConnectOption oac = Config->get_output_auto_connect();
if (oac & Session::AutoConnectMaster) {
if (oac & AutoConnectMaster) {
output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
} else {
output_chan = input_chan;

View file

@ -112,8 +112,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI
int build_session (const string & path, const string & snapshot,
uint32_t ctl_chns,
uint32_t master_chns,
ARDOUR::Session::AutoConnectOption input_connect,
ARDOUR::Session::AutoConnectOption output_connect,
ARDOUR::AutoConnectOption input_connect,
ARDOUR::AutoConnectOption output_connect,
uint32_t nphysin,
uint32_t nphysout,
jack_nframes_t initial_length);
@ -373,16 +373,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
void toggle_time_master ();
void toggle_video_sync ();
enum ShuttleBehaviour {
Sprung,
Wheel
};
enum ShuttleUnits {
Percentage,
Semitones
};
Gtk::DrawingArea shuttle_box;
Gtk::EventBox speed_display_box;
Gtk::Label speed_display_label;
@ -390,8 +380,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
Gtk::ComboBoxText shuttle_style_button;
Gtk::Menu* shuttle_unit_menu;
Gtk::Menu* shuttle_style_menu;
ShuttleBehaviour shuttle_behaviour;
ShuttleUnits shuttle_units;
float shuttle_max_speed;
Gtk::Menu* shuttle_context_menu;
@ -399,8 +387,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
void show_shuttle_context_menu ();
void shuttle_style_changed();
void shuttle_unit_clicked ();
void set_shuttle_behaviour (ShuttleBehaviour);
void set_shuttle_units (ShuttleUnits);
void set_shuttle_max_speed (float);
void update_speed_display ();
float last_speed_displayed;
@ -416,6 +402,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI
bool shuttle_grabbed;
double shuttle_fract;
static const double SHUTTLE_FRACT_SPEED1=0.48412291827; /* derived from A1,A2 */
Gtk::ToggleButton punch_in_button;
Gtk::ToggleButton punch_out_button;
Gtk::ToggleButton auto_return_button;
@ -565,7 +553,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI
void we_have_dependents ();
void setup_keybindings ();
void setup_session_options ();
void setup_config_options ();
guint32 last_key_press_time;
@ -670,9 +657,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI
std::vector<std::string> positional_sync_strings;
void toggle_config_state (const char* group, const char* action, void (ARDOUR::Configuration::*set)(bool));
void toggle_session_state (const char* group, const char* action, void (ARDOUR::Session::*set)(bool), bool (ARDOUR::Session::*get)(void) const);
void toggle_session_state (const char* group, const char* action, sigc::slot<void> theSlot);
void toggle_config_state (const char* group, const char* action, bool (ARDOUR::Configuration::*set)(bool), bool (ARDOUR::Configuration::*get)(void) const);
void toggle_config_state (const char* group, const char* action, sigc::slot<void> theSlot);
void toggle_send_midi_feedback ();
void toggle_use_mmc ();
void toggle_send_mmc ();
@ -699,9 +685,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI
void toggle_LatchedRecordEnable ();
void mtc_port_changed ();
void map_some_session_state (const char* group, const char* action, bool (ARDOUR::Session::*get)() const);
void queue_session_control_changed (ARDOUR::Session::ControlType t);
void session_control_changed (ARDOUR::Session::ControlType t);
void map_some_state (const char* group, const char* action, bool (ARDOUR::Configuration::*get)() const);
void parameter_changed (const char*);
void toggle_control_protocol (ARDOUR::ControlProtocolInfo*);
};

View file

@ -130,20 +130,16 @@ ARDOUR_UI::transport_stopped ()
update_disk_space ();
}
static const double SHUTTLE_FRACT_SPEED1=0.48412291827; /* derived from A1,A2 */
void
ARDOUR_UI::transport_rolling ()
{
stop_button.set_active (false);
if (session->get_play_range()) {
play_selection_button.set_active (true);
roll_button.set_active (false);
auto_loop_button.set_active (false);
} else if (session->get_auto_loop ()) {
} else if (Config->get_auto_loop ()) {
auto_loop_button.set_active (true);
play_selection_button.set_active (false);
roll_button.set_active (false);
@ -396,9 +392,9 @@ ARDOUR_UI::setup_transport ()
sdframe->add (speed_display_box);
mtc_port_changed ();
sync_option_combo.set_active_text (positional_sync_strings.front());
sync_option_combo.signal_changed().connect (mem_fun (*this, &ARDOUR_UI::sync_option_changed));
Gtkmm2ext::set_size_request_to_display_given_text (sync_option_combo, "Internal", 22, 10);
const guint32 FUDGE = 25; // Combo's are stupid - they steal space from the entry for the button
set_size_request_to_display_given_text (sync_option_combo, X_("Igternal"), 2+FUDGE, 10);
shbox->pack_start (*sdframe, false, false);
shbox->pack_start (shuttle_units_button, true, true);
@ -514,7 +510,7 @@ ARDOUR_UI::_auditioning_changed (bool onoff)
void
ARDOUR_UI::auditioning_changed (bool onoff)
{
Gtkmm2ext::UI::instance()->call_slot(bind (mem_fun(*this, &ARDOUR_UI::_auditioning_changed), onoff));
UI::instance()->call_slot(bind (mem_fun(*this, &ARDOUR_UI::_auditioning_changed), onoff));
}
void
@ -668,8 +664,8 @@ ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev)
mouse_shuttle (ev->x, true);
shuttle_grabbed = false;
shuttle_box.remove_modal_grab ();
if (shuttle_behaviour == Sprung) {
if (session->get_auto_play() || roll_button.get_state()) {
if (Config->get_shuttle_behaviour() == Sprung) {
if (Config->get_auto_play() || roll_button.get_state()) {
shuttle_fract = SHUTTLE_FRACT_SPEED1;
session->request_transport_speed (1.0);
stop_button.set_active (false);
@ -828,50 +824,15 @@ ARDOUR_UI::shuttle_unit_clicked ()
shuttle_unit_menu->popup (1, 0);
}
void
ARDOUR_UI::set_shuttle_units (ShuttleUnits u)
{
switch ((shuttle_units = u)) {
case Percentage:
shuttle_units_button.set_label("% ");
break;
case Semitones:
shuttle_units_button.set_label(_("ST"));
break;
}
}
void
ARDOUR_UI::shuttle_style_changed ()
{
ustring str = shuttle_style_button.get_active_text ();
if (str == _("sprung")) {
set_shuttle_behaviour (Sprung);
Config->set_shuttle_behaviour (Sprung);
} else if (str == _("wheel")) {
set_shuttle_behaviour (Wheel);
}
}
void
ARDOUR_UI::set_shuttle_behaviour (ShuttleBehaviour b)
{
switch ((shuttle_behaviour = b)) {
case Sprung:
shuttle_style_button.set_active_text (_("sprung"));
shuttle_fract = 0.0;
shuttle_box.queue_draw ();
if (session) {
if (session->transport_rolling()) {
shuttle_fract = SHUTTLE_FRACT_SPEED1;
session->request_transport_speed (1.0);
}
}
break;
case Wheel:
shuttle_style_button.set_active_text (_("wheel"));
break;
Config->set_shuttle_behaviour (Wheel);
}
}
@ -892,7 +853,7 @@ ARDOUR_UI::update_speed_display ()
if (x != last_speed_displayed) {
if (x != 0) {
if (shuttle_units == Percentage) {
if (Config->get_shuttle_units() == Percentage) {
snprintf (buf, sizeof (buf), "%.2f", x);
} else {
if (x < 0) {
@ -920,31 +881,19 @@ ARDOUR_UI::set_transport_sensitivity (bool yn)
void
ARDOUR_UI::editor_realized ()
{
Config->map_parameters (mem_fun (*this, &ARDOUR_UI::parameter_changed));
set_size_request_to_display_given_text (speed_display_box, _("-0.55"), 2, 2);
/* XXX: this should really be saved in instant.xml or something similar and restored from there */
shuttle_style_button.set_active_text (_("sprung"));
const guint32 FUDGE = 20; // Combo's are stupid - they steal space from the entry for the button
const guint32 FUDGE = 25; // Combo's are stupid - they steal space from the entry for the button
set_size_request_to_display_given_text (shuttle_style_button, _("sprung"), 2+FUDGE, 10);
}
void
ARDOUR_UI::sync_option_changed ()
{
string which;
if (session == 0) {
return;
if (session) {
session->request_slave_source (string_to_slave_source (sync_option_combo.get_active_text()));
}
which = sync_option_combo.get_active_text();
if (which == positional_sync_strings[Session::None]) {
session->request_slave_source (Session::None);
} else if (which == positional_sync_strings[Session::MTC]) {
session->request_slave_source (Session::MTC);
} else if (which == positional_sync_strings[Session::JACK]) {
session->request_slave_source (Session::JACK);
}
}
void

View file

@ -354,8 +354,8 @@ ARDOUR_UI::install_actions ()
Glib::RefPtr<ActionGroup> shuttle_actions = ActionGroup::create ("ShuttleActions");
shuttle_actions->add (Action::create (X_("SetShuttleUnitsPercentage"), _("Percentage")), bind (mem_fun(*this, &ARDOUR_UI::set_shuttle_units), Percentage));
shuttle_actions->add (Action::create (X_("SetShuttleUnitsSemitones"), _("Semitones")), bind (mem_fun(*this, &ARDOUR_UI::set_shuttle_units), Semitones));
shuttle_actions->add (Action::create (X_("SetShuttleUnitsPercentage"), _("Percentage")), sigc::hide_return (sigc::bind (sigc::mem_fun (*Config, &Configuration::set_shuttle_units), Percentage)));
shuttle_actions->add (Action::create (X_("SetShuttleUnitsSemitones"), _("Semitones")), sigc::hide_return (sigc::bind (sigc::mem_fun (*Config, &Configuration::set_shuttle_units), Semitones)));
Glib::RefPtr<ActionGroup> option_actions = ActionGroup::create ("options");
@ -437,10 +437,6 @@ ARDOUR_UI::install_actions ()
ActionManager::add_action_group (transport_actions);
ActionManager::add_action_group (main_actions);
ActionManager::add_action_group (common_actions);
/* initialize state of non-session dependent options */
setup_config_options ();
}
void

View file

@ -36,99 +36,27 @@ using namespace Gtk;
using namespace Gtkmm2ext;
using namespace ARDOUR;
using namespace PBD;
using namespace sigc;
void
ARDOUR_UI::setup_config_options ()
{
std::vector<Glib::ustring> groups;
groups.push_back("options");
groups.push_back("Editor");
groups.push_back("Transport");
struct {
char* name;
bool (Configuration::*method)(void) const;
char act_type; //(t)oggle or (r)adio
} options[] = {
{ "ToggleTimeMaster", &Configuration::get_jack_time_master, 't' },
{ "StopPluginsWithTransport", &Configuration::get_plugins_stop_with_transport, 't' },
{ "LatchedRecordEnable", &Configuration::get_latched_record_enable, 't' },
{ "VerifyRemoveLastCapture", &Configuration::get_verify_remove_last_capture, 't' },
{ "StopRecordingOnXrun", &Configuration::get_stop_recording_on_xrun, 't' },
{ "StopTransportAtEndOfSession", &Configuration::get_stop_at_session_end, 't' },
{ "UseHardwareMonitoring", &Configuration::get_use_hardware_monitoring, 'r' },
{ "UseSoftwareMonitoring", &Configuration::get_use_sw_monitoring, 'r' },
{ "UseExternalMonitoring", &Configuration::get_use_external_monitoring, 'r' },
{ "MeterFalloffOff", &Configuration::get_meter_falloff_off, 'r' },
{ "MeterFalloffSlowest", &Configuration::get_meter_falloff_slowest, 'r' },
{ "MeterFalloffSlow", &Configuration::get_meter_falloff_slow, 'r' },
{ "MeterFalloffMedium", &Configuration::get_meter_falloff_medium, 'r' },
{ "MeterFalloffFast", &Configuration::get_meter_falloff_fast, 'r' },
{ "MeterFalloffFaster", &Configuration::get_meter_falloff_faster, 'r' },
{ "MeterFalloffFastest", &Configuration::get_meter_falloff_fastest, 'r' },
{ "MeterHoldOff", &Configuration::get_meter_hold_off, 'r' },
{ "MeterHoldShort", &Configuration::get_meter_hold_short, 'r' },
{ "MeterHoldMedium", &Configuration::get_meter_hold_medium, 'r' },
{ "MeterHoldLong", &Configuration::get_meter_hold_long, 'r' },
{ "ToggleVideoSync", &Configuration::get_use_video_sync, 't' },
{ 0, 0, 0 }
};
for (uint32_t n = 0; options[n].name; ++n) {
for (std::vector<Glib::ustring>::iterator i = groups.begin(); i != groups.end(); i++) {
Glib::RefPtr<Action> act = ActionManager::get_action (i->c_str(), options[n].name);
if (act) {
Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
if (options[n].act_type == 't' || options[n].act_type == 'r') {
if ((Config->*(options[n].method))()) {
tact->set_active (true);
} else {
tact->set_active (false);
}
}
continue;
}
}
}
}
void
ARDOUR_UI::toggle_time_master ()
{
toggle_config_state ("Transport", "ToggleTimeMaster", &Configuration::set_jack_time_master);
if (session) {
session->engine().reset_timebase ();
}
}
void
ARDOUR_UI::toggle_config_state (const char* group, const char* action, void (Configuration::*set)(bool))
ARDOUR_UI::toggle_config_state (const char* group, const char* action, bool (Configuration::*set)(bool), bool (Configuration::*get)(void) const)
{
Glib::RefPtr<Action> act = ActionManager::get_action (group, action);
if (act) {
Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
(Config->*set) (tact->get_active());
}
}
void
ARDOUR_UI::toggle_session_state (const char* group, const char* action, void (Session::*set)(bool), bool (Session::*get)(void) const)
{
if (session) {
Glib::RefPtr<Action> act = ActionManager::get_action (group, action);
if (act) {
Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
bool x = (session->*get)();
if (tact) {
bool x = (Config->*get)();
if (x != tact->get_active()) {
(session->*set) (!x);
(Config->*set) (!x);
}
}
}
}
void
ARDOUR_UI::toggle_session_state (const char* group, const char* action, sigc::slot<void> theSlot)
ARDOUR_UI::toggle_config_state (const char* group, const char* action, sigc::slot<void> theSlot)
{
if (session) {
Glib::RefPtr<Action> act = ActionManager::get_action (group, action);
@ -141,93 +69,102 @@ ARDOUR_UI::toggle_session_state (const char* group, const char* action, sigc::sl
}
}
void
ARDOUR_UI::toggle_time_master ()
{
toggle_config_state ("Transport", "ToggleTimeMaster", &Configuration::set_jack_time_master, &Configuration::get_jack_time_master);
if (session) {
session->engine().reset_timebase ();
}
}
void
ARDOUR_UI::toggle_send_mtc ()
{
toggle_session_state ("options", "SendMTC", &Session::set_send_mtc, &Session::get_send_mtc);
toggle_config_state ("options", "SendMTC", &Configuration::set_send_mtc, &Configuration::get_send_mtc);
}
void
ARDOUR_UI::toggle_send_mmc ()
{
toggle_session_state ("options", "SendMMC", &Session::set_send_mmc, &Session::get_send_mmc);
toggle_config_state ("options", "SendMMC", &Configuration::set_send_mmc, &Configuration::get_send_mmc);
}
void
ARDOUR_UI::toggle_use_mmc ()
{
toggle_session_state ("options", "UseMMC", &Session::set_mmc_control, &Session::get_mmc_control);
toggle_config_state ("options", "UseMMC", &Configuration::set_mmc_control, &Configuration::get_mmc_control);
}
void
ARDOUR_UI::toggle_use_midi_control ()
{
toggle_session_state ("options", "UseMIDIcontrol", &Session::set_midi_control, &Session::get_midi_control);
toggle_config_state ("options", "UseMIDIcontrol", &Configuration::set_midi_control, &Configuration::get_midi_control);
}
void
ARDOUR_UI::toggle_send_midi_feedback ()
{
toggle_session_state ("options", "SendMIDIfeedback", &Session::set_midi_feedback, &Session::get_midi_feedback);
toggle_config_state ("options", "SendMIDIfeedback", &Configuration::set_midi_feedback, &Configuration::get_midi_feedback);
}
void
ARDOUR_UI::toggle_AutoConnectNewTrackInputsToHardware()
{
toggle_session_state ("options", "AutoConnectNewTrackInputsToHardware", &Session::set_input_auto_connect, &Session::get_input_auto_connect);
toggle_config_state ("options", "AutoConnectNewTrackInputsToHardware", hide_return (bind (mem_fun (*Config, &Configuration::set_input_auto_connect), AutoConnectPhysical)));
}
void
ARDOUR_UI::toggle_AutoConnectNewTrackOutputsToHardware()
{
toggle_session_state ("options", "AutoConnectNewTrackOutputsToHardware", bind (mem_fun (session, &Session::set_output_auto_connect), Session::AutoConnectPhysical));
toggle_config_state ("options", "AutoConnectNewTrackOutputsToHardware", hide_return (bind (mem_fun (*Config, &Configuration::set_output_auto_connect), AutoConnectPhysical)));
}
void
ARDOUR_UI::toggle_AutoConnectNewTrackOutputsToMaster()
{
toggle_session_state ("options", "AutoConnectNewTrackOutputsToHardware", bind (mem_fun (session, &Session::set_output_auto_connect), Session::AutoConnectMaster));
toggle_config_state ("options", "AutoConnectNewTrackOutputsToHardware", hide_return (bind (mem_fun (*Config, &Configuration::set_output_auto_connect), AutoConnectMaster)));
}
void
ARDOUR_UI::toggle_ManuallyConnectNewTrackOutputs()
{
toggle_session_state ("options", "AutoConnectNewTrackOutputsToHardware", bind (mem_fun (session, &Session::set_output_auto_connect), Session::AutoConnectOption (0)));
toggle_config_state ("options", "AutoConnectNewTrackOutputsToHardware", hide_return (bind (mem_fun (*Config, &Configuration::set_output_auto_connect), AutoConnectOption (0))));
}
void
ARDOUR_UI::toggle_auto_input ()
{
toggle_session_state ("Transport", "ToggleAutoInput", &Session::set_auto_input, &Session::get_auto_input);
toggle_config_state ("Transport", "ToggleAutoInput", &Configuration::set_auto_input, &Configuration::get_auto_input);
}
void
ARDOUR_UI::toggle_auto_play ()
{
toggle_session_state ("Transport", "ToggleAutoPlay", &Session::set_auto_play, &Session::get_auto_play);
toggle_config_state ("Transport", "ToggleAutoPlay", &Configuration::set_auto_play, &Configuration::get_auto_play);
}
void
ARDOUR_UI::toggle_auto_return ()
{
toggle_session_state ("Transport", "ToggleAutoReturn", &Session::set_auto_return, &Session::get_auto_return);
toggle_config_state ("Transport", "ToggleAutoReturn", &Configuration::set_auto_return, &Configuration::get_auto_return);
}
void
ARDOUR_UI::toggle_click ()
{
toggle_session_state ("Transport", "ToggleClick", &Session::set_clicking, &Session::get_clicking);
toggle_config_state ("Transport", "ToggleClick", &Configuration::set_clicking, &Configuration::get_clicking);
}
void
ARDOUR_UI::toggle_session_auto_loop ()
{
if (session) {
if (session->get_auto_loop()) {
if (Config->get_auto_loop()) {
if (session->transport_rolling()) {
transport_roll();
} else {
session->request_auto_loop (false);
session->request_play_loop (false);
}
} else {
session->request_auto_loop (true);
session->request_play_loop (true);
}
}
}
@ -235,16 +172,16 @@ ARDOUR_UI::toggle_session_auto_loop ()
void
ARDOUR_UI::toggle_punch_in ()
{
toggle_session_state ("Transport", "TogglePunchIn", &Session::set_punch_in, &Session::get_punch_in);
toggle_config_state ("Transport", "TogglePunchIn", &Configuration::set_punch_in, &Configuration::get_punch_in);
}
void
ARDOUR_UI::toggle_punch_out ()
{
toggle_session_state ("Transport", "TogglePunchOut", &Session::set_punch_out, &Session::get_punch_out);
toggle_config_state ("Transport", "TogglePunchOut", &Configuration::set_punch_out, &Configuration::get_punch_out);
}
void
void
ARDOUR_UI::toggle_video_sync()
{
Glib::RefPtr<Action> act = ActionManager::get_action ("Transport", "ToggleVideoSync");
@ -322,37 +259,37 @@ ARDOUR_UI::toggle_UseExternalMonitoring()
void
ARDOUR_UI::toggle_StopPluginsWithTransport()
{
toggle_config_state ("options", "StopPluginsWithTransport", &Configuration::set_plugins_stop_with_transport);
toggle_config_state ("options", "StopPluginsWithTransport", &Configuration::set_plugins_stop_with_transport, &Configuration::get_plugins_stop_with_transport);
}
void
ARDOUR_UI::toggle_LatchedRecordEnable()
{
toggle_config_state ("options", "LatchedRecordEnable", &Configuration::set_latched_record_enable);
toggle_config_state ("options", "LatchedRecordEnable", &Configuration::set_latched_record_enable, &Configuration::get_latched_record_enable);
}
void
ARDOUR_UI::toggle_DoNotRunPluginsWhileRecording()
{
toggle_session_state ("options", "DoNotRunPluginsWhileRecording", &Session::set_do_not_record_plugins, &Session::get_do_not_record_plugins);
toggle_config_state ("options", "DoNotRunPluginsWhileRecording", &Configuration::set_do_not_record_plugins, &Configuration::get_do_not_record_plugins);
}
void
ARDOUR_UI::toggle_VerifyRemoveLastCapture()
{
toggle_config_state ("options", "VerifyRemoveLastCapture", &Configuration::set_verify_remove_last_capture);
toggle_config_state ("options", "VerifyRemoveLastCapture", &Configuration::set_verify_remove_last_capture, &Configuration::get_verify_remove_last_capture);
}
void
ARDOUR_UI::toggle_StopRecordingOnXrun()
{
toggle_config_state ("options", "StopRecordingOnXrun", &Configuration::set_stop_recording_on_xrun);
toggle_config_state ("options", "StopRecordingOnXrun", &Configuration::set_stop_recording_on_xrun, &Configuration::get_stop_recording_on_xrun);
}
void
ARDOUR_UI::toggle_StopTransportAtEndOfSession()
{
toggle_config_state ("options", "StopTransportAtEndOfSession", &Configuration::set_stop_at_session_end);
toggle_config_state ("options", "StopTransportAtEndOfSession", &Configuration::set_stop_at_session_end, &Configuration::get_stop_at_session_end);
}
void
@ -372,7 +309,7 @@ ARDOUR_UI::toggle_GainReduceFastTransport()
void
ARDOUR_UI::toggle_LatchedSolo()
{
toggle_session_state ("options", "LatchedSolo", &Session::set_solo_latched, &Session::solo_latched);
toggle_config_state ("options", "LatchedSolo", &Configuration::set_solo_latched, &Configuration::get_solo_latched);
}
void
@ -387,9 +324,9 @@ ARDOUR_UI::toggle_SoloViaBus()
Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
if (tact->get_active()) {
session->set_solo_model (Session::SoloBus);
Config->set_solo_model (SoloBus);
} else {
session->set_solo_model (Session::InverseMute);
Config->set_solo_model (InverseMute);
}
}
}
@ -398,6 +335,7 @@ void
ARDOUR_UI::toggle_AutomaticallyCreateCrossfades()
{
}
void
ARDOUR_UI::toggle_UnmuteNewFullCrossfades()
{
@ -418,24 +356,12 @@ ARDOUR_UI::mtc_port_changed ()
have_mtc = false;
}
positional_sync_strings.clear ();
positional_sync_strings.push_back (slave_source_to_string (None));
if (have_mtc) {
const gchar *psync_strings[] = {
N_("Internal"),
N_("MTC"),
N_("JACK"),
0
};
positional_sync_strings = PBD::internationalize (psync_strings);
} else {
const gchar *psync_strings[] = {
N_("Internal"),
N_("JACK"),
0
};
positional_sync_strings = PBD::internationalize (psync_strings);
positional_sync_strings.push_back (slave_source_to_string (MTC));
}
positional_sync_strings.push_back (slave_source_to_string (JACK));
set_popdown_strings (sync_option_combo, positional_sync_strings);
}
@ -445,147 +371,126 @@ ARDOUR_UI::setup_session_options ()
{
mtc_port_changed ();
session_control_changed (Session::SlaveType);
session_control_changed (Session::SendMTC);
session_control_changed (Session::SendMMC);
session_control_changed (Session::MMCControl);
session_control_changed (Session::MidiFeedback);
session_control_changed (Session::MidiControl);
session_control_changed (Session::RecordingPlugins);
session_control_changed (Session::CrossFadesActive);
session_control_changed (Session::SoloLatch);
session_control_changed (Session::SoloingModel);
session_control_changed (Session::LayeringModel);
session_control_changed (Session::CrossfadingModel);
session_control_changed (Session::PunchOut);
session_control_changed (Session::PunchIn);
session_control_changed (Session::AutoPlay);
session_control_changed (Session::AutoReturn);
session_control_changed (Session::AutoInput);
session_control_changed (Session::Clicking);
session_control_changed (Session::SmpteMode);
session->ControlChanged.connect (mem_fun (*this, &ARDOUR_UI::queue_session_control_changed));
Config->ParameterChanged.connect (mem_fun (*this, &ARDOUR_UI::parameter_changed));
}
void
ARDOUR_UI::map_some_session_state (const char* group, const char* action, bool (Session::*get)() const)
ARDOUR_UI::map_some_state (const char* group, const char* action, bool (Configuration::*get)() const)
{
if (!session) {
return;
}
Glib::RefPtr<Action> act = ActionManager::get_action (group, action);
if (act) {
Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
bool x = (session->*get)();
if (tact->get_active() != x) {
tact->set_active (x);
if (tact) {
bool x = (Config->*get)();
if (tact->get_active() != x) {
tact->set_active (x);
}
}
}
}
void
ARDOUR_UI::queue_session_control_changed (Session::ControlType t)
ARDOUR_UI::parameter_changed (const char* parameter_name)
{
ENSURE_GUI_THREAD (bind (mem_fun (*this, &ARDOUR_UI::session_control_changed), t));
}
#define PARAM_IS(x) (!strcmp (parameter_name, (x)))
void
ARDOUR_UI::session_control_changed (Session::ControlType t)
{
switch (t) {
case Session::SlaveType:
switch (session->slave_source()) {
case Session::None:
sync_option_combo.set_active_text (_("Internal"));
if (PARAM_IS ("slave-source")) {
sync_option_combo.set_active_text (slave_source_to_string (Config->get_slave_source()));
} else if (PARAM_IS ("send-mtc")) {
map_some_state ("options", "SendMTC", &Configuration::get_send_mtc);
} else if (PARAM_IS ("send-mmc")) {
map_some_state ("options", "SendMMC", &Configuration::get_send_mmc);
} else if (PARAM_IS ("mmc-control")) {
map_some_state ("options", "UseMMC", &Configuration::get_mmc_control);
} else if (PARAM_IS ("midi-feedback")) {
map_some_state ("options", "SendMIDIfeedback", &Configuration::get_midi_feedback);
} else if (PARAM_IS ("midi-control")) {
map_some_state ("options", "UseMIDIcontrol", &Configuration::get_midi_control);
} else if (PARAM_IS ("do-not-record-plugins")) {
map_some_state ("options", "DoNotRunPluginsWhileRecording", &Configuration::get_do_not_record_plugins);
} else if (PARAM_IS ("crossfades-active")) {
map_some_state ("options", "CrossfadesActive", &Configuration::get_crossfades_active);
} else if (PARAM_IS ("latched-record-enable")) {
map_some_state ("options", "LatchedRecordEnable", &Configuration::get_latched_record_enable);
} else if (PARAM_IS ("solo-latch")) {
map_some_state ("options", "LatchedSolo", &Configuration::get_solo_latched);
} else if (PARAM_IS ("solo-model")) {
} else if (PARAM_IS ("layer-model")) {
} else if (PARAM_IS ("crossfade-model")) {
} else if (PARAM_IS ("auto-play")) {
map_some_state ("Transport", "ToggleAutoPlay", &Configuration::get_auto_play);
} else if (PARAM_IS ("auto-loop")) {
map_some_state ("Transport", "Loop", &Configuration::get_auto_loop);
} else if (PARAM_IS ("auto-return")) {
map_some_state ("Transport", "ToggleAutoReturn", &Configuration::get_auto_return);
} else if (PARAM_IS ("auto-input")) {
map_some_state ("Transport", "ToggleAutoInput", &Configuration::get_auto_input);
} else if (PARAM_IS ("punch-out")) {
map_some_state ("Transport", "TogglePunchOut", &Configuration::get_punch_out);
} else if (PARAM_IS ("punch-in")) {
map_some_state ("Transport", "TogglePunchIn", &Configuration::get_punch_in);
} else if (PARAM_IS ("clicking")) {
map_some_state ("Transport", "ToggleClick", &Configuration::get_clicking);
} else if (PARAM_IS ("jack-time-master")) {
map_some_state ("Transport", "ToggleTimeMaster", &Configuration::get_jack_time_master);
} else if (PARAM_IS ("plugins-stop-with-transport")) {
map_some_state ("options", "StopPluginsWithTransport", &Configuration::get_plugins_stop_with_transport);
} else if (PARAM_IS ("latched-record-enable")) {
map_some_state ("options", "LatchedRecordEnable", &Configuration::get_latched_record_enable);
} else if (PARAM_IS ("verify-remove-last-capture")) {
map_some_state ("options", "VerifyRemoveLastCapture", &Configuration::get_verify_remove_last_capture);
} else if (PARAM_IS ("stop-recording-on-xrun")) {
map_some_state ("options", "StopRecordingOnXrun", &Configuration::get_stop_recording_on_xrun);
} else if (PARAM_IS ("stop-at-session-end")) {
map_some_state ("options", "StopTransportAtEndOfSession", &Configuration::get_stop_at_session_end);
} else if (PARAM_IS ("use-hardware-monitoring")) {
map_some_state ("options", "UseHardwareMonitoring", &Configuration::get_use_hardware_monitoring);
} else if (PARAM_IS ("use-sw-monitoring")) {
map_some_state ("options", "UseSoftwareMonitoring", &Configuration::get_use_sw_monitoring);
} else if (PARAM_IS ("use-external-monitoring")) {
map_some_state ("options", "UseExternalMonitoring", &Configuration::get_use_external_monitoring);
} else if (PARAM_IS ("use-video-sync")) {
map_some_state ("Transport", "ToggleVideoSync", &Configuration::get_use_video_sync);
} else if (PARAM_IS ("quieten-at-speed")) {
map_some_state ("options", "GainReduceFastTransport", &Configuration::get_quieten_at_speed);
} else if (PARAM_IS ("shuttle-behaviour")) {
switch (Config->get_shuttle_behaviour ()) {
case Sprung:
shuttle_style_button.set_active_text (_("sprung"));
shuttle_fract = 0.0;
shuttle_box.queue_draw ();
if (session) {
if (session->transport_rolling()) {
shuttle_fract = SHUTTLE_FRACT_SPEED1;
session->request_transport_speed (1.0);
}
}
break;
case Session::MTC:
sync_option_combo.set_active_text (_("MTC"));
break;
case Session::JACK:
sync_option_combo.set_active_text (_("JACK"));
case Wheel:
shuttle_style_button.set_active_text (_("wheel"));
break;
}
} else if (PARAM_IS ("shuttle-units")) {
break;
case Session::SendMTC:
map_some_session_state ("options", "SendMTC", &Session::get_send_mtc);
break;
case Session::SendMMC:
map_some_session_state ("options", "SendMMC", &Session::get_send_mmc);
break;
case Session::MMCControl:
map_some_session_state ("options", "UseMMC", &Session::get_mmc_control);
break;
case Session::MidiFeedback:
map_some_session_state ("options", "SendMIDIfeedback", &Session::get_midi_feedback);
break;
case Session::MidiControl:
map_some_session_state ("options", "UseMIDIcontrol", &Session::get_midi_control);
break;
case Session::RecordingPlugins:
map_some_session_state ("options", "DoNotRunPluginsWhileRecording", &Session::get_do_not_record_plugins);
break;
case Session::CrossFadesActive:
map_some_session_state ("options", "CrossfadesActive", &Session::get_crossfades_active);
break;
case Session::SoloLatch:
break;
case Session::SoloingModel:
switch (session->solo_model()) {
case Session::InverseMute:
switch (Config->get_shuttle_units()) {
case Percentage:
shuttle_units_button.set_label("% ");
break;
case Session::SoloBus:
case Semitones:
shuttle_units_button.set_label(_("ST"));
break;
}
break;
case Session::LayeringModel:
break;
case Session::CrossfadingModel:
break;
case Session::AutoPlay:
map_some_session_state ("Transport", "ToggleAutoPlay", &Session::get_auto_play);
break;
case Session::AutoLoop:
break;
case Session::AutoReturn:
map_some_session_state ("Transport", "ToggleAutoReturn", &Session::get_auto_return);
break;
case Session::AutoInput:
map_some_session_state ("Transport", "ToggleAutoInput", &Session::get_auto_input);
break;
case Session::PunchOut:
map_some_session_state ("Transport", "TogglePunchOut", &Session::get_punch_out);
break;
case Session::PunchIn:
map_some_session_state ("Transport", "TogglePunchIn", &Session::get_punch_in);
break;
case Session::Clicking:
map_some_session_state ("Transport", "ToggleClick", &Session::get_clicking);
break;
default:
// somebody else handles this
break;
}
#undef PARAM_IS
}

View file

@ -1140,7 +1140,7 @@ AudioClock::get_frames (Field field,jack_nframes_t pos,int dir)
frames = session->frame_rate();
break;
case SMPTE_Frames:
frames = (jack_nframes_t) floor (session->frame_rate() / session->smpte_frames_per_second);
frames = (jack_nframes_t) floor (session->frame_rate() / Config->get_smpte_frames_per_second());
break;
case AudioFrames:
@ -1248,7 +1248,7 @@ AudioClock::smpte_sanitize_display()
seconds_label.set_text("59");
}
switch ((long)rint(session->smpte_frames_per_second)) {
switch ((long)rint(Config->get_smpte_frames_per_second())) {
case 24:
if (atoi(frames_label.get_text()) > 23) {
frames_label.set_text("23");
@ -1268,7 +1268,7 @@ AudioClock::smpte_sanitize_display()
break;
}
if (session->smpte_drop_frames) {
if (Config->get_smpte_drop_frames()) {
if ((atoi(minutes_label.get_text()) % 10) && (atoi(seconds_label.get_text()) == 0) && (atoi(frames_label.get_text()) < 2)) {
frames_label.set_text("02");
}

View file

@ -861,6 +861,7 @@ gnome_canvas_waveview_get_property (GObject *object,
case PROP_RECTIFIED:
g_value_set_boolean (value, waveview->rectified);
break;
case PROP_REGION_START:
g_value_set_uint (value, waveview->region_start);

View file

@ -1003,36 +1003,28 @@ Editor::on_realize ()
}
void
Editor::queue_session_control_changed (Session::ControlType t)
Editor::parameter_changed (const char* parameter_name)
{
Gtkmm2ext::UI::instance()->call_slot (bind (mem_fun(*this, &Editor::session_control_changed), t));
}
#define PARAM_IS(x) (!strcmp (parameter_name, (x)))
void
Editor::session_control_changed (Session::ControlType t)
{
// right now we're only tracking some state here
ENSURE_GUI_THREAD (bind (mem_fun (*this, &Editor::parameter_changed), parameter_name));
switch (t) {
case Session::AutoLoop:
if (PARAM_IS ("auto-loop")) {
update_loop_range_view (true);
break;
case Session::PunchIn:
case Session::PunchOut:
} else if (PARAM_IS ("punch-in")) {
update_punch_range_view (true);
break;
case Session::LayeringModel:
} else if (PARAM_IS ("punch-out")) {
update_punch_range_view (true);
} else if (PARAM_IS ("layer-model")) {
update_layering_model ();
break;
case Session::SmpteMode:
} else if (PARAM_IS ("smpte-frames-per-second") || PARAM_IS ("smpte-drop-frames")) {
update_smpte_mode ();
break;
update_just_smpte ();
} else if (PARAM_IS ("video-pullup")) {
update_video_pullup ();
}
default:
break;
}
#undef PARAM_IS
}
void
@ -1174,10 +1166,6 @@ Editor::connect_to_session (Session *t)
session_connections.push_back (session->RegionHiddenChange.connect (mem_fun(*this, &Editor::region_hidden)));
session_connections.push_back (session->SMPTEOffsetChanged.connect (mem_fun(*this, &Editor::update_just_smpte)));
session_connections.push_back (session->SMPTETypeChanged.connect (mem_fun(*this, &Editor::update_just_smpte)));
session_connections.push_back (session->SMPTETypeChanged.connect (mem_fun(*this, &Editor::update_smpte_mode)));
session_connections.push_back (session->PullupChanged.connect (mem_fun(*this, &Editor::update_video_pullup)));
session_connections.push_back (session->tempo_map().StateChanged.connect (mem_fun(*this, &Editor::tempo_map_changed)));
@ -1193,7 +1181,7 @@ Editor::connect_to_session (Session *t)
analysis_window->set_session (session);
#endif
switch (session->get_edit_mode()) {
switch (Config->get_edit_mode()) {
case Splice:
edit_mode_selector.set_active_text (edit_mode_strings[splice_index]);
break;
@ -1234,7 +1222,6 @@ Editor::connect_to_session (Session *t)
update_loop_range_view (true);
update_punch_range_view (true);
session->ControlChanged.connect (mem_fun(*this, &Editor::queue_session_control_changed));
session->StateSaved.connect (mem_fun(*this, &Editor::session_state_saved));
refresh_location_display ();
@ -1251,7 +1238,7 @@ Editor::connect_to_session (Session *t)
if (act) {
RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
/* do it twice to force the change */
yn = session->get_crossfades_active();
yn = Config->get_crossfades_active();
tact->set_active (!yn);
tact->set_active (yn);
}
@ -3522,7 +3509,7 @@ Editor::edit_mode_selection_done ()
mode = Slide;
}
session->set_edit_mode (mode);
Config->set_edit_mode (mode);
}
void
@ -4156,8 +4143,8 @@ Editor::update_smpte_mode ()
RefPtr<Action> act;
float frames = session->smpte_frames_per_second;
bool drop = session->smpte_drop_frames;
float frames = Config->get_smpte_frames_per_second();
bool drop = Config->get_smpte_drop_frames();
if ((frames < 23.976 * 1.0005) && !drop)
act = ActionManager::get_action (X_("Editor"), X_("Smpte23976"));
@ -4198,7 +4185,7 @@ Editor::update_video_pullup ()
RefPtr<Action> act;
float pullup = session->video_pullup;
float pullup = Config->get_video_pullup();
if ( pullup < (-4.1667 - 0.1) * 0.99) {
act = ActionManager::get_action (X_("Editor"), X_("PullupMinus4Minus1"));
@ -4235,14 +4222,14 @@ Editor::update_layering_model ()
{
RefPtr<Action> act;
switch (session->get_layer_model()) {
case Session::LaterHigher:
switch (Config->get_layer_model()) {
case LaterHigher:
act = ActionManager::get_action (X_("Editor"), X_("LayerLaterHigher"));
break;
case Session::MoveAddHigher:
case MoveAddHigher:
act = ActionManager::get_action (X_("Editor"), X_("LayerMoveAddHigher"));
break;
case Session::AddHigher:
case AddHigher:
act = ActionManager::get_action (X_("Editor"), X_("LayerAddHigher"));
break;
}
@ -4260,7 +4247,7 @@ Editor::update_crossfade_model ()
{
RefPtr<Action> act;
switch (session->get_xfade_model()) {
switch (Config->get_xfade_model()) {
case FullCrossfade:
act = ActionManager::get_action (X_("Editor"), X_("CrossfadesFull"));
break;

View file

@ -298,9 +298,6 @@ class Editor : public PublicEditor
void toggle_waveforms_while_recording ();
void toggle_measure_visibility ();
void set_meter_falloff (int);
void set_meter_hold (int32_t);
/* SMPTE timecode & video sync */
void smpte_fps_chosen (ARDOUR::Session::SmpteFormat format);
@ -320,7 +317,7 @@ class Editor : public PublicEditor
/* layers */
void set_layer_model (ARDOUR::Session::LayerModel);
void set_layer_model (ARDOUR::LayerModel);
void update_layering_model ();
/* redirect shared ops menu. caller must free returned menu */
@ -488,9 +485,7 @@ class Editor : public PublicEditor
ArdourCanvas::Text* verbose_canvas_cursor;
bool verbose_cursor_visible;
void session_control_changed (ARDOUR::Session::ControlType);
void queue_session_control_changed (ARDOUR::Session::ControlType);
void parameter_changed (const char *);
bool track_canvas_motion (GdkEvent*);

View file

@ -376,24 +376,24 @@ Editor::register_actions ()
Slow = 6.8dB/sec falloff at update rate of 40ms
*/
ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffOff"), _("Off"), bind (mem_fun (*this, &Editor::set_meter_falloff), 0));
ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffSlowest"), _("Slowest"), bind (mem_fun (*this, &Editor::set_meter_falloff), 1));
ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffSlow"), _("Slow"), bind (mem_fun (*this, &Editor::set_meter_falloff), 2));
ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffMedium"), _("Medium"), bind (mem_fun (*this, &Editor::set_meter_falloff), 3));
ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffFast"), _("Fast"), bind (mem_fun (*this, &Editor::set_meter_falloff), 4));
ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffFaster"), _("Faster"), bind (mem_fun (*this, &Editor::set_meter_falloff), 5));
ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffFastest"), _("Fastest"), bind (mem_fun (*this, &Editor::set_meter_falloff), 6));
ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffOff"), _("Off"), hide_return (bind (mem_fun (*Config, &Configuration::set_meter_falloff), 0.0f)));
ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffSlowest"), _("Slowest"), hide_return (bind (mem_fun (*Config, &Configuration::set_meter_falloff), 1.0f)));
ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffSlow"), _("Slow"), hide_return (bind (mem_fun (*Config, &Configuration::set_meter_falloff), 2.0f)));
ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffMedium"), _("Medium"), hide_return (bind (mem_fun (*Config, &Configuration::set_meter_falloff), 3.0f)));
ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffFast"), _("Fast"), hide_return (bind (mem_fun (*Config, &Configuration::set_meter_falloff), 4.0f)));
ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffFaster"), _("Faster"), hide_return (bind (mem_fun (*Config, &Configuration::set_meter_falloff), 5.0f)));
ActionManager::register_radio_action (editor_actions, meter_falloff_group, X_("MeterFalloffFastest"), _("Fastest"), hide_return (bind (mem_fun (*Config, &Configuration::set_meter_falloff), 6.0f)));
ActionManager::register_radio_action (editor_actions, meter_hold_group, X_("MeterHoldOff"), _("Off"), bind (mem_fun (*this, &Editor::set_meter_hold), 0));
ActionManager::register_radio_action (editor_actions, meter_hold_group, X_("MeterHoldShort"), _("Short"), bind (mem_fun (*this, &Editor::set_meter_hold), 40));
ActionManager::register_radio_action (editor_actions, meter_hold_group, X_("MeterHoldMedium"), _("Medium"), bind (mem_fun (*this, &Editor::set_meter_hold), 100));
ActionManager::register_radio_action (editor_actions, meter_hold_group, X_("MeterHoldLong"), _("Long"), bind (mem_fun (*this, &Editor::set_meter_hold), 200));
ActionManager::register_radio_action (editor_actions, meter_hold_group, X_("MeterHoldOff"), _("Off"), hide_return (bind (mem_fun (*Config, &Configuration::set_meter_hold), 0.0f)));
ActionManager::register_radio_action (editor_actions, meter_hold_group, X_("MeterHoldShort"), _("Short"), hide_return (bind (mem_fun (*Config, &Configuration::set_meter_hold), 40.0f)));
ActionManager::register_radio_action (editor_actions, meter_hold_group, X_("MeterHoldMedium"), _("Medium"), hide_return (bind (mem_fun (*Config, &Configuration::set_meter_hold), 100.0f)));
ActionManager::register_radio_action (editor_actions, meter_hold_group, X_("MeterHoldLong"), _("Long"), hide_return (bind (mem_fun (*Config, &Configuration::set_meter_hold), 200.0f)));
RadioAction::Group layer_model_group;
ActionManager::register_radio_action (editor_actions, layer_model_group, X_("LayerLaterHigher"), _("Later is Higher"), bind (mem_fun (*this, &Editor::set_layer_model), Session::LaterHigher));
ActionManager::register_radio_action (editor_actions, layer_model_group, X_("LayerMoveAddHigher"), _("Most Recently Moved/Added is Higher"), bind (mem_fun (*this, &Editor::set_layer_model), Session::MoveAddHigher));
ActionManager::register_radio_action (editor_actions, layer_model_group, X_("LayerAddHigher"), _("Most Recently Added is Higher"), bind (mem_fun (*this, &Editor::set_layer_model), Session::AddHigher));
ActionManager::register_radio_action (editor_actions, layer_model_group, X_("LayerLaterHigher"), _("Later is Higher"), bind (mem_fun (*this, &Editor::set_layer_model), LaterHigher));
ActionManager::register_radio_action (editor_actions, layer_model_group, X_("LayerMoveAddHigher"), _("Most Recently Moved/Added is Higher"), bind (mem_fun (*this, &Editor::set_layer_model), MoveAddHigher));
ActionManager::register_radio_action (editor_actions, layer_model_group, X_("LayerAddHigher"), _("Most Recently Added is Higher"), bind (mem_fun (*this, &Editor::set_layer_model), AddHigher));
RadioAction::Group smpte_group;
@ -473,7 +473,7 @@ Editor::toggle_xfades_active ()
Glib::RefPtr<Action> act = ActionManager::get_action (X_("Editor"), X_("toggle-xfades-active"));
if (session && act) {
Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
session->set_crossfades_active (tact->get_active());
Config->set_crossfades_active (tact->get_active());
}
}
@ -488,7 +488,7 @@ Editor::toggle_xfade_visibility ()
}
void
Editor::set_layer_model (Session::LayerModel model)
Editor::set_layer_model (LayerModel model)
{
/* this is driven by a toggle on a radio group, and so is invoked twice,
once for the item that became inactive and once for the one that became
@ -499,13 +499,13 @@ Editor::set_layer_model (Session::LayerModel model)
if (session) {
switch (model) {
case Session::LaterHigher:
case LaterHigher:
act = ActionManager::get_action (X_("Editor"), X_("LayerLaterHigher"));
break;
case Session::MoveAddHigher:
case MoveAddHigher:
act = ActionManager::get_action (X_("Editor"), X_("LayerMoveAddHigher"));
break;
case Session::AddHigher:
case AddHigher:
act = ActionManager::get_action (X_("Editor"), X_("LayerAddHigher"));
break;
}
@ -513,7 +513,7 @@ Editor::set_layer_model (Session::LayerModel model)
if (act) {
RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act);
if (ract && ract->get_active()) {
session->set_layer_model (model);
Config->set_layer_model (model);
}
}
}
@ -656,7 +656,7 @@ Editor::video_pullup_chosen (Session::PullupFormat pullup)
if (act) {
RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act);
if (ract && ract->get_active()) {
session->set_video_pullup ( pull );
Config->set_video_pullup ( pull );
}
} else cerr << "Editor::video_pullup_chosen could not find action to match pullup." << endl;
}
@ -686,7 +686,7 @@ Editor::set_crossfade_model (CrossfadeModel model)
if (act) {
RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act);
if (ract && ract->get_active()) {
session->set_xfade_model (model);
Config->set_xfade_model (model);
}
}
}

View file

@ -294,7 +294,7 @@ Editor::embed_sndfile (Glib::ustring path, bool split, bool multiple_files, bool
input_chan = finfo.channels;
if (session->get_output_auto_connect() & Session::AutoConnectMaster) {
if (Config->get_output_auto_connect() & AutoConnectMaster) {
output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
} else {
output_chan = input_chan;

View file

@ -27,7 +27,7 @@ Editor::set_route_loop_selection ()
loc->set (start, end);
// enable looping, reposition and start rolling
session->request_auto_loop (true);
session->request_play_loop (true);
session->request_locate (loc->start(), true);
}

View file

@ -745,7 +745,7 @@ Editor::marker_menu_loop_range ()
l2->set (l->start(), l->end());
// enable looping, reposition and start rolling
session->request_auto_loop(true);
session->request_play_loop(true);
session->request_locate (l2->start(), true);
}
}
@ -925,7 +925,7 @@ Editor::update_loop_range_view (bool visibility)
Location* tll;
if (session->get_auto_loop() && ((tll = transport_loop_location()) != 0)) {
if (Config->get_auto_loop() && ((tll = transport_loop_location()) != 0)) {
double x1 = frame_to_pixel (tll->start());
double x2 = frame_to_pixel (tll->end());
@ -951,7 +951,7 @@ Editor::update_punch_range_view (bool visibility)
Location* tpl;
if ((session->get_punch_in() || session->get_punch_out()) && ((tpl = transport_punch_location()) != 0)) {
if ((Config->get_punch_in() || Config->get_punch_out()) && ((tpl = transport_punch_location()) != 0)) {
double x1 = frame_to_pixel (tpl->start());
double x2 = frame_to_pixel (tpl->end());

View file

@ -3513,7 +3513,7 @@ Editor::show_verbose_time_cursor (jack_nframes_t frame, double offset, double xp
case AudioClock::MinSec:
/* XXX fix this to compute min/sec properly */
session->smpte_time (frame, smpte);
secs = smpte.seconds + ((float) smpte.frames / session->smpte_frames_per_second);
secs = smpte.seconds + ((float) smpte.frames / Config->get_smpte_frames_per_second());
snprintf (buf, sizeof (buf), "%02" PRId32 ":%02" PRId32 ":%.4f", smpte.hours, smpte.minutes, secs);
break;
@ -3580,7 +3580,7 @@ Editor::show_verbose_duration_cursor (jack_nframes_t start, jack_nframes_t end,
case AudioClock::MinSec:
/* XXX fix this to compute min/sec properly */
session->smpte_duration (end - start, smpte);
secs = smpte.seconds + ((float) smpte.frames / session->smpte_frames_per_second);
secs = smpte.seconds + ((float) smpte.frames / Config->get_smpte_frames_per_second());
snprintf (buf, sizeof (buf), "%02" PRId32 ":%02" PRId32 ":%.4f", smpte.hours, smpte.minutes, secs);
break;

View file

@ -90,87 +90,6 @@ Editor::redo (uint32_t n)
}
}
void
Editor::set_meter_hold (int32_t cnt)
{
Config->set_meter_hold_off(false);
Config->set_meter_hold_short(false);
Config->set_meter_hold_medium(false);
Config->set_meter_hold_long(false);
switch (cnt)
{
case 0:
Config->set_meter_hold_off(true);
break;
case 40:
Config->set_meter_hold_short(true);
break;
case 100:
Config->set_meter_hold_medium(true);
break;
case 200:
Config->set_meter_hold_long(true);
break;
}
if (session) {
session->set_meter_hold (cnt);
}
}
void
Editor::set_meter_falloff (int intval)
{
float val = 0.0f; /* off */
std::string str;
Config->set_meter_falloff_off(false);
Config->set_meter_falloff_slowest(false);
Config->set_meter_falloff_slow(false);
Config->set_meter_falloff_medium(false);
Config->set_meter_falloff_fast(false);
Config->set_meter_falloff_faster(false);
Config->set_meter_falloff_fastest(false);
switch (intval)
{
case 0:
val = 0.0f;
Config->set_meter_falloff_off(true);
break;
case 1:
val = 0.125f;
Config->set_meter_falloff_slowest(true);
break;
case 2:
val = 0.250f;
Config->set_meter_falloff_slow(true);
break;
case 3:
val = 0.375f;
Config->set_meter_falloff_medium(true);
break;
case 4:
val = 0.500f;
Config->set_meter_falloff_fast(true);
break;
case 5:
val = 0.750f;
Config->set_meter_falloff_faster(true);
break;
case 6:
val = 0.875f;
Config->set_meter_falloff_fastest(true);
break;
}
if (session) {
session->set_meter_falloff (val);
}
}
int
Editor::ensure_cursor (jack_nframes_t *pos)
{
@ -1898,9 +1817,9 @@ Editor::toggle_playback (bool with_abort)
return;
}
switch (session->slave_source()) {
case Session::None:
case Session::JACK:
switch (Config->get_slave_source()) {
case None:
case JACK:
break;
default:
/* transport controlled by the master */
@ -1914,8 +1833,8 @@ Editor::toggle_playback (bool with_abort)
if (session->transport_rolling()) {
session->request_stop (with_abort);
if (session->get_auto_loop()) {
session->request_auto_loop (false);
if (Config->get_auto_loop()) {
session->request_play_loop (false);
}
} else {
session->request_transport_speed (1.0f);
@ -1961,7 +1880,7 @@ Editor::loop_selected_region ()
// enable looping, reposition and start rolling
session->request_auto_loop (true);
session->request_play_loop (true);
session->request_locate (tll->start(), false);
session->request_transport_speed (1.0f);
}
@ -1991,7 +1910,7 @@ Editor::loop_location (Location& location)
tll->set (location.start(), location.end());
// enable looping, reposition and start rolling
session->request_auto_loop (true);
session->request_play_loop (true);
session->request_locate (tll->start(), true);
}
}

View file

@ -201,7 +201,7 @@ GainMeter::GainMeter (boost::shared_ptr<IO> io, Session& s)
gain_adjustment.signal_value_changed().connect (mem_fun(*this, &GainMeter::gain_adjusted));
peak_display.signal_button_release_event().connect (mem_fun(*this, &GainMeter::peak_button_release));
_session.MeterHoldChanged.connect (mem_fun(*this, &GainMeter::meter_hold_changed));
Config->ParameterChanged.connect (mem_fun (*this, &GainMeter::parameter_changed));
gain_changed (0);
update_gain_sensitive ();
@ -346,17 +346,24 @@ GainMeter::update_meters ()
}
void
GainMeter::meter_hold_changed()
GainMeter::parameter_changed(const char* parameter_name)
{
ENSURE_GUI_THREAD(mem_fun(*this, &GainMeter::meter_hold_changed));
#define PARAM_IS(x) (!strcmp (parameter_name, (x)))
ENSURE_GUI_THREAD (bind (mem_fun(*this, &GainMeter::parameter_changed), parameter_name));
if (PARAM_IS ("meter-hold")) {
vector<MeterInfo>::iterator i;
uint32_t n;
for (n = 0, i = meters.begin(); i != meters.end(); ++i, ++n) {
vector<MeterInfo>::iterator i;
uint32_t n;
(*i).meter->set_hold_count ((uint32_t) floor(_session.meter_hold()));
for (n = 0, i = meters.begin(); i != meters.end(); ++i, ++n) {
(*i).meter->set_hold_count ((uint32_t) floor(Config->get_meter_hold()));
}
}
#undef PARAM_IS
}
void
@ -424,7 +431,7 @@ GainMeter::setup_meters ()
for (uint32_t n = 0; n < nmeters; ++n) {
if (meters[n].width != width) {
delete meters[n].meter;
meters[n].meter = new FastMeter ((uint32_t) floor (_session.meter_hold()), width, FastMeter::Vertical);
meters[n].meter = new FastMeter ((uint32_t) floor (Config->get_meter_hold()), width, FastMeter::Vertical);
meters[n].width = width;
meters[n].meter->add_events (Gdk::BUTTON_RELEASE_MASK);

View file

@ -172,7 +172,7 @@ class GainMeter : public Gtk::VBox
bool wait_for_release;
ARDOUR::MeterPoint old_meter_point;
void meter_hold_changed();
void parameter_changed (const char*);
void reset_peak_display ();
void reset_group_peak_display (ARDOUR::RouteGroup*);

View file

@ -441,6 +441,7 @@ int main (int argc, char *argv[])
try {
ARDOUR::init (use_vst, try_hw_optimization);
Config->set_current_owner (ConfigVariableBase::Interface);
ui->set_engine (*engine);
} catch (failed_constructor& err) {
error << _("could not initialize Ardour.") << endmsg;

View file

@ -248,16 +248,16 @@ OptionEditor::add_session_paths ()
click_emphasis_path_entry.set_sensitive (true);
session_raid_entry.set_sensitive (true);
if (session->click_sound.length() == 0) {
if (Config->get_click_sound().empty()) {
click_path_entry.set_text (_("internal"));
} else {
click_path_entry.set_text (session->click_sound);
click_path_entry.set_text (Config->get_click_sound());
}
if (session->click_emphasis_sound.length() == 0) {
if (Config->get_click_emphasis_sound().empty()) {
click_emphasis_path_entry.set_text (_("internal"));
} else {
click_emphasis_path_entry.set_text (session->click_emphasis_sound);
click_emphasis_path_entry.set_text (Config->get_click_emphasis_sound());
}
session_raid_entry.set_text(session->raid_path());
@ -607,7 +607,7 @@ void
OptionEditor::raid_path_changed ()
{
if (session) {
session->set_raid_path (session_raid_entry.get_text());
Config->set_raid_path (session_raid_entry.get_text());
}
}
@ -655,22 +655,22 @@ OptionEditor::click_sound_changed ()
if (session) {
string path = click_path_entry.get_text();
if (path == session->click_sound) {
if (path == Config->get_click_sound()) {
return;
}
if (path.length() == 0) {
if (path.empty()) {
session->set_click_sound ("");
Config->set_click_sound ("");
} else {
strip_whitespace_edges (path);
if (path == _("internal")) {
session->set_click_sound ("");
Config->set_click_sound ("");
} else {
session->set_click_sound (path);
Config->set_click_sound (path);
}
}
}
@ -682,22 +682,22 @@ OptionEditor::click_emphasis_sound_changed ()
if (session) {
string path = click_emphasis_path_entry.get_text();
if (path == session->click_emphasis_sound) {
if (path == Config->get_click_emphasis_sound()) {
return;
}
if (path.length() == 0) {
if (path.empty()) {
session->set_click_emphasis_sound ("");
Config->set_click_emphasis_sound ("");
} else {
strip_whitespace_edges (path);
if (path == _("internal")) {
session->set_click_emphasis_sound ("");
Config->set_click_emphasis_sound ("");
} else {
session->set_click_emphasis_sound (path);
Config->set_click_emphasis_sound (path);
}
}
}

View file

@ -113,7 +113,7 @@ SendUI::update ()
void
SendUI::fast_update ()
{
if (_session.meter_falloff() > 0.0f) {
if (Config->get_meter_falloff() > 0.0f) {
gpm.update_meters ();
}
}

View file

@ -55,11 +55,17 @@ class Configuration : public Stateful
std::map<std::string,MidiPortDescriptor *> midi_ports;
void map_parameters (sigc::slot<void,const char*> theSlot);
int load_state ();
int save_state ();
int set_state (const XMLNode&);
XMLNode& get_state (void);
XMLNode& get_partial_state (ConfigVariableBase::Owner);
void set_variables (const XMLNode&, ConfigVariableBase::Owner owner);
void set_current_owner (ConfigVariableBase::Owner);
XMLNode* control_protocol_state () { return _control_protocol_state; }
@ -71,14 +77,13 @@ class Configuration : public Stateful
#undef CONFIG_VARIABLE_SPECIAL
#define CONFIG_VARIABLE(Type,var,name,value) \
Type get_##var () const { return var.get(); } \
void set_##var (Type val) { var.set (val); var.set_is_user (user_configuration); ParameterChanged (name); }
bool set_##var (Type val) { bool ret = var.set (val, current_owner); if (ret) { ParameterChanged (name); } return ret; }
#define CONFIG_VARIABLE_SPECIAL(Type,var,name,value,mutator) \
Type get_##var () const { return var.get(); } \
void set_##var (Type val) { var.set (val); var.set_is_user (user_configuration); ParameterChanged (name); }
bool set_##var (Type val) { bool ret = var.set (val, current_owner); if (ret) { ParameterChanged (name); } return ret; }
#include "ardour/configuration_vars.h"
#undef CONFIG_VARIABLE
#undef CONFIG_VARIABLE_SPECIAL
private:
@ -92,10 +97,10 @@ class Configuration : public Stateful
#undef CONFIG_VARIABLE
#undef CONFIG_VARIABLE_SPECIAL
bool user_configuration;
ConfigVariableBase::Owner current_owner;
XMLNode* _control_protocol_state;
XMLNode& state (bool user_only);
XMLNode& state (ConfigVariableBase::Owner);
};
extern Configuration *Config;

View file

@ -10,19 +10,26 @@ namespace ARDOUR {
class ConfigVariableBase {
public:
ConfigVariableBase (std::string str) : _name (str), _is_user (false) {}
enum Owner {
Default,
System,
Config,
Session,
Interface
};
ConfigVariableBase (std::string str) : _name (str), _owner (Default) {}
virtual ~ConfigVariableBase() {}
std::string name() const { return _name; }
bool is_user() const { return _is_user; }
void set_is_user (bool yn) { _is_user = yn; }
Owner owner() const { return _owner; }
virtual void add_to_node (XMLNode& node) = 0;
virtual bool set_from_node (const XMLNode& node) = 0;
virtual bool set_from_node (const XMLNode& node, Owner owner) = 0;
protected:
std::string _name;
bool _is_user;
Owner _owner;
};
template<class T>
@ -32,8 +39,13 @@ class ConfigVariable : public ConfigVariableBase
ConfigVariable (std::string str) : ConfigVariableBase (str) {}
ConfigVariable (std::string str, T val) : ConfigVariableBase (str), value (val) {}
virtual void set (T val) {
virtual bool set (T val, Owner owner) {
if (val == value) {
return false;
}
value = val;
_owner = owner;
return true;
}
T get() const {
@ -49,30 +61,63 @@ class ConfigVariable : public ConfigVariableBase
node.add_child_nocopy (*child);
}
bool set_from_node (const XMLNode& node) {
const XMLProperty* prop;
XMLNodeList nlist;
XMLNodeConstIterator niter;
XMLNode* child;
bool set_from_node (const XMLNode& node, Owner owner) {
nlist = node.children();
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
if (node.name() == "Config") {
/* ardour.rc */
const XMLProperty* prop;
XMLNodeList nlist;
XMLNodeConstIterator niter;
XMLNode* child;
child = *niter;
nlist = node.children();
if (child->name() == "Option") {
if ((prop = child->property ("name")) != 0) {
if (prop->value() == _name) {
if ((prop = child->property ("value")) != 0) {
std::stringstream ss;
ss << prop->value();
ss >> value;
return true;
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
child = *niter;
if (child->name() == "Option") {
if ((prop = child->property ("name")) != 0) {
if (prop->value() == _name) {
if ((prop = child->property ("value")) != 0) {
std::stringstream ss;
ss << prop->value();
ss >> value;
_owner = owner;
return true;
}
}
}
}
}
} else if (node.name() == "Options") {
/* session file */
XMLNodeList olist;
XMLNodeConstIterator oiter;
XMLNode* option;
const XMLProperty* opt_prop;
olist = node.children();
for (oiter = olist.begin(); oiter != olist.end(); ++oiter) {
option = *oiter;
if (option->name() == _name) {
if ((opt_prop = option->property ("val")) != 0) {
std::stringstream ss;
ss << opt_prop->value();
ss >> value;
_owner = owner;
return true;
}
}
}
}
return false;
@ -90,9 +135,12 @@ class ConfigVariableWithMutation : public ConfigVariable<T>
ConfigVariableWithMutation (std::string name, T val, T (*m)(T))
: ConfigVariable<T> (name, val), mutator (m) {}
void set (T val) {
unmutated_value = val;
ConfigVariable<T>::set (mutator (val));
bool set (T val, ConfigVariableBase::Owner owner) {
if (unmutated_value != val) {
unmutated_value = val;
return ConfigVariable<T>::set (mutator (val), owner);
}
return false;
}
protected:

View file

@ -1,61 +1,91 @@
#ifdef __APPLE__
CONFIG_VARIABLE(std::string, auditioner_output_left, "auditioner-output-left", "coreaudio:Built-in Audio:in1")
CONFIG_VARIABLE(std::string, auditioner_output_right, "auditioner-output-right", "coreaudio:Built-in Audio:in2")
CONFIG_VARIABLE (std::string, auditioner_output_left, "auditioner-output-left", "coreaudio:Built-in Audio:in1")
CONFIG_VARIABLE (std::string, auditioner_output_right, "auditioner-output-right", "coreaudio:Built-in Audio:in2")
#else
CONFIG_VARIABLE(std::string, auditioner_output_left, "auditioner-output-left", "alsa_pcm:playback_1")
CONFIG_VARIABLE(std::string, auditioner_output_right, "auditioner-output-right", "alsa_pcm:playback_2")
CONFIG_VARIABLE (std::string, auditioner_output_left, "auditioner-output-left", "alsa_pcm:playback_1")
CONFIG_VARIABLE (std::string, auditioner_output_right, "auditioner-output-right", "alsa_pcm:playback_2")
#endif
CONFIG_VARIABLE(std::string, mtc_port_name, "mtc-port-name", "default")
CONFIG_VARIABLE(std::string, mmc_port_name, "mmc-port-name", "default")
CONFIG_VARIABLE(std::string, midi_port_name, "midi-port-name", "default")
CONFIG_VARIABLE(uint32_t, minimum_disk_io_bytes, "minimum-disk-io-bytes", 1024 * 256)
CONFIG_VARIABLE(float, track_buffer_seconds, "track-buffer-seconds", 5.0)
CONFIG_VARIABLE(bool, hiding_groups_deactivates_groups, "hiding-groups-deactivates-groups", true)
CONFIG_VARIABLE(bool, mute_affects_pre_fader, "mute-affects-pre-fader", true)
CONFIG_VARIABLE(bool, mute_affects_post_fader, "mute-affects-post-fader", true)
CONFIG_VARIABLE(bool, mute_affects_control_outs, "mute-affects-control-outs", true)
CONFIG_VARIABLE(bool, mute_affects_main_outs, "mute-affects-main-outs", true)
CONFIG_VARIABLE(bool, solo_latch, "solo-latch", true)
CONFIG_VARIABLE(bool, use_hardware_monitoring, "use-hardware-monitoring", false)
CONFIG_VARIABLE(bool, use_sw_monitoring, "use-sw-monitoring", false)
CONFIG_VARIABLE(bool, use_external_monitoring, "use-external-monitoring", true)
CONFIG_VARIABLE(bool, jack_time_master, "jack-time-master", true)
CONFIG_VARIABLE(bool, use_video_sync, "use-video-sync", false)
CONFIG_VARIABLE(bool, trace_midi_input, "trace-midi-input", false)
CONFIG_VARIABLE(bool, trace_midi_output, "trace-midi-output", false)
CONFIG_VARIABLE(bool, plugins_stop_with_transport, "plugins-stop-with-transport", false)
CONFIG_VARIABLE(bool, stop_recording_on_xrun, "stop-recording-on-xrun", false)
CONFIG_VARIABLE(bool, verify_remove_last_capture, "verify-remove-last-capture", true)
CONFIG_VARIABLE(bool, stop_at_session_end, "stop-at-session-end", true)
CONFIG_VARIABLE(bool, seamless_looping, "seamless-looping", true)
CONFIG_VARIABLE(bool, auto_xfade, "auto-xfade", true)
CONFIG_VARIABLE(bool, no_new_session_dialog, "no-new-session-dialog", false)
CONFIG_VARIABLE(bool, timecode_source_is_synced, "timecode-source-is-synced", true)
CONFIG_VARIABLE(bool, latched_record_enable, "latched-record-enable", false)
CONFIG_VARIABLE(bool, use_vst, "use-vst", true)
CONFIG_VARIABLE(bool, quieten_at_speed, "quieten-at-speed", true)
CONFIG_VARIABLE(uint32_t, feedback_interval_ms, "feedback-interval-ms", 100)
CONFIG_VARIABLE(uint32_t, disk_choice_space_threshold, "disk-choice-space-threshold", 57600000)
CONFIG_VARIABLE(uint32_t, destructive_xfade_msecs, "destructive-xfade-msecs", 2)
CONFIG_VARIABLE(SampleFormat, native_file_data_format, "native-file-data-format", ARDOUR::FormatFloat)
CONFIG_VARIABLE(HeaderFormat, native_file_header_format, "native-file-header-format", ARDOUR::WAVE)
CONFIG_VARIABLE(bool, use_tranzport, "use-tranzport", false)
CONFIG_VARIABLE(uint32_t, osc_port, "osc-port", 3819)
CONFIG_VARIABLE(bool, use_osc, "use-osc", true)
CONFIG_VARIABLE(bool, use_overlap_equivalency, "use-overlap-equivalency", true)
CONFIG_VARIABLE(bool, meter_falloff_off, "meter-falloff-off", false)
CONFIG_VARIABLE(bool, meter_falloff_slowest, "meter-falloff-slowest", false)
CONFIG_VARIABLE(bool, meter_falloff_slower, "meter-falloff-slower", false)
CONFIG_VARIABLE(bool, meter_falloff_slow, "meter-falloff-slow", false)
CONFIG_VARIABLE(bool, meter_falloff_medium, "meter-falloff-medium", false)
CONFIG_VARIABLE(bool, meter_falloff_fast, "meter-falloff-fast", true)
CONFIG_VARIABLE(bool, meter_falloff_faster, "meter-falloff-faster", false)
CONFIG_VARIABLE(bool, meter_falloff_fastest, "meter-falloff-fastest", false)
CONFIG_VARIABLE(bool, meter_hold_off, "meter-hold-off", false)
CONFIG_VARIABLE(bool, meter_hold_short, "meter-hold-short", false)
CONFIG_VARIABLE(bool, meter_hold_medium, "meter-hold-medium", false)
CONFIG_VARIABLE(bool, meter_hold_long, "meter-hold-long", false)
CONFIG_VARIABLE (std::string, mtc_port_name, "mtc-port-name", "default")
CONFIG_VARIABLE (std::string, mmc_port_name, "mmc-port-name", "default")
CONFIG_VARIABLE (std::string, midi_port_name, "midi-port-name", "default")
CONFIG_VARIABLE (uint32_t, minimum_disk_io_bytes, "minimum-disk-io-bytes", 1024 * 256)
CONFIG_VARIABLE (float, track_buffer_seconds, "track-buffer-seconds", 5.0)
CONFIG_VARIABLE (bool, hiding_groups_deactivates_groups, "hiding-groups-deactivates-groups", true)
CONFIG_VARIABLE (bool, mute_affects_pre_fader, "mute-affects-pre-fader", true)
CONFIG_VARIABLE (bool, mute_affects_post_fader, "mute-affects-post-fader", true)
CONFIG_VARIABLE (bool, mute_affects_control_outs, "mute-affects-control-outs", true)
CONFIG_VARIABLE (bool, mute_affects_main_outs, "mute-affects-main-outs", true)
CONFIG_VARIABLE (bool, solo_latch, "solo-latch", true)
CONFIG_VARIABLE (bool, use_hardware_monitoring, "use-hardware-monitoring", false)
CONFIG_VARIABLE (bool, use_sw_monitoring, "use-sw-monitoring", false)
CONFIG_VARIABLE (bool, use_external_monitoring, "use-external-monitoring", true)
CONFIG_VARIABLE (bool, jack_time_master, "jack-time-master", true)
CONFIG_VARIABLE (bool, use_video_sync, "use-video-sync", false)
CONFIG_VARIABLE (bool, trace_midi_input, "trace-midi-input", false)
CONFIG_VARIABLE (bool, trace_midi_output, "trace-midi-output", false)
CONFIG_VARIABLE (bool, plugins_stop_with_transport, "plugins-stop-with-transport", false)
CONFIG_VARIABLE (bool, stop_recording_on_xrun, "stop-recording-on-xrun", false)
CONFIG_VARIABLE (bool, verify_remove_last_capture, "verify-remove-last-capture", true)
CONFIG_VARIABLE (bool, stop_at_session_end, "stop-at-session-end", true)
CONFIG_VARIABLE (bool, seamless_looping, "seamless-looping", true)
CONFIG_VARIABLE (bool, auto_xfade, "auto-xfade", true)
CONFIG_VARIABLE (bool, no_new_session_dialog, "no-new-session-dialog", false)
CONFIG_VARIABLE (bool, timecode_source_is_synced, "timecode-source-is-synced", true)
CONFIG_VARIABLE (bool, latched_record_enable, "latched-record-enable", false)
CONFIG_VARIABLE (bool, use_vst, "use-vst", true)
CONFIG_VARIABLE (bool, quieten_at_speed, "quieten-at-speed", true)
CONFIG_VARIABLE (uint32_t, feedback_interval_ms, "feedback-interval-ms", 100)
CONFIG_VARIABLE (uint32_t, disk_choice_space_threshold, "disk-choice-space-threshold", 57600000)
CONFIG_VARIABLE (uint32_t, destructive_xfade_msecs, "destructive-xfade-msecs", 2)
CONFIG_VARIABLE (SampleFormat, native_file_data_format, "native-file-data-format", ARDOUR::FormatFloat)
CONFIG_VARIABLE (HeaderFormat, native_file_header_format, "native-file-header-format", ARDOUR::WAVE)
CONFIG_VARIABLE (bool, use_tranzport, "use-tranzport", false)
CONFIG_VARIABLE (uint32_t, osc_port, "osc-port", 3819)
CONFIG_VARIABLE (bool, use_osc, "use-osc", true)
CONFIG_VARIABLE (bool, use_overlap_equivalency, "use-overlap-equivalency", true)
CONFIG_VARIABLE (bool, auto_play, "auto-play", false)
CONFIG_VARIABLE (bool, auto_return, "auto-return", false)
CONFIG_VARIABLE (bool, auto_input, "auto-input", true)
CONFIG_VARIABLE (bool, auto_loop, "auto-loop", false)
CONFIG_VARIABLE (bool, all_safe, "all-safe", false)
CONFIG_VARIABLE (bool, punch_in, "punch-in", false)
CONFIG_VARIABLE (bool, punch_out, "punch-out", false)
CONFIG_VARIABLE (bool, send_mtc, "send-mtc", false)
CONFIG_VARIABLE (bool, send_mmc, "send-mmc", false)
CONFIG_VARIABLE (bool, mmc_control, "mmc-control", false)
CONFIG_VARIABLE (bool, midi_feedback, "midi-feedback", false)
CONFIG_VARIABLE (bool, midi_control, "midi-control", false)
CONFIG_VARIABLE (bool, crossfades_active, "crossfades-active", false)
CONFIG_VARIABLE (bool, seamless_loop, "seamless-loop", false)
CONFIG_VARIABLE (bool, do_not_record_plugins, "do_not_record_plugins", false)
CONFIG_VARIABLE (AutoConnectOption, output_auto_connect, "output-auto-connect", AutoConnectOption (0))
CONFIG_VARIABLE (AutoConnectOption, input_auto_connect, "input-auto-connect", AutoConnectOption (0))
CONFIG_VARIABLE (EditMode, edit_mode, "edit-mode", Slide)
CONFIG_VARIABLE (LayerModel, layer_model, "layer-model", MoveAddHigher)
CONFIG_VARIABLE (SoloModel, solo_model, "solo-model", InverseMute)
CONFIG_VARIABLE (bool, solo_latched, "solo-latched", true)
CONFIG_VARIABLE (CrossfadeModel, xfade_model, "xfade-model", ShortCrossfade)
CONFIG_VARIABLE (bool, clicking, "clicking", false)
CONFIG_VARIABLE (std::string, click_sound, "click-sound", "")
CONFIG_VARIABLE (std::string, click_emphasis_sound, "click-emphasis-sound", "")
CONFIG_VARIABLE (float, meter_hold, "meter-hold", 100)
CONFIG_VARIABLE (float, meter_falloff, "meter-falloff", 0.375f)
CONFIG_VARIABLE (float, rf_speed, "rf-speed", 2.0f)
CONFIG_VARIABLE (float, shuttle_speed_factor, "shuttle-speed-factor", 1.0f)
CONFIG_VARIABLE (float, shuttle_speed_threshold, "shuttle-speed-threshold", 5.0f)
CONFIG_VARIABLE (float, smpte_frames_per_second, "smpte-frames-per-second", 30.0f)
CONFIG_VARIABLE (float, video_pullup, "video-pullup", 0.0f)
CONFIG_VARIABLE (bool, smpte_drop_frames, "smpte-drop-frames", false)
CONFIG_VARIABLE (jack_nframes_t, preroll, "preroll", 0)
CONFIG_VARIABLE (jack_nframes_t, postroll, "postroll", 0)
CONFIG_VARIABLE (jack_nframes_t, over_length_short, "over-length-short", 2)
CONFIG_VARIABLE (jack_nframes_t, over_length_long, "over-length-long", 10)
CONFIG_VARIABLE (bool, full_xfades_unmuted, "full-xfades-unmuted", true)
CONFIG_VARIABLE (float, short_xfade_seconds, "short-xfade-seconds", 0.015)
CONFIG_VARIABLE (SlaveSource, slave_source, "slave-source", None)
CONFIG_VARIABLE (ShuttleBehaviour, shuttle_behaviour, "shuttle-behaviour", Sprung)
CONFIG_VARIABLE (ShuttleUnits, shuttle_units, "shuttle-units", Percentage)
/* these variables have custom set() methods */

View file

@ -119,17 +119,6 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
Recording = 2
};
enum SlaveSource {
None = 0,
MTC,
JACK
};
enum AutoConnectOption {
AutoConnectPhysical = 0x1,
AutoConnectMaster = 0x2
};
struct Event {
enum Type {
SetTransportSpeed,
@ -172,7 +161,7 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
union {
void* ptr;
bool yes_or_no;
Session::SlaveSource slave;
SlaveSource slave;
Route* route;
};
@ -247,6 +236,7 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
string path() const { return _path; }
string name() const { return _name; }
string snap_name() const { return _current_snapshot_name; }
string raid_path () const;
void set_snap_name ();
@ -356,7 +346,7 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
void request_bounded_roll (jack_nframes_t start, jack_nframes_t end);
void request_stop (bool abort = false);
void request_locate (jack_nframes_t frame, bool with_roll = false);
void request_auto_loop (bool yn);
void request_play_loop (bool yn);
jack_nframes_t last_transport_start() const { return _last_roll_location; }
void goto_end () { request_locate (end_location->start(), false);}
void goto_start () { request_locate (start_location->start(), false); }
@ -395,84 +385,7 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
void set_auto_punch_location (Location *);
void set_auto_loop_location (Location *);
enum ControlType {
AutoPlay,
AutoLoop,
AutoReturn,
AutoInput,
PunchIn,
PunchOut,
SendMTC,
MMCControl,
SoloLatch,
SoloingModel,
RecordingPlugins,
CrossFadesActive,
SendMMC,
SlaveType,
Clicking,
EditingMode,
PlayRange,
LayeringModel,
CrossfadingModel,
SeamlessLoop,
MidiFeedback,
MidiControl,
TranzportControl,
Feedback,
SmpteMode,
};
sigc::signal<void,ControlType> ControlChanged;
void set_auto_play (bool yn);
void set_auto_return (bool yn);
void set_auto_input (bool yn);
void reset_input_monitor_state ();
void set_input_auto_connect (bool yn);
void set_output_auto_connect (AutoConnectOption);
void set_punch_in (bool yn);
void set_punch_out (bool yn);
void set_send_mtc (bool yn);
void set_send_mmc (bool yn);
void set_mmc_control (bool yn);
void set_midi_feedback (bool yn);
void set_midi_control (bool yn);
void set_do_not_record_plugins (bool yn);
void set_crossfades_active (bool yn);
void set_seamless_loop (bool yn);
bool get_auto_play () const { return auto_play; }
bool get_auto_input () const { return auto_input; }
bool get_auto_loop () const { return auto_loop; }
bool get_seamless_loop () const { return seamless_loop; }
bool get_punch_in () const { return punch_in; }
bool get_punch_out () const { return punch_out; }
bool get_all_safe () const { return all_safe; }
bool get_auto_return () const { return auto_return; }
bool get_send_mtc () const;
bool get_send_mmc () const;
bool get_mmc_control () const;
bool get_midi_feedback () const;
bool get_midi_control () const;
bool get_do_not_record_plugins () const { return do_not_record_plugins; }
bool get_crossfades_active () const { return crossfades_active; }
bool get_input_auto_connect () const;
AutoConnectOption get_output_auto_connect () const { return output_auto_connect; }
enum LayerModel {
LaterHigher,
MoveAddHigher,
AddHigher
};
void set_layer_model (LayerModel);
LayerModel get_layer_model () const { return layer_model; }
void set_xfade_model (CrossfadeModel);
CrossfadeModel get_xfade_model () const { return xfade_model; }
void add_event (jack_nframes_t action_frame, Event::Type type, jack_nframes_t target_frame = 0);
void remove_event (jack_nframes_t frame, Event::Type type);
@ -555,36 +468,9 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
AudioEngine &engine() { return _engine; };
/* configuration. there should really be accessors/mutators
for these
*/
float meter_hold () { return _meter_hold; }
void set_meter_hold (float);
sigc::signal<void> MeterHoldChanged;
float meter_falloff () { return _meter_falloff; }
void set_meter_falloff (float);
sigc::signal<void> MeterFalloffChanged;
int32_t max_level;
int32_t min_level;
string click_emphasis_sound;
string click_sound;
bool click_requested;
jack_nframes_t over_length_short;
jack_nframes_t over_length_long;
bool send_midi_timecode;
bool send_midi_machine_control;
float shuttle_speed_factor;
float shuttle_speed_threshold;
float rf_speed;
float smpte_frames_per_second;
float video_pullup;
bool smpte_drop_frames;
AnyTime preroll;
AnyTime postroll;
/* Time */
jack_nframes_t transport_frame () const {return _transport_frame; }
@ -616,7 +502,6 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
};
int set_smpte_type (float fps, bool drop_frames);
int set_video_pullup (float pullup);
void sync_time_vars();
@ -640,12 +525,10 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
static sigc::signal<void> StartTimeChanged;
static sigc::signal<void> EndTimeChanged;
static sigc::signal<void> SMPTEOffsetChanged;
static sigc::signal<void> SMPTETypeChanged;
static sigc::signal<void> PullupChanged;
void request_slave_source (SlaveSource, jack_nframes_t pos = 0);
SlaveSource slave_source() const { return _slave_type; }
bool synced_to_jack() const { return _slave_type == JACK; }
void request_slave_source (SlaveSource);
bool synced_to_jack() const { return Config->get_slave_source() == JACK; }
float transport_speed() const { return _transport_speed; }
bool transport_stopped() const { return _transport_speed == 0.0f; }
bool transport_rolling() const { return _transport_speed != 0.0f; }
@ -690,7 +573,7 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
bool sample_rate_convert (import_status&, string infile, string& outfile);
string build_tmp_convert_name (string file);
Session::SlaveSource post_export_slave;
SlaveSource post_export_slave;
jack_nframes_t post_export_position;
int start_audio_export (ARDOUR::AudioExportSpecification&);
@ -782,20 +665,9 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
int freeze (InterThreadInfo&);
/* session-wide solo/mute/rec-enable */
enum SoloModel {
InverseMute,
SoloBus
};
bool soloing() const { return currently_soloing; }
SoloModel solo_model() const { return _solo_model; }
void set_solo_model (SoloModel);
bool solo_latched() const { return _solo_latched; }
void set_solo_latched (bool yn);
void set_all_solo (bool);
void set_all_mute (bool);
@ -833,7 +705,7 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
sigc::signal<void,Connection *> ConnectionRemoved;
/* MIDI */
int set_mtc_port (string port_tag);
int set_mmc_port (string port_tag);
int set_midi_port (string port_tag);
@ -942,19 +814,9 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
void mark();
};
/* edit mode */
void set_edit_mode (EditMode);
EditMode get_edit_mode () const { return _edit_mode; }
/* clicking */
boost::shared_ptr<IO> click_io() { return _click_io; }
void set_clicking (bool yn);
bool get_clicking() const;
void set_click_sound (string path);
void set_click_emphasis_sound (string path);
/* tempo FX */
@ -971,9 +833,6 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
boost::shared_ptr<AudioRegion> tempoize_region (TimeStretchRequest&);
string raid_path() const;
void set_raid_path(string);
/* need to call this whenever we change native file formats */
void reset_native_file_format();
@ -1099,7 +958,6 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
Location* end_location;
Location* start_location;
Slave *_slave;
SlaveSource _slave_type;
volatile float _transport_speed;
volatile float _desired_transport_speed;
float _last_transport_speed;
@ -1153,6 +1011,7 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
void reset_slave_state ();
bool follow_slave (jack_nframes_t, jack_nframes_t);
void set_slave_source (SlaveSource);
bool _exporting;
int prepare_to_export (ARDOUR::AudioExportSpecification&);
@ -1166,7 +1025,7 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
if (actively_recording()) {
return true;
} else {
if (auto_input) {
if (Config->get_auto_input()) {
return false;
} else {
return true;
@ -1204,26 +1063,12 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
MIDI::Port* _midi_port;
string _path;
string _name;
bool do_not_record_plugins;
/* toggles */
bool auto_play;
bool punch_in;
bool punch_out;
bool auto_loop;
bool seamless_loop;
bool loop_changing;
jack_nframes_t last_loopend;
bool auto_input;
bool crossfades_active;
bool all_safe;
bool auto_return;
bool monitor_in;
bool send_mtc;
bool send_mmc;
bool mmc_control;
bool midi_control;
bool session_send_mmc;
bool session_send_mtc;
bool session_midi_feedback;
bool play_loop;
bool loop_changing;
jack_nframes_t last_loopend;
RingBuffer<Event*> pending_events;
@ -1519,7 +1364,7 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
bool waiting_to_start;
void set_auto_loop (bool yn);
void set_play_loop (bool yn);
void overwrite_some_buffers (Diskstream*);
void flush_all_redirects ();
void locate (jack_nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
@ -1718,8 +1563,6 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
ConnectionList _connections;
int load_connections (const XMLNode&);
int set_slave_source (SlaveSource, jack_nframes_t);
void reverse_diskstream_buffers ();
UndoHistory history;
@ -1787,7 +1630,6 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
vector<Route*> master_outs;
EditMode _edit_mode;
EditMode pending_edit_mode;
/* range playback */
@ -1842,7 +1684,7 @@ class Session : public sigc::trackable, public PBD::StatefulDestructible
void add_controllable (PBD::Controllable*);
void remove_controllable (PBD::Controllable*);
void handle_configuration_change (const char*);
void config_changed (const char*);
};
} // namespace ARDOUR

View file

@ -150,6 +150,8 @@ namespace ARDOUR {
jack_nframes_t frames;
double seconds;
};
AnyTime() { type = Frames; frames = 0; }
};
struct AudioRange {
@ -216,6 +218,22 @@ namespace ARDOUR {
FullCrossfade,
ShortCrossfade
};
enum LayerModel {
LaterHigher,
MoveAddHigher,
AddHigher
};
enum SoloModel {
InverseMute,
SoloBus
};
enum AutoConnectOption {
AutoConnectPhysical = 0x1,
AutoConnectMaster = 0x2
};
struct InterThreadInfo {
volatile bool done;
@ -252,13 +270,37 @@ namespace ARDOUR {
LADSPA,
VST
};
enum SlaveSource {
None = 0,
MTC,
JACK
};
enum ShuttleBehaviour {
Sprung,
Wheel
};
enum ShuttleUnits {
Percentage,
Semitones
};
typedef std::vector<boost::shared_ptr<AudioSource> > SourceList;
} // namespace ARDOUR
std::istream& operator>>(std::istream& o, ARDOUR::SampleFormat& sf);
std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
std::istream& operator>>(std::istream& o, ARDOUR::SoloModel& sf);
std::istream& operator>>(std::istream& o, ARDOUR::LayerModel& sf);
std::istream& operator>>(std::istream& o, ARDOUR::CrossfadeModel& sf);
std::istream& operator>>(std::istream& o, ARDOUR::SlaveSource& sf);
std::istream& operator>>(std::istream& o, ARDOUR::ShuttleBehaviour& sf);
std::istream& operator>>(std::istream& o, ARDOUR::ShuttleUnits& sf);
static inline jack_nframes_t
session_frame_to_track_frame (jack_nframes_t session_frame, double speed)

View file

@ -59,6 +59,9 @@ std::string path_expand (std::string);
void compute_equal_power_fades (jack_nframes_t nframes, float* in, float* out);
const char* slave_source_to_string (ARDOUR::SlaveSource src);
ARDOUR::SlaveSource string_to_slave_source (std::string str);
#if defined(HAVE_COREAUDIO) || defined(HAVE_AUDIOUNITS)
std::string CFStringRefToStdString(CFStringRef stringRef);
#endif // HAVE_COREAUDIO

View file

@ -467,8 +467,7 @@ AudioDiskstream::check_record_status (jack_nframes_t transport_frame, jack_nfram
if (_alignment_style == ExistingMaterial) {
if (!_session.get_punch_in()) {
if (!Config->get_punch_in()) {
/* manual punch in happens at the correct transport frame
because the user hit a button. but to get alignment correct
@ -497,7 +496,7 @@ AudioDiskstream::check_record_status (jack_nframes_t transport_frame, jack_nfram
} else {
if (_session.get_punch_in()) {
if (Config->get_punch_in()) {
first_recordable_frame += _roll_delay;
} else {
capture_start_frame -= _roll_delay;
@ -591,7 +590,7 @@ AudioDiskstream::process (jack_nframes_t transport_frame, jack_nframes_t nframes
(*c).current_playback_buffer = 0;
}
if (nominally_recording || (_session.get_record_enabled() && _session.get_punch_in())) {
if (nominally_recording || (_session.get_record_enabled() && Config->get_punch_in())) {
OverlapType ot;
ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
@ -1716,7 +1715,7 @@ AudioDiskstream::engage_record_enable ()
if (Config->get_use_hardware_monitoring()) {
for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
if ((*chan).source) {
(*chan).source->ensure_monitor_input (!(_session.get_auto_input() && rolling));
(*chan).source->ensure_monitor_input (!(Config->get_auto_input() && rolling));
}
capturing_sources.push_back ((*chan).write_source);
}
@ -1782,7 +1781,7 @@ AudioDiskstream::get_state ()
Location* pi;
if (_session.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
if (Config->get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
snprintf (buf, sizeof (buf), "%" PRIu32, pi->start());
} else {
snprintf (buf, sizeof (buf), "%" PRIu32, _session.transport_frame());

View file

@ -450,7 +450,7 @@ AudioPlaylist::check_dependents (boost::shared_ptr<Region> r, bool norefresh)
} else {
xfade = new Crossfade (other, region, _session.get_xfade_model(), _session.get_crossfades_active());
xfade = new Crossfade (other, region, Config->get_xfade_model(), Config->get_crossfades_active());
add_crossfade (*xfade);
}
}

View file

@ -444,7 +444,7 @@ AudioTrack::no_roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nf
send_silence = true;
} else {
if (_session.get_auto_input()) {
if (Config->get_auto_input()) {
if (Config->get_use_sw_monitoring()) {
send_silence = false;
} else {
@ -545,7 +545,7 @@ AudioTrack::roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nfram
just_meter_input (start_frame, end_frame, nframes, offset);
}
if (diskstream->record_enabled() && !can_record && !_session.get_auto_input()) {
if (diskstream->record_enabled() && !can_record && !Config->get_auto_input()) {
/* not actually recording, but we want to hear the input material anyway,
at least potentially (depending on monitoring options)
@ -593,7 +593,7 @@ AudioTrack::roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nfram
}
}
process_output_buffers (bufs, limit, start_frame, end_frame, nframes, offset, (!_session.get_record_enabled() || !_session.get_do_not_record_plugins()), declick, (_meter_point != MeterInput));
process_output_buffers (bufs, limit, start_frame, end_frame, nframes, offset, (!_session.get_record_enabled() || !Config->get_do_not_record_plugins()), declick, (_meter_point != MeterInput));
} else {
/* problem with the diskstream; just be quiet for a bit */

View file

@ -56,7 +56,7 @@ Configuration::Configuration ()
#undef CONFIG_VARIABLE
#undef CONFIG_VARIABLE_SPECIAL
user_configuration (false)
current_owner (ConfigVariableBase::Default)
{
_control_protocol_state = 0;
}
@ -65,6 +65,12 @@ Configuration::~Configuration ()
{
}
void
Configuration::set_current_owner (ConfigVariableBase::Owner owner)
{
current_owner = owner;
}
int
Configuration::load_state ()
{
@ -85,15 +91,14 @@ Configuration::load_state ()
return -1;
}
current_owner = ConfigVariableBase::System;
if (set_state (*tree.root())) {
error << string_compose(_("Ardour: system configuration file \"%1\" not loaded successfully."), rcfile) << endmsg;
return -1;
}
}
/* from this point on, all configuration changes are user driven */
user_configuration = true;
/* now load configuration file for user */
@ -110,6 +115,8 @@ Configuration::load_state ()
return -1;
}
current_owner = ConfigVariableBase::Config;
if (set_state (*tree.root())) {
error << string_compose(_("Ardour: user configuration file \"%1\" not loaded successfully."), rcfile) << endmsg;
return -1;
@ -125,15 +132,14 @@ Configuration::save_state()
XMLTree tree;
string rcfile;
/* Note: this only writes the per-user file, and therefore
only saves variables marked as user-set or modified
/* Note: this only writes the state not touched by Session or Interface
*/
rcfile = get_user_ardour_path ();
rcfile += "ardour.rc";
if (rcfile.length()) {
tree.set_root (&state (true));
tree.set_root (&state (ConfigVariableBase::Config));
if (!tree.write (rcfile.c_str())){
error << string_compose (_("Config file %1 not saved"), rcfile) << endmsg;
return -1;
@ -146,41 +152,56 @@ Configuration::save_state()
XMLNode&
Configuration::get_state ()
{
return state (false);
return state (ConfigVariableBase::Config);
}
XMLNode&
Configuration::state (bool user_only)
Configuration::get_partial_state (ConfigVariableBase::Owner owner)
{
XMLNode* root = new XMLNode("Ardour");
return state (owner);
}
XMLNode&
Configuration::state (ConfigVariableBase::Owner owner)
{
XMLNode* root;
XMLNode* node;
LocaleGuard lg (X_("POSIX"));
typedef map<string, MidiPortDescriptor*>::const_iterator CI;
for(CI m = midi_ports.begin(); m != midi_ports.end(); ++m){
root->add_child_nocopy(m->second->get_state());
}
node = new XMLNode("Config");
XMLNode* node = new XMLNode("Config");
#undef CONFIG_VARIABLE
#undef CONFIG_VARIABLE_SPECIAL
#define CONFIG_VARIABLE(type,var,name,value) \
if (!user_only || var.is_user()) var.add_to_node (*node);
if (var.owner() <= owner) var.add_to_node (*node);
#define CONFIG_VARIABLE_SPECIAL(type,var,name,value,mutator) \
if (!user_only || var.is_user()) var.add_to_node (*node);
if (var.owner() <= owner) var.add_to_node (*node);
#include "ardour/configuration_vars.h"
#undef CONFIG_VARIABLE
#undef CONFIG_VARIABLE_SPECIAL
root->add_child_nocopy (*node);
if (owner == ConfigVariableBase::Config) {
if (_extra_xml) {
root->add_child_copy (*_extra_xml);
root = new XMLNode("Ardour");
typedef map<string, MidiPortDescriptor*>::const_iterator CI;
for(CI m = midi_ports.begin(); m != midi_ports.end(); ++m){
root->add_child_nocopy(m->second->get_state());
}
root->add_child_nocopy (*node);
if (_extra_xml) {
root->add_child_copy (*_extra_xml);
}
root->add_child_nocopy (ControlProtocolManager::instance().get_state());
root->add_child_nocopy (Library->get_state());
} else {
root = node;
}
root->add_child_nocopy (ControlProtocolManager::instance().get_state());
root->add_child_nocopy (Library->get_state());
return *root;
}
@ -213,18 +234,8 @@ Configuration::set_state (const XMLNode& root)
}
} else if (node->name() == "Config") {
#undef CONFIG_VARIABLE
#undef CONFIG_VARIABLE_SPECIAL
#define CONFIG_VARIABLE(type,var,name,value) \
var.set_from_node (*node); \
var.set_is_user (user_configuration);
#define CONFIG_VARIABLE_SPECIAL(type,var,name,value,mutator) \
var.set_from_node (*node); \
var.set_is_user (user_configuration);
#include "ardour/configuration_vars.h"
#undef CONFIG_VARIABLE
#undef CONFIG_VARIABLE_SPECIAL
set_variables (*node, ConfigVariableBase::Config);
} else if (node->name() == "extra") {
_extra_xml = new XMLNode (*node);
@ -241,6 +252,25 @@ Configuration::set_state (const XMLNode& root)
return 0;
}
void
Configuration::set_variables (const XMLNode& node, ConfigVariableBase::Owner owner)
{
#undef CONFIG_VARIABLE
#undef CONFIG_VARIABLE_SPECIAL
#define CONFIG_VARIABLE(type,var,name,value) \
if (var.set_from_node (node, owner)) { \
ParameterChanged (name); \
}
#define CONFIG_VARIABLE_SPECIAL(type,var,name,value,mutator) \
if (var.set_from_node (node, owner)) { \
ParameterChanged (name); \
}
#include "ardour/configuration_vars.h"
#undef CONFIG_VARIABLE
#undef CONFIG_VARIABLE_SPECIAL
}
Configuration::MidiPortDescriptor::MidiPortDescriptor (const XMLNode& node)
{
const XMLProperty *prop;
@ -287,3 +317,14 @@ Configuration::MidiPortDescriptor::get_state()
return *root;
}
void
Configuration::map_parameters (sigc::slot<void,const char*> theSlot)
{
#undef CONFIG_VARIABLE
#undef CONFIG_VARIABLE_SPECIAL
#define CONFIG_VARIABLE(type,var,name,value) theSlot (name);
#define CONFIG_VARIABLE_SPECIAL(type,var,name,value,mutator) theSlot (name);
#include "ardour/configuration_vars.h"
#undef CONFIG_VARIABLE
#undef CONFIG_VARIABLE_SPECIAL
}

View file

@ -574,16 +574,22 @@ ARDOUR::coverage (jack_nframes_t sa, jack_nframes_t ea,
/* not sure where to put these */
std::istream& operator>>(std::istream& o, HeaderFormat& hf) {
template<class T>
std::istream& int_to_type (std::istream& o, T& hf) {
int val;
o >> val;
hf = (HeaderFormat) val;
hf = (T) val;
return o;
}
std::istream& operator>>(std::istream& o, SampleFormat& sf) {
int val;
o >> val;
sf = (SampleFormat) val;
return o;
}
std::istream& operator>>(std::istream& o, HeaderFormat& var) { return int_to_type<HeaderFormat> (o, var); }
std::istream& operator>>(std::istream& o, SampleFormat& var) { return int_to_type<SampleFormat> (o, var); }
std::istream& operator>>(std::istream& o, AutoConnectOption& var) { return int_to_type<AutoConnectOption> (o, var); }
std::istream& operator>>(std::istream& o, EditMode& var) { return int_to_type<EditMode> (o, var); }
std::istream& operator>>(std::istream& o, SoloModel& var) { return int_to_type<SoloModel> (o, var); }
std::istream& operator>>(std::istream& o, LayerModel& var) { return int_to_type<LayerModel> (o, var); }
std::istream& operator>>(std::istream& o, CrossfadeModel& var) { return int_to_type<CrossfadeModel> (o, var); }
std::istream& operator>>(std::istream& o, SlaveSource& var) { return int_to_type<SlaveSource> (o, var); }
std::istream& operator>>(std::istream& o, ShuttleBehaviour& var) { return int_to_type<ShuttleBehaviour> (o, var); }
std::istream& operator>>(std::istream& o, ShuttleUnits& var) { return int_to_type<ShuttleUnits> (o, var); }

View file

@ -2366,11 +2366,11 @@ IO::meter ()
new_peak = minus_infinity();
}
if (_session.meter_falloff() == 0.0f || new_peak > _visible_peak_power[n]) {
if (Config->get_meter_falloff() == 0.0f || new_peak > _visible_peak_power[n]) {
_visible_peak_power[n] = new_peak;
} else {
// do falloff
new_peak = _visible_peak_power[n] - _session.meter_falloff();
new_peak = _visible_peak_power[n] - Config->get_meter_falloff();
_visible_peak_power[n] = max (new_peak, -INFINITY);
}
}

View file

@ -232,7 +232,7 @@ Playlist::init (bool hide)
_splicing = false;
_nudging = false;
in_set_state = false;
_edit_mode = _session.get_edit_mode();
_edit_mode = Config->get_edit_mode();
in_flush = false;
in_partition = false;
subcnt = 0;
@ -394,7 +394,7 @@ Playlist::flush_notifications ()
// pending_bounds.sort (cmp);
for (RegionList::iterator r = pending_bounds.begin(); r != pending_bounds.end(); ++r) {
if (_session.get_layer_model() == Session::MoveAddHigher) {
if (Config->get_layer_model() == MoveAddHigher) {
timestamp_layer_op (*r);
}
pending_length = true;
@ -1134,7 +1134,7 @@ Playlist::region_bounds_changed (Change what_changed, boost::shared_ptr<Region>
if (holding_state ()) {
pending_bounds.push_back (region);
} else {
if (_session.get_layer_model() == Session::MoveAddHigher) {
if (Config->get_layer_model() == MoveAddHigher) {
/* it moved or changed length, so change the timestamp */
timestamp_layer_op (region);
}
@ -1537,8 +1537,8 @@ Playlist::relayer ()
freeze ();
if (_session.get_layer_model() == Session::MoveAddHigher ||
_session.get_layer_model() == Session::AddHigher) {
if (Config->get_layer_model() == MoveAddHigher ||
Config->get_layer_model() == AddHigher) {
RegionSortByLastLayerOp cmp;
RegionList copy = regions;
@ -1604,8 +1604,8 @@ void
Playlist::raise_region_to_top (boost::shared_ptr<Region> region)
{
/* does nothing useful if layering mode is later=higher */
if ((_session.get_layer_model() == Session::MoveAddHigher) ||
(_session.get_layer_model() == Session::AddHigher)) {
if ((Config->get_layer_model() == MoveAddHigher) ||
(Config->get_layer_model() == AddHigher)) {
timestamp_layer_op (region);
relayer ();
}
@ -1615,8 +1615,8 @@ void
Playlist::lower_region_to_bottom (boost::shared_ptr<Region> region)
{
/* does nothing useful if layering mode is later=higher */
if ((_session.get_layer_model() == Session::MoveAddHigher) ||
(_session.get_layer_model() == Session::AddHigher)) {
if ((Config->get_layer_model() == MoveAddHigher) ||
(Config->get_layer_model() == AddHigher)) {
region->set_last_layer_op (0);
relayer ();
}

View file

@ -311,7 +311,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
// TODO: this is probably wrong
(no_monitor && record_enabled() && (!_session.get_auto_input() || _session.actively_recording()))
(no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
) {
@ -390,7 +390,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
// rec-enabled but not s/w monitoring
(no_monitor && record_enabled() && (!_session.get_auto_input() || _session.actively_recording()))
(no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
) {
@ -553,7 +553,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
// recording but not s/w monitoring
(no_monitor && record_enabled() && (!_session.get_auto_input() || _session.actively_recording()))
(no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
) {
@ -586,7 +586,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
/* relax */
} else if (no_monitor && record_enabled() && (!_session.get_auto_input() || _session.actively_recording())) {
} else if (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording())) {
IO::silence (nframes, offset);
@ -598,7 +598,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
// muted by solo of another track, but not using control outs for solo
(!solo_audible && (_session.solo_model() != Session::SoloBus)) ||
(!solo_audible && (Config->get_solo_model() != SoloBus)) ||
// muted by mute of this track

View file

@ -96,8 +96,6 @@ sigc::signal<int> Session::AskAboutPendingState;
sigc::signal<void> Session::SendFeedback;
sigc::signal<void> Session::SMPTEOffsetChanged;
sigc::signal<void> Session::SMPTETypeChanged;
sigc::signal<void> Session::PullupChanged;
sigc::signal<void> Session::StartTimeChanged;
sigc::signal<void> Session::EndTimeChanged;
@ -296,7 +294,7 @@ Session::Session (AudioEngine &eng,
_state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
Config->ParameterChanged.connect (mem_fun (*this, &Session::handle_configuration_change));
Config->ParameterChanged.connect (mem_fun (*this, &Session::config_changed));
if (was_dirty) {
DirtyChanged (); /* EMIT SIGNAL */
@ -601,6 +599,8 @@ Session::when_engine_running ()
set_block_size (_engine.frames_per_cycle());
set_frame_rate (_engine.frame_rate());
Config->map_parameters (mem_fun (*this, &Session::config_changed));
/* every time we reconnect, recompute worst case output latencies */
_engine.Running.connect (mem_fun (*this, &Session::set_worst_io_latencies));
@ -626,7 +626,7 @@ Session::when_engine_running ()
if (_click_io->set_state (*child->children().front()) == 0) {
_clicking = click_requested;
_clicking = Config->get_clicking ();
} else {
@ -644,7 +644,7 @@ Session::when_engine_running ()
if (_click_io->add_output_port (first_physical_output, this)) {
// relax, even though its an error
} else {
_clicking = click_requested;
_clicking = Config->get_clicking ();
}
}
}
@ -657,7 +657,7 @@ Session::when_engine_running ()
set_worst_io_latencies ();
if (_clicking) {
ControlChanged (Clicking); /* EMIT SIGNAL */
// XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
}
if (auditioner == 0) {
@ -923,76 +923,12 @@ Session::record_enabling_legal () const
// return false;
// }
if (all_safe) {
if (Config->get_all_safe()) {
return false;
}
return true;
}
void
Session::set_auto_play (bool yn)
{
if (auto_play != yn) {
auto_play = yn;
set_dirty ();
ControlChanged (AutoPlay);
}
}
void
Session::set_auto_return (bool yn)
{
if (auto_return != yn) {
auto_return = yn;
set_dirty ();
ControlChanged (AutoReturn);
}
}
void
Session::set_crossfades_active (bool yn)
{
if (crossfades_active != yn) {
crossfades_active = yn;
set_dirty ();
ControlChanged (CrossFadesActive);
}
}
void
Session::set_do_not_record_plugins (bool yn)
{
if (do_not_record_plugins != yn) {
do_not_record_plugins = yn;
set_dirty ();
ControlChanged (RecordingPlugins);
}
}
void
Session::set_auto_input (bool yn)
{
if (auto_input != yn) {
auto_input = yn;
if (Config->get_use_hardware_monitoring() && transport_rolling()) {
/* auto-input only makes a difference if we're rolling */
boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
if ((*i)->record_enabled ()) {
//cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
(*i)->monitor_input (!auto_input);
}
}
}
set_dirty();
ControlChanged (AutoInput);
}
}
void
Session::reset_input_monitor_state ()
{
@ -1003,7 +939,7 @@ Session::reset_input_monitor_state ()
for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
if ((*i)->record_enabled ()) {
//cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
(*i)->monitor_input (Config->get_use_hardware_monitoring() && !auto_input);
(*i)->monitor_input (Config->get_use_hardware_monitoring() && !Config->get_auto_input());
}
}
} else {
@ -1011,44 +947,19 @@ Session::reset_input_monitor_state ()
for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
if ((*i)->record_enabled ()) {
//cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
//cerr << "switching to input = " << !Config->get_auto_input() << __FILE__ << __LINE__ << endl << endl;
(*i)->monitor_input (Config->get_use_hardware_monitoring());
}
}
}
}
void
Session::set_input_auto_connect (bool yn)
{
if (yn) {
input_auto_connect = AutoConnectOption (input_auto_connect|AutoConnectPhysical);
} else {
input_auto_connect = AutoConnectOption (input_auto_connect|~AutoConnectPhysical);
}
set_dirty ();
}
bool
Session::get_input_auto_connect () const
{
return (input_auto_connect & AutoConnectPhysical);
}
void
Session::set_output_auto_connect (AutoConnectOption aco)
{
output_auto_connect = aco;
set_dirty ();
}
void
Session::auto_punch_start_changed (Location* location)
{
replace_event (Event::PunchIn, location->start());
if (get_record_enabled() && get_punch_in()) {
if (get_record_enabled() && Config->get_punch_in()) {
/* capture start has been changed, so save new pending state */
save_state ("", true);
}
@ -1077,7 +988,7 @@ Session::auto_loop_changed (Location* location)
{
replace_event (Event::AutoLoop, location->end(), location->start());
if (transport_rolling() && get_auto_loop()) {
if (transport_rolling() && play_loop) {
//if (_transport_frame < location->start() || _transport_frame > location->end()) {
@ -1088,7 +999,7 @@ Session::auto_loop_changed (Location* location)
request_locate (location->start(), true);
}
else if (seamless_loop && !loop_changing) {
else if (Config->get_seamless_loop() && !loop_changing) {
// schedule a locate-roll to refill the diskstreams at the
// previous loop end
@ -1145,48 +1056,6 @@ Session::set_auto_punch_location (Location* location)
auto_punch_location_changed (location);
}
void
Session::set_punch_in (bool yn)
{
if (punch_in == yn) {
return;
}
Location* location;
if ((location = _locations.auto_punch_location()) != 0) {
if ((punch_in = yn) == true) {
replace_event (Event::PunchIn, location->start());
} else {
remove_event (location->start(), Event::PunchIn);
}
}
set_dirty();
ControlChanged (PunchIn); /* EMIT SIGNAL */
}
void
Session::set_punch_out (bool yn)
{
if (punch_out == yn) {
return;
}
Location* location;
if ((location = _locations.auto_punch_location()) != 0) {
if ((punch_out = yn) == true) {
replace_event (Event::PunchOut, location->end());
} else {
clear_events (Event::PunchOut);
}
}
set_dirty();
ControlChanged (PunchOut); /* EMIT SIGNAL */
}
void
Session::set_auto_loop_location (Location* location)
{
@ -1280,7 +1149,7 @@ Session::enable_record ()
_last_record_location = _transport_frame;
send_mmc_in_another_thread (MIDI::MachineControl::cmdRecordStrobe);
if (Config->get_use_hardware_monitoring() && auto_input) {
if (Config->get_use_hardware_monitoring() && Config->get_auto_input()) {
boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
if ((*i)->record_enabled ()) {
@ -1310,7 +1179,7 @@ Session::disable_record (bool rt_context, bool force)
send_mmc_in_another_thread (MIDI::MachineControl::cmdRecordExit);
if (Config->get_use_hardware_monitoring() && auto_input) {
if (Config->get_use_hardware_monitoring() && Config->get_auto_input()) {
boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
@ -1337,7 +1206,7 @@ Session::step_back_from_record ()
boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
if (auto_input && (*i)->record_enabled ()) {
if (Config->get_auto_input() && (*i)->record_enabled ()) {
//cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl;
(*i)->monitor_input (false);
}
@ -1357,7 +1226,7 @@ Session::maybe_enable_record ()
save_state ("", true);
if (_transport_speed) {
if (!punch_in) {
if (!Config->get_punch_in()) {
enable_record ();
}
} else {
@ -2166,16 +2035,6 @@ Session::route_solo_changed (void* src, shared_ptr<Route> route)
set_dirty();
}
void
Session::set_solo_latched (bool yn)
{
if (yn != _solo_latched) {
_solo_latched = yn;
set_dirty ();
ControlChanged (SoloLatch);
}
}
void
Session::update_route_solo_state ()
{
@ -3455,23 +3314,6 @@ Session::connection_by_name (string name) const
return 0;
}
void
Session::set_edit_mode (EditMode mode)
{
_edit_mode = mode;
{
Glib::Mutex::Lock lm (playlist_lock);
for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) {
(*i)->set_edit_mode (mode);
}
}
set_dirty ();
ControlChanged (EditingMode); /* EMIT SIGNAL */
}
void
Session::tempo_map_changed (Change ignored)
{
@ -3618,16 +3460,6 @@ Session::n_playlists () const
return playlists.size();
}
void
Session::set_solo_model (SoloModel sm)
{
if (sm != _solo_model) {
_solo_model = sm;
ControlChanged (SoloingModel);
set_dirty ();
}
}
void
Session::allocate_pan_automation_buffers (jack_nframes_t nframes, uint32_t howmany, bool force)
{
@ -3869,36 +3701,6 @@ Session::nbusses () const
return n;
}
void
Session::set_layer_model (LayerModel lm)
{
if (lm != layer_model) {
layer_model = lm;
set_dirty ();
ControlChanged (LayeringModel);
}
}
void
Session::set_xfade_model (CrossfadeModel xm)
{
if (xm != xfade_model) {
xfade_model = xm;
set_dirty ();
ControlChanged (CrossfadingModel);
}
}
void
Session::handle_configuration_change (const char* parameter)
{
if (!strcmp (parameter, "use-video-sync")) {
if (_transport_speed == 0.0f) {
waiting_for_sync_offset = true;
}
}
}
void
Session::add_curve(Curve *curve)
{

View file

@ -145,17 +145,19 @@ Session::setup_click_sounds (int which)
click_data = 0;
}
if (click_sound.length() == 0) {
string path = Config->get_click_emphasis_sound();
if (path.empty()) {
click_data = const_cast<Sample*> (default_click);
click_length = default_click_length;
} else {
if ((sndfile = sf_open (click_sound.c_str(), SFM_READ, &info)) == 0) {
if ((sndfile = sf_open (path.c_str(), SFM_READ, &info)) == 0) {
char errbuf[256];
sf_error_str (0, errbuf, sizeof (errbuf) - 1);
warning << string_compose (_("cannot open click soundfile %1 (%2)"), click_sound, errbuf) << endmsg;
warning << string_compose (_("cannot open click soundfile %1 (%2)"), path, errbuf) << endmsg;
_clicking = false;
return;
}
@ -182,14 +184,16 @@ Session::setup_click_sounds (int which)
click_emphasis_data = 0;
}
if (click_emphasis_sound.length() == 0) {
string path = Config->get_click_emphasis_sound();
if (path.empty()) {
click_emphasis_data = const_cast<Sample*> (default_click_emphasis);
click_emphasis_length = default_click_emphasis_length;
} else {
if ((sndfile = sf_open (click_emphasis_sound.c_str(), SFM_READ, &info)) == 0) {
if ((sndfile = sf_open (path.c_str(), SFM_READ, &info)) == 0) {
char errbuf[256];
sf_error_str (0, errbuf, sizeof (errbuf) - 1);
warning << string_compose (_("cannot open click emphasis soundfile %1 (%2)"), click_emphasis_sound, errbuf) << endmsg;
warning << string_compose (_("cannot open click emphasis soundfile %1 (%2)"), path, errbuf) << endmsg;
return;
}
@ -218,46 +222,3 @@ Session::clear_clicks ()
clicks.clear ();
}
void
Session::set_click_sound (string path)
{
if (path != click_sound) {
click_sound = path;
setup_click_sounds (1);
}
}
void
Session::set_click_emphasis_sound (string path)
{
if (path != click_emphasis_sound) {
click_emphasis_sound = path;
setup_click_sounds (-1);
}
}
void
Session::set_clicking (bool yn)
{
if (click_requested != yn) {
click_requested = yn;
if (yn) {
if (_click_io && click_data) {
_clicking = true;
}
} else {
_clicking = false;
}
ControlChanged (Clicking); /* EMIT SIGNAL */
}
}
bool
Session::get_clicking () const
{
return click_requested;
}

View file

@ -312,7 +312,15 @@ Session::process_event (Event* ev)
switch (ev->type) {
case Event::SetLoop:
set_auto_loop (ev->yes_or_no);
set_play_loop (ev->yes_or_no);
break;
case Event::AutoLoop:
if (play_loop) {
start_locate (ev->target_frame, true, false, Config->get_seamless_loop());
}
remove = false;
del = false;
break;
case Event::Locate:
@ -341,7 +349,7 @@ Session::process_event (Event* ev)
case Event::PunchIn:
// cerr << "PunchIN at " << transport_frame() << endl;
if (punch_in && record_status() == Enabled) {
if (Config->get_punch_in() && record_status() == Enabled) {
enable_record ();
}
remove = false;
@ -350,7 +358,7 @@ Session::process_event (Event* ev)
case Event::PunchOut:
// cerr << "PunchOUT at " << transport_frame() << endl;
if (punch_out) {
if (Config->get_punch_out()) {
step_back_from_record ();
}
remove = false;
@ -380,14 +388,6 @@ Session::process_event (Event* ev)
del = false;
break;
case Event::AutoLoop:
if (auto_loop) {
start_locate (ev->target_frame, true, false, seamless_loop);
}
remove = false;
del = false;
break;
case Event::Overwrite:
overwrite_some_buffers (static_cast<AudioDiskstream*>(ev->ptr));
break;
@ -397,7 +397,7 @@ Session::process_event (Event* ev)
break;
case Event::SetSlaveSource:
set_slave_source (ev->slave, ev->target_frame);
set_slave_source (ev->slave);
break;
case Event::Audition:

View file

@ -462,7 +462,7 @@ Session::stop_audio_export (AudioExportSpecification& spec)
/* restart slaving */
if (post_export_slave != None) {
set_slave_source (post_export_slave, post_export_position);
Config->set_slave_source (post_export_slave);
} else {
locate (post_export_position, false, false, false);
}
@ -517,10 +517,10 @@ Session::prepare_to_export (AudioExportSpecification& spec)
/* no slaving */
post_export_slave = _slave_type;
post_export_slave = Config->get_slave_source ();
post_export_position = _transport_frame;
set_slave_source (None, 0);
Config->set_slave_source (None);
/* get transport ready */

View file

@ -84,104 +84,6 @@ Session::use_config_midi_ports ()
MTC, MMC, etc.
**********************************************************************/
void
Session::set_mmc_control (bool yn)
{
if (mmc_control == yn) {
return;
}
mmc_control = yn;
set_dirty();
poke_midi_thread ();
ControlChanged (MMCControl); /* EMIT SIGNAL */
}
void
Session::set_midi_control (bool yn)
{
if (midi_control == yn) {
return;
}
midi_control = yn;
set_dirty();
poke_midi_thread ();
ControlChanged (MidiControl); /* EMIT SIGNAL */
}
void
Session::set_send_mtc (bool yn)
{
/* set the persistent option value regardless */
send_midi_timecode = yn;
set_dirty();
/* only set the internal flag if we have
a port.
*/
if (_mtc_port == 0 || send_mtc == yn) {
return;
}
send_mtc = yn;
ControlChanged (SendMTC); /* EMIT SIGNAL */
}
void
Session::set_send_mmc (bool yn)
{
if (_mmc_port == 0) {
return;
}
if (send_midi_machine_control == yn) {
return;
}
/* only set the internal flag if we have
a port.
*/
if (_mmc_port) {
send_mmc = yn;
}
/* set the persistent option value regardless */
send_midi_machine_control = yn;
set_dirty();
ControlChanged (SendMMC); /* EMIT SIGNAL */
}
void
Session::set_midi_feedback (bool yn)
{
}
bool
Session::get_midi_feedback () const
{
return false;
}
bool
Session::get_send_mtc () const
{
return send_mtc;
}
bool
Session::get_send_mmc () const
{
return send_mmc;
}
int
Session::set_mtc_port (string port_tag)
{
@ -483,21 +385,20 @@ Session::setup_midi_control ()
if (_mmc_port != 0) {
send_mmc = send_midi_machine_control;
Config->set_send_mmc (session_send_mmc);
} else {
mmc = 0;
send_mmc = false;
session_send_mmc = false;
}
if (_mtc_port != 0) {
send_mtc = send_midi_timecode;
Config->set_send_mtc (session_send_mtc);
} else {
send_mtc = false;
session_send_mtc = false;
}
}
@ -542,7 +443,7 @@ Session::midi_read (MIDI::Port* port)
void
Session::spp_start (Parser& ignored)
{
if (mmc_control && (_slave_type != MTC)) {
if (Config->get_mmc_control() && (Config->get_slave_source() != MTC)) {
request_transport_speed (1.0);
}
}
@ -556,7 +457,7 @@ Session::spp_continue (Parser& ignored)
void
Session::spp_stop (Parser& ignored)
{
if (mmc_control) {
if (Config->get_mmc_control()) {
request_stop ();
}
}
@ -564,7 +465,7 @@ Session::spp_stop (Parser& ignored)
void
Session::mmc_deferred_play (MIDI::MachineControl &mmc)
{
if (mmc_control && (_slave_type != MTC)) {
if (Config->get_mmc_control() && (Config->get_slave_source() != MTC)) {
request_transport_speed (1.0);
}
}
@ -572,7 +473,7 @@ Session::mmc_deferred_play (MIDI::MachineControl &mmc)
void
Session::mmc_record_pause (MIDI::MachineControl &mmc)
{
if (mmc_control) {
if (Config->get_mmc_control()) {
maybe_enable_record();
}
}
@ -580,7 +481,7 @@ Session::mmc_record_pause (MIDI::MachineControl &mmc)
void
Session::mmc_record_strobe (MIDI::MachineControl &mmc)
{
if (!mmc_control)
if (!Config->get_mmc_control())
return;
/* record strobe does an implicit "Play" command */
@ -608,7 +509,7 @@ Session::mmc_record_strobe (MIDI::MachineControl &mmc)
void
Session::mmc_record_exit (MIDI::MachineControl &mmc)
{
if (mmc_control) {
if (Config->get_mmc_control()) {
disable_record (false);
}
}
@ -616,7 +517,7 @@ Session::mmc_record_exit (MIDI::MachineControl &mmc)
void
Session::mmc_stop (MIDI::MachineControl &mmc)
{
if (mmc_control) {
if (Config->get_mmc_control()) {
request_stop ();
}
}
@ -624,7 +525,7 @@ Session::mmc_stop (MIDI::MachineControl &mmc)
void
Session::mmc_pause (MIDI::MachineControl &mmc)
{
if (mmc_control) {
if (Config->get_mmc_control()) {
/* We support RECORD_PAUSE, so the spec says that
we must interpret PAUSE like RECORD_PAUSE if
@ -645,7 +546,7 @@ void
Session::mmc_step (MIDI::MachineControl &mmc, int steps)
{
if (!mmc_control) {
if (!Config->get_mmc_control()) {
return;
}
@ -664,7 +565,7 @@ Session::mmc_step (MIDI::MachineControl &mmc, int steps)
}
double diff_secs = diff.tv_sec + (diff.tv_usec / 1000000.0);
double cur_speed = (((steps * 0.5) * smpte_frames_per_second) / diff_secs) / smpte_frames_per_second;
double cur_speed = (((steps * 0.5) * Config->get_smpte_frames_per_second()) / diff_secs) / Config->get_smpte_frames_per_second();
if (_transport_speed == 0 || cur_speed * _transport_speed < 0) {
/* change direction */
@ -696,7 +597,7 @@ Session::mmc_step (MIDI::MachineControl &mmc, int steps)
void
Session::mmc_rewind (MIDI::MachineControl &mmc)
{
if (mmc_control) {
if (Config->get_mmc_control()) {
request_transport_speed(-8.0f);
}
}
@ -704,7 +605,7 @@ Session::mmc_rewind (MIDI::MachineControl &mmc)
void
Session::mmc_fast_forward (MIDI::MachineControl &mmc)
{
if (mmc_control) {
if (Config->get_mmc_control()) {
request_transport_speed(8.0f);
}
}
@ -712,7 +613,7 @@ Session::mmc_fast_forward (MIDI::MachineControl &mmc)
void
Session::mmc_locate (MIDI::MachineControl &mmc, const MIDI::byte* mmc_tc)
{
if (!mmc_control) {
if (!Config->get_mmc_control()) {
return;
}
@ -751,18 +652,14 @@ Session::mmc_locate (MIDI::MachineControl &mmc, const MIDI::byte* mmc_tc)
void
Session::mmc_shuttle (MIDI::MachineControl &mmc, float speed, bool forw)
{
cerr << "MMC shuttle, speed = " << speed << endl;
if (!mmc_control) {
if (!Config->get_mmc_control()) {
return;
}
if (shuttle_speed_threshold >= 0 && speed > shuttle_speed_threshold) {
speed *= shuttle_speed_factor;
if (Config->get_shuttle_speed_threshold() >= 0 && speed > Config->get_shuttle_speed_threshold()) {
speed *= Config->get_shuttle_speed_factor();
}
cerr << "requested MMC control speed = " << speed << endl;
if (forw) {
request_transport_speed (speed);
} else {
@ -773,7 +670,7 @@ Session::mmc_shuttle (MIDI::MachineControl &mmc, float speed, bool forw)
void
Session::mmc_record_enable (MIDI::MachineControl &mmc, size_t trk, bool enabled)
{
if (mmc_control) {
if (Config->get_mmc_control()) {
RouteList::iterator i;
boost::shared_ptr<RouteList> r = routes.reader();
@ -853,7 +750,7 @@ Session::send_full_time_code ()
MIDI::byte msg[10];
SMPTE::Time smpte;
if (_mtc_port == 0 || !send_mtc) {
if (_mtc_port == 0 || !session_send_mtc) {
return 0;
}
@ -916,7 +813,7 @@ Session::send_full_time_code ()
int
Session::send_midi_time_code ()
{
if (_mtc_port == 0 || !send_mtc || transmitting_smpte_time.negative || (next_quarter_frame_to_send < 0) ) {
if (_mtc_port == 0 || !session_send_mtc || transmitting_smpte_time.negative || (next_quarter_frame_to_send < 0) ) {
return 0;
}
@ -999,7 +896,7 @@ Session::send_mmc_in_another_thread (MIDI::MachineControl::Command cmd, jack_nfr
{
MIDIRequest* request;
if (_mtc_port == 0 || !send_mmc) {
if (_mtc_port == 0 || !session_send_mmc) {
return;
}
@ -1019,7 +916,7 @@ Session::deliver_mmc (MIDI::MachineControl::Command cmd, jack_nframes_t where)
int nbytes = 4;
SMPTE::Time smpte;
if (_mmc_port == 0 || !send_mmc) {
if (_mmc_port == 0 || !session_send_mmc) {
return;
}
@ -1272,7 +1169,7 @@ Session::midi_thread_work ()
on the appropriate port.
*/
if (mmc_control && _mmc_port && _mmc_port->selectable() >= 0) {
if (Config->get_mmc_control() && _mmc_port && _mmc_port->selectable() >= 0) {
pfd[nfds].fd = _mmc_port->selectable();
pfd[nfds].events = POLLIN|POLLHUP|POLLERR;
ports[nfds] = _mmc_port;
@ -1284,14 +1181,14 @@ Session::midi_thread_work ()
the relevant port.
*/
if (_mtc_port && (_mtc_port != _mmc_port || !mmc_control) && _mtc_port->selectable() >= 0) {
if (_mtc_port && (_mtc_port != _mmc_port || !Config->get_mmc_control()) && _mtc_port->selectable() >= 0) {
pfd[nfds].fd = _mtc_port->selectable();
pfd[nfds].events = POLLIN|POLLHUP|POLLERR;
ports[nfds] = _mtc_port;
nfds++;
}
if (_midi_port && (_midi_port != _mmc_port || !mmc_control) && (_midi_port != _mtc_port) && _midi_port->selectable() >= 0) {
if (_midi_port && (_midi_port != _mmc_port || !Config->get_mmc_control()) && (_midi_port != _mtc_port) && _midi_port->selectable() >= 0) {
pfd[nfds].fd = _midi_port->selectable();
pfd[nfds].events = POLLIN|POLLHUP|POLLERR;
ports[nfds] = _midi_port;
@ -1450,14 +1347,3 @@ Session::midi_thread_work ()
}
}
bool
Session::get_mmc_control () const
{
return mmc_control;
}
bool
Session::get_midi_control () const
{
return midi_control;
}

View file

@ -410,7 +410,7 @@ Session::process_with_events (jack_nframes_t nframes)
summon_butler ();
}
if (!_engine.freewheeling() && send_mtc) {
if (!_engine.freewheeling() && session_send_mtc) {
send_midi_time_code_in_another_thread ();
}
@ -431,7 +431,7 @@ Session::transport_locked () const
{
Slave* sl = _slave;
if (!locate_pending() && ((_slave_type == None) || (sl && sl->ok() && sl->locked()))) {
if (!locate_pending() && ((Config->get_slave_source() == None) || (sl && sl->ok() && sl->locked()))) {
return true;
}
@ -449,7 +449,7 @@ Session::follow_slave (jack_nframes_t nframes, jack_nframes_t offset)
if (!_slave->ok()) {
stop_transport ();
set_slave_source (None, 0);
Config->set_slave_source (None);
goto noroll;
}
@ -540,9 +540,9 @@ Session::follow_slave (jack_nframes_t nframes, jack_nframes_t offset)
Location* al = _locations.auto_loop_location();
if (al && auto_loop && (slave_transport_frame < al->start() || slave_transport_frame > al->end())) {
if (al && play_loop && (slave_transport_frame < al->start() || slave_transport_frame > al->end())) {
// cancel looping
request_auto_loop(false);
request_play_loop(false);
}
if (slave_transport_frame != _transport_frame) {
@ -614,7 +614,7 @@ Session::follow_slave (jack_nframes_t nframes, jack_nframes_t offset)
// << " tf = " << _transport_frame
// << endl;
if (_slave_type == JACK) {
if (Config->get_slave_source() == JACK) {
last_stop_frame = _transport_frame;
}
@ -784,7 +784,7 @@ Session::process_without_events (jack_nframes_t nframes)
} else {
increment_transport_position (frames_moved);
}
maybe_stop (stop_limit);
check_declick_out ();
@ -794,7 +794,7 @@ Session::process_without_events (jack_nframes_t nframes)
summon_butler ();
}
if (!_engine.freewheeling() && send_mtc) {
if (!_engine.freewheeling() && session_send_mtc) {
send_midi_time_code_in_another_thread ();
}

View file

@ -99,10 +99,11 @@ Session::first_stage_init (string fullpath, string snapshot_name)
}
char buf[PATH_MAX+1];
if (!realpath(fullpath.c_str(), buf) && (errno != ENOENT)) {
if (!realpath (fullpath.c_str(), buf) && (errno != ENOENT)) {
error << string_compose(_("Could not use path %1 (%s)"), buf, strerror(errno)) << endmsg;
throw failed_constructor();
}
_path = string(buf);
if (_path[_path.length()-1] != '/') {
@ -131,16 +132,8 @@ Session::first_stage_init (string fullpath, string snapshot_name)
start_location = new Location (0, 0, _("start"), Location::Flags ((Location::IsMark|Location::IsStart)));
_end_location_is_free = true;
g_atomic_int_set (&_record_status, Disabled);
auto_play = false;
punch_in = false;
punch_out = false;
auto_loop = false;
seamless_loop = false;
loop_changing = false;
auto_input = true;
crossfades_active = false;
all_safe = false;
auto_return = false;
play_loop = false;
_last_roll_location = 0;
_last_record_location = 0;
pending_locate_frame = 0;
@ -153,8 +146,6 @@ Session::first_stage_init (string fullpath, string snapshot_name)
outbound_mtc_smpte_frame = 0;
next_quarter_frame_to_send = -1;
current_block_size = 0;
_solo_latched = true;
_solo_model = InverseMute;
solo_update_disabled = false;
currently_soloing = false;
_have_captured = false;
@ -163,12 +154,12 @@ Session::first_stage_init (string fullpath, string snapshot_name)
_worst_track_latency = 0;
_state_of_the_state = StateOfTheState(CannotSave|InitialConnecting|Loading);
_slave = 0;
_slave_type = None;
butler_mixdown_buffer = 0;
butler_gain_buffer = 0;
mmc_control = false;
midi_control = true;
mmc = 0;
session_send_mmc = false;
session_send_mtc = false;
session_midi_feedback = false;
post_transport_work = PostTransportWork (0);
g_atomic_int_set (&butler_should_do_transport_work, 0);
g_atomic_int_set (&butler_active, 0);
@ -176,48 +167,37 @@ Session::first_stage_init (string fullpath, string snapshot_name)
g_atomic_int_set (&_capture_load, 100);
g_atomic_int_set (&_playback_load_min, 100);
g_atomic_int_set (&_capture_load_min, 100);
_edit_mode = Slide;
pending_edit_mode = _edit_mode;
pending_edit_mode = Config->get_edit_mode ();
_play_range = false;
input_auto_connect = AutoConnectOption (0);
output_auto_connect = AutoConnectOption (0);
waiting_to_start = false;
_exporting = false;
_gain_automation_buffer = 0;
_pan_automation_buffer = 0;
_npan_buffers = 0;
pending_abort = false;
layer_model = MoveAddHigher;
xfade_model = ShortCrossfade;
destructive_index = 0;
current_trans = 0;
AudioDiskstream::allocate_working_buffers();
/* default short fade = 15ms */
Crossfade::set_short_xfade_length ((jack_nframes_t) floor ((15.0 * frame_rate()) / 1000.0));
Crossfade::set_short_xfade_length ((jack_nframes_t) floor (Config->get_short_xfade_seconds() * frame_rate()));
DestructiveFileSource::setup_standard_crossfades (frame_rate());
last_mmc_step.tv_sec = 0;
last_mmc_step.tv_usec = 0;
step_speed = 0.0;
preroll.type = AnyTime::Frames;
preroll.frames = 0;
postroll.type = AnyTime::Frames;
postroll.frames = 0;
/* click sounds are unset by default, which causes us to internal
waveforms for clicks.
*/
_clicking = false;
click_requested = false;
click_data = 0;
click_emphasis_data = 0;
click_length = 0;
click_emphasis_length = 0;
_clicking = false;
process_function = &Session::process_with_events;
@ -230,34 +210,18 @@ Session::first_stage_init (string fullpath, string snapshot_name)
_current_frame_rate = 48000;
_base_frame_rate = 48000;
smpte_frames_per_second = 30;
video_pullup = 0.0;
smpte_drop_frames = false;
last_smpte_when = 0;
_smpte_offset = 0;
_smpte_offset_negative = true;
last_smpte_valid = false;
sync_time_vars ();
last_rr_session_dir = session_dirs.begin();
refresh_disk_space ();
// set_default_fade (0.2, 5.0); /* steepness, millisecs */
/* default configuration */
do_not_record_plugins = false;
over_length_short = 2;
over_length_long = 10;
send_midi_timecode = false;
send_midi_machine_control = false;
shuttle_speed_factor = 1.0;
shuttle_speed_threshold = 5;
rf_speed = 2.0;
_meter_hold = 100; // XXX unknown units: number of calls to meter::set()
_meter_falloff = 0.375f; // XXX unknown units: refresh_rate
max_level = 0;
min_level = 0;
/* slave stuff */
average_slave_delta = 1800;
@ -265,11 +229,6 @@ Session::first_stage_init (string fullpath, string snapshot_name)
delta_accumulator_cnt = 0;
slave_state = Stopped;
/* default SMPTE type is 30 FPS, non-drop */
set_smpte_type (30.0, false);
set_video_pullup (0.0);
_engine.GraphReordered.connect (mem_fun (*this, &Session::graph_reordered));
/* These are all static "per-class" signals */
@ -382,14 +341,6 @@ Session::raid_path () const
return path.substr (0, path.length() - 1); // drop final colon
}
void
Session::set_raid_path (string path)
{
/* public-access to setup_raid_path() */
setup_raid_path (path);
}
void
Session::setup_raid_path (string path)
{
@ -762,40 +713,9 @@ Session::load_options (const XMLNode& node)
{
XMLNode* child;
XMLProperty* prop;
bool have_fade_msecs = false;
bool have_fade_steepness = false;
float fade_msecs = 0;
float fade_steepness = 0;
SlaveSource slave_src = None;
int x;
LocaleGuard lg (X_("POSIX"));
if ((child = find_named_node (node, "input-auto-connect")) != 0) {
if ((prop = child->property ("val")) != 0) {
sscanf (prop->value().c_str(), "%x", &x);
input_auto_connect = AutoConnectOption (x);
}
}
if ((child = find_named_node (node, "output-auto-connect")) != 0) {
if ((prop = child->property ("val")) != 0) {
sscanf (prop->value().c_str(), "%x", &x);
output_auto_connect = AutoConnectOption (x);
}
}
if ((child = find_named_node (node, "slave")) != 0) {
if ((prop = child->property ("type")) != 0) {
if (prop->value() == "none") {
slave_src = None;
} else if (prop->value() == "mtc") {
slave_src = MTC;
} else if (prop->value() == "jack") {
slave_src = JACK;
}
set_slave_source (slave_src, 0);
}
}
Config->set_variables (node, ConfigVariableBase::Session);
/* we cannot set edit mode if we are loading a session,
because it might destroy the playlist's positioning
@ -810,184 +730,6 @@ Session::load_options (const XMLNode& node)
}
}
}
if ((child = find_named_node (node, "send-midi-timecode")) != 0) {
if ((prop = child->property ("val")) != 0) {
bool x = (prop->value() == "yes");
send_mtc = !x; /* force change in value */
set_send_mtc (x);
}
}
if ((child = find_named_node (node, "send-midi-machine-control")) != 0) {
if ((prop = child->property ("val")) != 0) {
bool x = (prop->value() == "yes");
send_mmc = !x; /* force change in value */
set_send_mmc (prop->value() == "yes");
}
}
if ((child = find_named_node (node, "max-level")) != 0) {
if ((prop = child->property ("val")) != 0) {
max_level = atoi (prop->value().c_str());
}
}
if ((child = find_named_node (node, "min-level")) != 0) {
if ((prop = child->property ("val")) != 0) {
min_level = atoi (prop->value().c_str());
}
}
if ((child = find_named_node (node, "meter-hold")) != 0) {
if ((prop = child->property ("val")) != 0) {
_meter_hold = atof (prop->value().c_str());
}
}
if ((child = find_named_node (node, "meter-falloff")) != 0) {
if ((prop = child->property ("val")) != 0) {
_meter_falloff = atof (prop->value().c_str());
}
}
if ((child = find_named_node (node, "long-over-length")) != 0) {
if ((prop = child->property ("val")) != 0) {
over_length_long = atoi (prop->value().c_str());
}
}
if ((child = find_named_node (node, "short-over-length")) != 0) {
if ((prop = child->property ("val")) != 0) {
over_length_short = atoi (prop->value().c_str());
}
}
if ((child = find_named_node (node, "shuttle-speed-factor")) != 0) {
if ((prop = child->property ("val")) != 0) {
shuttle_speed_factor = atof (prop->value().c_str());
}
}
if ((child = find_named_node (node, "shuttle-speed-threshold")) != 0) {
if ((prop = child->property ("val")) != 0) {
shuttle_speed_threshold = atof (prop->value().c_str());
}
}
if ((child = find_named_node (node, "rf-speed")) != 0) {
if ((prop = child->property ("val")) != 0) {
rf_speed = atof (prop->value().c_str());
}
}
if ((child = find_named_node (node, "video-pullup")) != 0) {
if ((prop = child->property ("val")) != 0) {
set_video_pullup( atof (prop->value().c_str()) );
}
}
if ((child = find_named_node (node, "smpte-frames-per-second")) != 0) {
if ((prop = child->property ("val")) != 0) {
set_smpte_type( atof (prop->value().c_str()), smpte_drop_frames );
}
}
if ((child = find_named_node (node, "smpte-drop-frames")) != 0) {
if ((prop = child->property ("val")) != 0) {
set_smpte_type( smpte_frames_per_second, (prop->value() == "yes") );
}
}
if ((child = find_named_node (node, "smpte-offset")) != 0) {
if ((prop = child->property ("val")) != 0) {
set_smpte_offset( atoi (prop->value().c_str()) );
}
}
if ((child = find_named_node (node, "smpte-offset-negative")) != 0) {
if ((prop = child->property ("val")) != 0) {
set_smpte_offset_negative( (prop->value() == "yes") );
}
}
if ((child = find_named_node (node, "click-sound")) != 0) {
if ((prop = child->property ("val")) != 0) {
click_sound = prop->value();
}
}
if ((child = find_named_node (node, "click-emphasis-sound")) != 0) {
if ((prop = child->property ("val")) != 0) {
click_emphasis_sound = prop->value();
}
}
if ((child = find_named_node (node, "solo-model")) != 0) {
if ((prop = child->property ("val")) != 0) {
if (prop->value() == "SoloBus")
_solo_model = SoloBus;
else
_solo_model = InverseMute;
}
}
/* BOOLEAN OPTIONS */
if ((child = find_named_node (node, "auto-play")) != 0) {
if ((prop = child->property ("val")) != 0) {
set_auto_play (prop->value() == "yes");
}
}
if ((child = find_named_node (node, "auto-input")) != 0) {
if ((prop = child->property ("val")) != 0) {
set_auto_input (prop->value() == "yes");
}
}
if ((child = find_named_node (node, "seamless-loop")) != 0) {
if ((prop = child->property ("val")) != 0) {
set_seamless_loop (prop->value() == "yes");
}
}
if ((child = find_named_node (node, "punch-in")) != 0) {
if ((prop = child->property ("val")) != 0) {
set_punch_in (prop->value() == "yes");
}
}
if ((child = find_named_node (node, "punch-out")) != 0) {
if ((prop = child->property ("val")) != 0) {
set_punch_out (prop->value() == "yes");
}
}
if ((child = find_named_node (node, "auto-return")) != 0) {
if ((prop = child->property ("val")) != 0) {
set_auto_return (prop->value() == "yes");
}
}
if ((child = find_named_node (node, "send-mtc")) != 0) {
if ((prop = child->property ("val")) != 0) {
set_send_mtc (prop->value() == "yes");
}
}
if ((child = find_named_node (node, "mmc-control")) != 0) {
if ((prop = child->property ("val")) != 0) {
set_mmc_control (prop->value() == "yes");
}
}
if ((child = find_named_node (node, "midi-control")) != 0) {
if ((prop = child->property ("val")) != 0) {
set_midi_control (prop->value() == "yes");
}
}
if ((child = find_named_node (node, "midi-feedback")) != 0) {
if ((prop = child->property ("val")) != 0) {
set_midi_feedback (prop->value() == "yes");
}
}
// Legacy support for <recording-plugins>
if ((child = find_named_node (node, "recording-plugins")) != 0) {
if ((prop = child->property ("val")) != 0) {
set_do_not_record_plugins (prop->value() == "no");
}
}
if ((child = find_named_node (node, "do-not-record-plugins")) != 0) {
if ((prop = child->property ("val")) != 0) {
set_do_not_record_plugins (prop->value() == "yes");
}
}
if ((child = find_named_node (node, "crossfades-active")) != 0) {
if ((prop = child->property ("val")) != 0) {
set_crossfades_active (prop->value() == "yes");
}
}
if ((child = find_named_node (node, "audible-click")) != 0) {
if ((prop = child->property ("val")) != 0) {
set_clicking (prop->value() == "yes");
}
}
if ((child = find_named_node (node, "end-marker-is-free")) != 0) {
if ((prop = child->property ("val")) != 0) {
@ -995,243 +737,23 @@ Session::load_options (const XMLNode& node)
}
}
if ((child = find_named_node (node, "layer-model")) != 0) {
if ((prop = child->property ("val")) != 0) {
if (prop->value() == X_("LaterHigher")) {
set_layer_model (LaterHigher);
} else if (prop->value() == X_("AddHigher")) {
set_layer_model (AddHigher);
} else {
set_layer_model (MoveAddHigher);
}
}
}
if ((child = find_named_node (node, "xfade-model")) != 0) {
if ((prop = child->property ("val")) != 0) {
if (prop->value() == X_("Short")) {
set_xfade_model (ShortCrossfade);
} else {
set_xfade_model (FullCrossfade);
}
}
}
if ((child = find_named_node (node, "short-xfade-length")) != 0) {
if ((prop = child->property ("val")) != 0) {
/* value is stored as a fractional seconds */
float secs = atof (prop->value().c_str());
Crossfade::set_short_xfade_length ((jack_nframes_t) floor (secs * frame_rate()));
}
}
if ((child = find_named_node (node, "full-xfades-unmuted")) != 0) {
if ((prop = child->property ("val")) != 0) {
crossfades_active = (prop->value() == "yes");
}
}
/* TIED OPTIONS */
if ((child = find_named_node (node, "default-fade-steepness")) != 0) {
if ((prop = child->property ("val")) != 0) {
fade_steepness = atof (prop->value().c_str());
have_fade_steepness = true;
}
}
if ((child = find_named_node (node, "default-fade-msec")) != 0) {
if ((prop = child->property ("val")) != 0) {
fade_msecs = atof (prop->value().c_str());
have_fade_msecs = true;
}
}
if (have_fade_steepness || have_fade_msecs) {
// set_default_fade (fade_steepness, fade_msecs);
}
return 0;
}
XMLNode&
Session::get_options () const
{
XMLNode* opthead;
XMLNode* child;
char buf[32];
LocaleGuard lg (X_("POSIX"));
opthead = new XMLNode ("Options");
XMLNode& option_root = Config->get_partial_state (ConfigVariableBase::Interface);
SlaveSource src = slave_source ();
string src_string;
switch (src) {
case None:
src_string = "none";
break;
case MTC:
src_string = "mtc";
break;
case JACK:
src_string = "jack";
break;
}
child = opthead->add_child ("slave");
child->add_property ("type", src_string);
child = opthead->add_child ("send-midi-timecode");
child->add_property ("val", send_midi_timecode?"yes":"no");
child = opthead->add_child ("send-midi-machine-control");
child->add_property ("val", send_midi_machine_control?"yes":"no");
snprintf (buf, sizeof(buf)-1, "%x", (int) input_auto_connect);
child = opthead->add_child ("input-auto-connect");
child->add_property ("val", buf);
snprintf (buf, sizeof(buf)-1, "%x", (int) output_auto_connect);
child = opthead->add_child ("output-auto-connect");
child->add_property ("val", buf);
snprintf (buf, sizeof(buf)-1, "%d", max_level);
child = opthead->add_child ("max-level");
child->add_property ("val", buf);
snprintf (buf, sizeof(buf)-1, "%d", min_level);
child = opthead->add_child ("min-level");
child->add_property ("val", buf);
snprintf (buf, sizeof(buf)-1, "%f", _meter_hold);
child = opthead->add_child ("meter-hold");
child->add_property ("val", buf);
snprintf (buf, sizeof(buf)-1, "%f", _meter_falloff);
child = opthead->add_child ("meter-falloff");
child->add_property ("val", buf);
snprintf (buf, sizeof(buf)-1, "%u", over_length_long);
child = opthead->add_child ("long-over-length");
child->add_property ("val", buf);
snprintf (buf, sizeof(buf)-1, "%u", over_length_short);
child = opthead->add_child ("short-over-length");
child->add_property ("val", buf);
snprintf (buf, sizeof(buf)-1, "%f", shuttle_speed_factor);
child = opthead->add_child ("shuttle-speed-factor");
child->add_property ("val", buf);
snprintf (buf, sizeof(buf)-1, "%f", shuttle_speed_threshold);
child = opthead->add_child ("shuttle-speed-threshold");
child->add_property ("val", buf);
snprintf (buf, sizeof(buf)-1, "%f", rf_speed);
child = opthead->add_child ("rf-speed");
child->add_property ("val", buf);
snprintf (buf, sizeof(buf)-1, "%.4f", video_pullup);
child = opthead->add_child ("video-pullup");
child->add_property ("val", buf);
snprintf (buf, sizeof(buf)-1, "%.2f", smpte_frames_per_second);
child = opthead->add_child ("smpte-frames-per-second");
child->add_property ("val", buf);
child = opthead->add_child ("smpte-drop-frames");
child->add_property ("val", smpte_drop_frames ? "yes" : "no");
snprintf (buf, sizeof(buf)-1, "%u", smpte_offset ());
child = opthead->add_child ("smpte-offset");
child->add_property ("val", buf);
child = opthead->add_child ("smpte-offset-negative");
child->add_property ("val", smpte_offset_negative () ? "yes" : "no");
child = opthead->add_child ("edit-mode");
switch (_edit_mode) {
case Splice:
child->add_property ("val", "splice");
break;
case Slide:
child->add_property ("val", "slide");
break;
}
child = opthead->add_child ("auto-play");
child->add_property ("val", get_auto_play () ? "yes" : "no");
child = opthead->add_child ("auto-input");
child->add_property ("val", get_auto_input () ? "yes" : "no");
child = opthead->add_child ("seamless-loop");
child->add_property ("val", get_seamless_loop () ? "yes" : "no");
child = opthead->add_child ("punch-in");
child->add_property ("val", get_punch_in () ? "yes" : "no");
child = opthead->add_child ("punch-out");
child->add_property ("val", get_punch_out () ? "yes" : "no");
child = opthead->add_child ("all-safe");
child->add_property ("val", get_all_safe () ? "yes" : "no");
child = opthead->add_child ("auto-return");
child->add_property ("val", get_auto_return () ? "yes" : "no");
child = opthead->add_child ("mmc-control");
child->add_property ("val", get_mmc_control () ? "yes" : "no");
child = opthead->add_child ("midi-control");
child->add_property ("val", get_midi_control () ? "yes" : "no");
child = opthead->add_child ("midi-feedback");
child->add_property ("val", get_midi_feedback () ? "yes" : "no");
child = opthead->add_child ("do-not-record-plugins");
child->add_property ("val", get_do_not_record_plugins () ? "yes" : "no");
child = opthead->add_child ("auto-crossfade");
child->add_property ("val", get_crossfades_active () ? "yes" : "no");
child = opthead->add_child ("audible-click");
child->add_property ("val", get_clicking () ? "yes" : "no");
child = opthead->add_child ("end-marker-is-free");
child = option_root.add_child ("end-marker-is-free");
child->add_property ("val", _end_location_is_free ? "yes" : "no");
if (click_sound.length()) {
child = opthead->add_child ("click-sound");
child->add_property ("val", click_sound);
}
child = option_root.add_child ("full-xfades-unmuted");
if (click_emphasis_sound.length()) {
child = opthead->add_child ("click-emphasis-sound");
child->add_property ("val", click_emphasis_sound);
}
child = opthead->add_child ("solo-model");
child->add_property ("val", _solo_model == SoloBus ? "SoloBus" : "InverseMute");
child = opthead->add_child ("layer-model");
switch (layer_model) {
case LaterHigher:
child->add_property ("val", X_("LaterHigher"));
break;
case MoveAddHigher:
child->add_property ("val", X_("MoveAddHigher"));
break;
case AddHigher:
child->add_property ("val", X_("AddHigher"));
break;
}
child = opthead->add_child ("xfade-model");
switch (xfade_model) {
case FullCrossfade:
child->add_property ("val", X_("Full"));
break;
case ShortCrossfade:
child->add_property ("val", X_("Short"));
}
child = opthead->add_child ("short-xfade-length");
/* store as fractions of a second */
snprintf (buf, sizeof(buf)-1, "%f",
(float) Crossfade::short_xfade_length() / frame_rate());
child->add_property ("val", buf);
child = opthead->add_child ("full-xfades-unmuted");
child->add_property ("val", crossfades_active ? "yes" : "no");
return *opthead;
return option_root;
}
XMLNode&
@ -1504,7 +1026,7 @@ Session::set_state (const XMLNode& node)
MIDI
Path
extra
Options
Options/Config
Sources
AudioRegions
AudioDiskstreams
@ -1519,21 +1041,16 @@ Session::set_state (const XMLNode& node)
if (use_config_midi_ports ()) {
}
if ((child = find_named_node (node, "Path")) != 0) {
/* XXX this XML content stuff horrible API design */
string raid_path = _path + ':' + child->children().front()->content();
setup_raid_path (raid_path);
} else {
/* the path is already set */
}
if ((child = find_named_node (node, "extra")) != 0) {
_extra_xml = new XMLNode (*child);
}
if ((child = find_named_node (node, "Options")) == 0) {
if (((child = find_named_node (node, "Options")) != 0)) { /* old style */
load_options (*child);
} else if ((child = find_named_node (node, "Config")) != 0) { /* new style */
load_options (*child);
} else {
error << _("Session: XML state has no options section") << endmsg;
} else if (load_options (*child)) {
}
if ((child = find_named_node (node, "Sources")) == 0) {
@ -1652,7 +1169,7 @@ Session::set_state (const XMLNode& node)
/* OK, now we can set edit mode */
set_edit_mode (pending_edit_mode);
Config->set_edit_mode (pending_edit_mode);
/* here beginneth the second phase ... */
@ -2536,21 +2053,6 @@ Session::edit_group_by_name (string name)
return 0;
}
void
Session::set_meter_hold (float val)
{
_meter_hold = val;
MeterHoldChanged(); // emit
}
void
Session::set_meter_falloff (float val)
{
_meter_falloff = val;
MeterFalloffChanged(); // emit
}
void
Session::begin_reversible_command (string name)
{
@ -3374,3 +2876,159 @@ Session::restore_history (string snapshot_name)
return 0;
}
void
Session::config_changed (const char* parameter_name)
{
#define PARAM_IS(x) (!strcmp (parameter_name, (x)))
if (PARAM_IS ("seamless-loop")) {
} else if (PARAM_IS ("rf-speed")) {
} else if (PARAM_IS ("auto-loop")) {
} else if (PARAM_IS ("auto-input")) {
if (Config->get_use_hardware_monitoring() && transport_rolling()) {
/* auto-input only makes a difference if we're rolling */
boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
if ((*i)->record_enabled ()) {
//cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
(*i)->monitor_input (!Config->get_auto_input());
}
}
}
} else if (PARAM_IS ("punch-in")) {
Location* location;
if ((location = _locations.auto_punch_location()) != 0) {
if (Config->get_punch_in ()) {
replace_event (Event::PunchIn, location->start());
} else {
remove_event (location->start(), Event::PunchIn);
}
}
} else if (PARAM_IS ("punch-out")) {
Location* location;
if ((location = _locations.auto_punch_location()) != 0) {
if (Config->get_punch_out()) {
replace_event (Event::PunchOut, location->end());
} else {
clear_events (Event::PunchOut);
}
}
} else if (PARAM_IS ("edit-mode")) {
Glib::Mutex::Lock lm (playlist_lock);
for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) {
(*i)->set_edit_mode (Config->get_edit_mode ());
}
} else if (PARAM_IS ("use-video-sync")) {
if (transport_stopped()) {
if (Config->get_use_video_sync()) {
waiting_for_sync_offset = true;
}
}
} else if (PARAM_IS ("mmc-control")) {
poke_midi_thread ();
} else if (PARAM_IS ("midi-control")) {
poke_midi_thread ();
} else if (PARAM_IS ("raid-path")) {
setup_raid_path (Config->get_raid_path());
} else if (PARAM_IS ("smpte-frames-per-second") || PARAM_IS ("smpte-drop-frames")) {
sync_time_vars ();
} else if (PARAM_IS ("video-pullup")) {
sync_time_vars ();
} else if (PARAM_IS ("seamless-loop")) {
if (play_loop && transport_rolling()) {
// to reset diskstreams etc
request_play_loop (true);
}
} else if (PARAM_IS ("rf-speed")) {
cumulative_rf_motion = 0;
reset_rf_scale (0);
} else if (PARAM_IS ("click-sound")) {
setup_click_sounds (1);
} else if (PARAM_IS ("click-emphasis-sound")) {
setup_click_sounds (-1);
} else if (PARAM_IS ("clicking")) {
if (Config->get_clicking()) {
if (_click_io && click_data) { // don't require emphasis data
_clicking = true;
}
} else {
_clicking = false;
}
} else if (PARAM_IS ("send-mtc")) {
/* only set the internal flag if we have
a port.
*/
if (_mtc_port != 0) {
session_send_mtc = Config->get_send_mtc();
}
} else if (PARAM_IS ("send-mmc")) {
/* only set the internal flag if we have
a port.
*/
if (_mmc_port != 0) {
session_send_mmc = Config->get_send_mmc();
}
} else if (PARAM_IS ("midi-feedback")) {
/* only set the internal flag if we have
a port.
*/
if (_mtc_port != 0) {
session_midi_feedback = Config->get_midi_feedback();
}
}
set_dirty ();
#undef PARAM_IS
}

View file

@ -51,17 +51,17 @@ Session::bbt_time (jack_nframes_t when, BBT_Time& bbt)
void
Session::sync_time_vars ()
{
_current_frame_rate = (jack_nframes_t) round (_base_frame_rate * (1.0 + (video_pullup/100.0)));
_current_frame_rate = (jack_nframes_t) round (_base_frame_rate * (1.0 + (Config->get_video_pullup()/100.0)));
_frames_per_hour = _current_frame_rate * 3600;
_frames_per_smpte_frame = (double) _current_frame_rate / (double) smpte_frames_per_second;
_smpte_frames_per_hour = (unsigned long) (smpte_frames_per_second * 3600.0);
_frames_per_smpte_frame = (double) _current_frame_rate / (double) Config->get_smpte_frames_per_second();
_smpte_frames_per_hour = (unsigned long) (Config->get_smpte_frames_per_second() * 3600.0);
}
int
Session::set_smpte_type (float fps, bool drop_frames)
{
smpte_frames_per_second = fps;
smpte_drop_frames = drop_frames;
Config->set_smpte_frames_per_second (fps);
Config->set_smpte_drop_frames (drop_frames);
last_smpte_valid = false;
// smpte type bits are the middle two in the upper nibble
@ -84,26 +84,6 @@ Session::set_smpte_type (float fps, bool drop_frames)
break;
};
sync_time_vars();
SMPTETypeChanged (); /* EMIT SIGNAL */
set_dirty();
return 0;
}
int
Session::set_video_pullup (float pull)
{
video_pullup = pull;
sync_time_vars();
PullupChanged (); /* EMIT SIGNAL */
set_dirty();
return 0;
}
@ -128,7 +108,7 @@ Session::set_smpte_offset_negative (bool neg)
void
Session::smpte_to_sample( SMPTE::Time& smpte, jack_nframes_t& sample, bool use_offset, bool use_subframes ) const
{
if (smpte_drop_frames) {
if (Config->get_smpte_drop_frames()) {
// The drop frame format was created to better approximate the 30000/1001 = 29.97002997002997....
// framerate of NTSC color TV. The used frame rate of drop frame is 29.97, which drifts by about
// 0.108 frame per hour, or about 1.3 frames per 12 hours. This is not perfect, but a lot better
@ -255,7 +235,7 @@ Session::sample_to_smpte( jack_nframes_t sample, SMPTE::Time& smpte, bool use_of
// Extract hour-exceeding frames for minute, second and frame calculations
smpte_frames_left = ((long) floor( smpte_frames_left_exact ));
if (smpte_drop_frames) {
if (Config->get_smpte_drop_frames()) {
// See long explanation in smpte_to_sample()...
// Number of 10 minute chunks
@ -291,10 +271,10 @@ Session::sample_to_smpte( jack_nframes_t sample, SMPTE::Time& smpte, bool use_of
}
} else {
// Non drop is easy
smpte.minutes = smpte_frames_left / ((long) smpte_frames_per_second * 60);
smpte_frames_left = smpte_frames_left % ((long) smpte_frames_per_second * 60);
smpte.seconds = smpte_frames_left / (long) smpte_frames_per_second;
smpte.frames = smpte_frames_left % (long) smpte_frames_per_second;
smpte.minutes = smpte_frames_left / ((long) Config->get_smpte_frames_per_second () * 60);
smpte_frames_left = smpte_frames_left % ((long) Config->get_smpte_frames_per_second () * 60);
smpte.seconds = smpte_frames_left / (long) Config->get_smpte_frames_per_second ();
smpte.frames = smpte_frames_left % (long) Config->get_smpte_frames_per_second ();
}
if (!use_subframes) {
@ -430,7 +410,7 @@ Session::jack_timebase_callback (jack_transport_state_t state,
#ifdef HAVE_JACK_VIDEO_SUPPORT
//poke audio video ratio so Ardour can track Video Sync
pos->audio_frames_per_video_frame = frame_rate() / smpte_frames_per_second;
pos->audio_frames_per_video_frame = frame_rate() / Config->get_smpte_frames_per_second ();
pos->valid = jack_position_bits_t (pos->valid | JackAudioVideoRatio);
#endif
@ -438,11 +418,11 @@ Session::jack_timebase_callback (jack_transport_state_t state,
/* SMPTE info */
t.smpte_offset = _smpte_offset;
t.smpte_frame_rate = smpte_frames_per_second;
t.smpte_frame_rate = Config->get_smpte_frames_per_second ();
if (_transport_speed) {
if (auto_loop) {
if (play_loop) {
Location* location = _locations.auto_loop_location();
@ -489,7 +469,7 @@ Session::convert_to_frames_at (jack_nframes_t position, AnyTime& any)
secs = any.smpte.hours * 60 * 60;
secs += any.smpte.minutes * 60;
secs += any.smpte.seconds;
secs += any.smpte.frames / smpte_frames_per_second;
secs += any.smpte.frames / Config->get_smpte_frames_per_second ();
if (_smpte_offset_negative)
{
return (jack_nframes_t) floor (secs * frame_rate()) - _smpte_offset;

View file

@ -57,16 +57,15 @@ Session::request_input_change_handling ()
}
void
Session::request_slave_source (SlaveSource src, jack_nframes_t pos)
Session::request_slave_source (SlaveSource src)
{
Event* ev = new Event (Event::SetSlaveSource, Event::Add, Event::Immediate, pos, 0.0);
Event* ev = new Event (Event::SetSlaveSource, Event::Add, Event::Immediate, 0, 0.0);
if (src == Session::JACK) {
/* could set_seamless_loop() be disposed of entirely?*/
set_seamless_loop (false);
if (src == JACK) {
/* could set_seamless_loop() be disposed of entirely?*/
Config->set_seamless_loop (false);
} else {
set_seamless_loop (true);
Config->set_seamless_loop (true);
}
ev->slave = src;
queue_event (ev);
@ -109,7 +108,7 @@ Session::force_locate (jack_nframes_t target_frame, bool with_roll)
}
void
Session::request_auto_loop (bool yn)
Session::request_play_loop (bool yn)
{
Event* ev;
Location *location = _locations.auto_loop_location();
@ -123,28 +122,13 @@ Session::request_auto_loop (bool yn)
ev = new Event (Event::SetLoop, Event::Add, Event::Immediate, 0, 0.0, yn);
queue_event (ev);
if (!yn && seamless_loop && transport_rolling()) {
if (!yn && Config->get_seamless_loop() && transport_rolling()) {
// request an immediate locate to refresh the diskstreams
// after disabling looping
request_locate (_transport_frame-1, true);
}
}
void
Session::set_seamless_loop (bool yn)
{
if (seamless_loop != yn) {
seamless_loop = yn;
if (auto_loop && transport_rolling()) {
// to reset diskstreams etc
request_auto_loop (true);
}
ControlChanged (SeamlessLoop); /* EMIT */
}
}
void
Session::realtime_stop (bool abort)
{
@ -190,7 +174,7 @@ Session::realtime_stop (bool abort)
waiting_for_sync_offset = true;
}
transport_sub_state = (auto_return ? AutoReturning : 0);
transport_sub_state = (Config->get_auto_return() ? AutoReturning : 0);
}
void
@ -357,13 +341,13 @@ Session::non_realtime_stop (bool abort)
update_latency_compensation (true, abort);
}
if (auto_return || (post_transport_work & PostTransportLocate) || synced_to_jack()) {
if (Config->get_auto_return() || (post_transport_work & PostTransportLocate) || synced_to_jack()) {
if (pending_locate_flush) {
flush_all_redirects ();
}
if ((auto_return || synced_to_jack()) && !(post_transport_work & PostTransportLocate)) {
if ((Config->get_auto_return() || synced_to_jack()) && !(post_transport_work & PostTransportLocate)) {
_transport_frame = last_stop_frame;
@ -445,7 +429,7 @@ Session::non_realtime_stop (bool abort)
/* and start it up again if relevant */
if ((post_transport_work & PostTransportLocate) && _slave_type == None && pending_locate_roll) {
if ((post_transport_work & PostTransportLocate) && Config->get_slave_source() == None && pending_locate_roll) {
request_transport_speed (1.0);
pending_locate_roll = false;
}
@ -476,7 +460,7 @@ Session::check_declick_out ()
}
void
Session::set_auto_loop (bool yn)
Session::set_play_loop (bool yn)
{
/* Called from event-handling context */
@ -486,7 +470,7 @@ Session::set_auto_loop (bool yn)
set_dirty();
if (yn && seamless_loop && synced_to_jack()) {
if (yn && Config->get_seamless_loop() && synced_to_jack()) {
warning << _("Seamless looping cannot be supported while Ardour is using JACK transport.\n"
"Recommend changing the configured options")
<< endmsg;
@ -494,14 +478,14 @@ Session::set_auto_loop (bool yn)
}
if ((auto_loop = yn)) {
if ((play_loop = yn)) {
Location *loc;
if ((loc = _locations.auto_loop_location()) != 0) {
if (seamless_loop) {
if (Config->get_seamless_loop()) {
// set all diskstreams to use internal looping
boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
@ -551,8 +535,6 @@ Session::set_auto_loop (bool yn)
}
}
ControlChanged (AutoLoop); /* EMIT SIGNAL */
}
void
@ -624,7 +606,7 @@ Session::locate (jack_nframes_t target_frame, bool with_roll, bool with_flush, b
}
}
if (transport_rolling() && !auto_play && !with_roll && !(synced_to_jack() && auto_loop)) {
if (transport_rolling() && !Config->get_auto_play() && !with_roll && !(synced_to_jack() && play_loop)) {
realtime_stop (false);
}
@ -663,7 +645,7 @@ Session::locate (jack_nframes_t target_frame, bool with_roll, bool with_flush, b
for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
if ((*i)->record_enabled ()) {
//cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl;
(*i)->monitor_input (!auto_input);
(*i)->monitor_input (!Config->get_auto_input());
}
}
}
@ -681,13 +663,13 @@ Session::locate (jack_nframes_t target_frame, bool with_roll, bool with_flush, b
}
}
/* cancel autoloop if transport pos outside of loop range */
if (auto_loop) {
/* cancel looped playback if transport pos outside of loop range */
if (play_loop) {
Location* al = _locations.auto_loop_location();
if (al && (_transport_frame < al->start() || _transport_frame > al->end())) {
// cancel looping directly, this is called from event handling context
set_auto_loop(false);
set_play_loop (false);
}
}
@ -738,7 +720,7 @@ Session::set_transport_speed (float speed, bool abort)
boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
if (auto_input && (*i)->record_enabled ()) {
if (Config->get_auto_input() && (*i)->record_enabled ()) {
//cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl;
(*i)->monitor_input (false);
}
@ -851,7 +833,7 @@ Session::start_transport ()
switch (record_status()) {
case Enabled:
if (!punch_in) {
if (!Config->get_punch_in()) {
enable_record ();
}
break;
@ -907,7 +889,7 @@ Session::post_transport ()
if (post_transport_work & PostTransportLocate) {
if ((auto_play && !_exporting) || (post_transport_work & PostTransportRoll)) {
if ((Config->get_auto_play() && !_exporting) || (post_transport_work & PostTransportRoll)) {
start_transport ();
@ -921,14 +903,6 @@ Session::post_transport ()
post_transport_work = PostTransportWork (0);
}
void
Session::set_rf_speed (float speed)
{
rf_speed = speed;
cumulative_rf_motion = 0;
reset_rf_scale (0);
}
void
Session::reset_rf_scale (jack_nframes_t motion)
{
@ -949,31 +923,24 @@ Session::reset_rf_scale (jack_nframes_t motion)
}
}
int
Session::set_slave_source (SlaveSource src, jack_nframes_t frame)
void
Session::set_slave_source (SlaveSource src)
{
bool reverse = false;
bool non_rt_required = false;
if (src == _slave_type) {
return 0;
}
if (_transport_speed) {
error << _("please stop the transport before adjusting slave settings") << endmsg;
/* help out non-MVC friendly UI's by telling them the slave type changed */
ControlChanged (SlaveType); /* EMIT SIGNAL */
return 0;
return;
}
// if (src == JACK && Config->get_jack_time_master()) {
// return -1;
// return;
// }
if (_slave) {
delete _slave;
_slave = 0;
_slave_type = None;
}
if (_transport_speed < 0.0) {
@ -992,12 +959,12 @@ Session::set_slave_source (SlaveSource src, jack_nframes_t frame)
}
catch (failed_constructor& err) {
return -1;
return;
}
} else {
error << _("No MTC port defined: MTC slaving is impossible.") << endmsg;
return -1;
return;
}
_desired_transport_speed = _transport_speed;
break;
@ -1007,9 +974,9 @@ Session::set_slave_source (SlaveSource src, jack_nframes_t frame)
_desired_transport_speed = _transport_speed;
break;
};
_slave_type = src;
Config->set_slave_source (src);
boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
if (!(*i)->hidden()) {
@ -1030,9 +997,6 @@ Session::set_slave_source (SlaveSource src, jack_nframes_t frame)
}
set_dirty();
ControlChanged (SlaveType); /* EMIT SIGNAL */
return 0;
}
void
@ -1081,8 +1045,6 @@ Session::set_play_range (bool yn)
Event* ev = new Event (Event::SetTransportSpeed, Event::Add, Event::Immediate, 0, 0.0f, false);
merge_event (ev);
}
ControlChanged (PlayRange); /* EMIT SIGNAL */
}
}

View file

@ -281,7 +281,7 @@ compute_equal_power_fades (jack_nframes_t nframes, float* in, float* out)
in[0] = 0.0f;
for (int i = 1; i < nframes - 1; ++i) {
for (jack_nframes_t i = 1; i < nframes - 1; ++i) {
in[i] = in[i-1] + step;
}
@ -297,3 +297,40 @@ compute_equal_power_fades (jack_nframes_t nframes, float* in, float* out)
in[n] = inVal * (scale * inVal + 1.0f - scale);
}
}
SlaveSource
string_to_slave_source (string str)
{
if (str == _("Internal")) {
return None;
}
if (str == _("MTC")) {
return MTC;
}
if (str == _("JACK")) {
return JACK;
}
fatal << string_compose (_("programming error: unknown slave source string \"%1\""), str) << endmsg;
/*NOTREACHED*/
return None;
}
const char*
slave_source_to_string (SlaveSource src)
{
switch (src) {
case JACK:
return _("JACK");
case MTC:
return _("MTC");
default:
case None:
return _("Internal");
}
}

View file

@ -54,10 +54,10 @@ BasicUI::register_thread (std::string name)
void
BasicUI::loop_toggle ()
{
if (session->get_auto_loop()) {
session->request_auto_loop (false);
if (Config->get_auto_loop()) {
session->request_play_loop (false);
} else {
session->request_auto_loop (true);
session->request_play_loop (true);
if (!session->transport_rolling()) {
session->request_transport_speed (1.0);
}
@ -106,8 +106,8 @@ BasicUI::transport_play (bool from_last_start)
{
bool rolling = session->transport_rolling ();
if (session->get_auto_loop()) {
session->request_auto_loop (false);
if (Config->get_auto_loop()) {
session->request_play_loop (false);
}
if (session->get_play_range ()) {
@ -208,13 +208,13 @@ BasicUI::toggle_all_rec_enables ()
void
BasicUI::toggle_punch_in ()
{
session->set_punch_in (!session->get_punch_in());
Config->set_punch_in (!Config->get_punch_in());
}
void
BasicUI::toggle_punch_out ()
{
session->set_punch_out (!session->get_punch_out());
Config->set_punch_out (!Config->get_punch_out());
}
bool