Make editor route list rec button respect group settings.
[ardour.git] / gtk2_ardour / sfdb_ui.cc
index bb95da5c0064e91be34ff0595ce247a9ebb894b8..41758d493dd8e024d9a6fac160b0d159799ee48d 100644 (file)
 #include <gtkmm/stock.h>
 #include <glibmm/fileutils.h>
 
-#include <pbd/convert.h>
-#include <pbd/tokenizer.h>
-#include <pbd/enumwriter.h>
-#include <pbd/pthread_utils.h>
-#include <pbd/xml++.h>
+#include "pbd/convert.h"
+#include "pbd/tokenizer.h"
+#include "pbd/enumwriter.h"
+#include "pbd/pthread_utils.h"
+#include "pbd/xml++.h"
 
 #include <gtkmm2ext/utils.h>
 
-#include <evoral/SMFReader.hpp>
+#include "evoral/SMF.hpp"
 
-#include <ardour/audio_library.h>
-#include <ardour/auditioner.h>
-#include <ardour/audioregion.h>
-#include <ardour/audiofilesource.h>
-#include <ardour/smf_source.h>
-#include <ardour/region_factory.h>
-#include <ardour/source_factory.h>
-#include <ardour/session.h>
-#include <ardour/session_directory.h>
-#include <ardour/profile.h>
+#include "ardour/amp.h"
+#include "ardour/audio_library.h"
+#include "ardour/auditioner.h"
+#include "ardour/audioregion.h"
+#include "ardour/audiofilesource.h"
+#include "ardour/smf_source.h"
+#include "ardour/region_factory.h"
+#include "ardour/source_factory.h"
+#include "ardour/session.h"
+#include "ardour/session_directory.h"
+#include "ardour/profile.h"
 
 #include "ardour_ui.h"
 #include "editing.h"
@@ -120,13 +121,10 @@ SoundFileBox::SoundFileBox (bool persistent)
          autoplay_btn (_("Auto-play"))
        
 {
-       HBox* hbox;
-       VBox* vbox;
-
        set_name (X_("SoundFileBox"));
        set_size_request (300, -1);
 
-       preview_label.set_markup (_("<b>Soundfile Info</b>"));
+       preview_label.set_markup (_("<b>Sound File Information</b>"));
 
        border_frame.set_label_widget (preview_label);
        border_frame.add (main_box);
@@ -135,55 +133,55 @@ SoundFileBox::SoundFileBox (bool persistent)
        set_border_width (6);
 
        main_box.set_border_width (6);
-       main_box.set_spacing (12);
 
        length.set_text (_("Length:"));
+       length.set_alignment (1, 0.5);
        timecode.set_text (_("Timestamp:"));
+       timecode.set_alignment (1, 0.5);
        format.set_text (_("Format:"));
+       format.set_alignment (1, 0.5);
        channels.set_text (_("Channels:"));
+       channels.set_alignment (1, 0.5);
        samplerate.set_text (_("Sample rate:"));
+       samplerate.set_alignment (1, 0.5);
+
+       format_text.set_max_width_chars (8);
+       format_text.set_ellipsize (Pango::ELLIPSIZE_END);
+       format_text.set_alignment (0, 1);
 
        table.set_col_spacings (6);
        table.set_homogeneous (false);
        table.set_row_spacings (6);
 
-       table.attach (channels, 0, 1, 0, 1, FILL|EXPAND, (AttachOptions) 0);
-       table.attach (samplerate, 0, 1, 1, 2, FILL|EXPAND, (AttachOptions) 0);
-       table.attach (format, 0, 1, 2, 4, FILL|EXPAND, (AttachOptions) 0);
-       table.attach (length, 0, 1, 4, 5, FILL|EXPAND, (AttachOptions) 0);
-       table.attach (timecode, 0, 1, 5, 6, FILL|EXPAND, (AttachOptions) 0);
+       table.attach (channels, 0, 1, 0, 1, FILL, FILL);
+       table.attach (samplerate, 0, 1, 1, 2, FILL, FILL);
+       table.attach (format, 0, 1, 2, 4, FILL, FILL);
+       table.attach (length, 0, 1, 4, 5, FILL, FILL);
+       table.attach (timecode, 0, 1, 5, 6, FILL, FILL);
 
-       table.attach (channels_value, 1, 2, 0, 1, FILL, (AttachOptions) 0);
-       table.attach (samplerate_value, 1, 2, 1, 2, FILL, (AttachOptions) 0);
-       table.attach (format_text, 1, 2, 2, 4, FILL, AttachOptions (0));
-       table.attach (length_clock, 1, 2, 4, 5, FILL, (AttachOptions) 0);
-       table.attach (timecode_clock, 1, 2, 5, 6, FILL, (AttachOptions) 0);
+       table.attach (channels_value, 1, 2, 0, 1, FILL, FILL);
+       table.attach (samplerate_value, 1, 2, 1, 2, FILL, FILL);
+       table.attach (format_text, 1, 2, 2, 4, FILL, FILL);
+       table.attach (length_clock, 1, 2, 4, 5, FILL, FILL);
+       table.attach (timecode_clock, 1, 2, 5, 6, FILL, FILL);
 
        length_clock.set_mode (ARDOUR_UI::instance()->secondary_clock.mode());
        timecode_clock.set_mode (AudioClock::SMPTE);
 
-       hbox = manage (new HBox);
-       hbox->pack_start (table, false, false);
-       main_box.pack_start (*hbox, false, false);
+       main_box.pack_start (table, false, false);
 
        tags_entry.set_editable (true);
        tags_entry.signal_focus_out_event().connect (mem_fun (*this, &SoundFileBox::tags_entry_left));
-       hbox = manage (new HBox);
-       hbox->pack_start (tags_entry, true, true);
-
-       vbox = manage (new VBox);
 
        Label* label = manage (new Label (_("Tags:")));
        label->set_alignment (0.0f, 0.5f);
-       vbox->set_spacing (6);
-       vbox->pack_start(*label, false, false);
-       vbox->pack_start(*hbox, true, true);
+       main_box.pack_start (*label, false, false);
+       main_box.pack_start (tags_entry, true, true);
 
-       main_box.pack_start(*vbox, true, true);
-       main_box.pack_start(bottom_box, false, false);
+       main_box.pack_start (bottom_box, false, false);
        
        play_btn.set_image (*(manage (new Image (Stock::MEDIA_PLAY, ICON_SIZE_BUTTON))));
-       play_btn.set_label (_("Play (double click)"));
+       play_btn.set_label (_("Play"));
 
        stop_btn.set_image (*(manage (new Image (Stock::MEDIA_STOP, ICON_SIZE_BUTTON))));
        stop_btn.set_label (_("Stop"));
@@ -197,12 +195,6 @@ SoundFileBox::SoundFileBox (bool persistent)
        play_btn.signal_clicked().connect (mem_fun (*this, &SoundFileBox::audition));
        stop_btn.signal_clicked().connect (mem_fun (*this, &SoundFileBox::stop_audition));
 
-       length.set_alignment (0.0f, 0.5f);
-       format.set_alignment (0.0f, 0.5f);
-       channels.set_alignment (0.0f, 0.5f);
-       samplerate.set_alignment (0.0f, 0.5f);
-       timecode.set_alignment (0.0f, 0.5f);
-
        channels_value.set_alignment (0.0f, 0.5f);
        samplerate_value.set_alignment (0.0f, 0.5f);
 }
