#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 AUDIOUNIT_SUPPORT
#include "ardour/audio_unit.h"
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
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);
+
+ _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;
+ }
+#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 */
}
int
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;
}
{
_info = info;
}
+
+