Allow port matrix to show both audio and midi ports at the same time, and use that...
[ardour.git] / gtk2_ardour / sfdb_ui.cc
index bc2f115ed92e1c89429c4231162bc138319c8e25..2e6235e70cefe8f3650d2292680b74fb828d0752 100644 (file)
@@ -113,8 +113,7 @@ importmode2string (ImportMode mode)
 }
 
 SoundFileBox::SoundFileBox (bool persistent)
-       : _session(0),
-         table (6, 2),
+       : table (6, 2),
          length_clock ("sfboxLengthClock", !persistent, "EditCursorClock", false, false, true, false),
          timecode_clock ("sfboxTimecodeClock", !persistent, "EditCursorClock", false, false, false, false),
          main_box (false, 6),
@@ -171,7 +170,7 @@ SoundFileBox::SoundFileBox (bool persistent)
        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));
+       tags_entry.signal_focus_out_event().connect (sigc::mem_fun (*this, &SoundFileBox::tags_entry_left));
 
        Label* label = manage (new Label (_("Tags:")));
        label->set_alignment (0.0f, 0.5f);
@@ -192,8 +191,8 @@ SoundFileBox::SoundFileBox (bool persistent)
        bottom_box.pack_start(stop_btn, true, true);
        bottom_box.pack_start(autoplay_btn, false, false);
 
-       play_btn.signal_clicked().connect (mem_fun (*this, &SoundFileBox::audition));
-       stop_btn.signal_clicked().connect (mem_fun (*this, &SoundFileBox::stop_audition));
+       play_btn.signal_clicked().connect (sigc::mem_fun (*this, &SoundFileBox::audition));
+       stop_btn.signal_clicked().connect (sigc::mem_fun (*this, &SoundFileBox::stop_audition));
 
        channels_value.set_alignment (0.0f, 0.5f);
        samplerate_value.set_alignment (0.0f, 0.5f);
@@ -202,16 +201,15 @@ SoundFileBox::SoundFileBox (bool persistent)
 void
 SoundFileBox::set_session(Session* s)
 {
-       _session = s;
+       SessionHandlePtr::set_session (s);
+
+       length_clock.set_session (s);
+       timecode_clock.set_session (s);
 
        if (!_session) {
                play_btn.set_sensitive (false);
                stop_btn.set_sensitive (false);
        }
-
-
-       length_clock.set_session (s);
-       timecode_clock.set_session (s);
 }
 
 bool
@@ -310,6 +308,11 @@ SoundFileBox::audition ()
                return;
        }
 
+       if (SMFSource::safe_midi_file_extension (path)) {
+               error << _("Auditioning of MIDI files is not yet supported") << endmsg;
+               return;
+       }
+
        _session->cancel_audition();
 
        if (!Glib::file_test (path, Glib::FILE_TEST_EXISTS)) {
@@ -330,7 +333,7 @@ SoundFileBox::audition ()
                try {
                        afs = boost::dynamic_pointer_cast<AudioFileSource> (
                                        SourceFactory::createReadable (DataType::AUDIO, *_session,
-                                                       path, false, n, Source::Flag (0), false));
+                                                       path, n, Source::Flag (0), false));
 
                        srclist.push_back(afs);
 
@@ -349,9 +352,15 @@ 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(srclist[0]->timeline_position()),
-                               rname, 0, Region::DefaultFlags, false));
+       
+       PropertyList plist; 
+       
+       plist.add (ARDOUR::Properties::start, 0);
+       plist.add (ARDOUR::Properties::length, srclist[0]->length(srclist[0]->timeline_position()));
+       plist.add (ARDOUR::Properties::name, rname);
+       plist.add (ARDOUR::Properties::layer, 0);
+       
+       r = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (srclist, plist, false));
 
        _session->audition_region(r);
 }
@@ -419,15 +428,18 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S
                chooser.add_shortcut_folder_uri("file:///Library/Application Support/GarageBand/Instrument Library/Sampler/Sampler Files");
        }
 
