#include <iostream>
+#include <gtkmm/messagedialog.h>
+#include <gtkmm/accelmap.h>
+
#include <pbd/error.h>
#include <pbd/compose.h>
-#include <pbd/basename.h>
#include <pbd/pathscanner.h>
#include <pbd/failed_constructor.h>
#include <gtkmm2ext/gtk_ui.h>
-#include <gtkmm2ext/pix.h>
#include <gtkmm2ext/utils.h>
#include <gtkmm2ext/click_box.h>
#include <gtkmm2ext/fastmeter.h>
#include <midi++/mmc.h>
#include <ardour/ardour.h>
+#include <ardour/session_route.h>
#include <ardour/port.h>
#include <ardour/audioengine.h>
#include <ardour/playlist.h>
#include <ardour/utils.h>
-#include <ardour/diskstream.h>
-#include <ardour/filesource.h>
+#include <ardour/audio_diskstream.h>
+#include <ardour/audiofilesource.h>
#include <ardour/recent_sessions.h>
-#include <ardour/session_diskstream.h>
#include <ardour/port.h>
#include <ardour/audio_track.h>
#include "actions.h"
#include "ardour_ui.h"
-#include "ardour_message.h"
#include "public_editor.h"
#include "audio_clock.h"
#include "keyboard.h"
#include "about.h"
#include "utils.h"
#include "gui_thread.h"
-#include "meter_xpms.h"
+#include "color_manager.h"
#include "i18n.h"
using namespace ARDOUR;
+using namespace PBD;
using namespace Gtkmm2ext;
using namespace Gtk;
using namespace sigc;
sigc::signal<void> ARDOUR_UI::SuperRapidScreenUpdate;
sigc::signal<void,jack_nframes_t> ARDOUR_UI::Clock;
-static const char* channel_setup_names[] = {
- "mono",
- "stereo",
- "3 channels",
- "4 channels",
- "5 channels",
- "8 channels",
- "manual setup",
- 0
-};
-
-vector<string> channel_combo_strings;
-
ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
: Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile),
shuttle_units_button (_("% ")),
- punch_in_button (_("punch\nin")),
- punch_out_button (_("punch\nout")),
- auto_return_button (_("auto\nreturn")),
- auto_play_button (_("auto\nplay")),
- auto_input_button (_("auto\ninput")),
- click_button (_("click")),
- auditioning_alert_button (_("AUDITIONING")),
+ punch_in_button (_("Punch In")),
+ punch_out_button (_("Punch Out")),
+ auto_return_button (_("Auto Return")),
+ auto_play_button (_("Autuo Play")),
+ auto_input_button (_("Auto Input")),
+ click_button (_("Click")),
+ auditioning_alert_button (_("AUDITION")),
solo_alert_button (_("SOLO")),
shown_flag (false)
-
{
using namespace Gtk::Menu_Helpers;
Gtkmm2ext::init();
-
- /* actually, its already loaded, but ... */
-
- cerr << "Loading UI configuration file " << rcfile << endl;
-
+
about = 0;
if (theArdourUI == 0) {
}
ActionManager::init ();
+
+ /* load colors */
+
+ color_manager = new ColorManager();
+
+ std::string color_file = ARDOUR::find_config_file("ardour.colors");
- m_new_session_dialog = 0;
- m_new_session_dialog_ref = NewSessionDialogFactory::create();
- m_new_session_dialog_ref->get_widget_derived (NewSessionDialogFactory::top_level_widget_name(), m_new_session_dialog);
+ color_manager->load (color_file);
+
+ m_new_session_dialog = new NewSessionDialog();
editor = 0;
mixer = 0;
session = 0;
shuttle_grabbed = false;
shuttle_fract = 0.0;
+ shuttle_max_speed = 8.0f;
set_shuttle_units (Percentage);
set_shuttle_behaviour (Sprung);
gettimeofday (&last_peak_grab, 0);
gettimeofday (&last_shuttle_request, 0);
- ARDOUR::DiskStream::CannotRecordNoInput.connect (mem_fun(*this, &ARDOUR_UI::cannot_record_no_input));
- ARDOUR::DiskStream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
- ARDOUR::DiskStream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
- ARDOUR::DiskStream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
+ ARDOUR::AudioDiskstream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
+ ARDOUR::Diskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
+ ARDOUR::Diskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
/* handle pending state with a dialog */
ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
- channel_combo_strings = internationalize (channel_setup_names);
-
/* have to wait for AudioEngine and Configuration before proceeding */
}
-void
-ARDOUR_UI::cannot_record_no_input (DiskStream* ds)
-{
- ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::cannot_record_no_input), ds));
-
- string msg = string_compose (_("\
-You cannot record-enable\n\
-track %1\n\
-because it has no input connections.\n\
-You would be wasting space recording silence."),
- ds->name());
-
- ArdourMessage message (editor, X_("cannotrecord"), msg);
-}
-
void
ARDOUR_UI::set_engine (AudioEngine& e)
{
_tooltips.enable();
keyboard = new Keyboard;
- install_keybindings ();
-
- FastMeter::set_vertical_xpm (v_meter_strip_xpm);
- FastMeter::set_horizontal_xpm (h_meter_strip_xpm);
if (setup_windows ()) {
throw failed_constructor ();
blink_timeout_tag = -1;
+ /* the global configuration object is now valid */
+
+ use_config ();
+
/* this being a GUI and all, we want peakfiles */
- FileSource::set_build_peakfiles (true);
- FileSource::set_build_missing_peakfiles (true);
+ AudioFileSource::set_build_peakfiles (true);
+ AudioFileSource::set_build_missing_peakfiles (true);
- if (Source::start_peak_thread ()) {
+ if (AudioSource::start_peak_thread ()) {
throw failed_constructor();
}
delete add_route_dialog;
}
- Source::stop_peak_thread ();
+ AudioSource::stop_peak_thread ();
}
gint
Config->add_extra_xml (*node);
Config->save_state();
- XMLNode& enode (static_cast<Stateful*>(editor)->get_state());
- XMLNode& mnode (mixer->get_state());
+ XMLNode enode(static_cast<Stateful*>(editor)->get_state());
+ XMLNode mnode(mixer->get_state());
if (session) {
- session->add_instant_xml(enode, session->path());
- session->add_instant_xml(mnode, session->path());
+ session->add_instant_xml (enode, session->path());
+ session->add_instant_xml (mnode, session->path());
} else {
- Config->add_instant_xml(enode, Config->get_user_ardour_path());
- Config->add_instant_xml(mnode, Config->get_user_ardour_path());
+ Config->add_instant_xml (enode, get_user_ardour_path());
+ Config->add_instant_xml (mnode, get_user_ardour_path());
}
+
+ /* keybindings */
+
+ AccelMap::save ("ardour.saved_bindings");
}
void
/* use the default name */
if (save_state_canfail ("")) {
/* failed - don't quit */
- ArdourMessage (editor, X_("badsave dialog"),
+ MessageDialog msg (*editor,
_("\
Ardour was unable to save your session.\n\n\
If you still wish to quit, please use the\n\n\
\"Just quit\" option."));
+ msg.run ();
return;
}
break;
break;
}
}
-
+ Config->save_state();
quit ();
}
ARDOUR_UI::ask_about_saving_session (const string & what)
{
ArdourDialog window (_("ardour: save session?"));
+ Gtk::HBox dhbox; // the hbox for the image and text
Gtk::Label prompt_label;
+ Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
+
string msg;
- msg = string_compose(_("Save and %1"), what);
- window.add_button (msg, RESPONSE_ACCEPT);
- msg = string_compose(_("Just %1"), what);
- window.add_button (msg, RESPONSE_APPLY);
msg = string_compose(_("Don't %1"), what);
window.add_button (msg, RESPONSE_REJECT);
+ msg = string_compose(_("Just %1"), what);
+ window.add_button (msg, RESPONSE_APPLY);
+ msg = string_compose(_("Save and %1"), what);
+ window.add_button (msg, RESPONSE_ACCEPT);
+
+ window.set_default_response (RESPONSE_ACCEPT);
Gtk::Button noquit_button (msg);
noquit_button.set_name ("EditorGTKButton");
} else {
type = _("snapshot");
}
- prompt = string_compose(_("The %1\n\"%2\"\nhas not been saved.\n\nAny changes made this time\nwill be lost unless you save it.\n\nWhat do you want to do?"),
+ prompt = string_compose(_("The %1\"%2\"\nhas not been saved.\n\nAny changes made this time\nwill be lost unless you save it.\n\nWhat do you want to do?"),
type, session->snap_name());
prompt_label.set_text (prompt);
- prompt_label.set_alignment (0.5, 0.5);
prompt_label.set_name (X_("PrompterLabel"));
-
- window.get_vbox()->pack_start (prompt_label);
+ prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
+
+ dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
+;
+ dhbox.set_homogeneous (false);
+ dhbox.pack_start (*dimage, false, false, 5);
+ dhbox.pack_start (prompt_label, true, false, 5);
+ window.get_vbox()->pack_start (dhbox);
window.set_name (_("Prompter"));
window.set_position (Gtk::WIN_POS_MOUSE);
window.set_modal (true);
+ window.set_resizable (false);
window.show_all ();
save_the_session = 0;
update_cpu_load ();
update_buffer_load ();
update_disk_space ();
- // update_disk_rate ();
return TRUE;
}
gint
ARDOUR_UI::every_point_one_seconds ()
{
- struct timeval now;
- struct timeval diff;
-
- /* do not attempt to grab peak power more than once per cycle.
- */
-
- gettimeofday (&now, 0);
- timersub (&now, &last_peak_grab, &diff);
-
- if ((diff.tv_usec + (diff.tv_sec * 1000000)) >= engine->usecs_per_cycle()) {
- IO::GrabPeakPower(); /* EMIT_SIGNAL */
- last_peak_grab = now;
- }
-
update_speed_display ();
RapidScreenUpdate(); /* EMIT_SIGNAL */
return TRUE;
jack_nframes_t rate = engine->frame_rate();
if (fmod (rate, 1000.0) != 0.0) {
- snprintf (buf, sizeof (buf), _("SR: %.1f kHz / %4.1f msecs"),
+ snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"),
(float) rate/1000.0f,
(engine->frames_per_cycle() / (float) rate) * 1000.0f);
} else {
- snprintf (buf, sizeof (buf), _("SR: %u kHz / %4.1f msecs"),
+ snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"),
rate/1000,
(engine->frames_per_cycle() / (float) rate) * 1000.0f);
}
ARDOUR_UI::update_cpu_load ()
{
char buf[32];
- snprintf (buf, sizeof (buf), _("DSP Load: %.1f%%"), engine->get_cpu_load());
+ snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
cpu_load_label.set_text (buf);
}
-void
-ARDOUR_UI::update_disk_rate ()
-{
- char buf[64];
-
- if (session) {
- snprintf (buf, sizeof (buf), _("Disk r:%5.1f w:%5.1f MB/s"),
- session->read_data_rate()/1048576.0f, session->write_data_rate()/1048576.0f);
- disk_rate_label.set_text (buf);
- } else {
- disk_rate_label.set_text ("");
- }
-}
-
void
ARDOUR_UI::update_buffer_load ()
{
}
void
-ARDOUR_UI::count_recenabled_diskstreams (DiskStream& ds)
+ARDOUR_UI::count_recenabled_diskstreams (Route& route)
{
- if (ds.record_enabled()) {
+ Track* track = dynamic_cast<Track*>(&route);
+ if (track && track->diskstream().record_enabled()) {
rec_enabled_diskstreams++;
}
}
char buf[64];
if (frames == max_frames) {
- strcpy (buf, _("space: 24hrs+"));
+ strcpy (buf, _("Disk: 24hrs+"));
} else {
int hrs;
int mins;
if (session->actively_recording()){
rec_enabled_diskstreams = 0;
- session->foreach_diskstream (this, &ARDOUR_UI::count_recenabled_diskstreams);
+ session->foreach_route (this, &ARDOUR_UI::count_recenabled_diskstreams);
if (rec_enabled_diskstreams) {
frames /= rec_enabled_diskstreams;
frames -= mins * fr * 60;
secs = frames / fr;
- snprintf (buf, sizeof(buf), _("space: %02dh:%02dm:%02ds"), hrs, mins, secs);
+ snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs);
}
disk_space_label.set_text (buf);
TreeModel::Row row = *(recent_session_model->append());
- row[recent_session_columns.visible_name] = PBD::basename (fullpath);
+ row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
row[recent_session_columns.fullpath] = fullpath;
if (states->size() > 1) {
Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
- session_selector_window->add_button (Stock::OK, RESPONSE_ACCEPT);
-
+ session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
+ session_selector_window->set_default_response (RESPONSE_ACCEPT);
recent_session_model = TreeStore::create (recent_session_columns);
recent_session_display.set_model (recent_session_model);
recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
recent_session_display.set_headers_visible (false);
+ recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
+
+ recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
scroller->add (recent_session_display);
scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
session_selector_window->show_all_children();
}
+void
+ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
+{
+ session_selector_window->response (RESPONSE_ACCEPT);
+}
+
void
ARDOUR_UI::open_recent_session ()
{
return false;
}
+ // XXX Portability
+
string session_file = info.filename;
session_file += '/';
- session_file += PBD::basename (info.filename);
+ session_file += Glib::path_get_basename (info.filename);
session_file += ".ardour";
if (stat (session_file.c_str(), &statbuf) != 0) {
}
void
-ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels)
+ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
{
- Route* route;
+ boost::shared_ptr<Route> route;
if (session == 0) {
warning << _("You cannot add a track without a session already loaded.") << endmsg;
try {
if (disk) {
- if ((route = session->new_audio_track (input_channels, output_channels)) == 0) {
+ if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
error << _("could not create new audio track") << endmsg;
}
} else {
}
catch (...) {
- ArdourMessage msg (editor, X_("noport dialog"),
+ MessageDialog msg (*editor,
_("There are insufficient JACK ports available\n\
to create a new track or bus.\n\
You should save Ardour, exit and\n\
restart JACK with more ports."));
+ msg.run ();
}
}
void
-ARDOUR_UI::diskstream_added (DiskStream* ds)
+ARDOUR_UI::diskstream_added (Diskstream* ds)
{
}
void
ARDOUR_UI::transport_goto_start ()
+{
+ if (session) {
+ session->goto_start();
+
+
+ /* force displayed area in editor to start no matter
+ what "follow playhead" setting is.
+ */
+
+ if (editor) {
+ editor->reposition_x_origin (session->current_start_frame());
+ }
+ }
+}
+
+void
+ARDOUR_UI::transport_goto_zero ()
{
if (session) {
session->request_locate (0);
case Session::Disabled:
if (session->ntracks() == 0) {
string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
- ArdourMessage msg (editor, X_("cannotrecenable"), txt);
+ MessageDialog msg (*editor, txt);
+ msg.run ();
return;
}
session->maybe_enable_record ();
break;
case Session::Recording:
case Session::Enabled:
- session->disable_record ();
+ session->disable_record (true);
}
}
}
}
void
-ARDOUR_UI::toggle_monitor_enable (guint32 dstream)
+ARDOUR_UI::toggle_record_enable (uint32_t dstream)
{
if (session == 0) {
return;
}
- DiskStream *ds;
+ boost::shared_ptr<Route> r;
+
+ if ((r = session->route_by_remote_id (dstream)) != 0) {
- if ((ds = session->diskstream_by_id (dstream)) != 0) {
- Port *port = ds->io()->input (0);
- port->request_monitor_input (!port->monitoring_input());
- }
-}
+ Track* t;
-void
-ARDOUR_UI::toggle_record_enable (guint32 dstream)
-{
+ if ((t = dynamic_cast<Track*>(r.get())) != 0) {
+ t->diskstream().set_record_enabled (!t->diskstream().record_enabled());
+ }
+ }
if (session == 0) {
return;
}
-
- DiskStream *ds;
-
- if ((ds = session->diskstream_by_id (dstream)) != 0) {
- ds->set_record_enabled (!ds->record_enabled(), this);
- }
}
void
}
}
-void
-ARDOUR_UI::send_all_midi_feedback ()
-{
- if (session) {
- session->send_all_midi_feedback();
- }
-}
-
void
ARDOUR_UI::allow_local_only ()
{
update_sample_rate (0);
- ArdourMessage msg (editor, X_("halted"),
+ MessageDialog msg (*editor,
_("\
JACK has either been shutdown or it\n\
disconnected Ardour because Ardour\n\
was not fast enough. You can save the\n\
session and/or try to reconnect to JACK ."));
+ msg.run ();
}
int32_t
settings for a new session
*/
session->save_state ("");
+ session->save_history ();
}
/* there is too much going on, in too many threads, for us to
}
}
-
-void
-ARDOUR_UI::add_diskstream_to_menu (DiskStream& dstream)
-{
- using namespace Gtk;
- using namespace Menu_Helpers;
-
- if (dstream.hidden()) {
- return;
- }
-
- MenuList& items = diskstream_menu->items();
- items.push_back (MenuElem (dstream.name(), bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), (gint32) dstream.id())));
-}
-
-void
-ARDOUR_UI::diskstream_selected (gint32 id)
-{
- selected_dstream = id;
- Main::quit ();
-}
-
-gint32
-ARDOUR_UI::select_diskstream (GdkEventButton *ev)
-{
- using namespace Gtk;
- using namespace Menu_Helpers;
-
- if (session == 0) {
- return -1;
- }
-
- diskstream_menu = new Menu();
- diskstream_menu->set_name ("ArdourContextMenu");
- using namespace Gtk;
- using namespace Menu_Helpers;
-
- MenuList& items = diskstream_menu->items();
- items.push_back (MenuElem (_("No Stream"), (bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), -1))));
-
- session->foreach_diskstream (this, &ARDOUR_UI::add_diskstream_to_menu);
-
- if (ev) {
- diskstream_menu->popup (ev->button, ev->time);
- } else {
- diskstream_menu->popup (0, 0);
- }
-
- selected_dstream = -1;
-
- Main::run ();
-
- delete diskstream_menu;
-
- return selected_dstream;
-}
-
void
ARDOUR_UI::name_io_setup (AudioEngine& engine,
string& buf,
time (&n);
now = ctime (&n);
- now = now.substr (0, now.length() - 1);
+ now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
prompter.set_name ("Prompter");
- prompter.set_prompt (_("Name for snapshot"));
+ prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
+ prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
+ prompter.set_prompt (_("Name of New Snapshot"));
prompter.set_initial_text (now);
switch (prompter.run()) {
}
if ((ret = session->save_state (name)) != 0) {
+ session->save_history();
return ret;
}
}
}
void
-ARDOUR_UI::rec_enable_button_blink (bool onoff, DiskStream *dstream, Widget *w)
+ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
{
if (session && dstream && dstream->record_enabled()) {
prompter.set_name (X_("Prompter"));
prompter.set_prompt (_("Name for mix template:"));
prompter.set_initial_text(session->name() + _("-template"));
-
+ prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
+ prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
+
switch (prompter.run()) {
case RESPONSE_ACCEPT:
prompter.get_result (name);
void
ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
{
- m_new_session_dialog->show_all();
- m_new_session_dialog->set_transient_for(*editor);
+ m_new_session_dialog->show();
+ m_new_session_dialog->set_modal(true);
m_new_session_dialog->set_name(predetermined_path);
+ m_new_session_dialog->reset_recent();
int response = Gtk::RESPONSE_CANCEL;
do {
response = m_new_session_dialog->run ();
-
- if(response == Gtk::RESPONSE_OK) {
+ if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
+ quit();
+ return;
+
+ } else if (response == Gtk::RESPONSE_NONE) {
+ /* Clear was pressed */
+ m_new_session_dialog->reset();
+
+ } else if (response == Gtk::RESPONSE_YES) {
+ /* YES == OPEN, but there's no enum for that */
+ std::string session_name = m_new_session_dialog->session_name();
+ std::string session_path = m_new_session_dialog->session_folder();
+ load_session (session_path, session_name);
+
+
+ } else if (response == Gtk::RESPONSE_OK) {
+ if (m_new_session_dialog->get_current_page() == 1) {
+
+ /* XXX this is a bit of a hack..
+ i really want the new sesion dialog to return RESPONSE_YES
+ if we're on page 1 (the load page)
+ Unfortunately i can't see how atm..
+ */
+ std::string session_name = m_new_session_dialog->session_name();
+ std::string session_path = m_new_session_dialog->session_folder();
+ load_session (session_path, session_name);
+
+ } else {
_session_is_new = true;
std::string session_name = m_new_session_dialog->session_name();
std::string session_path = m_new_session_dialog->session_folder();
- /*
- XXX This is needed because session constructor wants a
- non-existant path. hopefully this will be fixed at some point.
- */
+
+ //XXX This is needed because session constructor wants a
+ //non-existant path. hopefully this will be fixed at some point.
+
session_path = Glib::build_filename(session_path, session_name);
std::string template_name = m_new_session_dialog->session_template_name();
nphysin,
nphysout,
engine->frame_rate() * 60 * 5);
- }
+ }
+ }
}
+
+ } while (response == Gtk::RESPONSE_NONE);
+ m_new_session_dialog->hide();
+ show();
- } while(response == Gtk::RESPONSE_HELP);
- m_new_session_dialog->hide_all();
+}
+
+void
+ARDOUR_UI::close_session()
+{
+ unload_session();
+ new_session ();
}
int
/* if it already exists, we must have write access */
if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
- ArdourMessage msg (editor, X_("noaccess dialog"), _("\
+ MessageDialog msg (*editor, _("\
You do not have write access to this session.\n\
This prevents the session from being loaded."));
+ msg.run ();
return -1;
}
session->set_clean ();
}
+ show ();
+
return FALSE;
}
removed = rep.paths.size();
if (removed == 0) {
- ArdourMessage msg (editor, X_("cleanupresults"),
- _("\
-No audio files were ready for cleanup\n\n\
-If this seems suprising, check for any existing\n\
-snapshots. These may still include regions that\n\
+ MessageDialog msgd (*editor,
+ _("No audio files were ready for cleanup"),
+ true,
+ Gtk::MESSAGE_INFO,
+ (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
+ msgd.set_secondary_text (_("If this seems suprising, \n\
+check for any existing snapshots.\n\
+These may still include regions that\n\
require some unused files to continue to exist."));
+
+ msgd.run ();
return;
}
- ArdourDialog results (_("ardour: cleanup"), true);
+ ArdourDialog results (_("ardour: cleanup"), true, false);
struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
CleanupResultsModelColumns() {
};
- Glib::RefPtr<Gtk::ListStore> results_model;
CleanupResultsModelColumns results_columns;
+ Glib::RefPtr<Gtk::ListStore> results_model;
Gtk::TreeView results_display;
results_model = ListStore::create (results_columns);
results_display.set_model (results_model);
results_display.append_column (list_title, results_columns.visible_name);
+
+ results_display.set_name ("CleanupResultsList");
results_display.set_headers_visible (true);
+ results_display.set_headers_clickable (false);
+ results_display.set_reorderable (false);
Gtk::ScrolledWindow list_scroller;
Gtk::Label txt;
+ Gtk::VBox dvbox;
+ Gtk::HBox dhbox; // the hbox for the image and text
+ Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
+ Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
+
+ dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
if (rep.space < 1048576.0f) {
if (removed > 1) {
- txt.set_text (string_compose (msg, removed, _("files"), (float) rep.space / 1024.0f, "kilo"));
+ txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
} else {
- txt.set_text (string_compose (msg, removed, _("file"), (float) rep.space / 1024.0f, "kilo"));
+ txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
}
} else {
if (removed > 1) {
- txt.set_text (string_compose (msg, removed, _("files"), (float) rep.space / 1048576.0f, "mega"));
+ txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
} else {
- txt.set_text (string_compose (msg, removed, _("file"), (float) rep.space / 1048576.0f, "mega"));
+ txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
}
}
- results.get_vbox()->pack_start (txt, false, false);
-
+ dhbox.pack_start (*dimage, true, false, 5);
+ dhbox.pack_start (txt, true, false, 5);
+
for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
TreeModel::Row row = *(results_model->append());
row[results_columns.visible_name] = *i;
}
list_scroller.add (results_display);
- list_scroller.set_size_request (-1, 250);
+ list_scroller.set_size_request (-1, 150);
list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
-
- results.get_vbox()->pack_start (list_scroller, true, true);
- results.add_button (Stock::OK, RESPONSE_ACCEPT);
+
+ dvbox.pack_start (dhbox, true, false, 5);
+ dvbox.pack_start (list_scroller, true, false, 5);
+ ddhbox.pack_start (dvbox, true, false, 5);
+
+ results.get_vbox()->pack_start (ddhbox, true, false, 5);
+ results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
+ results.set_default_response (RESPONSE_CLOSE);
results.set_position (Gtk::WIN_POS_MOUSE);
+ results.show_all_children ();
+ results.set_resizable (false);
results.run ();
+
}
void
return;
}
- ArdourDialog checker (_("ardour cleanup"));
- Gtk::Label label (_("\
-Cleanup is a destructive operation.\n\
+
+ MessageDialog checker (_("Are you sure you want to cleanup?"),
+ true,
+ Gtk::MESSAGE_QUESTION,
+ (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
+
+ checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
ALL undo/redo information will be lost if you cleanup.\n\
-Unused audio files will be moved to a \"dead sounds\" location."));
+After cleanup, unused audio files will be moved to a \
+\"dead sounds\" location."));
- checker.get_vbox()->pack_start (label, false, false);
- checker.add_button (Stock::OK, RESPONSE_ACCEPT);
checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
+ checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
+ checker.set_default_response (RESPONSE_CANCEL);
checker.set_name (_("CleanupDialog"));
checker.set_wmclass (_("ardour_cleanup"), "Ardour");
if (session->cleanup_sources (rep)) {
return;
}
-
+ checker.hide();
display_cleanup_results (rep,
_("cleaned files"),
_("\
-The following %1 %2 were not in use.\n\
-The next time you flush the wastebasket\n\
-it will release an additional %3 %4bytes\n\
-of disk space"
+The following %1 %2 not in use and \n\
+have been moved to:\n\
+%3. \n\n\
+Flushing the wastebasket will \n\
+release an additional\n\
+%4 %5bytes of disk space.\n"
));
}
display_cleanup_results (rep,
_("deleted file"),
- _("The following %1 file%2 were deleted, releasing %3 %4bytes of disk space"));
+ _("The following %1 %2 deleted from\n\
+%3,\n\
+releasing %4 %5bytes of disk space"));
}
void
while (count) {
if (track) {
- session_add_audio_track (input_chan, output_chan);
+ session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
} else {
session_add_audio_bus (input_chan, output_chan);
}
if (session) {
node = session->instant_xml(X_("Mixer"), session->path());
} else {
- node = Config->instant_xml(X_("Mixer"), Config->get_user_ardour_path());
+ node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
}
if (!node) {
if (session) {
node = session->instant_xml(X_("Editor"), session->path());
} else {
- node = Config->instant_xml(X_("Editor"), Config->get_user_ardour_path());
+ node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
}
if (!node) {
{
ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
- ArdourMessage msg (editor, X_("haltonxrun"),
+ MessageDialog msg (*editor,
_("Recording was stopped because your system could not keep up."));
+ msg.run ();
}
void
if (!have_disk_overrun_displayed) {
have_disk_overrun_displayed = true;
- ArdourMessage msg (editor, X_("diskrate dialog"), _("\
+ MessageDialog msg (*editor, X_("diskrate dialog"), _("\
The disk system on your computer\n\
was not able to keep up with Ardour.\n\
\n\
Specifically, it failed to write data to disk\n\
quickly enough to keep up with recording.\n"));
+ msg.run ();
have_disk_overrun_displayed = false;
}
}
if (!have_disk_underrun_displayed) {
have_disk_underrun_displayed = true;
- ArdourMessage msg (editor, X_("diskrate2 dialog"),
+ MessageDialog msg (*editor,
(_("The disk system on your computer\n\
was not able to keep up with Ardour.\n\
\n\
Specifically, it failed to read data from disk\n\
quickly enough to keep up with playback.\n")));
+ msg.run ();
have_disk_underrun_displayed = false;
}
}
switch (dialog.run ()) {
case RESPONSE_ACCEPT:
- break;
- default:
return 1;
+ default:
+ return 0;
}
-
- return 0;
}
-
void
ARDOUR_UI::disconnect_from_jack ()
{
if (engine) {
if( engine->disconnect_from_jack ()) {
- ArdourMessage msg (editor, X_("nojack dialog"),
- _("Could not disconnect from JACK"));
+ MessageDialog msg (*editor, _("Could not disconnect from JACK"));
+ msg.run ();
}
update_sample_rate (0);
{
if (engine) {
if (engine->reconnect_to_jack ()) {
- ArdourMessage msg (editor, X_("nojack dialog"),
- _("Could not reconnect to JACK"));
+ MessageDialog msg (*editor, _("Could not reconnect to JACK"));
+ msg.run ();
}
update_sample_rate (0);
_will_create_new_session_automatically = false; /* done it */
return FALSE; /* don't call it again */
}
+
+void
+ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
+{
+ Glib::RefPtr<Action> act;
+
+ switch (hf) {
+ case BWF:
+ act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
+ break;
+ case WAVE:
+ act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
+ break;
+ case WAVE64:
+ act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
+ break;
+ case iXML:
+ act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
+ break;
+ case RF64:
+ act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
+ break;
+ case CAF:
+ act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
+ break;
+ case AIFF:
+ act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
+ break;
+ }
+
+ if (act) {
+ Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
+ if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
+ Config->set_native_file_header_format (hf);
+ if (session) {
+ session->reset_native_file_format ();
+ }
+ }
+ }
+}
+
+void
+ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
+{
+ Glib::RefPtr<Action> act;
+
+ switch (sf) {
+ case FormatFloat:
+ act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
+ break;
+ case FormatInt24:
+ act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
+ break;
+ }
+
+ if (act) {
+ Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
+
+ if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
+ Config->set_native_file_data_format (sf);
+ if (session) {
+ session->reset_native_file_format ();
+ }
+ }
+ }
+}
+
+void
+ARDOUR_UI::use_config ()
+{
+ Glib::RefPtr<Action> act;
+
+ switch (Config->get_native_file_data_format ()) {
+ case FormatFloat:
+ act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
+ break;
+ case FormatInt24:
+ act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
+ break;
+ }
+
+ if (act) {
+ Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
+ ract->set_active ();
+ }
+
+ switch (Config->get_native_file_header_format ()) {
+ case BWF:
+ act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
+ break;
+ case WAVE:
+ act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
+ break;
+ case WAVE64:
+ act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
+ break;
+ case iXML:
+ act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
+ break;
+ case RF64:
+ act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
+ break;
+ case CAF:
+ act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
+ break;
+ case AIFF:
+ act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
+ break;
+ }
+
+ if (act) {
+ Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
+ ract->set_active ();
+ }
+}