From f8480d6392e6d0e61aa39e564904ba67822f711e Mon Sep 17 00:00:00 2001 From: Hans Baier Date: Tue, 9 Dec 2008 08:35:02 +0000 Subject: * moved /midi_patch_manager.* to libs/ardour * GUI improvement: do away with the midi channel expander git-svn-id: svn://localhost/ardour2/branches/3.0@4305 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/SConscript | 1 + libs/ardour/ardour/midi_patch_manager.h | 81 ++++++++++++++++++++++++++ libs/ardour/midi_patch_manager.cc | 100 ++++++++++++++++++++++++++++++++ libs/ardour/session_state.cc | 2 + 4 files changed, 184 insertions(+) create mode 100644 libs/ardour/ardour/midi_patch_manager.h create mode 100644 libs/ardour/midi_patch_manager.cc (limited to 'libs/ardour') diff --git a/libs/ardour/SConscript b/libs/ardour/SConscript index 172cb5163d..52dbb90ba7 100644 --- a/libs/ardour/SConscript +++ b/libs/ardour/SConscript @@ -115,6 +115,7 @@ midi_source.cc midi_state_tracker.cc midi_stretch.cc midi_track.cc +midi_patch_manager.cc mix.cc mtc_slave.cc named_selection.cc diff --git a/libs/ardour/ardour/midi_patch_manager.h b/libs/ardour/ardour/midi_patch_manager.h new file mode 100644 index 0000000000..3591f87d89 --- /dev/null +++ b/libs/ardour/ardour/midi_patch_manager.h @@ -0,0 +1,81 @@ +/* + Copyright (C) 2008 Hans Baier + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + $Id$ +*/ + +#ifndef MIDI_PATCH_MANAGER_H_ +#define MIDI_PATCH_MANAGER_H_ + +#include + +namespace ARDOUR { + class Session; +} + +namespace MIDI +{ + +namespace Name +{ + +class MidiPatchManager +{ + /// Singleton +private: + MidiPatchManager() {}; + MidiPatchManager( const MidiPatchManager& ); + MidiPatchManager& operator= (const MidiPatchManager&); + + static MidiPatchManager* _manager; + +public: + typedef std::map > MidiNameDocuments; + + virtual ~MidiPatchManager() { _manager = 0; } + + static MidiPatchManager& instance() { + if (_manager == 0) { + _manager = new MidiPatchManager(); + } + return *_manager; + } + + void set_session (ARDOUR::Session&); + + boost::shared_ptr document_by_model(std::string model_name) + { return _documents[model_name]; } + + boost::shared_ptr master_device_by_model(std::string model_name) + { return _master_devices_by_model[model_name]; } + + const MasterDeviceNames::Models& all_models() const { return _all_models; } + +private: + void drop_session(); + void refresh(); + + ARDOUR::Session* _session; + MidiNameDocuments _documents; + MIDINameDocument::MasterDeviceNamesList _master_devices_by_model; + MasterDeviceNames::Models _all_models; +}; + +} // namespace Name + +} // namespace MIDI +#endif /* MIDI_PATCH_MANAGER_H_ */ diff --git a/libs/ardour/midi_patch_manager.cc b/libs/ardour/midi_patch_manager.cc new file mode 100644 index 0000000000..bb57f4b10f --- /dev/null +++ b/libs/ardour/midi_patch_manager.cc @@ -0,0 +1,100 @@ +/* + Copyright (C) 2008 Hans Baier + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + $Id$ +*/ + +#include +#include + +#include + +#include "ardour/session.h" +#include "ardour/session_directory.h" +#include "ardour/midi_patch_manager.h" + +using namespace std; +using namespace sigc; +using namespace ARDOUR; +using namespace MIDI; +using namespace MIDI::Name; +using namespace PBD; +using namespace PBD::sys; + +MidiPatchManager* MidiPatchManager::_manager = 0; + +void +MidiPatchManager::set_session (Session& s) +{ + _session = &s; + _session->GoingAway.connect (mem_fun (*this, &MidiPatchManager::drop_session)); + + refresh(); +} + +void +MidiPatchManager::refresh() +{ + _documents.clear(); + + path path_to_patches = _session->session_directory().midi_patch_path(); + + cerr << "Path to patches: " << path_to_patches.to_string() << endl; + + if(!exists(path_to_patches)) { + return; + } + cerr << "Path to patches: " << path_to_patches.to_string() << " exists" << endl; + + assert(is_directory(path_to_patches)); + + Glib::PatternSpec pattern(Glib::ustring("*.midnam")); + vector result; + + find_matching_files_in_directory(path_to_patches, pattern, result); + + cerr << "patchfiles result contains " << result.size() << " elements" << endl; + + for(vector::iterator i = result.begin(); i != result.end(); ++i) { + cerr << "processing patchfile " << i->to_string() << endl; + + boost::shared_ptr document(new MIDINameDocument(i->to_string())); + for(MIDINameDocument::MasterDeviceNamesList::const_iterator device = + document->master_device_names_by_model().begin(); + device != document->master_device_names_by_model().end(); + ++device) { + cerr << "got model " << device->first << endl; + // have access to the documents by model name + _documents[device->first] = document; + // build a list of all master devices from all documents + _master_devices_by_model[device->first] = device->second; + _all_models.push_back(device->first); + + // make sure there are no double model names + // TODO: handle this gracefully. + assert(_documents.count(device->first) == 1); + assert(_master_devices_by_model.count(device->first) == 1); + } + } +} + +void +MidiPatchManager::drop_session () +{ + _session = 0; + _documents.clear(); +} diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index a1b4f34a25..b1a494584a 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -86,6 +86,7 @@ #include #include #include +#include #include #include #include @@ -359,6 +360,7 @@ Session::second_stage_init (bool new_session) deliver_mmc (MIDI::MachineControl::cmdLocate, 0); MidiClockTicker::instance().set_session(*this); + MIDI::Name::MidiPatchManager::instance().set_session(*this); BootMessage (_("Reset Control Protocols")); -- cgit v1.2.3