#include <cstdlib>
#include <cstdio> // so libraptor doesn't complain
#include <cmath>
+#ifndef COMPILER_MSVC
#include <dirent.h>
+#endif
#include <sys/stat.h>
#include <cerrno>
#include <utility>
+#ifdef HAVE_LRDF
#include <lrdf.h>
+#endif
#include "pbd/compose.h"
#include "pbd/error.h"
#include "pbd/xml++.h"
-#include "ardour/ardour.h"
-#include "ardour/session.h"
-#include "ardour/audioengine.h"
+#include "ardour/buffer_set.h"
+#include "ardour/chan_count.h"
+#include "ardour/chan_mapping.h"
+#include "ardour/data_type.h"
+#include "ardour/midi_buffer.h"
+#include "ardour/midi_state_tracker.h"
#include "ardour/plugin.h"
-#include "ardour/ladspa_plugin.h"
#include "ardour/plugin_manager.h"
+#include "ardour/session.h"
+#include "ardour/types.h"
-#ifdef HAVE_AUDIOUNITS
+#ifdef AUDIOUNIT_SUPPORT
#include "ardour/audio_unit.h"
#endif
using namespace ARDOUR;
using namespace PBD;
+namespace ARDOUR { class AudioEngine; }
+
+#ifdef NO_PLUGIN_STATE
+static bool seen_get_state_message = false;
+static bool seen_set_state_message = false;
+#endif
+
+bool
+PluginInfo::is_instrument () const
+{
+ return (n_inputs.n_midi() != 0) && (n_outputs.n_audio() > 0);
+}
+
Plugin::Plugin (AudioEngine& e, Session& s)
: _engine (e)
, _session (s)
, _have_pending_stop_events (false)
, _parameter_changed_since_last_preset (false)
{
+ _pending_stop_events.ensure_buffers (DataType::MIDI, 1, 4096);
}
Plugin::Plugin (const Plugin& other)
, _have_pending_stop_events (false)
, _parameter_changed_since_last_preset (false)
{
-
+ _pending_stop_events.ensure_buffers (DataType::MIDI, 1, 4096);
}
Plugin::~Plugin ()
{
-
}
void
PluginPtr
ARDOUR::find_plugin(Session& session, string identifier, PluginType type)
{
- PluginManager *mgr = PluginManager::the_manager();
+ PluginManager& mgr (PluginManager::instance());
PluginInfoList plugs;
switch (type) {
case ARDOUR::LADSPA:
- plugs = mgr->ladspa_plugin_info();
+ plugs = mgr.ladspa_plugin_info();
break;
#ifdef LV2_SUPPORT
case ARDOUR::LV2:
- plugs = mgr->lv2_plugin_info();
+ plugs = mgr.lv2_plugin_info();
break;
#endif
-#ifdef VST_SUPPORT
- case ARDOUR::VST:
- plugs = mgr->vst_plugin_info();
+#ifdef WINDOWS_VST_SUPPORT
+ case ARDOUR::Windows_VST:
+ plugs = mgr.windows_vst_plugin_info();
break;
#endif
#ifdef LXVST_SUPPORT
case ARDOUR::LXVST:
- plugs = mgr->lxvst_plugin_info();
+ plugs = mgr.lxvst_plugin_info();
break;
#endif
-#ifdef HAVE_AUDIOUNITS
+#ifdef AUDIOUNIT_SUPPORT
case ARDOUR::AudioUnit:
- plugs = mgr->au_plugin_info();
+ plugs = mgr.au_plugin_info();
break;
#endif
}
}
-#ifdef VST_SUPPORT
+#ifdef WINDOWS_VST_SUPPORT
/* hmm, we didn't find it. could be because in older versions of Ardour.
we used to store the name of a VST plugin, not its unique ID. so try
again.
int
Plugin::connect_and_run (BufferSet& bufs,
- ChanMapping in_map, ChanMapping out_map,
- pframes_t nframes, framecnt_t offset)
+ ChanMapping /*in_map*/, ChanMapping /*out_map*/,
+ pframes_t /* nframes */, framecnt_t /*offset*/)
{
if (bufs.count().n_midi() > 0) {
/* Track notes that we are sending to the plugin */
- MidiBuffer& b = bufs.get_midi (0);
- bool looped;
- _tracker.track (b.begin(), b.end(), looped);
+
+ const MidiBuffer& b = bufs.get_midi (0);
+
+ _tracker.track (b.begin(), b.end());
if (_have_pending_stop_events) {
/* Transmit note-offs that are pending from the last transport stop */
void
Plugin::realtime_handle_transport_stopped ()
+{
+ resolve_midi ();
+}
+
+void
+Plugin::realtime_locate ()
+{
+ resolve_midi ();
+}
+
+void
+Plugin::monitoring_changed ()
+{
+ resolve_midi ();
+}
+
+void
+Plugin::resolve_midi ()
{
/* Create note-offs for any active notes and put them in _pending_stop_events, to be picked
up on the next call to connect_and_run ().
*/
- _pending_stop_events.ensure_buffers (DataType::MIDI, 1, 4096);
_pending_stop_events.get_midi(0).clear ();
_tracker.resolve_notes (_pending_stop_events.get_midi (0), 0);
_have_pending_stop_events = true;
}
+
vector<Plugin::PresetRecord>
Plugin::get_presets ()
{
+ vector<PresetRecord> p;
+
+#ifndef NO_PLUGIN_STATE
if (!_have_presets) {
find_presets ();
_have_presets = true;
}
- vector<PresetRecord> p;
for (map<string, PresetRecord>::const_iterator i = _presets.begin(); i != _presets.end(); ++i) {
p.push_back (i->second);
}
+#else
+ if (!seen_set_state_message) {
+ info << string_compose (_("Plugin presets are not supported in this build of %1. Consider paying for a full version"),
+ PROGRAM_NAME)
+ << endmsg;
+ seen_set_state_message = true;
+ }
+#endif
return p;
}
return true;
}
+void
+Plugin::clear_preset ()
+{
+ _last_preset.uri = "";
+ _last_preset.label = "";
+ _parameter_changed_since_last_preset = false;
+
+ PresetLoaded (); /* EMIT SIGNAL */
+}
+
/** @param val `plugin' value */
void
-Plugin::set_parameter (uint32_t which, float val)
+Plugin::set_parameter (uint32_t which, float)
{
_parameter_changed_since_last_preset = true;
_session.set_dirty ();
- ParameterChanged (which, val); /* EMIT SIGNAL */
+ ParameterChanged (which, get_parameter (which)); /* EMIT SIGNAL */
+}
+
+void
+Plugin::set_parameter_automated (uint32_t which, float val)
+{
+ Plugin::set_parameter (which, val);
}
int
-Plugin::set_state (const XMLNode& node, int version)
+Plugin::set_state (const XMLNode& node, int /*version*/)
{
XMLProperty const * p = node.property (X_("last-preset-uri"));
if (p) {
Plugin::get_state ()
{
XMLNode* root = new XMLNode (state_node_name ());
- LocaleGuard lg (X_("POSIX"));
+ LocaleGuard lg (X_("C"));
root->add_property (X_("last-preset-uri"), _last_preset.uri);
root->add_property (X_("last-preset-label"), _last_preset.label);
root->add_property (X_("parameter-changed-since-last-preset"), _parameter_changed_since_last_preset ? X_("yes") : X_("no"));
+#ifndef NO_PLUGIN_STATE
add_state (root);
+#else
+ if (!seen_get_state_message) {
+ info << string_compose (_("Saving plugin settings is not supported in this build of %1. Consider paying for the full version"),
+ PROGRAM_NAME)
+ << endmsg;
+ seen_get_state_message = true;
+ }
+#endif
+
return *root;
}
+
+void
+Plugin::set_info (PluginInfoPtr info)
+{
+ _info = info;
+}
+
+