+#ifdef GTKOSX
+        chooser.add_shortcut_folder_uri("file:///Volumes");
+#endif
 
        //add the file chooser
        {
                chooser.set_border_width (12);
 
-               audio_filter.add_custom (FILE_FILTER_FILENAME, mem_fun(*this, &SoundFileBrowser::on_audio_filter));
+               audio_filter.add_custom (FILE_FILTER_FILENAME, sigc::mem_fun(*this, &SoundFileBrowser::on_audio_filter));
                audio_filter.set_name (_("Audio files"));
 
-               midi_filter.add_custom (FILE_FILTER_FILENAME, mem_fun(*this, &SoundFileBrowser::on_midi_filter));
+               midi_filter.add_custom (FILE_FILTER_FILENAME, sigc::mem_fun(*this, &SoundFileBrowser::on_midi_filter));
                midi_filter.set_name (_("MIDI files"));
 
                matchall_filter.add_pattern ("*.*");
@@ -437,8 +449,12 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S
                chooser.add_filter (midi_filter);
                chooser.add_filter (matchall_filter);
                chooser.set_select_multiple (true);
-               chooser.signal_update_preview().connect(mem_fun(*this, &SoundFileBrowser::update_preview));
-               chooser.signal_file_activated().connect (mem_fun (*this, &SoundFileBrowser::chooser_file_activated));
+               chooser.signal_update_preview().connect(sigc::mem_fun(*this, &SoundFileBrowser::update_preview));
+               chooser.signal_file_activated().connect (sigc::mem_fun (*this, &SoundFileBrowser::chooser_file_activated));
+#ifdef GTKOSX
+                /* some broken redraw behaviour - this is a bandaid */
+                chooser.signal_selection_changed().connect (mem_fun (chooser, &Widget::queue_draw));
+#endif
 
                if (!persistent_folder.empty()) {
                        chooser.set_current_folder (persistent_folder);
@@ -472,12 +488,12 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S
 
                found_list_view.append_column(_("Paths"), found_list_columns.pathname);
 
-               found_list_view.get_selection()->signal_changed().connect(mem_fun(*this, &SoundFileBrowser::found_list_view_selected));
+               found_list_view.get_selection()->signal_changed().connect(sigc::mem_fun(*this, &SoundFileBrowser::found_list_view_selected));
 
-               found_list_view.signal_row_activated().connect (mem_fun (*this, &SoundFileBrowser::found_list_view_activated));
+               found_list_view.signal_row_activated().connect (sigc::mem_fun (*this, &SoundFileBrowser::found_list_view_activated));
 
-               found_search_btn.signal_clicked().connect(mem_fun(*this, &SoundFileBrowser::found_search_clicked));
-               found_entry.signal_activate().connect(mem_fun(*this, &SoundFileBrowser::found_search_clicked));
+               found_search_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::found_search_clicked));
+               found_entry.signal_activate().connect(sigc::mem_fun(*this, &SoundFileBrowser::found_search_clicked));
 
                notebook.append_page (*vbox, _("Search Tags"));
        }
@@ -518,12 +534,12 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S
                //vbox->pack_start (freesound_list_view);
 
                freesound_list_view.append_column(_("Paths"), freesound_list_columns.pathname);
-               freesound_list_view.get_selection()->signal_changed().connect(mem_fun(*this, &SoundFileBrowser::freesound_list_view_selected));
+               freesound_list_view.get_selection()->signal_changed().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_list_view_selected));
 
                //freesound_list_view.get_selection()->set_mode (SELECTION_MULTIPLE);
-               freesound_list_view.signal_row_activated().connect (mem_fun (*this, &SoundFileBrowser::freesound_list_view_activated));
-               freesound_search_btn.signal_clicked().connect(mem_fun(*this, &SoundFileBrowser::freesound_search_clicked));
-               freesound_entry.signal_activate().connect(mem_fun(*this, &SoundFileBrowser::freesound_search_clicked));
+               freesound_list_view.signal_row_activated().connect (sigc::mem_fun (*this, &SoundFileBrowser::freesound_list_view_activated));
+               freesound_search_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_search_clicked));
+               freesound_entry.signal_activate().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_search_clicked));
                notebook.append_page (*vbox, _("Search Freesound"));
        }
 #endif