@@ -236,10 +228,10 @@ SoundFileBox::setup_labels (const ustring& filename)
 
        if(!AudioFileSource::get_soundfile_info (filename, sf_info, error_msg)) {
 
-               preview_label.set_markup (_("<b>Soundfile Info</b>"));
-               format_text.set_text (_("n/a"));
-               channels_value.set_text (_("n/a"));
-               samplerate_value.set_text (_("n/a"));
+               preview_label.set_markup (_("<b>Sound File Information</b>"));
+               format_text.set_text ("");
+               channels_value.set_text ("");
+               samplerate_value.set_text ("");
                tags_entry.get_buffer()->set_text ("");
 
                length_clock.set (0);
@@ -252,7 +244,11 @@ SoundFileBox::setup_labels (const ustring& filename)
        }
 
        preview_label.set_markup (string_compose ("<b>%1</b>", Glib::path_get_basename (filename)));
-       format_text.set_text (sf_info.format_name);
+       std::string n = sf_info.format_name;
+       if (n.substr (0, 8) == X_("Format: ")) {
+               n = n.substr (8);
+       }
+       format_text.set_text (n);
        channels_value.set_text (to_string (sf_info.channels, std::dec));
 
        if (_session && sf_info.samplerate != _session->frame_rate()) {
@@ -267,7 +263,8 @@ SoundFileBox::setup_labels (const ustring& filename)
                samplerate.set_name ("NewSessionSR2Label");
        }
 
-       double src_coef = (double) _session->nominal_frame_rate() / sf_info.samplerate;
+       nframes_t const nfr = _session ? _session->nominal_frame_rate() : 25;
+       double src_coef = (double) nfr / sf_info.samplerate;
 
        length_clock.set (sf_info.length * src_coef + 0.5, true);
        timecode_clock.set (sf_info.timecode * src_coef + 0.5, true);
@@ -352,7 +349,9 @@ SoundFileBox::audition ()
        
        afs = boost::dynamic_pointer_cast<AudioFileSource> (srclist[0]);
        string rname = region_name_from_path (afs->path(), false);
-       r = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (srclist, 0, srclist[0]->length(), rname, 0, Region::DefaultFlags, false));
+       r = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (srclist, 0,
+                               srclist[0]->length(srclist[0]->timeline_position()),
+                               rname, 0, Region::DefaultFlags, false));
 
        _session->audition_region(r);
 }
@@ -366,7 +365,7 @@ SoundFileBox::stop_audition ()
 }
 
 bool
