nominally add MIDI input support for AudioUnit plugins
git-svn-id: svn://localhost/ardour2/branches/3.0@8044 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
27be3234f5
commit
90172686b9
@ -154,6 +154,8 @@ class AUPlugin : public ARDOUR::Plugin
|
|||||||
nframes_t _last_nframes;
|
nframes_t _last_nframes;
|
||||||
bool _requires_fixed_size_buffers;
|
bool _requires_fixed_size_buffers;
|
||||||
AudioBufferList* buffers;
|
AudioBufferList* buffers;
|
||||||
|
bool _has_midi_input;
|
||||||
|
bool _has_midi_output;
|
||||||
|
|
||||||
/* despite all the cool work that apple did on their AU preset
|
/* despite all the cool work that apple did on their AU preset
|
||||||
system, they left factory presets and user presets as two
|
system, they left factory presets and user presets as two
|
||||||
@ -206,6 +208,12 @@ class AUPluginInfo : public PluginInfo {
|
|||||||
|
|
||||||
PluginPtr load (Session& session);
|
PluginPtr load (Session& session);
|
||||||
|
|
||||||
|
bool needs_midi_input ();
|
||||||
|
bool is_effect () const;
|
||||||
|
bool is_effect_without_midi_input () const;
|
||||||
|
bool is_effect_with_midi_input () const;
|
||||||
|
bool is_instrument () const;
|
||||||
|
|
||||||
AUPluginCachedInfo cache;
|
AUPluginCachedInfo cache;
|
||||||
|
|
||||||
static PluginInfoList* discover ();
|
static PluginInfoList* discover ();
|
||||||
@ -221,6 +229,7 @@ class AUPluginInfo : public PluginInfo {
|
|||||||
static void discover_music (PluginInfoList&);
|
static void discover_music (PluginInfoList&);
|
||||||
static void discover_fx (PluginInfoList&);
|
static void discover_fx (PluginInfoList&);
|
||||||
static void discover_generators (PluginInfoList&);
|
static void discover_generators (PluginInfoList&);
|
||||||
|
static void discover_instruments (PluginInfoList&);
|
||||||
static void discover_by_description (PluginInfoList&, CAComponentDescription&);
|
static void discover_by_description (PluginInfoList&, CAComponentDescription&);
|
||||||
static Glib::ustring au_cache_path ();
|
static Glib::ustring au_cache_path ();
|
||||||
|
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
#include "ardour/ardour.h"
|
#include "ardour/ardour.h"
|
||||||
#include "ardour/audioengine.h"
|
#include "ardour/audioengine.h"
|
||||||
#include "ardour/audio_buffer.h"
|
#include "ardour/audio_buffer.h"
|
||||||
|
#include "ardour/midi_buffer.h"
|
||||||
#include "ardour/filesystem_paths.h"
|
#include "ardour/filesystem_paths.h"
|
||||||
#include "ardour/io.h"
|
#include "ardour/io.h"
|
||||||
#include "ardour/audio_unit.h"
|
#include "ardour/audio_unit.h"
|
||||||
@ -499,6 +500,10 @@ AUPlugin::init ()
|
|||||||
throw failed_constructor();
|
throw failed_constructor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AUPluginInfoPtr pinfo = boost::dynamic_pointer_cast<AUPluginInfo>(get_info());
|
||||||
|
_has_midi_input = pinfo->needs_midi_input ();
|
||||||
|
_has_midi_output = false;
|
||||||
|
|
||||||
discover_parameters ();
|
discover_parameters ();
|
||||||
discover_factory_presets ();
|
discover_factory_presets ();
|
||||||
|
|
||||||
@ -945,6 +950,14 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out) con
|
|||||||
int32_t plugcnt = -1;
|
int32_t plugcnt = -1;
|
||||||
AUPluginInfoPtr pinfo = boost::dynamic_pointer_cast<AUPluginInfo>(get_info());
|
AUPluginInfoPtr pinfo = boost::dynamic_pointer_cast<AUPluginInfo>(get_info());
|
||||||
|
|
||||||
|
/* lets check MIDI first */
|
||||||
|
|
||||||
|
if (in.n_midi() > 0) {
|
||||||
|
if (!_has_midi_input) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
vector<pair<int,int> >& io_configs = pinfo->cache.io_configs;
|
vector<pair<int,int> >& io_configs = pinfo->cache.io_configs;
|
||||||
|
|
||||||
if (debug_io_config) {
|
if (debug_io_config) {
|
||||||
@ -1182,7 +1195,38 @@ AUPlugin::render_callback(AudioUnitRenderActionFlags*,
|
|||||||
UInt32 inNumberFrames,
|
UInt32 inNumberFrames,
|
||||||
AudioBufferList* ioData)
|
AudioBufferList* ioData)
|
||||||
{
|
{
|
||||||
/* not much to do - the data is already in the buffers given to us in connect_and_run() */
|
if (_has_midi_input) {
|
||||||
|
assert (current_buffers->count().n_midi() > 0);
|
||||||
|
|
||||||
|
/* deliver the first (and assumed only) MIDI buffer's data
|
||||||
|
to the plugin
|
||||||
|
*/
|
||||||
|
|
||||||
|
MidiBuffer& mb (current_buffers->get_midi(0));
|
||||||
|
|
||||||
|
for (MidiBuffer::iterator i = mb.begin(); i != mb.end(); ++i) {
|
||||||
|
Evoral::MIDIEvent<MidiBuffer::TimeType> ev = *i;
|
||||||
|
switch (ev.type()) {
|
||||||
|
case MIDI_CMD_NOTE_ON:
|
||||||
|
case MIDI_CMD_NOTE_OFF:
|
||||||
|
case MIDI_CMD_CONTROL:
|
||||||
|
case MIDI_CMD_BENDER:
|
||||||
|
case MIDI_CMD_PGM_CHANGE:
|
||||||
|
case MIDI_CMD_CHANNEL_PRESSURE:
|
||||||
|
{
|
||||||
|
const uint8_t* b = ev.buffer();
|
||||||
|
unit->MIDIEvent (b[0], b[1], b[2], ev.time());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* plugins do not get other stuff by default */
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* not much to do with audio - the data is already in the buffers given to us in connect_and_run() */
|
||||||
|
|
||||||
if (current_maxbuf == 0) {
|
if (current_maxbuf == 0) {
|
||||||
error << _("AUPlugin: render callback called illegally!") << endmsg;
|
error << _("AUPlugin: render callback called illegally!") << endmsg;
|
||||||
@ -2039,6 +2083,7 @@ AUPluginInfo::discover ()
|
|||||||
discover_fx (*plugs);
|
discover_fx (*plugs);
|
||||||
discover_music (*plugs);
|
discover_music (*plugs);
|
||||||
discover_generators (*plugs);
|
discover_generators (*plugs);
|
||||||
|
discover_instruments (*plugs);
|
||||||
|
|
||||||
return plugs;
|
return plugs;
|
||||||
}
|
}
|
||||||
@ -2082,6 +2127,19 @@ AUPluginInfo::discover_generators (PluginInfoList& plugs)
|
|||||||
discover_by_description (plugs, desc);
|
discover_by_description (plugs, desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
AUPluginInfo::discover_instruments (PluginInfoList& plugs)
|
||||||
|
{
|
||||||
|
CAComponentDescription desc;
|
||||||
|
desc.componentFlags = 0;
|
||||||
|
desc.componentFlagsMask = 0;
|
||||||
|
desc.componentSubType = 0;
|
||||||
|
desc.componentManufacturer = 0;
|
||||||
|
desc.componentType = kAudioUnitType_MusicDevice;
|
||||||
|
|
||||||
|
discover_by_description (plugs, desc);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescription& desc)
|
AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescription& desc)
|
||||||
{
|
{
|
||||||
@ -2466,3 +2524,32 @@ AUPluginInfo::stringify_descriptor (const CAComponentDescription& desc)
|
|||||||
return s.str();
|
return s.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
AUPluginInfo::needs_midi_input ()
|
||||||
|
{
|
||||||
|
return is_effect_with_midi_input () || is_instrument ();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
AUPluginInfo::is_effect () const
|
||||||
|
{
|
||||||
|
return is_effect_without_midi_input() || is_effect_with_midi_input();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
AUPluginInfo::is_effect_without_midi_input () const
|
||||||
|
{
|
||||||
|
return descriptor->IsAUFX();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
AUPluginInfo::is_effect_with_midi_input () const
|
||||||
|
{
|
||||||
|
return descriptor->IsAUFM();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
AUPluginInfo::is_instrument () const
|
||||||
|
{
|
||||||
|
return descriptor->IsMusicDevice();
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user