X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fmidi_patch_manager.h;h=3c10a3a149047e2200a1e846ac31af044953f8d2;hb=74a604d261b1ecb0f20ee0c69aef7648da3a1d86;hp=9a99571f797eb4cd15b38afb6387b9b48f971810;hpb=dfed4965b7cf74f21a9e78689dbda1bc5892cde8;p=ardour.git diff --git a/libs/ardour/ardour/midi_patch_manager.h b/libs/ardour/ardour/midi_patch_manager.h index 9a99571f79..3c10a3a149 100644 --- a/libs/ardour/ardour/midi_patch_manager.h +++ b/libs/ardour/ardour/midi_patch_manager.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2008 Hans Baier + 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 @@ -21,11 +21,12 @@ #ifndef MIDI_PATCH_MANAGER_H_ #define MIDI_PATCH_MANAGER_H_ -#include +#include "midi++/midnam_patch.h" -namespace ARDOUR { - class Session; -} +#include "pbd/signals.h" +#include "pbd/search_path.h" + +#include "ardour/libardour_visibility.h" namespace MIDI { @@ -33,57 +34,128 @@ namespace MIDI namespace Name { -class MidiPatchManager +class LIBARDOUR_API MidiPatchManager { /// Singleton private: - MidiPatchManager() {}; + MidiPatchManager(); MidiPatchManager( const MidiPatchManager& ); MidiPatchManager& operator= (const MidiPatchManager&); - - static MidiPatchManager* _manager; - + + static MidiPatchManager* _manager; + public: - typedef std::map > MidiNameDocuments; - + typedef std::map > MidiNameDocuments; + typedef std::map DeviceNamesByMaker; + virtual ~MidiPatchManager() { _manager = 0; } - - static MidiPatchManager& instance() { + + static MidiPatchManager& instance() { if (_manager == 0) { _manager = new MidiPatchManager(); } - return *_manager; + return *_manager; } - - void set_session (ARDOUR::Session&); - - boost::shared_ptr document_by_model(std::string model_name) + + void add_search_path (const PBD::Searchpath& search_path); + + void remove_search_path (const PBD::Searchpath& search_path); + + 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) + + boost::shared_ptr master_device_by_model(std::string model_name) { return _master_devices_by_model[model_name]; } - - std::list custom_device_mode_names_by_model(std::string model_name) { - if (model_name != "") { - return master_device_by_model(model_name)->custom_device_mode_names(); + + boost::shared_ptr find_channel_name_set( + std::string model, + std::string custom_device_mode, + uint8_t channel) { + boost::shared_ptr master_device = master_device_by_model(model); + + if (master_device != 0 && custom_device_mode != "") { + return master_device->channel_name_set_by_channel(custom_device_mode, channel); + } else { + return boost::shared_ptr(); + } + } + + boost::shared_ptr find_patch( + std::string model, + std::string custom_device_mode, + uint8_t channel, + PatchPrimaryKey patch_key) { + + boost::shared_ptr channel_name_set = find_channel_name_set(model, custom_device_mode, channel); + + if (channel_name_set) { + return channel_name_set->find_patch(patch_key); + } else { + return boost::shared_ptr(); + } + } + + boost::shared_ptr previous_patch( + std::string model, + std::string custom_device_mode, + uint8_t channel, + PatchPrimaryKey patch_key) { + + boost::shared_ptr channel_name_set = find_channel_name_set(model, custom_device_mode, channel); + + if (channel_name_set) { + return channel_name_set->previous_patch(patch_key); } else { - return std::list(); + return boost::shared_ptr(); } } - + + boost::shared_ptr next_patch( + std::string model, + std::string custom_device_mode, + uint8_t channel, + PatchPrimaryKey patch_key) { + + boost::shared_ptr channel_name_set = find_channel_name_set(model, custom_device_mode, channel); + + if (channel_name_set) { + return channel_name_set->next_patch(patch_key); + } else { + return boost::shared_ptr(); + } + } + + std::list custom_device_mode_names_by_model(std::string model_name) { + if (model_name != "") { + if (master_device_by_model(model_name)) { + return master_device_by_model(model_name)->custom_device_mode_names(); + } + } + return std::list(); + } + const MasterDeviceNames::Models& all_models() const { return _all_models; } - + + const DeviceNamesByMaker& devices_by_manufacturer() const { return _devices_by_manufacturer; } + private: - void drop_session(); - void refresh(); - - ARDOUR::Session* _session; + bool add_midi_name_document(const std::string& file_path); + bool remove_midi_name_document(const std::string& file_path); + + void add_midnam_files_from_directory(const std::string& directory_path); + void remove_midnam_files_from_directory(const std::string& directory_path); + +private: + PBD::Searchpath _search_path; + MidiNameDocuments _documents; MIDINameDocument::MasterDeviceNamesList _master_devices_by_model; + DeviceNamesByMaker _devices_by_manufacturer; MasterDeviceNames::Models _all_models; }; } // namespace Name } // namespace MIDI + #endif /* MIDI_PATCH_MANAGER_H_ */