-SoundFileBox::tags_entry_left (GdkEventFocus *ev)
+SoundFileBox::tags_entry_left (GdkEventFocus *)
 {
        tags_changed ();
        return false;
@@ -567,13 +566,13 @@ SoundFileBrowser::chooser_file_activated ()
 }
 
 void
-SoundFileBrowser::found_list_view_activated (const TreeModel::Path& path, TreeViewColumn* col)
+SoundFileBrowser::found_list_view_activated (const TreeModel::Path&, TreeViewColumn*)
 {
        preview.audition ();
 }
 
 void
-SoundFileBrowser::freesound_list_view_activated (const TreeModel::Path& path, TreeViewColumn* col)
+SoundFileBrowser::freesound_list_view_activated (const TreeModel::Path&, TreeViewColumn*)
 {
        preview.audition ();
 }
@@ -596,7 +595,10 @@ SoundFileBrowser::add_gain_meter ()
        delete gm;
 
        gm = new GainMeter (*session);
-       gm->set_io (session->the_auditioner());
+
+       boost::shared_ptr<Route> r = session->the_auditioner ();
+
+       gm->set_controls (r, r->shared_peak_meter(), r->amp());
 
        meter_packer.set_border_width (12);
        meter_packer.pack_start (*gm, false, true);
@@ -1098,7 +1100,8 @@ SoundFileOmega::check_info (const vector<ustring>& paths, bool& same_size, bool&
 
                } else if (SMFSource::safe_midi_file_extension (*i)) {
 
-                       Evoral::SMFReader reader(*i);
+                       Evoral::SMF reader;
+                       reader.open(*i);
                        if (reader.num_tracks() > 1) {
                                multichannel = true; // "channel" == track here...
                        }
@@ -1207,10 +1210,10 @@ SoundFileOmega::SoundFileOmega (Gtk::Window& parent, string title, ARDOUR::Sessi
        options.set_spacing (12);
 
        str.clear ();
-       str.push_back (_("use file timestamp"));
-       str.push_back (_("at edit point"));
-       str.push_back (_("at playhead"));
-       str.push_back (_("at session start"));
+       str.push_back (_("file timestamp"));
+       str.push_back (_("edit point"));
+       str.push_back (_("playhead"));
+       str.push_back (_("session start"));
        set_popdown_strings (where_combo, str);
        where_combo.set_active_text (str.front());
 
@@ -1237,7 +1240,7 @@ SoundFileOmega::SoundFileOmega (Gtk::Window& parent, string title, ARDOUR::Sessi
        action_combo.set_sensitive (false);
 
        l = manage (new Label);
-       l->set_text (_("Insert:"));
+       l->set_text (_("Insert at:"));
 
        hbox = manage (new HBox);
        hbox->set_border_width (12);
@@ -1268,7 +1271,7 @@ SoundFileOmega::SoundFileOmega (Gtk::Window& parent, string title, ARDOUR::Sessi
        channel_combo.set_sensitive (false);
 
        l = manage (new Label);
-       l->set_text (_("Conversion Quality:"));
+       l->set_text (_("Conversion quality:"));
 
        hbox = manage (new HBox);
        hbox->set_border_width (12);
@@ -1314,6 +1317,25 @@ SoundFileOmega::SoundFileOmega (Gtk::Window& parent, string title, ARDOUR::Sessi
        disposition_map.insert (pair<ustring,ImportDisposition>(_("all files in one region"), ImportMergeFiles));
 
        chooser.signal_selection_changed().connect (mem_fun (*this, &SoundFileOmega::file_selection_changed));
+
+       /* set size requests for a couple of combos to allow them to display the longest text
+          they will ever be asked to display.  This prevents them being resized when the user
+          selects a file to import, which in turn prevents the size of the dialog from jumping
+          around. */
+
+       vector<string> t;
+       t.push_back (_("one track per file"));
+       t.push_back (_("one track per channel"));
+       t.push_back (_("sequence files"));
+       t.push_back (_("all files in one region"));
+       set_size_request_to_display_given_text (channel_combo, t, COMBO_FUDGE + 10, 15);
+
+       t.clear ();
+       t.push_back (importmode2string (ImportAsTrack));
+       t.push_back (importmode2string (ImportToTrack));
+       t.push_back (importmode2string (ImportAsRegion));
+       t.push_back (importmode2string (ImportAsTapeTrack));
+       set_size_request_to_display_given_text (action_combo, t, COMBO_FUDGE + 10, 15);
 }
 
 void
@@ -1342,11 +1364,11 @@ SoundFileOmega::get_position() const
 {
        ustring str = where_combo.get_active_text();
 
-       if (str == _("use file timestamp")) {
+       if (str == _("file timestamp")) {
                return ImportAtTimestamp;
-       } else if (str == _("at edit point")) {
+       } else if (str == _("edit point")) {
                return ImportAtEditPoint;
-       } else if (str == _("at playhead")) {
+       } else if (str == _("playhead")) {
                return ImportAtPlayhead;
        } else {
                return ImportAtStart;