summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/ardour/midi_patch_manager.h18
-rw-r--r--libs/ardour/midi_patch_manager.cc97
-rw-r--r--libs/ardour/session.cc3
-rw-r--r--libs/ardour/session_state.cc2
4 files changed, 63 insertions, 57 deletions
diff --git a/libs/ardour/ardour/midi_patch_manager.h b/libs/ardour/ardour/midi_patch_manager.h
index 97f9060a5d..c7154c49a6 100644
--- a/libs/ardour/ardour/midi_patch_manager.h
+++ b/libs/ardour/ardour/midi_patch_manager.h
@@ -22,12 +22,11 @@
#define MIDI_PATCH_MANAGER_H_
#include "midi++/midnam_patch.h"
+
#include "pbd/signals.h"
-#include "ardour/session_handle.h"
+#include "pbd/search_path.h"
-namespace ARDOUR {
- class Session;
-}
+#include "ardour/libardour_visibility.h"
namespace MIDI
{
@@ -35,7 +34,7 @@ namespace MIDI
namespace Name
{
-class LIBARDOUR_API MidiPatchManager : public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr
+class LIBARDOUR_API MidiPatchManager
{
/// Singleton
private:
@@ -58,7 +57,9 @@ public:
return *_manager;
}
- void set_session (ARDOUR::Session*);
+ void add_search_path (const PBD::Searchpath& search_path);
+
+ void remove_search_path (const PBD::Searchpath& search_path);
boost::shared_ptr<MIDINameDocument> document_by_model(std::string model_name)
{ return _documents[model_name]; }
@@ -138,12 +139,13 @@ public:
const DeviceNamesByMaker& devices_by_manufacturer() const { return _devices_by_manufacturer; }
private:
- void session_going_away();
void refresh();
- void add_session_patches();
bool add_midi_name_document(const std::string& file_path);
+private:
+ PBD::Searchpath _search_path;
+
MidiNameDocuments _documents;
MIDINameDocument::MasterDeviceNamesList _master_devices_by_model;
DeviceNamesByMaker _devices_by_manufacturer;
diff --git a/libs/ardour/midi_patch_manager.cc b/libs/ardour/midi_patch_manager.cc
index c6e70b2a6c..83a7a20c7f 100644
--- a/libs/ardour/midi_patch_manager.cc
+++ b/libs/ardour/midi_patch_manager.cc
@@ -25,8 +25,6 @@
#include "pbd/file_utils.h"
#include "pbd/error.h"
-#include "ardour/session.h"
-#include "ardour/session_directory.h"
#include "ardour/midi_patch_manager.h"
#include "ardour/search_paths.h"
@@ -43,13 +41,56 @@ MidiPatchManager* MidiPatchManager::_manager = 0;
MidiPatchManager::MidiPatchManager ()
{
+ add_search_path(midi_patch_search_path ());
}
void
-MidiPatchManager::set_session (Session* s)
+MidiPatchManager::add_search_path (const Searchpath& search_path)
{
- SessionHandlePtr::set_session (s);
- refresh ();
+ bool do_refresh = false;
+
+ for (Searchpath::const_iterator i = search_path.begin(); i != search_path.end(); ++i) {
+
+ if (_search_path.contains(*i)) {
+ // already processed files from this path
+ continue;
+ }
+
+ if (!Glib::file_test (*i, Glib::FILE_TEST_EXISTS)) {
+ continue;
+ }
+
+ if (!Glib::file_test (*i, Glib::FILE_TEST_IS_DIR)) {
+ continue;
+ }
+
+ _search_path.add_directory (*i);
+ do_refresh = true;
+ }
+
+ if (do_refresh) {
+ refresh();
+ }
+}
+
+void
+MidiPatchManager::remove_search_path (const Searchpath& search_path)
+{
+ bool do_refresh = false;
+
+ for (Searchpath::const_iterator i = search_path.begin(); i != search_path.end(); ++i) {
+
+ if (!_search_path.contains(*i)) {
+ continue;
+ }
+
+ _search_path.remove_directory (*i);
+ do_refresh = true;
+ }
+
+ if (do_refresh) {
+ refresh();
+ }
}
bool
@@ -95,32 +136,6 @@ MidiPatchManager::add_midi_name_document (const std::string& file_path)
}
void
-MidiPatchManager::add_session_patches ()
-{
- if (!_session) {
- return;
- }
-
- std::string path_to_patches = _session->session_directory().midi_patch_path();
-
- if (!Glib::file_test (path_to_patches, Glib::FILE_TEST_EXISTS)) {
- return;
- }
-
- assert (Glib::file_test (path_to_patches, Glib::FILE_TEST_IS_DIR));
-
- vector<std::string> result;
-
- find_files_matching_pattern (result, path_to_patches, "*.midnam");
-
- info << "Loading " << result.size() << " MIDI patches from " << path_to_patches << endmsg;
-
- for (vector<std::string>::iterator i = result.begin(); i != result.end(); ++i) {
- add_midi_name_document(*i);
- }
-}
-
-void
MidiPatchManager::refresh()
{
_documents.clear();
@@ -128,28 +143,14 @@ MidiPatchManager::refresh()
_all_models.clear();
_devices_by_manufacturer.clear();
- Searchpath search_path = midi_patch_search_path ();
vector<std::string> result;
- find_files_matching_pattern (result, search_path, "*.midnam");
+ find_files_matching_pattern (result, _search_path, "*.midnam");
- info << "Loading " << result.size() << " MIDI patches from " << search_path.to_string() << endmsg;
+ info << "Loading " << result.size() << " MIDI patches from "
+ << _search_path.to_string() << endmsg;
for (vector<std::string>::iterator i = result.begin(); i != result.end(); ++i) {
add_midi_name_document (*i);
}
-
- if (_session) {
- add_session_patches ();
- }
-}
-
-void
-MidiPatchManager::session_going_away ()
-{
- SessionHandlePtr::session_going_away ();
- _documents.clear();
- _master_devices_by_model.clear();
- _all_models.clear();
- _devices_by_manufacturer.clear();
}
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index 1231212d2e..a3b82d9d4b 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -74,6 +74,7 @@
#include "ardour/graph.h"
#include "ardour/midiport_manager.h"
#include "ardour/scene_changer.h"
+#include "ardour/midi_patch_manager.h"
#include "ardour/midi_track.h"
#include "ardour/midi_ui.h"
#include "ardour/operations.h"
@@ -555,6 +556,8 @@ Session::destroy ()
ControlProtocolManager::instance().drop_protocols ();
+ MIDI::Name::MidiPatchManager::instance().remove_search_path(session_directory().midi_patch_path());
+
_engine.remove_session ();
#ifdef USE_TRACKS_CODE_FEATURES
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc
index 036e023dff..0cbb550d02 100644
--- a/libs/ardour/session_state.cc
+++ b/libs/ardour/session_state.cc
@@ -343,7 +343,7 @@ Session::post_engine_init ()
send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdMmcReset));
send_immediate_mmc (MIDI::MachineControlCommand (Timecode::Time ()));
- MIDI::Name::MidiPatchManager::instance().set_session (this);
+ MIDI::Name::MidiPatchManager::instance().add_search_path (session_directory().midi_patch_path() );
ltc_tx_initialize();
/* initial program change will be delivered later; see ::config_changed() */