New session dialog fixups:

- The name specified on the command line for the new
   session comes up in the dialog
 - The editor will not appear below the NSD at startup

Command line parameter fixups:
 - You can't specify both a new session and a old
   session to load at the same time.
 - Ardour will abort if command line parameters are
   incorrect

Declick faster. Fixes audible and annoying volume ramps 
when running ardour at large buffer sizes.

Make it impossible to arm tracks which have un-connected
inputs.




git-svn-id: svn://localhost/ardour2/trunk@765 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Sampo Savolainen
2006-08-08 21:27:41 +00:00
parent fb8903e443
commit 3220684ade
9 changed files with 103 additions and 81 deletions

View File

@@ -102,7 +102,7 @@ AutomationTimeAxisView::AutomationTimeAxisView (Session& s, boost::shared_ptr<Ro
}
}
name_label.set_text (shortpname);
name_label.set_alignment (1.0, 0.5);
name_label.set_alignment (Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER);
if (nomparent.length()) {
@@ -118,7 +118,6 @@ AutomationTimeAxisView::AutomationTimeAxisView (Session& s, boost::shared_ptr<Ro
plugname = new Label (pname);
plugname->set_name (X_("TrackPlugName"));
plugname->set_alignment (1.0, 0.5);
plugname->show();
name_label.set_name (X_("TrackParameterName"));
controls_table.remove (name_hbox);

View File

@@ -293,60 +293,43 @@ Please consider the possibilities, and perhaps (re)start JACK."));
static bool
maybe_load_session ()
{
/* If no session name is given: we're not loading a session yet, nor creating a new one */
if (!session_name.length()) {
ui->hide_splash ();
if (!Config->get_no_new_session_dialog()) {
ui->new_session (true);
}
/* load session, if given */
return true;
}
/* Load session or start the new session dialog */
string name, path;
if (session_name.length()){
bool isnew;
bool isnew;
if (Session::find_session (session_name, path, name, isnew)) {
error << string_compose(_("could not load command line session \"%1\""), session_name) << endmsg;
} else {
if (Session::find_session (session_name, path, name, isnew)) {
error << string_compose(_("could not load command line session \"%1\""), session_name) << endmsg;
return false;
}
if (new_session) {
/* command line required that the session be new */
if (isnew) {
/* popup the new session dialog
once everything else is OK.
*/
Glib::signal_idle().connect (bind (mem_fun (*ui, &ARDOUR_UI::cmdline_new_session), path));
ui->set_will_create_new_session_automatically (true);
} else {
/* it wasn't new, but we require a new session */
error << string_compose (_("\n\nA session named \"%1\" already exists.\n\
To avoid this message, start ardour as \"ardour %1"), path)
<< endmsg;
return false;
}
} else {
/* command line didn't require a new session */
if (isnew) {
error << string_compose (_("\n\nNo session named \"%1\" exists.\n\
To create it from the command line, start ardour as \"ardour --new %1"), path)
<< endmsg;
return false;
}
ui->load_session (path, name);
}
if (!new_session) {
/* Loading a session, but the session doesn't exist */
if (isnew) {
error << string_compose (_("\n\nNo session named \"%1\" exists.\n\
To create it from the command line, start ardour as \"ardour --new %1"), path) << endmsg;
return false;
}
if (no_splash) {
ui->show();
}
ui->load_session (path, name);
} else {
/* TODO: This bit of code doesn't work properly yet
Glib::signal_idle().connect (bind (mem_fun (*ui, &ARDOUR_UI::cmdline_new_session), path));
ui->set_will_create_new_session_automatically (true); */
/* Show the NSD */
ui->hide_splash ();
if (!Config->get_no_new_session_dialog()) {
ui->new_session (true);

View File

@@ -32,12 +32,15 @@
#include <gtkmm/filefilter.h>
#include <gtkmm/stock.h>
#include "opts.h"
NewSessionDialog::NewSessionDialog()
: ArdourDialog ("New Session Dialog")
{
session_name_label = Gtk::manage(new class Gtk::Label(_("New Session Name :")));
m_name = Gtk::manage(new class Gtk::Entry());
m_name->set_text(GTK_ARDOUR::session_name);
session_location_label = Gtk::manage(new class Gtk::Label(_("Create Session Directory In :")));
m_folder = Gtk::manage(new class Gtk::FileChooserButton(Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER));
session_template_label = Gtk::manage(new class Gtk::Label(_("Use Session Template :")));
@@ -324,13 +327,21 @@ NewSessionDialog::NewSessionDialog()
m_folder->set_current_folder(getenv ("HOME"));
m_folder->set_title(_("select directory"));
set_default_response (Gtk::RESPONSE_OK);
set_response_sensitive (Gtk::RESPONSE_OK, false);
set_response_sensitive (Gtk::RESPONSE_NONE, false);
on_new_session_page = true;
m_notebook->set_current_page(0);
m_notebook->show();
m_notebook->show_all_children();
set_default_response (Gtk::RESPONSE_OK);
if (!GTK_ARDOUR::session_name.length()) {
set_response_sensitive (Gtk::RESPONSE_OK, false);
set_response_sensitive (Gtk::RESPONSE_NONE, false);
} else {
set_response_sensitive (Gtk::RESPONSE_OK, true);
set_response_sensitive (Gtk::RESPONSE_NONE, true);
}
///@ connect some signals
m_connect_inputs->signal_clicked().connect (mem_fun (*this, &NewSessionDialog::connect_inputs_clicked));
@@ -501,11 +512,11 @@ NewSessionDialog::reset_name()
bool
NewSessionDialog::entry_key_release (GdkEventKey* ev)
{
if (m_name->get_text() != "") {
set_response_sensitive (Gtk::RESPONSE_OK, true);
if (m_name->get_text() != "") {
set_response_sensitive (Gtk::RESPONSE_OK, true);
set_response_sensitive (Gtk::RESPONSE_NONE, true);
} else {
set_response_sensitive (Gtk::RESPONSE_OK, false);
set_response_sensitive (Gtk::RESPONSE_OK, false);
}
return true;
}
@@ -513,25 +524,27 @@ NewSessionDialog::entry_key_release (GdkEventKey* ev)
void
NewSessionDialog::notebook_page_changed (GtkNotebookPage* np, uint pagenum)
{
if (pagenum == 1) {
m_okbutton->set_label(_("Open"));
set_response_sensitive (Gtk::RESPONSE_NONE, false);
m_okbutton->set_image (*(new Gtk::Image (Gtk::Stock::OPEN, Gtk::ICON_SIZE_BUTTON)));
if (m_treeview->get_selection()->count_selected_rows() == 0) {
set_response_sensitive (Gtk::RESPONSE_OK, false);
if (pagenum == 1) {
on_new_session_page = false;
m_okbutton->set_label(_("Open"));
set_response_sensitive (Gtk::RESPONSE_NONE, false);
m_okbutton->set_image (*(new Gtk::Image (Gtk::Stock::OPEN, Gtk::ICON_SIZE_BUTTON)));
if (m_treeview->get_selection()->count_selected_rows() == 0) {
set_response_sensitive (Gtk::RESPONSE_OK, false);
} else {
set_response_sensitive (Gtk::RESPONSE_OK, true);
set_response_sensitive (Gtk::RESPONSE_OK, true);
}
} else {
if (m_name->get_text() != "") {
set_response_sensitive (Gtk::RESPONSE_NONE, true);
on_new_session_page = true;
if (m_name->get_text() != "") {
set_response_sensitive (Gtk::RESPONSE_NONE, true);
}
m_okbutton->set_label(_("New"));
m_okbutton->set_image (*(new Gtk::Image (Gtk::Stock::NEW, Gtk::ICON_SIZE_BUTTON)));
m_okbutton->set_label(_("New"));
m_okbutton->set_image (*(new Gtk::Image (Gtk::Stock::NEW, Gtk::ICON_SIZE_BUTTON)));
if (m_name->get_text() == "") {
set_response_sensitive (Gtk::RESPONSE_OK, false);
set_response_sensitive (Gtk::RESPONSE_OK, false);
} else {
set_response_sensitive (Gtk::RESPONSE_OK, true);
set_response_sensitive (Gtk::RESPONSE_OK, true);
}
}
}
@@ -540,35 +553,37 @@ void
NewSessionDialog::treeview_selection_changed ()
{
if (m_treeview->get_selection()->count_selected_rows() == 0) {
if (!m_open_filechooser->get_filename().empty()) {
set_response_sensitive (Gtk::RESPONSE_OK, true);
if (!m_open_filechooser->get_filename().empty()) {
set_response_sensitive (Gtk::RESPONSE_OK, true);
} else {
set_response_sensitive (Gtk::RESPONSE_OK, false);
set_response_sensitive (Gtk::RESPONSE_OK, false);
}
} else {
set_response_sensitive (Gtk::RESPONSE_OK, true);
set_response_sensitive (Gtk::RESPONSE_OK, true);
}
}
void
NewSessionDialog::file_chosen ()
{
m_treeview->get_selection()->unselect_all();
if (on_new_session_page) return;
m_treeview->get_selection()->unselect_all();
if (!m_open_filechooser->get_filename().empty()) {
set_response_sensitive (Gtk::RESPONSE_OK, true);
set_response_sensitive (Gtk::RESPONSE_OK, true);
} else {
set_response_sensitive (Gtk::RESPONSE_OK, false);
set_response_sensitive (Gtk::RESPONSE_OK, false);
}
}
void
NewSessionDialog::template_chosen ()
{
if (m_template->get_filename() != "" ) {;
set_response_sensitive (Gtk::RESPONSE_NONE, true);
if (m_template->get_filename() != "" ) {;
set_response_sensitive (Gtk::RESPONSE_NONE, true);
} else {
set_response_sensitive (Gtk::RESPONSE_NONE, false);
set_response_sensitive (Gtk::RESPONSE_NONE, false);
}
}

View File

@@ -182,6 +182,8 @@ protected:
void master_bus_button_clicked ();
void monitor_bus_button_clicked ();
bool on_new_session_page;
};

View File

@@ -143,14 +143,19 @@ GTK_ARDOUR::parse_opts (int argc, char *argv[])
break;
default:
break;
return print_help(execname);
}
}
if (optind < argc) {
if (new_session) {
cerr << "Illogical combination: you can either create a new session, or a load an existing session but not both!" << endl;
return print_help(execname);
}
session_name = argv[optind++];
}
return 0;
}

View File

@@ -97,7 +97,7 @@ class Route : public IO
virtual int silent_roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t end_frame,
jack_nframes_t offset, bool can_record, bool rec_monitors_input);
virtual void toggle_monitor_input ();
virtual bool can_record() const { return false; }
virtual bool can_record() { return false; }
virtual void set_record_enable (bool yn, void *src) {}
virtual bool record_enabled() const { return false; }
virtual void handle_transport_stopped (bool abort, bool did_locate, bool flush_redirects);

View File

@@ -48,7 +48,7 @@ class Track : public Route
void toggle_monitor_input ();
bool can_record() const { return true; }
virtual bool can_record();
Diskstream& diskstream() const { return *_diskstream; }

View File

@@ -170,7 +170,7 @@ IO::silence (jack_nframes_t nframes, jack_nframes_t offset)
void
IO::apply_declick (vector<Sample *>& bufs, uint32_t nbufs, jack_nframes_t nframes, gain_t initial, gain_t target, bool invert_polarity)
{
jack_nframes_t declick = min ((jack_nframes_t)4096, nframes);
jack_nframes_t declick = min ((jack_nframes_t)128, nframes);
gain_t delta;
Sample *buffer;
double fractional_shift;

View File

@@ -31,6 +31,7 @@
#include <ardour/audioplaylist.h>
#include <ardour/panner.h>
#include <ardour/utils.h>
#include <ardour/connection.h>
#include "i18n.h"
@@ -146,6 +147,18 @@ Track::record_enabled () const
{
return _diskstream->record_enabled ();
}
bool
Track::can_record()
{
bool will_record = true;
for (int i = 0; i < _inputs.size() && will_record; i++) {
if (!_inputs[i]->connected())
will_record = false;
}
return will_record;
}
void
Track::set_record_enable (bool yn, void *src)
@@ -159,8 +172,13 @@ Track::set_record_enable (bool yn, void *src)
return;
}
/* keep track of the meter point as it was before we rec-enabled */
// Do not set rec enabled if the track can't record.
if (yn && !can_record()) {
error << string_compose( _("Can not arm track '%1'. Check the input connections"), name() ) << endmsg;
return;
}
/* keep track of the meter point as it was before we rec-enabled */
if (!_diskstream->record_enabled()) {
_saved_meter_point = _meter_point;
}