@@ -582,7 +598,8 @@ SoundFileBrowser::set_session (Session* s)
 {
        ArdourDialog::set_session (s);
        preview.set_session (s);
-       if (s) {
+
+       if (_session) {
                add_gain_meter ();
        } else {
                remove_gain_meter ();
@@ -594,9 +611,9 @@ SoundFileBrowser::add_gain_meter ()
 {
        delete gm;
 
-       gm = new GainMeter (*session);
+       gm = new GainMeter (_session, 250);
 
-       boost::shared_ptr<Route> r = session->the_auditioner ();
+       boost::shared_ptr<Route> r = _session->the_auditioner ();
 
        gm->set_controls (r, r->shared_peak_meter(), r->amp());
 
@@ -621,7 +638,7 @@ SoundFileBrowser::remove_gain_meter ()
 void
 SoundFileBrowser::start_metering ()
 {
-       metering_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (mem_fun(*this, &SoundFileBrowser::meter));
+       metering_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (sigc::mem_fun(*this, &SoundFileBrowser::meter));
 }
 
 void
@@ -633,7 +650,7 @@ SoundFileBrowser::stop_metering ()
 void
 SoundFileBrowser::meter ()
 {
-       if (is_mapped () && session && gm) {
+       if (is_mapped () && _session && gm) {
                gm->update_meters ();
        }
 }
@@ -655,7 +672,7 @@ SoundFileBrowser::update_preview ()
 {
        if (preview.setup_labels (chooser.get_filename())) {
                if (preview.autoplay()) {
-                       Glib::signal_idle().connect (mem_fun (preview, &SoundFileBox::audition_oneshot));
+                       Glib::signal_idle().connect (sigc::mem_fun (preview, &SoundFileBox::audition_oneshot));
                }
        }
 }
@@ -733,7 +750,7 @@ SoundFileBrowser::found_search_clicked ()
 void*
 freesound_search_thread_entry (void* arg)
 {
-       PBD::notify_gui_about_thread_creation (pthread_self(), X_("Freesound Search"));
+       SessionEvent::create_per_thread_pool ("freesound events", 64);
 
        static_cast<SoundFileBrowser*>(arg)->freesound_search_thread ();
 
@@ -756,13 +773,17 @@ SoundFileBrowser::freesound_search_clicked ()
                searching = true;
                freesound_search_btn.set_label(_("Cancel"));
                pthread_t freesound_thr;
-               pthread_create_and_store ("freesound_search", &freesound_thr, 0, freesound_search_thread_entry, this);
+               pthread_create_and_store ("freesound_search", &freesound_thr, freesound_search_thread_entry, this);
        }
 }
 
 void
 SoundFileBrowser::freesound_search_thread()
 {
+#if 0
+
+       THIS IS ALL TOTALLY THREAD-ILLEGAL ... YOU CANNOT DO GTK STUFF IN THIS THREAD
+
 #ifdef FREESOUND
        freesound_list->clear();
 
@@ -810,6 +831,8 @@ SoundFileBrowser::freesound_search_thread()
        canceling = false;
        freesound_search_btn.set_label(_("Start Downloading"));
 #endif
+#endif
+
 }
 
 vector<ustring>
@@ -900,11 +923,11 @@ SoundFileOmega::reset_options ()
        bool same_size;
        bool src_needed;
        bool selection_includes_multichannel;
-       bool selection_can_be_embedded_with_links = check_link_status (*session, paths);
+       bool selection_can_be_embedded_with_links = check_link_status (_session, paths);
        ImportMode mode;
 
        if (check_info (paths, same_size, src_needed, selection_includes_multichannel)) {
-               Glib::signal_idle().connect (mem_fun (*this, &SoundFileOmega::bad_file_message));
+               Glib::signal_idle().connect (sigc::mem_fun (*this, &SoundFileOmega::bad_file_message));
                return false;
        }
 
@@ -989,7 +1012,7 @@ SoundFileOmega::reset_options ()
                                channel_strings.push_back (_("sequence files"));
                        }
                        if (same_size) {
-                               channel_strings.push_back (_("all files in one region"));
+                               channel_strings.push_back (_("all files in one track"));
                        }
 
                }
@@ -1094,7 +1117,7 @@ SoundFileOmega::check_info (const vector<ustring>& paths, bool& same_size, bool&
                                }
                        }
 
-                       if ((nframes_t) info.samplerate != session->frame_rate()) {
+                       if ((nframes_t) info.samplerate != _session->frame_rate()) {
                                src_needed = true;
                        }
 
@@ -1120,9 +1143,9 @@ SoundFileOmega::check_info (const vector<ustring>& paths, bool& same_size, bool&
 
 
 bool
-SoundFileOmega::check_link_status (const Session& s, const vector<ustring>& paths)
+SoundFileOmega::check_link_status (const Session* s, const vector<ustring>& paths)
 {
-       sys::path path = s.session_directory().sound_path() / "linktest";
+       sys::path path = s->session_directory().sound_path() / "linktest";
        string tmpdir = path.to_string();
        bool ret = false;
 
@@ -1168,8 +1191,8 @@ SoundFileChooser::on_hide ()
        ArdourDialog::on_hide();
        stop_metering ();
 
-       if (session) {
-               session->cancel_audition();
+       if (_session) {
+               _session->cancel_audition();
        }
 }
 
@@ -1295,7 +1318,7 @@ SoundFileOmega::SoundFileOmega (Gtk::Window& parent, string title, ARDOUR::Sessi
 
        reset_options ();
 
-       action_combo.signal_changed().connect (mem_fun (*this, &SoundFileOmega::reset_options_noret));
+       action_combo.signal_changed().connect (sigc::mem_fun (*this, &SoundFileOmega::reset_options_noret));
 
        copy_files_btn.set_active (true);
 
@@ -1315,8 +1338,9 @@ SoundFileOmega::SoundFileOmega (Gtk::Window& parent, string title, ARDOUR::Sessi
        disposition_map.insert (pair<ustring,ImportDisposition>(_("one region per file"), ImportDistinctFiles));
        disposition_map.insert (pair<ustring,ImportDisposition>(_("one region per channel"), ImportDistinctChannels));
        disposition_map.insert (pair<ustring,ImportDisposition>(_("all files in one region"), ImportMergeFiles));
+       disposition_map.insert (pair<ustring,ImportDisposition>(_("all files in one track"), ImportMergeFiles));
 
-       chooser.signal_selection_changed().connect (mem_fun (*this, &SoundFileOmega::file_selection_changed));
+       chooser.signal_selection_changed().connect (sigc::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
@@ -1354,8 +1378,8 @@ void
 SoundFileOmega::on_hide ()
 {
        ArdourDialog::on_hide();
-       if (session) {
-               session->cancel_audition();
+       if (_session) {
+               _session->cancel_audition();
        }
 }