Vapor: Prototype LV2 export extension
This commit is contained in:
parent
9cc966120c
commit
ec32d22cb3
@ -54,6 +54,9 @@ public:
|
|||||||
std::string range_id () const { return _range_id; }
|
std::string range_id () const { return _range_id; }
|
||||||
void set_range_id (std::string range_id) { _range_id = range_id; }
|
void set_range_id (std::string range_id) { _range_id = range_id; }
|
||||||
|
|
||||||
|
std::string vapor () const { return _vapor; }
|
||||||
|
void set_vapor (std::string vapor) { _vapor = vapor; }
|
||||||
|
|
||||||
bool realtime () const { return _realtime; }
|
bool realtime () const { return _realtime; }
|
||||||
void set_realtime (bool rt) { _realtime = rt; }
|
void set_realtime (bool rt) { _realtime = rt; }
|
||||||
|
|
||||||
@ -80,8 +83,8 @@ private:
|
|||||||
|
|
||||||
std::string _name;
|
std::string _name;
|
||||||
std::string _range_id;
|
std::string _range_id;
|
||||||
|
std::string _vapor;
|
||||||
bool _realtime;
|
bool _realtime;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ARDOUR
|
} // namespace ARDOUR
|
||||||
|
@ -19,8 +19,10 @@
|
|||||||
|
|
||||||
#ifdef HAVE_LV2_1_18_6
|
#ifdef HAVE_LV2_1_18_6
|
||||||
#include <lv2/core/lv2.h>
|
#include <lv2/core/lv2.h>
|
||||||
|
#include <lv2/options/options.h>
|
||||||
#else
|
#else
|
||||||
#include <lv2/lv2plug.in/ns/lv2core/lv2.h>
|
#include <lv2/lv2plug.in/ns/lv2core/lv2.h>
|
||||||
|
#include <lv2/lv2plug.in/ns/ext/options/options.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -280,6 +282,31 @@ typedef struct {
|
|||||||
void (*notify)(LV2_BankPatch_Handle handle, uint8_t channel, uint32_t bank, uint8_t pgm);
|
void (*notify)(LV2_BankPatch_Handle handle, uint8_t channel, uint32_t bank, uint8_t pgm);
|
||||||
} LV2_BankPatch;
|
} LV2_BankPatch;
|
||||||
|
|
||||||
|
/**
|
||||||
|
@}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
@defgroup lv2 export Extension
|
||||||
|
|
||||||
|
Notify plugin to write data to disk
|
||||||
|
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define LV2_EXPORT_URI "http://ardour.org/lv2/export"
|
||||||
|
#define LV2_EXPORT_PREFIX LV2_EXPORT_URI "#"
|
||||||
|
#define LV2_EXPORT__interface LV2_EXPORT_PREFIX "interface"
|
||||||
|
|
||||||
|
/** Export interface */
|
||||||
|
typedef struct {
|
||||||
|
/** .. */
|
||||||
|
int (*setup)(LV2_Handle, const char*, LV2_Options_Option const*);
|
||||||
|
/** .. */
|
||||||
|
int (*finalize)(LV2_Handle);
|
||||||
|
} LV2_Export_Interface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@}
|
@}
|
||||||
*/
|
*/
|
||||||
|
@ -93,6 +93,12 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
|
|||||||
|
|
||||||
const void* extension_data (const char* uri) const;
|
const void* extension_data (const char* uri) const;
|
||||||
|
|
||||||
|
#ifdef LV2_EXTENDED
|
||||||
|
int setup_export (const char*);
|
||||||
|
int finalize_export ();
|
||||||
|
bool can_export () const { return _export_interface; }
|
||||||
|
#endif
|
||||||
|
|
||||||
const void* c_plugin();
|
const void* c_plugin();
|
||||||
const void* c_ui();
|
const void* c_ui();
|
||||||
const void* c_ui_type();
|
const void* c_ui_type();
|
||||||
@ -312,9 +318,10 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
|
|||||||
static void midnam_update (LV2_Midnam_Handle);
|
static void midnam_update (LV2_Midnam_Handle);
|
||||||
static void bankpatch_notify (LV2_BankPatch_Handle, uint8_t, uint32_t, uint8_t);
|
static void bankpatch_notify (LV2_BankPatch_Handle, uint8_t, uint32_t, uint8_t);
|
||||||
|
|
||||||
const LV2_Inline_Display_Interface* _display_interface;
|
|
||||||
bool _inline_display_in_gui;
|
bool _inline_display_in_gui;
|
||||||
const LV2_Midnam_Interface* _midname_interface;
|
const LV2_Inline_Display_Interface* _display_interface;
|
||||||
|
const LV2_Midnam_Interface* _midname_interface;
|
||||||
|
const LV2_Export_Interface* _export_interface;
|
||||||
|
|
||||||
uint32_t _bankpatch[16];
|
uint32_t _bankpatch[16];
|
||||||
bool seen_bankpatch;
|
bool seen_bankpatch;
|
||||||
|
@ -113,6 +113,8 @@ public:
|
|||||||
uint32_t surr_ChannelCount;
|
uint32_t surr_ChannelCount;
|
||||||
uint32_t surr_DownmixMode;
|
uint32_t surr_DownmixMode;
|
||||||
uint32_t surr_WarpMode;
|
uint32_t surr_WarpMode;
|
||||||
|
uint32_t surr_ExportStart;
|
||||||
|
uint32_t surr_ExportStop;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -276,6 +276,11 @@ ExportGraphBuilder::add_config (FileSpec const & config, bool rt)
|
|||||||
|
|
||||||
_realtime = rt;
|
_realtime = rt;
|
||||||
|
|
||||||
|
if (!timespan->vapor().empty()) {
|
||||||
|
/* plugin export needs no actual channels */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* If the sample rate is "session rate", change it to the real value.
|
/* If the sample rate is "session rate", change it to the real value.
|
||||||
* However, we need to copy it to not change the config which is saved...
|
* However, we need to copy it to not change the config which is saved...
|
||||||
*/
|
*/
|
||||||
@ -609,7 +614,7 @@ ExportGraphBuilder::SFC::SFC (ExportGraphBuilder &parent, FileSpec const & new_c
|
|||||||
|
|
||||||
if (config.format->format_id() == ExportFormatBase::F_None) {
|
if (config.format->format_id() == ExportFormatBase::F_None) {
|
||||||
/* do not encode result, stop after chunker/analyzer */
|
/* do not encode result, stop after chunker/analyzer */
|
||||||
assert (_analyse);
|
assert (_analyse || !parent.timespan->vapor().empty());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,6 +237,7 @@ public:
|
|||||||
LilvNode* inline_display_interface; // lv2:extensionData
|
LilvNode* inline_display_interface; // lv2:extensionData
|
||||||
LilvNode* inline_display_in_gui; // lv2:optionalFeature
|
LilvNode* inline_display_in_gui; // lv2:optionalFeature
|
||||||
LilvNode* inline_mixer_control; // lv2:PortProperty
|
LilvNode* inline_mixer_control; // lv2:PortProperty
|
||||||
|
LilvNode* export_interface; // lv2:extensionData
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -521,6 +522,7 @@ LV2Plugin::init(const void* c_plugin, samplecnt_t rate)
|
|||||||
_can_write_automation = false;
|
_can_write_automation = false;
|
||||||
#ifdef LV2_EXTENDED
|
#ifdef LV2_EXTENDED
|
||||||
_display_interface = 0;
|
_display_interface = 0;
|
||||||
|
_export_interface = 0;
|
||||||
_inline_display_in_gui = false;
|
_inline_display_in_gui = false;
|
||||||
#endif
|
#endif
|
||||||
_max_latency = 0;
|
_max_latency = 0;
|
||||||
@ -761,6 +763,9 @@ LV2Plugin::init(const void* c_plugin, samplecnt_t rate)
|
|||||||
if (lilv_nodes_contains (optional_features, _world.inline_display_in_gui)) {
|
if (lilv_nodes_contains (optional_features, _world.inline_display_in_gui)) {
|
||||||
_inline_display_in_gui = true;
|
_inline_display_in_gui = true;
|
||||||
}
|
}
|
||||||
|
if (lilv_plugin_has_extension_data(plugin, _world.export_interface)) {
|
||||||
|
_export_interface = (const LV2_Export_Interface*) extension_data (LV2_EXPORT__interface);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
lilv_nodes_free(optional_features);
|
lilv_nodes_free(optional_features);
|
||||||
|
|
||||||
@ -1209,6 +1214,25 @@ LV2Plugin::midnam_model () {
|
|||||||
_midname_interface->free (model);
|
_midname_interface->free (model);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
LV2Plugin::setup_export (const char* fn)
|
||||||
|
{
|
||||||
|
if (!_export_interface) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return _export_interface->setup ((void*)_impl->instance->lv2_handle, fn, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
LV2Plugin::finalize_export ()
|
||||||
|
{
|
||||||
|
if (!_export_interface) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return _export_interface->finalize ((void*)_impl->instance->lv2_handle);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
string
|
string
|
||||||
@ -3523,6 +3547,7 @@ LV2World::LV2World()
|
|||||||
inline_display_interface = lilv_new_uri(world, LV2_INLINEDISPLAY__interface);
|
inline_display_interface = lilv_new_uri(world, LV2_INLINEDISPLAY__interface);
|
||||||
inline_display_in_gui = lilv_new_uri(world, LV2_INLINEDISPLAY__in_gui);
|
inline_display_in_gui = lilv_new_uri(world, LV2_INLINEDISPLAY__in_gui);
|
||||||
inline_mixer_control = lilv_new_uri(world, "http://ardour.org/lv2/ext#inlineMixerControl");
|
inline_mixer_control = lilv_new_uri(world, "http://ardour.org/lv2/ext#inlineMixerControl");
|
||||||
|
export_interface = lilv_new_uri(world, LV2_EXPORT__interface);
|
||||||
#endif
|
#endif
|
||||||
bufz_powerOf2BlockLength = lilv_new_uri(world, LV2_BUF_SIZE__powerOf2BlockLength);
|
bufz_powerOf2BlockLength = lilv_new_uri(world, LV2_BUF_SIZE__powerOf2BlockLength);
|
||||||
bufz_fixedBlockLength = lilv_new_uri(world, LV2_BUF_SIZE__fixedBlockLength);
|
bufz_fixedBlockLength = lilv_new_uri(world, LV2_BUF_SIZE__fixedBlockLength);
|
||||||
@ -3551,6 +3576,7 @@ LV2World::~LV2World()
|
|||||||
lilv_node_free(inline_display_interface);
|
lilv_node_free(inline_display_interface);
|
||||||
lilv_node_free(inline_display_in_gui);
|
lilv_node_free(inline_display_in_gui);
|
||||||
lilv_node_free(inline_mixer_control);
|
lilv_node_free(inline_mixer_control);
|
||||||
|
lilv_node_free(export_interface);
|
||||||
#endif
|
#endif
|
||||||
lilv_node_free(patch_Message);
|
lilv_node_free(patch_Message);
|
||||||
lilv_node_free(opts_requiredOptions);
|
lilv_node_free(opts_requiredOptions);
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <glibmm.h>
|
#include <glibmm.h>
|
||||||
|
|
||||||
#include "ardour/export_channel_configuration.h"
|
#include "ardour/export_channel_configuration.h"
|
||||||
|
#include "ardour/export_format_specification.h"
|
||||||
#include "ardour/export_filename.h"
|
#include "ardour/export_filename.h"
|
||||||
#include "ardour/export_preset.h"
|
#include "ardour/export_preset.h"
|
||||||
#include "ardour/export_profile_manager.h"
|
#include "ardour/export_profile_manager.h"
|
||||||
@ -189,11 +190,20 @@ SimpleExport::run_export ()
|
|||||||
assert (!fns.empty ());
|
assert (!fns.empty ());
|
||||||
|
|
||||||
auto fms = _manager->get_formats ();
|
auto fms = _manager->get_formats ();
|
||||||
for (auto const& fm : fms) {
|
if (ts.front ()->timespans->front ()->vapor().empty ()) {
|
||||||
for (auto const& fn : fns) {
|
for (auto const& fm : fms) {
|
||||||
fn->filename->set_folder (_folder);
|
for (auto const& fn : fns) {
|
||||||
fn->filename->set_timespan (ts.front ()->timespans->front ());
|
fn->filename->set_folder (_folder);
|
||||||
info << string_compose (_("Exporting: '%1'"), fn->filename->get_path (fm->format)) << endmsg;
|
fn->filename->set_timespan (ts.front ()->timespans->front ());
|
||||||
|
info << string_compose (_("Exporting: '%1'"), fn->filename->get_path (fm->format)) << endmsg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (auto const& fm : fms) {
|
||||||
|
std::shared_ptr<ExportFormatSpecification> fmp = fm->format;
|
||||||
|
fmp->set_format_id (ExportFormatBase::F_None);
|
||||||
|
fmp->set_type (ExportFormatBase::T_None);
|
||||||
|
fmp->set_analyse (false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,6 +90,8 @@ URIMap::URIDs::init(URIMap& uri_map)
|
|||||||
surr_ChannelCount = uri_map.uri_to_id("urn:ardour:a-vapor#ChannelCount");
|
surr_ChannelCount = uri_map.uri_to_id("urn:ardour:a-vapor#ChannelCount");
|
||||||
surr_DownmixMode = uri_map.uri_to_id("urn:ardour:a-vapor#DownmixMode");
|
surr_DownmixMode = uri_map.uri_to_id("urn:ardour:a-vapor#DownmixMode");
|
||||||
surr_WarpMode = uri_map.uri_to_id("urn:ardour:a-vapor#WarpMode");
|
surr_WarpMode = uri_map.uri_to_id("urn:ardour:a-vapor#WarpMode");
|
||||||
|
surr_ExportStart = uri_map.uri_to_id("urn:ardour:a-vapor#ExportStart");
|
||||||
|
surr_ExportStop = uri_map.uri_to_id("urn:ardour:a-vapor#ExportStop");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user