13
0

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:
Paul Davis 2010-11-15 19:54:23 +00:00
parent 27be3234f5
commit 90172686b9
2 changed files with 97 additions and 1 deletions

View File

@ -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 ();

View File

@ -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();
}