resolve merge with master (?)

This commit is contained in:
Paul Davis 2013-11-26 10:24:51 -05:00
commit 08371ae2cf
92 changed files with 29015 additions and 64536 deletions

View file

@ -722,7 +722,7 @@ int
ARDOUR_UI::starting ()
{
Application* app = Application::instance ();
char *nsm_url;
const char *nsm_url;
bool brand_new_user = ArdourStartup::required ();
app->ShouldQuit.connect (sigc::mem_fun (*this, &ARDOUR_UI::queue_finish));
@ -734,9 +734,17 @@ ARDOUR_UI::starting ()
app->ready ();
nsm_url = getenv ("NSM_URL");
/* we need to create this early because it may need to set the
* audio backend end up.
*/
if (nsm_url) {
try {
audio_midi_setup.get (true);
} catch (...) {
return -1;
}
if ((nsm_url = g_getenv ("NSM_URL")) != 0) {
nsm = new NSM_Client;
if (!nsm->init (nsm_url)) {
nsm->announce (PROGRAM_NAME, ":dirty:", "ardour3");
@ -746,19 +754,33 @@ ARDOUR_UI::starting ()
for ( i = 0; i < 5000; ++i) {
nsm->check ();
usleep (i);
if (nsm->is_active())
if (nsm->is_active()) {
break;
}
}
if (i == 5000) {
error << _("NSM server did not announce itself") << endmsg;
return -1;
}
// wait for open command from nsm server
for ( i = 0; i < 5000; ++i) {
nsm->check ();
usleep (1000);
if (nsm->client_id ())
if (nsm->client_id ()) {
break;
}
}
if (i == 5000) {
error << _("NSM: no client ID provided") << endmsg;
return -1;
}
if (_session && nsm) {
_session->set_nsm_state( nsm->is_active() );
} else {
error << _("NSM: no session created") << endmsg;
return -1;
}
// nsm requires these actions disabled
@ -777,10 +799,11 @@ ARDOUR_UI::starting ()
}
}
}
else {
} else {
delete nsm;
nsm = 0;
error << _("NSM: initialization failed") << endmsg;
return -1;
}
} else {
@ -798,16 +821,6 @@ ARDOUR_UI::starting ()
}
}
/* we need to create this early because it may need to set the
* audio backend end up.
*/
try {
audio_midi_setup.get (true);
} catch (...) {
return -1;
}
/* go get a session */
const bool new_session_required = (ARDOUR_COMMAND_LINE::new_session || brand_new_user);
@ -3226,6 +3239,57 @@ ARDOUR_UI::flush_trash ()
display_cleanup_results (rep, _("deleted file"), true);
}
void
ARDOUR_UI::setup_order_hint ()
{
uint32_t order_hint = 0;
/*
we want the new routes to have their order keys set starting from
the highest order key in the selection + 1 (if available).
*/
if (add_route_dialog->get_transient_for () == mixer->get_toplevel()) {
for (RouteUISelection::iterator s = mixer->selection().routes.begin(); s != mixer->selection().routes.end(); ++s) {
if ((*s)->route()->order_key() > order_hint) {
order_hint = (*s)->route()->order_key();
}
}
if (!mixer->selection().routes.empty()) {
order_hint++;
}
} else {
for (TrackSelection::iterator s = editor->get_selection().tracks.begin(); s != editor->get_selection().tracks.end(); ++s) {
RouteTimeAxisView* tav = dynamic_cast<RouteTimeAxisView*> (*s);
if (tav->route()->order_key() > order_hint) {
order_hint = tav->route()->order_key();
}
}
if (!editor->get_selection().tracks.empty()) {
order_hint++;
}
}
_session->set_order_hint (order_hint);
/* create a gap in the existing route order keys to accomodate new routes.*/
boost::shared_ptr <RouteList> rd = _session->get_routes();
for (RouteList::iterator ri = rd->begin(); ri != rd->end(); ++ri) {
boost::shared_ptr<Route> rt (*ri);
if (rt->is_monitor()) {
continue;
}
if (rt->order_key () >= order_hint) {
rt->set_order_key (rt->order_key () + add_route_dialog->count());
}
}
}
void
ARDOUR_UI::add_route (Gtk::Window* float_window)
{
@ -3241,6 +3305,7 @@ ARDOUR_UI::add_route (Gtk::Window* float_window)
}
if (float_window) {
add_route_dialog->unset_transient_for ();
add_route_dialog->set_transient_for (*float_window);
}
@ -3260,6 +3325,8 @@ ARDOUR_UI::add_route (Gtk::Window* float_window)
return;
}
setup_order_hint();
PBD::ScopedConnection idle_connection;
if (count > 8) {

View file

@ -582,6 +582,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
void snapshot_session (bool switch_to_it);
void rename_session ();
void setup_order_hint ();
Mixer_UI *mixer;
int create_mixer ();

View file

@ -339,7 +339,7 @@ ARDOUR_UI::goto_mixer_window ()
screen = Gdk::Screen::get_default();
}
if (screen && screen->get_height() < 700) {
if (g_getenv ("ARDOUR_LOVES_STUPID_TINY_SCREENS") == 0 && screen && screen->get_height() < 700) {
Gtk::MessageDialog msg (_("This screen is not tall enough to display the mixer window"));
msg.run ();
return;

View file

@ -75,14 +75,6 @@ set_language_preference ()
{
gtk_disable_setlocale ();
if (g_getenv ("LANGUAGE") || g_getenv ("LC_ALL") || g_getenv ("LANG")) {
return;
}
if (g_getenv ("ARDOUR_EN")) {
return;
}
/* the gettext manual is potentially misleading about the utility of
LANGUAGE. It notes that if LANGUAGE is set to include a dialect/region-free
language code, like "it", it will assume that you mean the main

View file

@ -1085,6 +1085,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
bool button_press_handler_1 (ArdourCanvas::Item *, GdkEvent *, ItemType);
bool button_press_handler_2 (ArdourCanvas::Item *, GdkEvent *, ItemType);
bool button_release_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
bool button_double_click_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
bool button_press_dispatch (GdkEventButton*);
bool button_release_dispatch (GdkEventButton*);
bool motion_handler (ArdourCanvas::Item*, GdkEvent*, bool from_autoscroll = false);
@ -1523,6 +1524,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void marker_menu_edit ();
void marker_menu_remove ();
void marker_menu_rename ();
void rename_marker (Marker *marker);
void toggle_marker_menu_lock ();
void toggle_marker_menu_glue ();
void marker_menu_hide ();

View file

@ -1338,12 +1338,23 @@ Editor::marker_menu_rename ()
/*NOTREACHED*/
}
rename_marker (marker);
}
void
Editor::rename_marker(Marker *marker)
{
Location* loc;
bool is_start;
loc = find_location_from_marker (marker, is_start);
if (!loc) return;
if (!loc)
return;
if (loc == transport_loop_location() || loc == transport_punch_location() || loc->is_session_range())
return;
ArdourPrompter dialog (true);
string txt;
@ -1378,6 +1389,7 @@ Editor::marker_menu_rename ()
dialog.get_result(txt);
loc->set_name (txt);
_session->set_dirty ();
XMLNode &after = _session->locations()->get_state();
_session->add_command (new MementoCommand<Locations>(*(_session->locations()), &before, &after));

View file

@ -86,7 +86,7 @@ Editor::show_editor_mixer (bool yn)
screen = Gdk::Screen::get_default();
}
if (screen && screen->get_height() < 700) {
if (g_getenv ("ARDOUR_LOVES_STUPID_TINY_SCREENS") == 0 && screen && screen->get_height() < 700) {
Gtk::MessageDialog msg (_("This screen is not tall enough to display the editor mixer"));
msg.run ();
return;

View file

@ -1269,6 +1269,10 @@ bool
Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type)
{
if (event->type != GDK_BUTTON_PRESS) {
if (event->type == GDK_2BUTTON_PRESS) {
gdk_pointer_ungrab (GDK_CURRENT_TIME);
return button_double_click_handler (item, event, item_type);
}
return false;
}
@ -1392,6 +1396,52 @@ Editor::button_release_dispatch (GdkEventButton* ev)
return button_bindings->activate (b, Gtkmm2ext::Bindings::Release);
}
bool
Editor::button_double_click_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type) {
if (event->button.button != 1) {
return false;
}
switch (item_type) {
case RegionItem:
RegionView *rv;
rv = clicked_regionview;
rv->show_region_editor ();
return true;
case NoteItem:
case PlayheadCursorItem:
break;
case MarkerItem:
case RangeMarkerBarItem:
case CdMarkerBarItem:
Marker* marker;
if ((marker = static_cast<Marker *> (item->get_data ("marker"))) == 0) {
break;
}
rename_marker (marker);
return true;
case TempoMarkerItem:
edit_tempo_marker (item);
return true;
case MeterMarkerItem:
edit_meter_marker (item);
return true;
case MarkerBarItem:
case TempoBarItem:
case MeterBarItem:
case TransportMarkerBarItem:
case StreamItem:
break;
default:
break;
}
return false;
}
bool
Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type)
{

View file

@ -600,9 +600,24 @@ EditorRoutes::active_changed (std::string const & path)
void
EditorRoutes::routes_added (list<RouteTimeAxisView*> routes)
{
TreeModel::Row row;
PBD::Unwinder<bool> at (_adding_routes, true);
bool from_scratch = (_model->children().size() == 0);
Gtk::TreeModel::Children::iterator insert_iter = _model->children().end();
for (Gtk::TreeModel::Children::iterator it = _model->children().begin(); it != _model->children().end(); ++it) {
boost::shared_ptr<Route> r = (*it)[_columns.route];
if (r->order_key() == (routes.front()->route()->order_key() + routes.size())) {
insert_iter = it;
break;
}
}
if(!from_scratch) {
_editor->selection->tracks.clear();
}
suspend_redisplay ();
_display.set_model (Glib::RefPtr<ListStore>());
@ -611,7 +626,7 @@ EditorRoutes::routes_added (list<RouteTimeAxisView*> routes)
boost::shared_ptr<MidiTrack> midi_trk = boost::dynamic_pointer_cast<MidiTrack> ((*x)->route());
row = *(_model->append ());
TreeModel::Row row = *(_model->insert (insert_iter));
row[_columns.text] = (*x)->route()->name();
row[_columns.visible] = (*x)->marked_for_display();
@ -635,6 +650,10 @@ EditorRoutes::routes_added (list<RouteTimeAxisView*> routes)
row[_columns.solo_safe_state] = (*x)->route()->solo_safe();
row[_columns.name_editable] = true;
if (!from_scratch) {
_editor->selection->add(*x);
}
boost::weak_ptr<Route> wr ((*x)->route());
(*x)->route()->gui_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::handle_gui_changes, this, _1, _2), gui_context());

View file

@ -45,7 +45,7 @@
#include "ardour/stretch.h"
#ifdef USE_RUBBERBAND
#include "rubberband/RubberBandStretcher.h"
#include <rubberband/RubberBandStretcher.h>
using namespace RubberBand;
#endif

View file

@ -478,12 +478,12 @@ void
LV2PluginUI::on_window_hide()
{
//printf("LV2PluginUI::on_window_hide\n");
_message_update_connection.disconnect();
if (_lv2->is_external_ui()) {
if (!_external_ui_ptr) { return; }
LV2_EXTERNAL_UI_HIDE(_external_ui_ptr);
if (!_lv2->is_external_kx()) { return ; }
_message_update_connection.disconnect();
_screen_update_connection.disconnect();
_external_ui_ptr = NULL;
suil_instance_free((SuilInstance*)_inst);

View file

@ -313,6 +313,22 @@ Mixer_UI::hide_window (GdkEventAny *ev)
void
Mixer_UI::add_strips (RouteList& routes)
{
bool from_scratch = track_model->children().size() == 0;
Gtk::TreeModel::Children::iterator insert_iter = track_model->children().end();
for (Gtk::TreeModel::Children::iterator it = track_model->children().begin(); it != track_model->children().end(); ++it) {
boost::shared_ptr<Route> r = (*it)[track_columns.route];
if (r->order_key() == (routes.front()->order_key() + routes.size())) {
insert_iter = it;
break;
}
}
if(!from_scratch) {
_selection.clear_routes ();
}
MixerStrip* strip;
try {
@ -359,12 +375,16 @@ Mixer_UI::add_strips (RouteList& routes)
show_strip (strip);
TreeModel::Row row = *(track_model->append());
TreeModel::Row row = *(track_model->insert(insert_iter));
row[track_columns.text] = route->name();
row[track_columns.visible] = strip->route()->is_master() ? true : strip->marked_for_display();
row[track_columns.route] = route;
row[track_columns.strip] = strip;
if (!from_scratch) {
_selection.add (strip);
}
route->PropertyChanged.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::strip_property_changed, this, _1, strip), gui_context());
strip->WidthChanged.connect (sigc::mem_fun(*this, &Mixer_UI::strip_width_changed));

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -37,7 +37,7 @@
#include "region_selection.h"
#ifdef USE_RUBBERBAND
#include "rubberband/RubberBandStretcher.h"
#include <rubberband/RubberBandStretcher.h>
using namespace RubberBand;
#endif

View file

@ -274,6 +274,8 @@ def configure(conf):
# TODO: Insert a sanity check for on OS X to ensure CoreAudio is present
autowaf.check_pkg(conf, 'fftw3f', uselib_store='FFTW3F',
mandatory=True)
autowaf.check_pkg(conf, 'flac', uselib_store='FLAC',
atleast_version='1.2.1')
autowaf.check_pkg(conf, 'gthread-2.0', uselib_store='GTHREAD',
@ -412,18 +414,24 @@ def build(bld):
obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3')
obj.uselib = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD GTK OGG ALSA CURL DL'
obj.uselib += ' GTKMM GNOMECANVASMM GNOMECANVAS '
obj.uselib += ' GTKMM GNOMECANVASMM GNOMECANVAS FFTW3F'
obj.uselib += ' AUDIOUNITS OSX GTKOSX LO '
obj.use = [ 'libpbd',
'libmidipp',
'libtaglib',
'ardour',
'libardour_cp',
'libgtkmm2ext',
'libtaglib' ]
]
if bld.env['build_target'] == 'mingw':
if bld.env['DEBUG'] == False:
obj.linkflags = ['-mwindows']
if bld.is_defined('USE_EXTERNAL_LIBS'):
obj.uselib += ' TAGLIB'
else:
obj.use.append('libtaglib')
if sys.platform == 'darwin':
obj.use += ' libappleutility'
obj.defines = [

View file

@ -25,7 +25,7 @@
#include <ostream>
#include <fstream>
#include <boost/utility.hpp>
#include "vamp-sdk/Plugin.h"
#include <vamp-sdk/Plugin.h>
#include "ardour/types.h"
namespace ARDOUR {

View file

@ -23,9 +23,9 @@
#include <string>
#include "taglib/tag.h"
#include "taglib/toolkit/taglib.h"
#include "taglib/ogg/xiphcomment.h"
#include <taglib/tag.h>
#include <taglib/taglib.h>
#include <taglib/xiphcomment.h>
namespace ARDOUR
{

View file

@ -51,8 +51,6 @@ class MidiControlUI : public AbstractUI<MidiUIRequest>
static MidiControlUI* instance() { return _instance; }
static BaseUI::RequestType PortChange;
void change_midi_ports ();
protected:
@ -63,7 +61,6 @@ class MidiControlUI : public AbstractUI<MidiUIRequest>
typedef std::list<GSource*> PortSources;
PortSources port_sources;
ARDOUR::Session& _session;
PBD::ScopedConnection rebind_connection;
bool midi_input_handler (Glib::IOCondition, AsyncMIDIPort*);
void reset_ports ();

View file

@ -117,10 +117,11 @@ class PortEngine {
* does not exist, return an empty string.
*/
virtual std::string get_port_name (PortHandle) const = 0;
/** Return a reference to a port with the fullname @param name. Return
* a null pointer if no such port exists.
* an "empty" PortHandle (analogous to a null pointer) if no such port exists.
*/
virtual PortHandle* get_port_by_name (const std::string&) const = 0;
virtual PortHandle get_port_by_name (const std::string&) const = 0;
/** Find the set of ports whose names, types and flags match
* specified values, place the names of each port into @param ports,

View file

@ -36,6 +36,8 @@
#include <glibmm/threads.h>
#include <ltc.h>
#include "pbd/error.h"
#include "pbd/event_loop.h"
#include "pbd/rcu.h"
@ -48,7 +50,6 @@
#include "midi++/types.h"
#include "timecode/time.h"
#include "ltc/ltc.h"
#include "ardour/ardour.h"
#include "ardour/chan_count.h"
@ -241,6 +242,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
bool operator() (boost::shared_ptr<Route>, boost::shared_ptr<Route> b);
};
void set_order_hint (uint32_t order_hint) {_order_hint = order_hint;};
void notify_remote_id_change ();
void sync_order_keys ();
@ -502,7 +504,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
void timecode_time_subframes (framepos_t when, Timecode::Time&);
void timecode_duration (framecnt_t, Timecode::Time&) const;
void timecode_duration_string (char *, framecnt_t) const;
void timecode_duration_string (char *, size_t len, framecnt_t) const;
framecnt_t convert_to_frames (AnyTime const & position);
framecnt_t any_duration_to_frames (framepos_t position, AnyTime const & duration);
@ -1594,6 +1596,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
GraphEdges _current_route_graph;
uint32_t next_control_id () const;
uint32_t _order_hint;
bool ignore_route_processor_changes;
MidiClockTicker* midi_clock;

View file

@ -25,11 +25,11 @@
#include <glibmm/threads.h>
#include <jack/jack.h>
#include <ltc.h>
#include "pbd/signals.h"
#include "timecode/time.h"
#include "ltc/ltc.h"
#include "ardour/types.h"
#include "midi++/parser.h"

View file

@ -19,7 +19,7 @@
#include <cstring>
#include "vamp-hostsdk/PluginLoader.h"
#include <vamp-hostsdk/PluginLoader.h>
#include <glibmm/miscutils.h>
#include <glibmm/fileutils.h>

View file

@ -1063,8 +1063,8 @@ AudioEngine::start_latency_detection ()
/* find the ports we will connect to */
PortEngine::PortHandle* out = pe.get_port_by_name (_latency_output_name);
PortEngine::PortHandle* in = pe.get_port_by_name (_latency_input_name);
PortEngine::PortHandle out = pe.get_port_by_name (_latency_output_name);
PortEngine::PortHandle in = pe.get_port_by_name (_latency_input_name);
if (!out || !in) {
stop (true);

View file

@ -24,12 +24,12 @@
#include "pbd/convert.h"
#include "taglib/fileref.h"
#include "taglib/flac/flacfile.h"
#include "taglib/ogg/oggfile.h"
#include "taglib/tag.h"
#include "taglib/toolkit/taglib.h"
#include "taglib/ogg/xiphcomment.h"
#include <taglib/fileref.h>
#include <taglib/flacfile.h>
#include <taglib/oggfile.h>
#include <taglib/tag.h>
#include <taglib/taglib.h>
#include <taglib/xiphcomment.h>
/* Convert string to TagLib::String */
#define TL_STR(string) TagLib::String ((string).c_str(), TagLib::String::UTF8)

View file

@ -39,7 +39,6 @@ using namespace Glib;
#include "i18n.h"
BaseUI::RequestType MidiControlUI::PortChange = BaseUI::new_request_type();
MidiControlUI* MidiControlUI::_instance = 0;
#include "pbd/abstract_ui.cc" /* instantiate the template */
@ -60,24 +59,7 @@ MidiControlUI::~MidiControlUI ()
void
MidiControlUI::do_request (MidiUIRequest* req)
{
if (req->type == PortChange) {
/* restart event loop with new ports */
DEBUG_TRACE (DEBUG::MidiIO, "reset ports\n");
reset_ports ();
} else if (req->type == CallSlot) {
#ifndef NDEBUG
if (getenv ("DEBUG_THREADED_SIGNALS")) {
cerr << "MIDI UI calls a slot\n";
}
#endif
req->the_slot ();
} else if (req->type == Quit) {
if (req->type == Quit) {
BaseUI::quit ();
}
}
@ -119,19 +101,33 @@ MidiControlUI::clear_ports ()
void
MidiControlUI::reset_ports ()
{
if (port_sources.empty()) {
AsyncMIDIPort* async = dynamic_cast<AsyncMIDIPort*> (_session.midi_input_port());
if (!port_sources.empty()) {
return;
}
if (!async) {
vector<AsyncMIDIPort*> ports;
AsyncMIDIPort* p;
if ((p = dynamic_cast<AsyncMIDIPort*> (_session.midi_input_port()))) {
ports.push_back (p);
}
if ((p = dynamic_cast<AsyncMIDIPort*> (_session.mmc_input_port()))) {
ports.push_back (p);
}
if (ports.empty()) {
return;
}
int fd;
for (vector<AsyncMIDIPort*>::const_iterator pi = ports.begin(); pi != ports.end(); ++pi) {
if ((fd = async->selectable ()) >= 0) {
if ((fd = (*pi)->selectable ()) >= 0) {
Glib::RefPtr<IOSource> psrc = IOSource::create (fd, IO_IN|IO_HUP|IO_ERR);
psrc->connect (sigc::bind (sigc::mem_fun (this, &MidiControlUI::midi_input_handler), async));
psrc->connect (sigc::bind (sigc::mem_fun (this, &MidiControlUI::midi_input_handler), *pi));
psrc->attach (_main_loop->get_context());
// glibmm hack: for now, store only the GSource*

View file

@ -68,11 +68,11 @@ MidiPortManager::create_ports ()
return;
}
_midi_in = AudioEngine::instance()->register_input_port (DataType::MIDI, _("MIDI control in"), true);
_midi_out = AudioEngine::instance()->register_output_port (DataType::MIDI, _("MIDI control out"), true);
_midi_in = AudioEngine::instance()->register_input_port (DataType::MIDI, X_("MIDI control in"), true);
_midi_out = AudioEngine::instance()->register_output_port (DataType::MIDI, X_("MIDI control out"), true);
_mmc_in = AudioEngine::instance()->register_input_port (DataType::MIDI, _("MMC in"), true);
_mmc_out = AudioEngine::instance()->register_output_port (DataType::MIDI, _("MMC out"), true);
_mmc_in = AudioEngine::instance()->register_input_port (DataType::MIDI, X_("MMC in"), true);
_mmc_out = AudioEngine::instance()->register_output_port (DataType::MIDI, X_("MMC out"), true);
/* XXX nasty type conversion needed because of the mixed inheritance
* required to integrate MIDI::IPMidiPort and ARDOUR::AsyncMIDIPort.
@ -93,14 +93,14 @@ MidiPortManager::create_ports ()
boost::shared_ptr<ARDOUR::Port> p;
p = AudioEngine::instance()->register_input_port (DataType::MIDI, _("MTC in"));
p = AudioEngine::instance()->register_input_port (DataType::MIDI, X_("MTC in"));
_mtc_input_port = boost::dynamic_pointer_cast<MidiPort> (p);
p = AudioEngine::instance()->register_output_port (DataType::MIDI, _("MTC out"));
p = AudioEngine::instance()->register_output_port (DataType::MIDI, X_("MTC out"));
_mtc_output_port= boost::dynamic_pointer_cast<MidiPort> (p);
p = AudioEngine::instance()->register_input_port (DataType::MIDI, _("MIDI Clock in"));
p = AudioEngine::instance()->register_input_port (DataType::MIDI, X_("MIDI Clock in"));
_midi_clock_input_port = boost::dynamic_pointer_cast<MidiPort> (p);
p = AudioEngine::instance()->register_output_port (DataType::MIDI, _("MIDI Clock out"));
p = AudioEngine::instance()->register_output_port (DataType::MIDI, X_("MIDI Clock out"));
_midi_clock_output_port= boost::dynamic_pointer_cast<MidiPort> (p);
/* These ports all need their incoming data handled in

File diff suppressed because it is too large Load diff

View file

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-09-26 16:09+0200\n"
"POT-Creation-Date: 2013-11-05 11:11-0500\n"
"PO-Revision-Date: 2013-09-26 16:32+0200\n"
"Last-Translator: Edgar Aichinger <edogawa@aon.at>\n"
"Language-Team: German <ardour-dev@lists.ardour.org>\n"
@ -137,7 +137,7 @@ msgstr "Audio-Wiedergabelisten (unbenutzt)"
#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529
#: midi_playlist_source.cc:144 midi_playlist_source.cc:152
#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643
#: rb_effect.cc:332 session.cc:2606 session.cc:2639 session.cc:3784
#: rb_effect.cc:333 session.cc:2619 session.cc:2652 session.cc:3797
#: session_handle.cc:87 sndfilesource.cc:121
msgid "programming error: %1"
msgstr "Programmierfehler: %1"
@ -206,19 +206,19 @@ msgstr "kann VAMP-Plugin \"%1\" nicht laden"
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr "VAMP-Plugin \"%1\" konnte nicht geladen werden"
#: audioengine.cc:489
#: audioengine.cc:488
msgid "looking for backends in %1\n"
msgstr "Suche nach Backends in %1\n"
#: audioengine.cc:512
#: audioengine.cc:511
msgid "AudioEngine: cannot load module \"%1\" (%2)"
msgstr "AudioEngine: kann Modul \"%1\" nicht laden (%2)"
#: audioengine.cc:518
#: audioengine.cc:517
msgid "AudioEngine: backend at \"%1\" has no descriptor function."
msgstr "AudioEngine: Backend an \"%1\" hat keine Beschreibungsfunktion."
#: audioengine.cc:580
#: audioengine.cc:589
msgid "Could not create backend for %1: %2"
msgstr "Konnte Backend für %1 nicht erzeugen: %2"
@ -272,8 +272,8 @@ msgstr "AudioSource: kann Pfad für Peaks (b) \"%1\" nicht öffnen (%2)"
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
"AudioSource[%1]: peak read - kann %2 Samples bei Offset %3 von %4 nicht "
"lesen(%5)"
"AudioSource[%1]: peak read - kann %2 Samples bei Offset %3 von %4 nicht lesen"
"(%5)"
#: audiosource.cc:667
msgid "%1: could not write read raw data for peak computation (%2)"
@ -423,7 +423,7 @@ msgstr "kann CPU-Takt in /proc/cpuinfo nicht finden"
msgid "audio"
msgstr "Audio"
#: data_type.cc:28 session.cc:1781 session.cc:1784
#: data_type.cc:28 session.cc:1791 session.cc:1794
msgid "MIDI"
msgstr "MIDI"
@ -538,7 +538,7 @@ msgstr "Dreieck"
msgid "Rectangular"
msgstr "Rechteck"
#: export_formats.cc:52 session.cc:5002 session.cc:5018
#: export_formats.cc:52 session.cc:5014 session.cc:5030
msgid "None"
msgstr "Kein"
@ -652,7 +652,7 @@ msgstr ""
"% unterstützt nur %2 Kanäle, in Ihrer Kanalkonfiguration befinden sich "
"jedoch %3 Kanäle"
#: file_source.cc:198 session_state.cc:2813
#: file_source.cc:198 session_state.cc:2807
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr ""
@ -910,15 +910,15 @@ msgstr "%s in"
msgid "%s out"
msgstr "%s out"
#: io.cc:1535 session.cc:676 session.cc:705
#: io.cc:1535 session.cc:686 session.cc:715
msgid "mono"
msgstr "Mono"
#: io.cc:1537 session.cc:689 session.cc:719
#: io.cc:1537 session.cc:699 session.cc:729
msgid "L"
msgstr "L"
#: io.cc:1537 session.cc:691 session.cc:721
#: io.cc:1537 session.cc:701 session.cc:731
msgid "R"
msgstr "R"
@ -1019,7 +1019,7 @@ msgstr ""
msgid "incorrect XML mode passed to Locations::set_state"
msgstr "unkorrekter XML-Modus an Locations::set_state weitergereicht"
#: location.cc:842 session.cc:4503 session_state.cc:1031
#: location.cc:842 session.cc:4516 session_state.cc:1031
msgid "session"
msgstr "Projekt"
@ -1166,38 +1166,6 @@ msgstr "Fehlende Eigenschaft \"state\" bei AutomationState"
msgid "MIDI stretch created non-MIDI source"
msgstr "MIDI Streckung erzeugte Nicht-MIDI Quelle"
#: midiport_manager.cc:71
msgid "MIDI control in"
msgstr "MIDI control in"
#: midiport_manager.cc:72
msgid "MIDI control out"
msgstr "MIDI control out"
#: midiport_manager.cc:74
msgid "MMC in"
msgstr "MMC in"
#: midiport_manager.cc:75
msgid "MMC out"
msgstr "MMC out"
#: midiport_manager.cc:96
msgid "MTC in"
msgstr "MTC in"
#: midiport_manager.cc:98
msgid "MTC out"
msgstr "MTC out"
#: midiport_manager.cc:101
msgid "MIDI Clock in"
msgstr "MIDI Clock in"
#: midiport_manager.cc:103
msgid "MIDI Clock out"
msgstr "MIDI Clock out"
#: monitor_processor.cc:53
msgid "monitor dim"
msgstr "Monitor dämpfen"
@ -1582,39 +1550,43 @@ msgstr "Import: Fehler in src_new() : %1"
msgid "return %1"
msgstr "Rückgabewert: %1"
#: route.cc:1105 route.cc:2581
#: route.cc:1075 route.cc:2528
msgid "unknown Processor type \"%1\"; ignored"
msgstr "unbekannter Prozessortyp \"%1\"; ignoriert"
#: route.cc:1117
#: route.cc:1087
msgid "processor could not be created. Ignored."
msgstr "Prozessor konnte nicht erzeugt werden. Ignoriert."
#: route.cc:2007 route.cc:2234
#: route.cc:1962 route.cc:2187
msgid "Bad node sent to Route::set_state() [%1]"
msgstr "Schlechter Knoten an Route::set_state() gesendet [%1]"
#: route.cc:2067
#: route.cc:2022
msgid "Pannable state found for route (%1) without a panner!"
msgstr "Pannerziel-Status für Route (%1) ohne Panner gefunden!"
#: route.cc:2137 route.cc:2141 route.cc:2348 route.cc:2352
#: route.cc:2096 route.cc:2100 route.cc:2301 route.cc:2305
msgid "badly formed order key string in state file! [%1] ... ignored."
msgstr ""
"schlecht geformte Zeichenkette für den Schlüssel der Sortierreihenfolge in "
"der Projektdatei! [%1] ... ignoriert"
#: route.cc:2311
msgid "Converting deprecated order key for %1 using Editor order %2"
msgstr ""
#: route_group.cc:459
msgid "You cannot subgroup MIDI tracks at this time"
msgstr "MIDI-Spuren können zur Zeit nicht zu Subgruppen zusammengefasst werden"
#: rb_effect.cc:233 rb_effect.cc:274
#: rb_effect.cc:234 rb_effect.cc:275
msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)"
msgstr ""
"tempoize: Fehler beim Lesen der Daten von %1 an %2 (%3 erwünscht, %4 "
"erhalten)"
#: rb_effect.cc:303 rb_effect.cc:325
#: rb_effect.cc:304 rb_effect.cc:326
msgid "error writing tempo-adjusted data to %1"
msgstr "Fehler beim Schreiben der tempo-angepassten Daten nach %1"
@ -1630,98 +1602,82 @@ msgstr "Send %1"
msgid "programming error: send created using role %1"
msgstr "Programmierfehler: Send erzeugt mittels Rolle %1"
#: session.cc:343
#: session.cc:344
msgid "Connect to engine"
msgstr "Verbinde zur Engine"
#: session.cc:348
#: session.cc:349
msgid "Session loading complete"
msgstr "Laden des Projektes abgeschlossen"
#: session.cc:420
#: session.cc:421
msgid "Set up LTC"
msgstr "LTC einrichten"
#: session.cc:422
#: session.cc:423
msgid "Set up Click"
msgstr "Klick einrichten"
#: session.cc:424
#: session.cc:425
msgid "Set up standard connections"
msgstr "Richte Standard-Verbindungen ein"
#: session.cc:561
msgid "LTC In"
msgstr "LTC In"
#: session.cc:562
msgid "LTC Out"
msgstr "LTC Out"
#: session.cc:588
msgid "LTC-in"
msgstr "LTC-in"
#: session.cc:589
msgid "LTC-out"
msgstr "LTC-out"
#: session.cc:625
#: session.cc:635
msgid "could not setup Click I/O"
msgstr "konnte Metronom-E/A nicht einrichten"
#: session.cc:673
#: session.cc:683
#, c-format
msgid "out %<PRIu32>"
msgstr "out %<PRIu32>"
#: session.cc:687
#: session.cc:697
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr "out %<PRIu32>+%<PRIu32>"
#: session.cc:702
#: session.cc:712
#, c-format
msgid "in %<PRIu32>"
msgstr "in %<PRIu32>"
#: session.cc:716
#: session.cc:726
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr "in %<PRIu32>+%<PRIu32>"
#: session.cc:780
#: session.cc:790
msgid "cannot connect master output %1 to %2"
msgstr "kann Master-Ausgang %1 nicht mit %2 verbinden"
#: session.cc:839
#: session.cc:849
msgid "monitor"
msgstr "Monitor"
#: session.cc:884
#: session.cc:894
msgid "cannot connect control input %1 to %2"
msgstr "kann Kontrolleingang %1 nicht mit %2 verbinden"
#: session.cc:904
#: session.cc:914
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr "Bevorzugte E/A für den Monitorbus (%1) kann nicht gefunden werden"
#: session.cc:935
#: session.cc:945
msgid "cannot connect control output %1 to %2"
msgstr "kann Kontrollausgang %1 nicht mit %2 verbinden"
#: session.cc:999
#: session.cc:1009
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr ""
"Kann das Vorhör-System nicht einrichten: kein Vorhören von Regionen möglich"
#: session.cc:1183
#: session.cc:1193
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
"Session: Sie können diese Position nicht für Auto-Punch verwenden (Start <= "
"Ende) "
#: session.cc:1223
#: session.cc:1233
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
@ -1729,15 +1685,15 @@ msgstr ""
"Sie können diese Position nicht für \"automatische Schleife\" verwenden, da "
"sie keine oder eine negative Länge hat"
#: session.cc:1537
#: session.cc:1547
msgid "feedback loop setup between %1 and %2"
msgstr "Feedbackschleife zwischen %1 und %2 erkannt"
#: session.cc:1833
#: session.cc:1843
msgid "Session: could not create new midi track."
msgstr "Session: konnte keine neue MIDI-Spur erzeugen."
#: session.cc:1839
#: session.cc:1849
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
@ -1745,76 +1701,76 @@ msgstr ""
"Keine JACK-Ports mehr verfügbar. Wenn Sie so viele Spuren benötigen, müssen "
"Sie %1 stoppen und JACK mit mehr Ports neu starten."
#: session.cc:2016 session.cc:2019
#: session.cc:2026 session.cc:2029
msgid "Audio"
msgstr "Audio"
#: session.cc:2043 session.cc:2051 session.cc:2128 session.cc:2136
#: session.cc:2053 session.cc:2061 session.cc:2138 session.cc:2146
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr "kann %1 ein/%2 aus für neue Audiospur nicht konfigurieren"
#: session.cc:2074
#: session.cc:2084
msgid "Session: could not create new audio track."
msgstr "Session: konnte keine neue Audios.pur erzeugen"
#: session.cc:2106 session.cc:2109
#: session.cc:2116 session.cc:2119
msgid "Bus"
msgstr "Bus"
#: session.cc:2159
#: session.cc:2169
msgid "Session: could not create new audio route."
msgstr "Session: konnte keine neueAudio-Route erzeugen"
#: session.cc:2218 session.cc:2228
#: session.cc:2228 session.cc:2238
msgid "Session: UINT_MAX routes? impossible!"
msgstr "Session: UINT_MAX Routen? unmöglich!"
#: session.cc:2250
#: session.cc:2260
msgid "Session: cannot create track/bus from template description"
msgstr "Session: Kann die Route aus der Vorlagenbeschreibung nicht erzeugen"
#: session.cc:2276
#: session.cc:2286
msgid "Session: could not create new route from template"
msgstr "Session: konnte keine neue Route aus der Vorlage erzeugen."
#: session.cc:2305
#: session.cc:2315
msgid "Adding new tracks/busses failed"
msgstr "Fehler beim Hinzufügen neuer Spuren/Busse"
#: session.cc:3406
#: session.cc:3419
msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename"
msgstr ""
"FATALER FEHLER! Konnte keine passende Version von %1 zum Umbenennen finden"
#: session.cc:3526 session.cc:3584
#: session.cc:3539 session.cc:3597
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr "Es gibt bereits %1 Aufnahmen für %2, was ich als zu viele erachte."
#: session.cc:3974
#: session.cc:3987
msgid "send ID %1 appears to be in use already"
msgstr "Send ID %1 ist offenbar schon in Gebrauch"
#: session.cc:3986
#: session.cc:3999
msgid "aux send ID %1 appears to be in use already"
msgstr "Aux-Send ID %1 ist offenbar schon in Gebrauch"
#: session.cc:3998
#: session.cc:4011
msgid "return ID %1 appears to be in use already"
msgstr "Return ID %1 ist offenbar schon in Gebrauch"
#: session.cc:4010
#: session.cc:4023
msgid "insert ID %1 appears to be in use already"
msgstr "Insert ID %1 ist offenbar schon in Gebrauch"
#: session.cc:4137
#: session.cc:4150
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr "Kann einen Bereich mit Ende <= Start nicht schreiben (z.B. %1 <= %2)"
#: session.cc:4166
#: session.cc:4179
msgid "too many bounced versions of playlist \"%1\""
msgstr "zu viele gebouncete Versionen der Wiedergabeliste \"%1\""
#: session.cc:4176
#: session.cc:4189
msgid "cannot create new audio file \"%1\" for %2"
msgstr "kann keine neue Audiodatei \"%1\" für %2 erzeugen"
@ -2072,55 +2028,55 @@ msgstr "Session: XML hat keinen Abschnitt \"mix groups\""
msgid "Session: XML state has no click section"
msgstr "Session: XML hat keinen Abschnitt \"click\""
#: session_state.cc:1366
#: session_state.cc:1360
msgid "Session: cannot create Route from XML description."
msgstr "Session: Kann die Route aus der XML-Beschreibung nicht erzeugen"
#: session_state.cc:1370
#: session_state.cc:1364
msgid "Loaded track/bus %1"
msgstr "Spur/Bus %1 wurde geladen"
#: session_state.cc:1468
#: session_state.cc:1462
msgid "Could not find diskstream for route"
msgstr "Konnte Diskstream für Route nicht finden"
#: session_state.cc:1522
#: session_state.cc:1516
msgid "Session: cannot create Region from XML description."
msgstr "Session: kann Region nicht aus XML-Beschreibung erzeugen"
#: session_state.cc:1526
#: session_state.cc:1520
msgid "Can not load state for region '%1'"
msgstr "Kann Status für Region '%1' nicht laden"
#: session_state.cc:1562
#: session_state.cc:1556
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr ""
"Regionen der Verbindungsbeschreibung nicht gefunden (IDs %1 and %2): "
"ignoriert"
#: session_state.cc:1590
#: session_state.cc:1584
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
"Verschachtelte Quelle hat keine ID-Information in Projektdatei! (ignoriert)"
#: session_state.cc:1602
#: session_state.cc:1596
msgid "Cannot reconstruct nested source for region %1"
msgstr "Kann verschachtelte Quelle für Region %1 nicht wiederherstellen"
#: session_state.cc:1664
#: session_state.cc:1658
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr ""
"Session: XML-Knoten zur Beschreibung einer Audioregion ist unvollständig "
"(Quelle fehlt)"
#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713
#: session_state.cc:1666 session_state.cc:1687 session_state.cc:1707
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
"Session: XML-Knoten zur Beschreibung einer Audioregion referenziert eine "
"unbekannte Quell-ID =%1"
#: session_state.cc:1678 session_state.cc:1699 session_state.cc:1719
#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
@ -2128,7 +2084,7 @@ msgstr ""
"Session: XML-Knoten zur Beschreibung einer Audioregion referenziert eine "
"Nicht-Audio Quell-ID =%1"
#: session_state.cc:1742
#: session_state.cc:1736
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
@ -2136,27 +2092,27 @@ msgstr ""
"Session: dem XML-Knoten zur Beschreibung einer Audioregion fehlen einige "
"Hauptquellen; ignoriert"
#: session_state.cc:1776
#: session_state.cc:1770
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr ""
"Session: XML-Knoten zur Beschreibung einer MIDI-Region ist unvollständig "
"(Quelle fehlt)"
#: session_state.cc:1784
#: session_state.cc:1778
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
"Session: XML-Knoten zur Beschreibung einer MIDI-Region referenziert eine "
"unbekannte Quell-ID =%1"
#: session_state.cc:1790
#: session_state.cc:1784
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
"Session: XML-Knoten zur Beschreibung einer MIDI-Region referenziert eine "
"Nicht-MIDI Quell-ID =%1"
#: session_state.cc:1858
#: session_state.cc:1852
msgid ""
"cannot create new file from region name \"%1\" with ident = \"%2\": too many "
"existing files with similar names"
@ -2164,109 +2120,109 @@ msgstr ""
"kann keine neue Datei aus dem Regionennamen \"%1\" mit ident = \"%2\" "
"erzeugen: zu viele Dateien mit ähnlichen Namen existieren"
#: session_state.cc:1881
#: session_state.cc:1875
msgid "Session: cannot create Source from XML description."
msgstr "Session: Kann Quelle aus der XML-Beschreibung nicht erzeugen"
#: session_state.cc:1915
#: session_state.cc:1909
msgid "A sound file is missing. It will be replaced by silence."
msgstr "Eine Audiodatei fehlt. Sie wird durch Stille ersetzt werden."
#: session_state.cc:1938
#: session_state.cc:1932
msgid "Found a sound file that cannot be used by %1. Talk to the progammers."
msgstr ""
"Eine nicht mit %1 benutzbare Audiodatei wurde gefunden. Sprechen Sie mit den "
"Programmierern."
#: session_state.cc:1955
#: session_state.cc:1949
msgid "Could not create templates directory \"%1\" (%2)"
msgstr "Konnte Vorlagenverzeichnis \"%1\" nicht erzeugen (%2)"
#: session_state.cc:1968
#: session_state.cc:1962
msgid "Template \"%1\" already exists - new version not created"
msgstr "Vorlage \"%1\" existiert bereits - neue Version wurde nicht erzeugt"
#: session_state.cc:1974
#: session_state.cc:1968
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr "Konnte kein Verzeichnis für Projektvorlage \"%1\" erzeugen (%2)"
#: session_state.cc:1984
#: session_state.cc:1978
msgid "template not saved"
msgstr "Vorlage nicht gesichert"
#: session_state.cc:1994
#: session_state.cc:1988
msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
msgstr ""
"Konnte Verzeichnis für Projektvorlagen-Pluginstatus \"%1\" nicht erzeugen "
"(%2)"
#: session_state.cc:2189
#: session_state.cc:2183
msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr "Unbekannter Knoten \"%1\" in Bündelliste der Projektdatei gefunden"
#: session_state.cc:2731 session_state.cc:2737
#: session_state.cc:2725 session_state.cc:2731
msgid "Cannot expand path %1 (%2)"
msgstr "Kann Pfad %1 nicht expandieren (%2)"
#: session_state.cc:2790
#: session_state.cc:2784
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr "Session: kann den Mülleimer \"%1\" nicht erzeugen (%2)"
#: session_state.cc:2829
#: session_state.cc:2823
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr "kann unbenutzte Dateiquelle nicht von %1 nach %2 umbenennen (%3)"
#: session_state.cc:2847
#: session_state.cc:2841
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr "kann Peakdatei %1 für %2 nicht entfernen (%3)"
#: session_state.cc:3149
#: session_state.cc:3143
msgid "could not backup old history file, current history not saved"
msgstr ""
"konnte kein Backup der alten Aktionsliste erstellen, momentane Aktionsliste "
"ungesichert"
#: session_state.cc:3162
#: session_state.cc:3156
msgid "history could not be saved to %1"
msgstr "Aktionsliste konnte nicht nach %1 gesichert werden"
#: session_state.cc:3165
#: session_state.cc:3159
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr "Konnte Aktionslistendatei im Pfad \"%1\" nicht entfernen (%2)"
#: session_state.cc:3169
#: session_state.cc:3163
msgid "could not restore history file from backup %1 (%2)"
msgstr "konnte Aktionslistendatei nicht aus dem Backup %1 restaurieren (%2)"
#: session_state.cc:3194
#: session_state.cc:3188
msgid "%1: no history file \"%2\" for this session."
msgstr "%1: keine Aktionslistendatei \"%2\" für dieses Projekt."
#: session_state.cc:3200
#: session_state.cc:3194
msgid "Could not understand session history file \"%1\""
msgstr "Konnte Projekt-Aktionslistendatei \"%1\" nicht verstehen"
#: session_state.cc:3242
#: session_state.cc:3236
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr "MidiSource für NoteDiffCommand nicht auffindbar"
#: session_state.cc:3253
#: session_state.cc:3247
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr "MidiSource für SysExDiffCommand nicht auffindbar"
#: session_state.cc:3264
#: session_state.cc:3258
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr "MidiSource für PatchChangeDiffCommand nicht auffindbar"
#: session_state.cc:3272
#: session_state.cc:3266
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr "Konnte im XML-Knoten \"%1\" keinen Befehl erkennen."
#: session_state.cc:3524
#: session_state.cc:3502
msgid "Session: unknown diskstream type in XML"
msgstr "Session: Unbekannter Diskstream im XML"
#: session_state.cc:3529
#: session_state.cc:3507
msgid "Session: could not load diskstream via XML state"
msgstr "Session: konnte Diskstream nicht via XML-Status laden"
@ -2710,56 +2666,3 @@ msgstr "Programmierfehler: unbekanntes natives Dateikopfformat: %1"
#: utils.cc:617
msgid "cannot open directory %1 (%2)"
msgstr "kann Verzeichnis %1 nicht öffnen (%2)"
#~ msgid "Setup signal flow and plugins"
#~ msgstr "Richte Signalfluss and Plugins ein"
#~ msgid "cannot setup Click I/O"
#~ msgstr "kann Metronom-E/A nicht einrichten"
#~ msgid "Compute I/O Latencies"
#~ msgstr "Berechne E/A-Latenzen"
#~ msgid ""
#~ "This version of JACK is old - you should upgrade to a newer version that "
#~ "supports jack_port_type_get_buffer_size()"
#~ msgstr ""
#~ "Diese JACK-Version ist alt - Sie sollten auf eine Version upgraden, die "
#~ "jack_port_type_get_buffer_size() unterstützt"
#~ msgid "Connect session to engine"
#~ msgstr "Verbinde Projekt mit Engine"
#~ msgid "connect called before engine was started"
#~ msgstr "Aufruf von connect vor dem Start der Engine"
#~ msgid "disconnect called before engine was started"
#~ msgstr "Aufruf von disconnect vor dem Start der Engine"
#~ msgid "get_port_by_name() called before engine was started"
#~ msgstr "Aufruf von get_port_by_name() vor dem Start der Engine"
#~ msgid "get_ports called before engine was started"
#~ msgstr "Aufruf von get_ports vor dem Start der Engine"
#~ msgid "failed to connect to JACK"
#~ msgstr "Verbindung zu JACK fehlgeschlagen"
#~ msgid "get_connected_latency_range() called while disconnected from JACK"
#~ msgstr "Aufruf von get_connected_latency_range(), während von JACK getrennt"
#~ msgid "Session: could not send full MIDI time code"
#~ msgstr "Session: konnte vollständigen MIDI-Timecode nicht senden"
#~ msgid "Session"
#~ msgstr "Projekt"
#~ msgid "MidiDiskstream: XML property channel-mask out of range"
#~ msgstr "MidiDiskstream: Wertüberschreitung der XML-Eigenschaft Kanalmaske"
#~ msgid ""
#~ "Copying old session file %1 to %2\n"
#~ "Use %2 with %3 versions before 2.0 from now on"
#~ msgstr ""
#~ "Kopiere alte Projektdatei %1 nach %2\n"
#~ "Benutzen Sie von jetzt an %2 mit %3-Versionen vor 2.0"

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libardour 3\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-10-15 21:42+0400\n"
"POT-Creation-Date: 2013-11-05 11:11-0500\n"
"PO-Revision-Date: 2013-10-15 21:40+0300\n"
"Last-Translator: Александр Прокудин <alexandre.prokoudine@gmail.com>\n"
"Language-Team: русский <>\n"
@ -124,7 +124,7 @@ msgstr ""
#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529
#: midi_playlist_source.cc:144 midi_playlist_source.cc:152
#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643
#: rb_effect.cc:332 session.cc:2613 session.cc:2646 session.cc:3791
#: rb_effect.cc:333 session.cc:2619 session.cc:2652 session.cc:3797
#: session_handle.cc:87 sndfilesource.cc:121
msgid "programming error: %1"
msgstr "programming error: %1"
@ -391,7 +391,7 @@ msgstr ""
msgid "audio"
msgstr ""
#: data_type.cc:28 session.cc:1788 session.cc:1791
#: data_type.cc:28 session.cc:1791 session.cc:1794
msgid "MIDI"
msgstr ""
@ -503,7 +503,7 @@ msgstr "Треугольное"
msgid "Rectangular"
msgstr "Прямоугольное"
#: export_formats.cc:52 session.cc:5009 session.cc:5025
#: export_formats.cc:52 session.cc:5014 session.cc:5030
msgid "None"
msgstr "Нет"
@ -859,15 +859,15 @@ msgstr ""
msgid "%s out"
msgstr ""
#: io.cc:1535 session.cc:683 session.cc:712
#: io.cc:1535 session.cc:686 session.cc:715
msgid "mono"
msgstr ""
#: io.cc:1537 session.cc:696 session.cc:726
#: io.cc:1537 session.cc:699 session.cc:729
msgid "L"
msgstr ""
#: io.cc:1537 session.cc:698 session.cc:728
#: io.cc:1537 session.cc:701 session.cc:731
msgid "R"
msgstr ""
@ -962,7 +962,7 @@ msgstr ""
msgid "incorrect XML mode passed to Locations::set_state"
msgstr ""
#: location.cc:842 session.cc:4510 session_state.cc:1031
#: location.cc:842 session.cc:4516 session_state.cc:1031
msgid "session"
msgstr ""
@ -1094,38 +1094,6 @@ msgstr ""
msgid "MIDI stretch created non-MIDI source"
msgstr ""
#: midiport_manager.cc:71
msgid "MIDI control in"
msgstr ""
#: midiport_manager.cc:72
msgid "MIDI control out"
msgstr ""
#: midiport_manager.cc:74
msgid "MMC in"
msgstr ""
#: midiport_manager.cc:75
msgid "MMC out"
msgstr ""
#: midiport_manager.cc:96
msgid "MTC in"
msgstr ""
#: midiport_manager.cc:98
msgid "MTC out"
msgstr ""
#: midiport_manager.cc:101
msgid "MIDI Clock in"
msgstr ""
#: midiport_manager.cc:103
msgid "MIDI Clock out"
msgstr ""
#: monitor_processor.cc:53
msgid "monitor dim"
msgstr ""
@ -1486,35 +1454,39 @@ msgstr ""
msgid "return %1"
msgstr ""
#: route.cc:1107 route.cc:2584
#: route.cc:1075 route.cc:2528
msgid "unknown Processor type \"%1\"; ignored"
msgstr ""
#: route.cc:1119
#: route.cc:1087
msgid "processor could not be created. Ignored."
msgstr ""
#: route.cc:2010 route.cc:2237
#: route.cc:1962 route.cc:2187
msgid "Bad node sent to Route::set_state() [%1]"
msgstr ""
#: route.cc:2070
#: route.cc:2022
msgid "Pannable state found for route (%1) without a panner!"
msgstr ""
#: route.cc:2140 route.cc:2144 route.cc:2351 route.cc:2355
#: route.cc:2096 route.cc:2100 route.cc:2301 route.cc:2305
msgid "badly formed order key string in state file! [%1] ... ignored."
msgstr ""
#: route.cc:2311
msgid "Converting deprecated order key for %1 using Editor order %2"
msgstr ""
#: route_group.cc:459
msgid "You cannot subgroup MIDI tracks at this time"
msgstr ""
#: rb_effect.cc:233 rb_effect.cc:274
#: rb_effect.cc:234 rb_effect.cc:275
msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)"
msgstr ""
#: rb_effect.cc:303 rb_effect.cc:325
#: rb_effect.cc:304 rb_effect.cc:326
msgid "error writing tempo-adjusted data to %1"
msgstr ""
@ -1530,183 +1502,167 @@ msgstr ""
msgid "programming error: send created using role %1"
msgstr "programming error: send created using role %1"
#: session.cc:343
#: session.cc:344
msgid "Connect to engine"
msgstr "Соединение со звуковым движком"
#: session.cc:348
#: session.cc:349
msgid "Session loading complete"
msgstr "Загрузка сеанса завершена"
#: session.cc:420
#: session.cc:421
msgid "Set up LTC"
msgstr ""
#: session.cc:422
#: session.cc:423
msgid "Set up Click"
msgstr ""
#: session.cc:424
#: session.cc:425
msgid "Set up standard connections"
msgstr "Настройка обычных соединений"
#: session.cc:561
msgid "LTC In"
msgstr ""
#: session.cc:562
msgid "LTC Out"
msgstr ""
#: session.cc:588
msgid "LTC-in"
msgstr ""
#: session.cc:589
msgid "LTC-out"
msgstr ""
#: session.cc:632
#: session.cc:635
msgid "could not setup Click I/O"
msgstr ""
#: session.cc:680
#: session.cc:683
#, c-format
msgid "out %<PRIu32>"
msgstr ""
#: session.cc:694
#: session.cc:697
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr ""
#: session.cc:709
#: session.cc:712
#, c-format
msgid "in %<PRIu32>"
msgstr ""
#: session.cc:723
#: session.cc:726
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr ""
#: session.cc:787
#: session.cc:790
msgid "cannot connect master output %1 to %2"
msgstr ""
#: session.cc:846
#: session.cc:849
msgid "monitor"
msgstr ""
#: session.cc:891
#: session.cc:894
msgid "cannot connect control input %1 to %2"
msgstr ""
#: session.cc:911
#: session.cc:914
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr ""
#: session.cc:942
#: session.cc:945
msgid "cannot connect control output %1 to %2"
msgstr ""
#: session.cc:1006
#: session.cc:1009
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr ""
#: session.cc:1190
#: session.cc:1193
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
#: session.cc:1230
#: session.cc:1233
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
msgstr ""
#: session.cc:1544
#: session.cc:1547
msgid "feedback loop setup between %1 and %2"
msgstr ""
#: session.cc:1840
#: session.cc:1843
msgid "Session: could not create new midi track."
msgstr ""
#: session.cc:1846
#: session.cc:1849
msgid ""
"No more JACK ports are available. You will need to stop %1 and restart JACK "
"with more ports if you need this many tracks."
msgstr ""
#: session.cc:2023 session.cc:2026
#: session.cc:2026 session.cc:2029
msgid "Audio"
msgstr ""
#: session.cc:2050 session.cc:2058 session.cc:2135 session.cc:2143
#: session.cc:2053 session.cc:2061 session.cc:2138 session.cc:2146
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr ""
#: session.cc:2081
#: session.cc:2084
msgid "Session: could not create new audio track."
msgstr ""
#: session.cc:2113 session.cc:2116
#: session.cc:2116 session.cc:2119
msgid "Bus"
msgstr ""
#: session.cc:2166
#: session.cc:2169
msgid "Session: could not create new audio route."
msgstr ""
#: session.cc:2225 session.cc:2235
#: session.cc:2228 session.cc:2238
msgid "Session: UINT_MAX routes? impossible!"
msgstr ""
#: session.cc:2257
#: session.cc:2260
msgid "Session: cannot create track/bus from template description"
msgstr ""
#: session.cc:2283
#: session.cc:2286
msgid "Session: could not create new route from template"
msgstr ""
#: session.cc:2312
#: session.cc:2315
msgid "Adding new tracks/busses failed"
msgstr "Не удалось добавить новые дорожки/шины"
#: session.cc:3413
#: session.cc:3419
msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename"
msgstr ""
#: session.cc:3533 session.cc:3591
#: session.cc:3539 session.cc:3597
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr ""
#: session.cc:3981
#: session.cc:3987
msgid "send ID %1 appears to be in use already"
msgstr ""
#: session.cc:3993
#: session.cc:3999
msgid "aux send ID %1 appears to be in use already"
msgstr ""
#: session.cc:4005
#: session.cc:4011
msgid "return ID %1 appears to be in use already"
msgstr ""
#: session.cc:4017
#: session.cc:4023
msgid "insert ID %1 appears to be in use already"
msgstr ""
#: session.cc:4144
#: session.cc:4150
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr ""
#: session.cc:4173
#: session.cc:4179
msgid "too many bounced versions of playlist \"%1\""
msgstr ""
#: session.cc:4183
#: session.cc:4189
msgid "cannot create new audio file \"%1\" for %2"
msgstr ""
@ -2110,11 +2066,11 @@ msgstr ""
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr ""
#: session_state.cc:3518
#: session_state.cc:3502
msgid "Session: unknown diskstream type in XML"
msgstr ""
#: session_state.cc:3523
#: session_state.cc:3507
msgid "Session: could not load diskstream via XML state"
msgstr ""
@ -2528,66 +2484,3 @@ msgstr "programming error: unknown native header format: %1"
#: utils.cc:617
msgid "cannot open directory %1 (%2)"
msgstr "cannot open directory %1 (%2)"
#~ msgid "Setup signal flow and plugins"
#~ msgstr "Настройка модулей и звукового потока"
#~ msgid "Session"
#~ msgstr "Сеанс"
#, fuzzy
#~ msgid "editor"
#~ msgstr "монитор"
#, fuzzy
#~ msgid "programming error: realpath(%1) failed, errcode %2"
#~ msgstr "ошибка программы: "
#, fuzzy
#~ msgid "programming error:"
#~ msgstr "ошибка программы: "
#~ msgid "cannot activate JACK client"
#~ msgstr "не удалось активировать клиента JACK сервера"
#, fuzzy
#~ msgid "removed event"
#~ msgstr "удалить область"
#, fuzzy
#~ msgid "removed range"
#~ msgstr "удалить область"
#~ msgid "add"
#~ msgstr "добавить"
#~ msgid "remove"
#~ msgstr "удалить"
#~ msgid "remove region"
#~ msgstr "удалить область"
#~ msgid "separate"
#~ msgstr "разделить"
#~ msgid "split"
#~ msgstr "склеить"
#~ msgid "pre"
#~ msgstr "пре"
#~ msgid "post"
#~ msgstr "пост"
#, fuzzy
#~ msgid "Master Out"
#~ msgstr "мастер"
#~ msgid "16 bit"
#~ msgstr "16 бит"
#~ msgid "24 bit"
#~ msgstr "24 бита"
#~ msgid "8 bit"
#~ msgstr "8 бит"

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -72,6 +72,9 @@ Quantize::operator () (boost::shared_ptr<MidiModel> model,
even = false;
/* TODO 'swing' probably requires a 2nd iteration:
* first quantize notes to the grid, then apply beat shift
*/
for (Evoral::Sequence<MidiModel::TimeType>::Notes::iterator i = (*s).begin(); i != (*s).end(); ++i) {
double new_start = round (((*i)->time() - offset) / _start_grid) * _start_grid + offset;
@ -86,6 +89,7 @@ Quantize::operator () (boost::shared_ptr<MidiModel> model,
*/
new_start = new_start + (2.0/3.0 * _swing * (next_grid - new_start));
new_end = new_end + (2.0/3.0 * _swing * (next_grid - new_start));
} else if (_swing < 0.0 && !even) {
@ -96,6 +100,7 @@ Quantize::operator () (boost::shared_ptr<MidiModel> model,
*/
new_start = new_start - (2.0/3.0 * _swing * (new_start - prev_grid));
new_end = new_end - (2.0/3.0 * _swing * (new_start - prev_grid));
}

View file

@ -20,8 +20,9 @@
#include <algorithm>
#include <cmath>
#include <rubberband/RubberBandStretcher.h>
#include "pbd/error.h"
#include "rubberband/RubberBandStretcher.h"
#include "ardour/audioregion.h"
#include "ardour/audiosource.h"

View file

@ -257,6 +257,7 @@ Session::Session (AudioEngine &eng,
, _step_editors (0)
, _suspend_timecode_transmission (0)
, _speakers (new Speakers)
, _order_hint (0)
, ignore_route_processor_changes (false)
, _midi_ports (0)
, _mmc (0)
@ -558,10 +559,10 @@ Session::setup_ltc ()
{
XMLNode* child = 0;
_ltc_input.reset (new IO (*this, _("LTC In"), IO::Input));
_ltc_output.reset (new IO (*this, _("LTC Out"), IO::Output));
_ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
_ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
if (state_tree && (child = find_named_node (*state_tree->root(), "LTC-In")) != 0) {
if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
_ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
} else {
{
@ -571,7 +572,7 @@ Session::setup_ltc ()
reconnect_ltc_input ();
}
if (state_tree && (child = find_named_node (*state_tree->root(), "LTC-Out")) != 0) {
if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
_ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
} else {
{
@ -585,15 +586,15 @@ Session::setup_ltc ()
* IO style of NAME/TYPE-{in,out}N
*/
_ltc_input->nth (0)->set_name (_("LTC-in"));
_ltc_output->nth (0)->set_name (_("LTC-out"));
_ltc_input->nth (0)->set_name (X_("LTC-in"));
_ltc_output->nth (0)->set_name (X_("LTC-out"));
}
void
Session::setup_click ()
{
_clicking = false;
_click_io.reset (new ClickIO (*this, "click"));
_click_io.reset (new ClickIO (*this, X_("Click")));
_click_gain.reset (new Amp (*this));
_click_gain->activate ();
if (state_tree) {
@ -2335,6 +2336,11 @@ Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool
ChanCount existing_outputs;
uint32_t order = next_control_id();
if (_order_hint != 0) {
order = _order_hint;
_order_hint = 0;
}
count_existing_track_channels (existing_inputs, existing_outputs);
{

View file

@ -164,12 +164,12 @@ Session::timecode_duration (framecnt_t when, Timecode::Time& timecode) const
}
void
Session::timecode_duration_string (char* buf, framepos_t when) const
Session::timecode_duration_string (char* buf, size_t len, framepos_t when) const
{
Timecode::Time timecode;
timecode_duration (when, timecode);
snprintf (buf, sizeof (buf), "%02" PRIu32 ":%02" PRIu32 ":%02" PRIu32 ":%02" PRIu32, timecode.hours, timecode.minutes, timecode.seconds, timecode.frames);
snprintf (buf, len, "%02" PRIu32 ":%02" PRIu32 ":%02" PRIu32 ":%02" PRIu32, timecode.hours, timecode.minutes, timecode.seconds, timecode.frames);
}
void

View file

@ -298,7 +298,7 @@ VSTPlugin::get_parameter_descriptor (uint32_t which, ParameterDescriptor& desc)
char label[64];
/* some VST plugins expect this buffer to be zero-filled */
memset (label, sizeof (label), 0);
memset (label, 0, sizeof (label));
_plugin->dispatcher (_plugin, effGetParamName, which, 0, label, 0);

View file

@ -339,9 +339,14 @@ def build(bld):
obj.uselib = ['GLIBMM','GTHREAD','AUBIO','SIGCPP','XML','UUID',
'SNDFILE','SAMPLERATE','LRDF','AUDIOUNITS',
'OSX','BOOST','CURL','DL']
obj.use = ['libpbd','libmidipp','libevoral','libvamphost',
'libvampplugin','libtaglib','librubberband',
obj.use = ['libpbd','libmidipp','libevoral','libvampplugin',
'libaudiographer','libltc','libtimecode']
if bld.is_defined('USE_EXTERNAL_LIBS'):
obj.uselib.extend(['RUBBERBAND', 'TAGLIB', 'LIBLTC', 'VAMPSDK',
'VAMPHOSTSDK'])
else:
obj.use.extend(['libltc', 'librubberband', 'libtaglib', 'libvamphost'])
obj.vnum = LIBARDOUR_LIB_VERSION
obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3')
obj.defines = [
@ -406,9 +411,13 @@ def build(bld):
'test/test_common.cc', 'test/dummy_lxvst.cc', 'test/audio_region_test.cc', 'test/test_util.cc']
testcommon.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD',
'SAMPLERATE','XML','LRDF','COREAUDIO']
testcommon.use = ['libpbd','libmidipp','libevoral','libvamphost',
'libvampplugin','libtaglib','librubberband',
'libaudiographer','libltc','ardour']
testcommon.use = ['libpbd','libmidipp','libevoral',
'libvampplugin','libaudiographer','ardour']
if bld.is_defined('USE_EXTERNAL_LIBS'):
testcommon.uselib.extend(['RUBBERBAND', 'TAGLIB', 'LIBLTC', 'VAMPSDK',
'VAMPHOSTSDK'])
else:
testcommon.use.extend(['libltc', 'librubberband', 'libtaglib', 'libvamphost'])
testcommon.defines = [
'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
@ -546,9 +555,15 @@ def create_ardour_test_program(bld, includes, name, target, sources):
testobj.source = sources
testobj.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD',
'SAMPLERATE','XML','LRDF','COREAUDIO']
testobj.use = ['libpbd','libmidipp','libevoral','libvamphost',
'libvampplugin','libtaglib','librubberband',
'libaudiographer','libltc','ardour','testcommon']
testobj.use = ['libpbd','libmidipp','libevoral','libvampplugin',
'libaudiographer','ardour','testcommon']
if bld.is_defined('USE_EXTERNAL_LIBS'):
testobj.uselib.extend(['RUBBERBAND', 'TAGLIB', 'LIBLTC', 'VAMPSDK',
'VAMPHOSTSDK'])
else:
testobj.use.extend(['libltc', 'librubberband', 'libtaglib',
'libvamphost'])
testobj.name = name
testobj.target = target
# not sure about install path

View file

@ -131,6 +131,9 @@ class SilenceTrimmer
}
in_end = c.has_flag (ProcessContext<T>::EndOfInput);
// If adding to end, delay end of input propagation
if (add_to_end) { c.remove_flag(ProcessContext<T>::EndOfInput); }
framecnt_t frame_index = 0;
if (in_beginning) {
@ -208,6 +211,7 @@ class SilenceTrimmer
// Finally, if in end, add silence to end
if (in_end && add_to_end) {
c.set_flag (ProcessContext<T>::EndOfInput);
if (debug_level (DebugVerbose)) {
debug_stream () << DebugUtils::demangled_name (*this) <<

View file

@ -509,6 +509,7 @@ JACKAudioBackend::setup_jack_startup_command (bool for_latency_measurement)
/* error, somehow - we will still try to start JACK
* automatically but it will be without our preferred options
*/
std::cerr << "get_jack_command_line_string () failed: using default settings." << std::endl;
return;
}

View file

@ -126,7 +126,7 @@ class JACKAudioBackend : public AudioBackend {
int set_port_name (PortHandle, const std::string&);
std::string get_port_name (PortHandle) const;
PortHandle* get_port_by_name (const std::string&) const;
PortHandle get_port_by_name (const std::string&) const;
int get_ports (const std::string& port_name_pattern, DataType type, PortFlags flags, std::vector<std::string>&) const;

View file

@ -116,11 +116,11 @@ JACKAudioBackend::get_port_name (PortHandle port) const
return jack_port_name ((jack_port_t*) port);
}
PortEngine::PortHandle*
PortEngine::PortHandle
JACKAudioBackend:: get_port_by_name (const std::string& name) const
{
GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 0);
return (PortHandle*) jack_port_by_name (_priv_jack, name.c_str());
return (PortHandle) jack_port_by_name (_priv_jack, name.c_str());
}
void

View file

@ -756,6 +756,9 @@ ARDOUR::get_jack_command_line_string (JackCommandLineOptions& options, string& c
string command_line_driver_name;
string command_line_input_device_name;
string command_line_output_device_name;
if (!get_jack_command_line_audio_driver_name (options.driver, command_line_driver_name)) {
return false;
}
@ -763,12 +766,11 @@ ARDOUR::get_jack_command_line_string (JackCommandLineOptions& options, string& c
args.push_back ("-d");
args.push_back (command_line_driver_name);
if (options.driver != dummy_driver_name) {
if (options.output_device.empty() && options.input_device.empty()) {
return false;
}
string command_line_input_device_name;
string command_line_output_device_name;
if (!get_jack_command_line_audio_device_name (options.driver,
options.input_device, command_line_input_device_name)) {
@ -818,6 +820,18 @@ ARDOUR::get_jack_command_line_string (JackCommandLineOptions& options, string& c
args.push_back ("-n");
args.push_back (to_string (options.num_periods, std::dec));
}
} else {
// jackd dummy backend
if (options.input_channels) {
args.push_back ("-C");
args.push_back (to_string (options.input_channels, std::dec));
}
if (options.output_channels) {
args.push_back ("-P");
args.push_back (to_string (options.output_channels, std::dec));
}
}
args.push_back ("-r");
args.push_back (to_string (options.samplerate, std::dec));
@ -836,10 +850,12 @@ ARDOUR::get_jack_command_line_string (JackCommandLineOptions& options, string& c
}
}
if (options.driver != dummy_driver_name) {
if (options.input_device == options.output_device && options.input_device != default_device_name) {
args.push_back ("-d");
args.push_back (command_line_input_device_name);
}
}
if (options.driver == alsa_driver_name) {
if (options.hardware_metering) {

View file

@ -637,7 +637,7 @@ smf_event_is_textual(const smf_event_t *event)
if (event->midi_buffer_length < 4)
return (0);
if (event->midi_buffer[3] < 1 && event->midi_buffer[3] > 9)
if (event->midi_buffer[3] < 1 || event->midi_buffer[3] > 9)
return (0);
return (1);

View file

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-08-15 15:09-0400\n"
"POT-Creation-Date: 2013-11-05 11:11-0500\n"
"PO-Revision-Date: 2013-06-13 22:33+0200\n"
"Last-Translator: Pavel Fric <pavelfric@seznam.cz>\n"
"Language-Team: Czech <kde-i18n-doc@kde.org>\n"
@ -33,7 +33,7 @@ msgstr "Tlačítko nemůže sledovat stav neexistujícího ovladatelného cíle\
msgid "Log"
msgstr "Zápis"
#: gtk_ui.cc:361
#: gtk_ui.cc:363
msgid ""
"\n"
"\n"
@ -43,11 +43,11 @@ msgstr ""
"\n"
"Kurzbefehl: "
#: gtk_ui.cc:633
#: gtk_ui.cc:635
msgid "Press To Exit"
msgstr "Stisknout pro ukončení"
#: gtk_ui.cc:669
#: gtk_ui.cc:671
msgid "I'm sorry %1, I can't do that"
msgstr "Bohužel to nelze udělat, %1"
@ -75,11 +75,11 @@ msgstr "Alt"
msgid "Meta"
msgstr "Meta"
#: keyboard.cc:139 keyboard.cc:531
#: keyboard.cc:139 keyboard.cc:535
msgid "Unknown"
msgstr "Neznámý"
#: keyboard.cc:542
#: keyboard.cc:546
msgid "key bindings file not found at \"%2\" or contains errors."
msgstr ""
"Soubor s přiřazením kláves \"%2\"se nepodařilo najít, nebo obsahuje chyby."

View file

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-08-15 15:09-0400\n"
"POT-Creation-Date: 2013-11-05 11:11-0500\n"
"PO-Revision-Date: 2013-02-05 19:50+0100\n"
"Last-Translator: Edgar Aichinger <edogawa@aon.at>\n"
"Language-Team: German <ardour-dev@lists.ardour.org>\n"
@ -35,7 +35,7 @@ msgstr ""
msgid "Log"
msgstr "Log"
#: gtk_ui.cc:361
#: gtk_ui.cc:363
msgid ""
"\n"
"\n"
@ -45,11 +45,11 @@ msgstr ""
"\n"
"Kurzbefehl: "
#: gtk_ui.cc:633
#: gtk_ui.cc:635
msgid "Press To Exit"
msgstr "Zum Beenden drücken"
#: gtk_ui.cc:669
#: gtk_ui.cc:671
msgid "I'm sorry %1, I can't do that"
msgstr "Leider kann ich das nicht tun, %1"
@ -77,11 +77,11 @@ msgstr "Alt"
msgid "Meta"
msgstr "Meta"
#: keyboard.cc:139 keyboard.cc:531
#: keyboard.cc:139 keyboard.cc:535
msgid "Unknown"
msgstr "Unbekannt"
#: keyboard.cc:542
#: keyboard.cc:546
msgid "key bindings file not found at \"%2\" or contains errors."
msgstr ""
"Die Tastenkürzel-Datei \"%1\" konnte nicht gefunden werden oder enthält "

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.99beta23\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-08-15 15:09-0400\n"
"POT-Creation-Date: 2013-11-05 11:11-0500\n"
"PO-Revision-Date: 2005-01-11\n"
"Last-Translator: Muadibas\n"
"Language-Team: Hellenic(Greek) <LL@li.org>\n"
@ -21,9 +21,8 @@ msgid "Unknown action name: %1"
msgstr ""
#: binding_proxy.cc:84
#, fuzzy
msgid "operate controller now"
msgstr "λειτουργία ελεγκτή MIDI τώρα"
msgstr ""
#: bindable_button.cc:48
msgid "button cannot watch state of non-existing Controllable\n"
@ -33,18 +32,18 @@ msgstr ""
msgid "Log"
msgstr ""
#: gtk_ui.cc:361
#: gtk_ui.cc:363
msgid ""
"\n"
"\n"
"Shortcut: "
msgstr ""
#: gtk_ui.cc:633
#: gtk_ui.cc:635
msgid "Press To Exit"
msgstr ""
#: gtk_ui.cc:669
#: gtk_ui.cc:671
msgid "I'm sorry %1, I can't do that"
msgstr ""
@ -72,11 +71,11 @@ msgstr ""
msgid "Meta"
msgstr ""
#: keyboard.cc:139 keyboard.cc:531
#: keyboard.cc:139 keyboard.cc:535
msgid "Unknown"
msgstr ""
#: keyboard.cc:542
#: keyboard.cc:546
msgid "key bindings file not found at \"%2\" or contains errors."
msgstr ""
@ -91,33 +90,3 @@ msgstr ""
#: textviewer.cc:34
msgid "Close"
msgstr "Κλείσιμο"
#~ msgid "OK"
#~ msgstr "OK"
#~ msgid "Location:"
#~ msgstr "Τοποθεσία:"
#~ msgid "Browse ..."
#~ msgstr "Αναζήτηση ..."
#~ msgid "Cancel"
#~ msgstr "Ακύρωση"
#~ msgid "New folder"
#~ msgstr "Νέος φάκελος"
#~ msgid "Add to favorites"
#~ msgstr "Πρόσθεση στα 'Αγαπημένα'"
#~ msgid "Remove from favorites"
#~ msgstr "Απαλοιφή από τα 'Αγαπημένα'"
#~ msgid "Show Hidden"
#~ msgstr "Ανάδειξη κρυμμένων"
#~ msgid "Hide browser"
#~ msgstr "Απόκρυψη browser"
#~ msgid "Rescan"
#~ msgstr "Ανανέωση"

View file

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gtkmm2ext\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-08-15 15:09-0400\n"
"POT-Creation-Date: 2013-11-05 11:11-0500\n"
"PO-Revision-Date: 2013-02-09 16:21+0100\n"
"Last-Translator: Pablo Fernández <pablo.fbus@gmail.com>\n"
"Language-Team: Spanish\n"
@ -31,7 +31,7 @@ msgstr ""
msgid "Log"
msgstr "Log"
#: gtk_ui.cc:361
#: gtk_ui.cc:363
msgid ""
"\n"
"\n"
@ -41,11 +41,11 @@ msgstr ""
"\n"
"Atajo: "
#: gtk_ui.cc:633
#: gtk_ui.cc:635
msgid "Press To Exit"
msgstr "Pulse para salir"
#: gtk_ui.cc:669
#: gtk_ui.cc:671
msgid "I'm sorry %1, I can't do that"
msgstr "Lo siento %1, no puedo hacer eso"
@ -73,11 +73,11 @@ msgstr ""
msgid "Meta"
msgstr ""
#: keyboard.cc:139 keyboard.cc:531
#: keyboard.cc:139 keyboard.cc:535
msgid "Unknown"
msgstr ""
#: keyboard.cc:542
#: keyboard.cc:546
msgid "key bindings file not found at \"%2\" or contains errors."
msgstr ""
"El archivo de combinaciones de teclado no se encontró en \"%2\" o contiene "
@ -94,36 +94,3 @@ msgstr "Pulsa para llevarlo a la ventana principal"
#: textviewer.cc:34
msgid "Close"
msgstr "Cerrar"
#~ msgid "Error"
#~ msgstr "Error"
#~ msgid "OK"
#~ msgstr "ACEPTAR"
#~ msgid "Location:"
#~ msgstr "Localización:"
#~ msgid "Browse ..."
#~ msgstr "Seleccionar ..."
#~ msgid "Cancel"
#~ msgstr "Cancelar"
#~ msgid "New folder"
#~ msgstr "Nueva carpeta"
#~ msgid "Add to favorites"
#~ msgstr "Agregar a favoritos"
#~ msgid "Remove from favorites"
#~ msgstr "Quitar de favoritos"
#~ msgid "Show Hidden"
#~ msgstr "Mostrar ocultos"
#~ msgid "Hide browser"
#~ msgstr "Ocultar explorador"
#~ msgid "Rescan"
#~ msgstr "Buscar de nuevo"

View file

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-08-15 15:09-0400\n"
"POT-Creation-Date: 2013-11-05 11:11-0500\n"
"PO-Revision-Date: 2011-06-13 00:30+0200\n"
"Language-Team: American English <kde-i18n-doc@kde.org>\n"
"Language: en_US\n"
@ -31,18 +31,18 @@ msgstr "Le bouton ne peut pas surveiller l'état d'un Controllable inexistant\n"
msgid "Log"
msgstr "Log"
#: gtk_ui.cc:361
#: gtk_ui.cc:363
msgid ""
"\n"
"\n"
"Shortcut: "
msgstr ""
#: gtk_ui.cc:633
#: gtk_ui.cc:635
msgid "Press To Exit"
msgstr "Appuyer pour quitter"
#: gtk_ui.cc:669
#: gtk_ui.cc:671
msgid "I'm sorry %1, I can't do that"
msgstr ""
@ -55,9 +55,8 @@ msgid "Control"
msgstr "Ctrl"
#: keyboard.cc:70 keyboard.cc:73 keyboard.cc:87 keyboard.cc:90
#, fuzzy
msgid "Key|Shift"
msgstr "Maj"
msgstr ""
#: keyboard.cc:71
msgid "Option"
@ -71,14 +70,13 @@ msgstr "Alt"
msgid "Meta"
msgstr "Meta"
#: keyboard.cc:139 keyboard.cc:531
#: keyboard.cc:139 keyboard.cc:535
msgid "Unknown"
msgstr "Inconnu"
#: keyboard.cc:542
#, fuzzy
#: keyboard.cc:546
msgid "key bindings file not found at \"%2\" or contains errors."
msgstr "Raccourcis clavier pour %1 introuvable dans \"%1\" ou corrompu."
msgstr ""
#: tearoff.cc:57
msgid "Click to tear this into its own window"
@ -91,6 +89,3 @@ msgstr "Cliquez pour remettre dans la fenêtre principale"
#: textviewer.cc:34
msgid "Close"
msgstr "Fermer"
#~ msgid "Mod1"
#~ msgstr "Mod1"

File diff suppressed because it is too large Load diff

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libgtkmm2ext\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-08-15 15:09-0400\n"
"POT-Creation-Date: 2013-11-05 11:11-0500\n"
"PO-Revision-Date: 2008-04-10 10:54+0100\n"
"Last-Translator: Piotr Zaryk <pzaryk@gmail.com>\n"
"Language-Team: Polish <pl@li.org>\n"
@ -32,18 +32,18 @@ msgstr ""
msgid "Log"
msgstr "Log"
#: gtk_ui.cc:361
#: gtk_ui.cc:363
msgid ""
"\n"
"\n"
"Shortcut: "
msgstr ""
#: gtk_ui.cc:633
#: gtk_ui.cc:635
msgid "Press To Exit"
msgstr "Wciśnij by zakończyć"
#: gtk_ui.cc:669
#: gtk_ui.cc:671
msgid "I'm sorry %1, I can't do that"
msgstr ""
@ -71,11 +71,11 @@ msgstr ""
msgid "Meta"
msgstr ""
#: keyboard.cc:139 keyboard.cc:531
#: keyboard.cc:139 keyboard.cc:535
msgid "Unknown"
msgstr ""
#: keyboard.cc:542
#: keyboard.cc:546
msgid "key bindings file not found at \"%2\" or contains errors."
msgstr ""
@ -90,18 +90,3 @@ msgstr ""
#: textviewer.cc:34
msgid "Close"
msgstr "Zamknij"
#~ msgid "Error"
#~ msgstr "Błąd"
#~ msgid "+"
#~ msgstr "+"
#~ msgid "-"
#~ msgstr "-"
#~ msgid "Paths"
#~ msgstr "Położenia"
#~ msgid "Path Chooser"
#~ msgstr "Wybór położenia"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gtkmm2ext\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-08-15 15:09-0400\n"
"POT-Creation-Date: 2013-11-05 11:11-0500\n"
"PO-Revision-Date: 2004-05-17 20:36+0200\n"
"Last-Translator: Chris Ross <chris.ross@tebibyte.org>\n"
"Language-Team: Portuguese\n"
@ -21,9 +21,8 @@ msgid "Unknown action name: %1"
msgstr ""
#: binding_proxy.cc:84
#, fuzzy
msgid "operate controller now"
msgstr "Operar controladora de MIDI agora"
msgstr ""
#: bindable_button.cc:48
msgid "button cannot watch state of non-existing Controllable\n"
@ -33,18 +32,18 @@ msgstr ""
msgid "Log"
msgstr ""
#: gtk_ui.cc:361
#: gtk_ui.cc:363
msgid ""
"\n"
"\n"
"Shortcut: "
msgstr ""
#: gtk_ui.cc:633
#: gtk_ui.cc:635
msgid "Press To Exit"
msgstr ""
#: gtk_ui.cc:669
#: gtk_ui.cc:671
msgid "I'm sorry %1, I can't do that"
msgstr ""
@ -72,11 +71,11 @@ msgstr ""
msgid "Meta"
msgstr ""
#: keyboard.cc:139 keyboard.cc:531
#: keyboard.cc:139 keyboard.cc:535
msgid "Unknown"
msgstr ""
#: keyboard.cc:542
#: keyboard.cc:546
msgid "key bindings file not found at \"%2\" or contains errors."
msgstr ""
@ -91,33 +90,3 @@ msgstr ""
#: textviewer.cc:34
msgid "Close"
msgstr "Fechar"
#~ msgid "OK"
#~ msgstr "OK"
#~ msgid "Location:"
#~ msgstr "localização:"
#~ msgid "Browse ..."
#~ msgstr "Localizar ..."
#~ msgid "Cancel"
#~ msgstr "Cancelar"
#~ msgid "New folder"
#~ msgstr "Novo diretório"
#~ msgid "Add to favorites"
#~ msgstr "Adicionar a favoritos"
#~ msgid "Remove from favorites"
#~ msgstr "Remover de favoritos"
#~ msgid "Show Hidden"
#~ msgstr "Mostrar ocultos"
#~ msgid "Hide browser"
#~ msgstr "Ocultar explorador"
#~ msgid "Rescan"
#~ msgstr "Buscar de novo"

View file

@ -7,10 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: gtkmm2ext\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-10-15 21:33+0400\n"
"POT-Creation-Date: 2013-11-05 11:11-0500\n"
"PO-Revision-Date: 2013-10-15 21:54+0300\n"
"Last-Translator: Александр Прокудин <alexandre.prokoudine@gmail.com>\n"
"Language-Team: русский <>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@ -96,42 +97,3 @@ msgstr "Щелкните, чтобы превратить это плавающ
#: textviewer.cc:34
msgid "Close"
msgstr "Закрыть"
#~ msgid ""
#~ "\n"
#~ "\n"
#~ "Key: "
#~ msgstr ""
#~ "\n"
#~ "\n"
#~ "Клавиша: "
#~ msgid "OK"
#~ msgstr "ОК"
#~ msgid "Location:"
#~ msgstr "Путь:"
#~ msgid "Browse ..."
#~ msgstr "Обзор ..."
#~ msgid "Cancel"
#~ msgstr "Отмена"
#~ msgid "New folder"
#~ msgstr "Новая папка"
#~ msgid "Add to favorites"
#~ msgstr "Добавить в избранное"
#~ msgid "Remove from favorites"
#~ msgstr "Исключить из избранного"
#~ msgid "Show Hidden"
#~ msgstr "Показывать скрытые файлы"
#~ msgid "Hide browser"
#~ msgstr "Скрыть область обзора"
#~ msgid "Rescan"
#~ msgstr "Обновить"

View file

@ -29,10 +29,15 @@ def options(opt):
autowaf.set_options(opt)
def configure(conf):
if conf.is_defined('USE_EXTERNAL_LIBS'):
autowaf.check_pkg(conf, 'ltc', uselib_store='LIBLTC', atleast_version=LIBLTC_LIB_VERSION, mandatory=True)
else:
conf.load('compiler_c')
autowaf.configure(conf)
def build(bld):
if bld.is_defined('USE_EXTERNAL_LIBS'):
return
obj = bld(features = 'c cshlib')
obj.source = '''
ltc.c
@ -41,7 +46,7 @@ def build(bld):
decoder.c
'''
obj.export_includes = ['.']
obj.export_includes = ['./ltc']
obj.includes = ['.']
obj.name = 'libltc'
obj.target = 'ltc'

View file

@ -25,7 +25,7 @@
/* LV2 */
#include "lv2/lv2plug.in/ns/lv2core/lv2.h"
#include "lv2/lv2plug.in/ns/ext/atom/util.h"
#include "lv2/lv2plug.in/ns/ext/atom/atom.h"
#include "lv2/lv2plug.in/ns/ext/urid/urid.h"
#include "lv2/lv2plug.in/ns/ext/midi/midi.h"
@ -35,7 +35,7 @@
static void * synth_alloc (void);
static void synth_init (void *, double rate);
static void synth_free (void *);
static void synth_parse_midi (void *, uint8_t *data, size_t size);
static void synth_parse_midi (void *, const uint8_t *data, const size_t size);
static uint32_t synth_sound (void *, uint32_t written, uint32_t nframes, float **out);
#include "rsynth.c"
@ -66,6 +66,9 @@ instantiate(const LV2_Descriptor* descriptor,
const char* bundle_path,
const LV2_Feature* const* features)
{
(void) descriptor; /* unused variable */
(void) bundle_path; /* unused variable */
if (rate < 8000) {
fprintf(stderr, "RSynth.lv2 error: unsupported sample-rate (must be > 8k)\n");
return NULL;
@ -131,8 +134,11 @@ run(LV2_Handle handle, uint32_t n_samples)
/* Process incoming MIDI events */
if (self->midiin) {
LV2_Atom_Event* ev = lv2_atom_sequence_begin(&(self->midiin)->body);
while(!lv2_atom_sequence_is_end(&(self->midiin)->body, (self->midiin)->atom.size, ev)) {
LV2_Atom_Event const* ev = (LV2_Atom_Event const*)((&(self->midiin)->body) + 1); // lv2_atom_sequence_begin
while( // !lv2_atom_sequence_is_end
(const uint8_t*)ev < ((const uint8_t*) &(self->midiin)->body + (self->midiin)->atom.size)
)
{
if (ev->body.type == self->midi_MidiEvent) {
if (written + BUFFER_SIZE_SAMPLES < ev->time.frames
&& ev->time.frames < n_samples) {
@ -140,9 +146,10 @@ run(LV2_Handle handle, uint32_t n_samples)
written = synth_sound(self->synth, written, ev->time.frames, audio);
}
/* send midi message to synth */
synth_parse_midi(self->synth, (uint8_t*)(ev+1), ev->body.size);
synth_parse_midi(self->synth, (const uint8_t*)(ev+1), ev->body.size);
}
ev = lv2_atom_sequence_next(ev);
ev = (LV2_Atom_Event const*) // lv2_atom_sequence_next()
((const uint8_t*)ev + sizeof(LV2_Atom_Event) + ((ev->body.size + 7) & ~7));
}
}
@ -161,6 +168,7 @@ cleanup(LV2_Handle handle)
static const void*
extension_data(const char* uri)
{
(void) uri; /* unused variable */
return NULL;
}
@ -177,9 +185,9 @@ static const LV2_Descriptor descriptor = {
LV2_SYMBOL_EXPORT
const LV2_Descriptor*
lv2_descriptor(uint32_t index)
lv2_descriptor(uint32_t idx)
{
switch (index) {
switch (idx) {
case 0:
return &descriptor;
default:
@ -187,4 +195,4 @@ lv2_descriptor(uint32_t index)
}
}
/* vi:set ts=8 sts=2 sw=2: */
/* vi:set ts=8 sts=2 sw=2 et: */

View file

@ -175,9 +175,10 @@ static void synthesize_sineP (RSSynthChannel* sc,
const uint8_t note, const float vol, const float fq,
const size_t n_samples, float* left, float* right) {
size_t i;
float phase = sc->phase[note];
for (size_t i=0; i < n_samples; ++i) {
for (i=0; i < n_samples; ++i) {
float env = adsr_env(sc, note);
if (sc->adsr_cnt[note] == 0) break;
const float amp = vol * env;
@ -188,7 +189,7 @@ static void synthesize_sineP (RSSynthChannel* sc,
left[i] += .080 * amp * sinf(2.0 * M_PI * phase * 4.0);
//left[i] -= .007 * amp * sinf(2.0 * M_PI * phase * 5.0);
//left[i] += .010 * amp * sinf(2.0 * M_PI * phase * 6.0);
//left[i] += .020 * amp * sinf(2.0 * M_PI * phase * 7.0);
left[i] += .020 * amp * sinf(2.0 * M_PI * phase * 7.0);
phase += fq;
right[i] += amp * sinf(2.0 * M_PI * phase);
right[i] += .300 * amp * sinf(2.0 * M_PI * phase * 2.0);
@ -196,13 +197,13 @@ static void synthesize_sineP (RSSynthChannel* sc,
right[i] -= .080 * amp * sinf(2.0 * M_PI * phase * 4.0);
//right[i] += .007 * amp * sinf(2.0 * M_PI * phase * 5.0);
//right[i] += .010 * amp * sinf(2.0 * M_PI * phase * 6.0);
//right[i] -= .020 * amp * sinf(2.0 * M_PI * phase * 7.0);
right[i] -= .020 * amp * sinf(2.0 * M_PI * phase * 7.0);
if (phase > 1.0) phase -= 2.0;
}
sc->phase[note] = phase;
}
static const ADSRcfg piano_adsr = {{ 5, 1300, 100}, { 1.0, 0.0}, {0,0,0}};
static const ADSRcfg piano_adsr = {{ 5, 800, 100}, { 1.0, 0.0}, {0,0,0}};
/*****************************************************************************/
@ -272,9 +273,11 @@ static void synth_fragment (void *synth, const size_t n_samples, float *left, fl
memset (left, 0, n_samples * sizeof(float));
memset (right, 0, n_samples * sizeof(float));
uint8_t keycomp = 0;
int c,k;
size_t i;
for (int c=0; c < 16; ++c) {
for (int k=0; k < 128; ++k) {
for (c=0; c < 16; ++c) {
for (k=0; k < 128; ++k) {
if (rs->sc[c].miditable[k] == 0) continue;
process_key(synth, c, k, n_samples, left, right);
}
@ -286,7 +289,7 @@ static void synth_fragment (void *synth, const size_t n_samples, float *left, fl
if (kctgt < .5) kctgt = .5;
if (kctgt > 1.0) kctgt = 1.0;
const float _w = rs->kcfilt;
for (unsigned int i=0; i < n_samples; ++i) {
for (i=0; i < n_samples; ++i) {
rs->kcgain += _w * (kctgt - rs->kcgain);
left[i] *= rs->kcgain;
right[i] *= rs->kcgain;
@ -296,7 +299,8 @@ static void synth_fragment (void *synth, const size_t n_samples, float *left, fl
}
static void synth_reset_channel(RSSynthChannel* sc) {
for (int k=0; k < 128; ++k) {
int k;
for (k=0; k < 128; ++k) {
sc->adsr_cnt[k] = 0;
sc->adsr_amp[k] = 0;
sc->phase[k] = -10;
@ -307,7 +311,8 @@ static void synth_reset_channel(RSSynthChannel* sc) {
static void synth_reset(void *synth) {
RSSynthesizer* rs = (RSSynthesizer*)synth;
for (int c=0; c < 16; ++c) {
int c;
for (c=0; c < 16; ++c) {
synth_reset_channel(&(rs->sc[c]));
}
rs->kcgain = 0;
@ -407,7 +412,7 @@ static uint32_t synth_sound (void *synth, uint32_t written, const uint32_t nfram
* @param data 8bit midi message
* @param size number of bytes in the midi-message
*/
static void synth_parse_midi(void *synth, uint8_t *data, size_t size) {
static void synth_parse_midi(void *synth, const uint8_t *data, const size_t size) {
if (size < 2 || size > 3) return;
// All messages need to be 3 bytes; except program-changes: 2bytes.
if (size == 2 && (data[0] & 0xf0) != 0xC0) return;
@ -454,14 +459,15 @@ static void synth_init(void *synth, double rate) {
rs->rate = rate;
rs->boffset = BUFFER_SIZE_SAMPLES;
const float tuning = 440;
for (int k=0; k < 128; k++) {
int c,k;
for (k=0; k < 128; k++) {
rs->freqs[k] = (2.0 * tuning / 32.0f) * powf(2, (k - 9.0) / 12.0) / rate;
assert(rs->freqs[k] < M_PI/2); // otherwise spatialization may phase out..
}
rs->kcfilt = 12.0 / rate;
synth_reset(synth);
for (int c=0; c < 16; c++) {
for (c=0; c < 16; c++) {
synth_load(&rs->sc[c], rate, &synthesize_sineP, &piano_adsr);
}
}
@ -487,4 +493,4 @@ static void * synth_alloc(void) {
static void synth_free(void *synth) {
free(synth);
}
/* vi:set ts=8 sts=2 sw=2: */
/* vi:set ts=8 sts=2 sw=2 et: */

View file

@ -15,7 +15,6 @@ def options(opt):
def configure(conf):
conf.load('compiler_c')
autowaf.configure(conf)
autowaf.set_c99_mode(conf)
if Options.options.lv2:
autowaf.check_pkg(conf, 'lv2', atleast_version='1.0.0',
uselib_store='LV2_1_0_0')

View file

@ -24,10 +24,16 @@ def options(opt):
autowaf.set_options(opt)
def configure(conf):
if conf.is_defined('USE_EXTERNAL_LIBS'):
autowaf.check_pkg(conf, 'rubberband', uselib_store='RUBBERBAND', atleast_version='1.0', mandatory=True)
else:
conf.load('compiler_cxx')
autowaf.configure(conf)
def build(bld):
if bld.is_defined('USE_EXTERNAL_LIBS'):
return
# Library
obj = bld(features = 'cxx cxxshlib')
prefix = 'libs/rubberband/'

View file

@ -24,10 +24,16 @@ def options(opt):
autowaf.set_options(opt)
def configure(conf):
if conf.is_defined('USE_EXTERNAL_LIBS'):
autowaf.check_pkg(conf, 'taglib', uselib_store='TAGLIB', atleast_version="1.4", mandatory=True)
else:
conf.load('compiler_cxx')
autowaf.configure(conf)
def build(bld):
if bld.is_defined('USE_EXTERNAL_LIBS'):
return
# Library
obj = bld(features = 'cxx cxxshlib')
sources = bld.path.ant_glob('taglib/*.cpp')

View file

@ -37,7 +37,7 @@
#ifndef _AMPLITUDE_FOLLOWER_PLUGIN_H_
#define _AMPLITUDE_FOLLOWER_PLUGIN_H_
#include "vamp-sdk/Plugin.h"
#include <vamp-sdk/Plugin.h>
/**
* Example plugin implementing the SuperCollider amplitude follower

View file

@ -17,7 +17,7 @@
#ifndef _ONSET_PLUGIN_H_
#define _ONSET_PLUGIN_H_
#include "vamp-sdk/Plugin.h"
#include <vamp-sdk/Plugin.h>
#include <aubio/aubio.h>
class Onset : public Vamp::Plugin

View file

@ -15,7 +15,7 @@
#ifndef _ONSET_DETECT_PLUGIN_H_
#define _ONSET_DETECT_PLUGIN_H_
#include "vamp-sdk/Plugin.h"
#include <vamp-sdk/Plugin.h>
class OnsetDetectorData;

View file

@ -37,7 +37,7 @@
#ifndef _PERCUSSION_ONSET_DETECTOR_PLUGIN_H_
#define _PERCUSSION_ONSET_DETECTOR_PLUGIN_H_
#include "vamp-sdk/Plugin.h"
#include <vamp-sdk/Plugin.h>
/**
* Example plugin that detects percussive events.

View file

@ -37,7 +37,7 @@
#ifndef _SPECTRAL_CENTROID_PLUGIN_H_
#define _SPECTRAL_CENTROID_PLUGIN_H_
#include "vamp-sdk/Plugin.h"
#include <vamp-sdk/Plugin.h>
/**
* Example plugin that calculates the centre of gravity of the

View file

@ -37,7 +37,7 @@
#ifndef _ZERO_CROSSING_PLUGIN_H_
#define _ZERO_CROSSING_PLUGIN_H_
#include "vamp-sdk/Plugin.h"
#include <vamp-sdk/Plugin.h>
/**
* Example plugin that calculates the positions and density of

View file

@ -38,8 +38,8 @@
#include "libvampplugins-config.h"
#endif
#include "vamp/vamp.h"
#include "vamp-sdk/PluginAdapter.h"
#include <vamp/vamp.h>
#include <vamp-sdk/PluginAdapter.h>
#include "ZeroCrossing.h"
#include "SpectralCentroid.h"

View file

@ -23,6 +23,10 @@ def options(opt):
autowaf.set_options(opt)
def configure(conf):
if conf.is_defined('USE_EXTERNAL_LIBS'):
autowaf.check_pkg(conf, 'vamp-sdk', uselib_store='VAMPSDK', mandatory=True)
autowaf.check_pkg(conf, 'vamp-hostsdk', uselib_store='VAMPHOSTSDK', mandatory=True)
else:
conf.load('compiler_cxx')
autowaf.configure(conf)
autowaf.check_pkg(conf, 'fftw3', uselib_store='FFTW3', mandatory=True)
@ -30,6 +34,8 @@ def configure(conf):
conf.env.append_value('CXXFLAGS', '-DHAVE_FFTW3')
def build(bld):
if bld.is_defined('USE_EXTERNAL_LIBS'):
return
# Host Library
obj = bld(features = 'cxx cxxshlib')
obj.source = '''

802
tools/autowaf.py Normal file
View file

@ -0,0 +1,802 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Autowaf, useful waf utilities with support for recursive projects
# Copyright 2008-2011 David Robillard
#
# Licensed under the GNU GPL v2 or later, see COPYING file for details.
import glob
import os
import subprocess
import sys
from waflib import Configure, Context, Logs, Node, Options, Task, Utils
from waflib.TaskGen import feature, before, after
global g_is_child
g_is_child = False
# Only run autowaf hooks once (even if sub projects call several times)
global g_step
g_step = 0
# Compute dependencies globally
#import preproc
#preproc.go_absolute = True
@feature('c', 'cxx')
@after('apply_incpaths')
def include_config_h(self):
self.env.append_value('INCPATHS', self.bld.bldnode.abspath())
def set_options(opt, debug_by_default=False):
"Add standard autowaf options if they havn't been added yet"
global g_step
if g_step > 0:
return
# Install directory options
dirs_options = opt.add_option_group('Installation directories', '')
# Move --prefix and --destdir to directory options group
for k in ('--prefix', '--destdir'):
option = opt.parser.get_option(k)
if option:
opt.parser.remove_option(k)
dirs_options.add_option(option)
# Standard directory options
dirs_options.add_option('--bindir', type='string',
help="Executable programs [Default: PREFIX/bin]")
dirs_options.add_option('--configdir', type='string',
help="Configuration data [Default: PREFIX/etc]")
dirs_options.add_option('--datadir', type='string',
help="Shared data [Default: PREFIX/share]")
dirs_options.add_option('--includedir', type='string',
help="Header files [Default: PREFIX/include]")
dirs_options.add_option('--libdir', type='string',
help="Libraries [Default: PREFIX/lib]")
dirs_options.add_option('--mandir', type='string',
help="Manual pages [Default: DATADIR/man]")
dirs_options.add_option('--docdir', type='string',
help="HTML documentation [Default: DATADIR/doc]")
# Build options
if debug_by_default:
opt.add_option('--optimize', action='store_false', default=True, dest='debug',
help="Build optimized binaries")
else:
opt.add_option('--debug', action='store_true', default=False, dest='debug',
help="Build debuggable binaries")
opt.add_option('--pardebug', action='store_true', default=False, dest='pardebug',
help="Build parallel-installable debuggable libraries with D suffix")
opt.add_option('--grind', action='store_true', default=False, dest='grind',
help="Run tests in valgrind")
opt.add_option('--strict', action='store_true', default=False, dest='strict',
help="Use strict compiler flags and show all warnings")
opt.add_option('--ultra-strict', action='store_true', default=False, dest='ultra_strict',
help="Use even stricter compiler flags (likely to trigger many warnings in library headers)")
opt.add_option('--docs', action='store_true', default=False, dest='docs',
help="Build documentation - requires doxygen")
# LV2 options
opt.add_option('--lv2-user', action='store_true', default=False, dest='lv2_user',
help="Install LV2 bundles to user location")
opt.add_option('--lv2-system', action='store_true', default=False, dest='lv2_system',
help="Install LV2 bundles to system location")
dirs_options.add_option('--lv2dir', type='string',
help="LV2 bundles [Default: LIBDIR/lv2]")
g_step = 1
def check_header(conf, lang, name, define='', mandatory=True):
"Check for a header"
includes = '' # search default system include paths
if sys.platform == "darwin":
includes = '/opt/local/include'
if lang == 'c':
check_func = conf.check_cc
elif lang == 'cxx':
check_func = conf.check_cxx
else:
Logs.error("Unknown header language `%s'" % lang)
return
if define != '':
check_func(header_name=name, includes=includes,
define_name=define, mandatory=mandatory)
else:
check_func(header_name=name, includes=includes, mandatory=mandatory)
def nameify(name):
return name.replace('/', '_').replace('++', 'PP').replace('-', '_').replace('.', '_')
def define(conf, var_name, value):
conf.define(var_name, value)
conf.env[var_name] = value
def check_pkg(conf, name, **args):
"Check for a package iff it hasn't been checked for yet"
if args['uselib_store'].lower() in conf.env['AUTOWAF_LOCAL_LIBS']:
return
class CheckType:
OPTIONAL=1
MANDATORY=2
var_name = 'CHECKED_' + nameify(args['uselib_store'])
check = not var_name in conf.env
mandatory = not 'mandatory' in args or args['mandatory']
if not check and 'atleast_version' in args:
# Re-check if version is newer than previous check
checked_version = conf.env['VERSION_' + name]
if checked_version and checked_version < args['atleast_version']:
check = True;
if not check and mandatory and conf.env[var_name] == CheckType.OPTIONAL:
# Re-check if previous check was optional but this one is mandatory
check = True;
if check:
found = None
pkg_var_name = 'PKG_' + name.replace('-', '_')
pkg_name = name
if conf.env.PARDEBUG:
args['mandatory'] = False # Smash mandatory arg
found = conf.check_cfg(package=pkg_name + 'D', args="--cflags --libs", **args)
if found:
pkg_name += 'D'
if mandatory:
args['mandatory'] = True # Unsmash mandatory arg
if not found:
found = conf.check_cfg(package=pkg_name, args="--cflags --libs", **args)
if found:
conf.env[pkg_var_name] = pkg_name
if 'atleast_version' in args:
conf.env['VERSION_' + name] = args['atleast_version']
if mandatory:
conf.env[var_name] = CheckType.MANDATORY
else:
conf.env[var_name] = CheckType.OPTIONAL
def normpath(path):
if sys.platform == 'win32':
return os.path.normpath(path).replace('\\', '/')
else:
return os.path.normpath(path)
def configure(conf):
global g_step
if g_step > 1:
return
def append_cxx_flags(flags):
conf.env.append_value('CFLAGS', flags)
conf.env.append_value('CXXFLAGS', flags)
print('')
display_header('Global Configuration')
if Options.options.docs:
conf.load('doxygen')
conf.env['DOCS'] = Options.options.docs
conf.env['DEBUG'] = Options.options.debug or Options.options.pardebug
conf.env['PARDEBUG'] = Options.options.pardebug
conf.env['PREFIX'] = normpath(os.path.abspath(os.path.expanduser(conf.env['PREFIX'])))
def config_dir(var, opt, default):
if opt:
conf.env[var] = normpath(opt)
else:
conf.env[var] = normpath(default)
opts = Options.options
prefix = conf.env['PREFIX']
config_dir('BINDIR', opts.bindir, os.path.join(prefix, 'bin'))
config_dir('SYSCONFDIR', opts.configdir, os.path.join(prefix, 'etc'))
config_dir('DATADIR', opts.datadir, os.path.join(prefix, 'share'))
config_dir('INCLUDEDIR', opts.includedir, os.path.join(prefix, 'include'))
config_dir('LIBDIR', opts.libdir, os.path.join(prefix, 'lib'))
config_dir('MANDIR', opts.mandir, os.path.join(conf.env['DATADIR'], 'man'))
config_dir('DOCDIR', opts.docdir, os.path.join(conf.env['DATADIR'], 'doc'))
if Options.options.lv2dir:
conf.env['LV2DIR'] = Options.options.lv2dir
elif Options.options.lv2_user:
if sys.platform == "darwin":
conf.env['LV2DIR'] = os.path.join(os.getenv('HOME'), 'Library/Audio/Plug-Ins/LV2')
elif sys.platform == "win32":
conf.env['LV2DIR'] = os.path.join(os.getenv('APPDATA'), 'LV2')
else:
conf.env['LV2DIR'] = os.path.join(os.getenv('HOME'), '.lv2')
elif Options.options.lv2_system:
if sys.platform == "darwin":
conf.env['LV2DIR'] = '/Library/Audio/Plug-Ins/LV2'
elif sys.platform == "win32":
conf.env['LV2DIR'] = os.path.join(os.getenv('COMMONPROGRAMFILES'), 'LV2')
else:
conf.env['LV2DIR'] = os.path.join(conf.env['LIBDIR'], 'lv2')
else:
conf.env['LV2DIR'] = os.path.join(conf.env['LIBDIR'], 'lv2')
conf.env['LV2DIR'] = normpath(conf.env['LV2DIR'])
if Options.options.docs:
doxygen = conf.find_program('doxygen')
if not doxygen:
conf.fatal("Doxygen is required to build with --docs")
dot = conf.find_program('dot')
if not dot:
conf.fatal("Graphviz (dot) is required to build with --docs")
if Options.options.debug:
if conf.env['MSVC_COMPILER']:
conf.env['CFLAGS'] = ['/Od', '/Zi', '/MTd']
conf.env['CXXFLAGS'] = ['/Od', '/Zi', '/MTd']
conf.env['LINKFLAGS'] = ['/DEBUG']
else:
conf.env['CFLAGS'] = ['-O0', '-g']
conf.env['CXXFLAGS'] = ['-O0', '-g']
else:
if conf.env['MSVC_COMPILER']:
conf.env['CFLAGS'] = ['/MD']
conf.env['CXXFLAGS'] = ['/MD']
append_cxx_flags(['-DNDEBUG'])
if Options.options.ultra_strict:
Options.options.strict = True
conf.env.append_value('CFLAGS', ['-Wredundant-decls',
'-Wstrict-prototypes',
'-Wmissing-prototypes'])
if Options.options.strict:
conf.env.append_value('CFLAGS', ['-std=c99', '-pedantic', '-Wshadow'])
conf.env.append_value('CXXFLAGS', ['-ansi',
'-Wnon-virtual-dtor',
'-Woverloaded-virtual'])
append_cxx_flags(['-Wall',
'-Wcast-align',
'-Wextra',
'-Wwrite-strings'])
if sys.platform != "darwin":
# this is really only to be avoid on OLD apple gcc, but not sure how to version check
append_cxx_flags(['-fstrict-overflow'])
if not conf.check_cc(fragment = '''
#ifndef __clang__
#error
#endif
int main() { return 0; }''',
features = 'c',
mandatory = False,
execute = False,
msg = 'Checking for clang'):
if sys.platform != "darwin":
# this is really only to be avoid on OLD apple gcc, but not sure how to version check
append_cxx_flags(['-Wunsafe-loop-optimizations'])
# this is invalid (still) on Lion apple gcc
append_cxx_flags(['-Wlogical-op'])
if not conf.env['MSVC_COMPILER']:
append_cxx_flags(['-fshow-column'])
conf.env.prepend_value('CFLAGS', '-I' + os.path.abspath('.'))
conf.env.prepend_value('CXXFLAGS', '-I' + os.path.abspath('.'))
display_msg(conf, "Install prefix", conf.env['PREFIX'])
display_msg(conf, "Debuggable build", str(conf.env['DEBUG']))
display_msg(conf, "Build documentation", str(conf.env['DOCS']))
print('')
g_step = 2
def set_c99_mode(conf):
if conf.env.MSVC_COMPILER:
# MSVC has no hope or desire to compile C99, just compile as C++
conf.env.append_unique('CFLAGS', ['-TP'])
else:
conf.env.append_unique('CFLAGS', ['-std=c99'])
def set_local_lib(conf, name, has_objects):
var_name = 'HAVE_' + nameify(name.upper())
define(conf, var_name, 1)
if has_objects:
if type(conf.env['AUTOWAF_LOCAL_LIBS']) != dict:
conf.env['AUTOWAF_LOCAL_LIBS'] = {}
conf.env['AUTOWAF_LOCAL_LIBS'][name.lower()] = True
else:
if type(conf.env['AUTOWAF_LOCAL_HEADERS']) != dict:
conf.env['AUTOWAF_LOCAL_HEADERS'] = {}
conf.env['AUTOWAF_LOCAL_HEADERS'][name.lower()] = True
def append_property(obj, key, val):
if hasattr(obj, key):
setattr(obj, key, getattr(obj, key) + val)
else:
setattr(obj, key, val)
def use_lib(bld, obj, libs):
abssrcdir = os.path.abspath('.')
libs_list = libs.split()
for l in libs_list:
in_headers = l.lower() in bld.env['AUTOWAF_LOCAL_HEADERS']
in_libs = l.lower() in bld.env['AUTOWAF_LOCAL_LIBS']
if in_libs:
append_property(obj, 'use', ' lib%s ' % l.lower())
append_property(obj, 'framework', bld.env['FRAMEWORK_' + l])
if in_headers or in_libs:
inc_flag = '-iquote ' + os.path.join(abssrcdir, l.lower())
for f in ['CFLAGS', 'CXXFLAGS']:
if not inc_flag in bld.env[f]:
bld.env.prepend_value(f, inc_flag)
else:
append_property(obj, 'uselib', ' ' + l)
@feature('c', 'cxx')
@before('apply_link')
def version_lib(self):
if sys.platform == 'win32':
self.vnum = None # Prevent waf from automatically appending -0
if self.env['PARDEBUG']:
applicable = ['cshlib', 'cxxshlib', 'cstlib', 'cxxstlib']
if [x for x in applicable if x in self.features]:
self.target = self.target + 'D'
def set_lib_env(conf, name, version):
'Set up environment for local library as if found via pkg-config.'
NAME = name.upper()
major_ver = version.split('.')[0]
pkg_var_name = 'PKG_' + name.replace('-', '_')
lib_name = '%s-%s' % (name, major_ver)
if conf.env.PARDEBUG:
lib_name += 'D'
conf.env[pkg_var_name] = lib_name
conf.env['INCLUDES_' + NAME] = ['${INCLUDEDIR}/%s-%s' % (name, major_ver)]
conf.env['LIBPATH_' + NAME] = [conf.env.LIBDIR]
conf.env['LIB_' + NAME] = [lib_name]
def display_header(title):
Logs.pprint('BOLD', title)
def display_msg(conf, msg, status = None, color = None):
color = 'CYAN'
if type(status) == bool and status or status == "True":
color = 'GREEN'
elif type(status) == bool and not status or status == "False":
color = 'YELLOW'
Logs.pprint('BOLD', " *", sep='')
Logs.pprint('NORMAL', "%s" % msg.ljust(conf.line_just - 3), sep='')
Logs.pprint('BOLD', ":", sep='')
Logs.pprint(color, status)
def link_flags(env, lib):
return ' '.join(map(lambda x: env['LIB_ST'] % x, env['LIB_' + lib]))
def compile_flags(env, lib):
return ' '.join(map(lambda x: env['CPPPATH_ST'] % x, env['INCLUDES_' + lib]))
def set_recursive():
global g_is_child
g_is_child = True
def is_child():
global g_is_child
return g_is_child
# Pkg-config file
def build_pc(bld, name, version, version_suffix, libs, subst_dict={}):
'''Build a pkg-config file for a library.
name -- uppercase variable name (e.g. 'SOMENAME')
version -- version string (e.g. '1.2.3')
version_suffix -- name version suffix (e.g. '2')
libs -- string/list of dependencies (e.g. 'LIBFOO GLIB')
'''
pkg_prefix = bld.env['PREFIX']
if pkg_prefix[-1] == '/':
pkg_prefix = pkg_prefix[:-1]
target = name.lower()
if version_suffix != '':
target += '-' + version_suffix
if bld.env['PARDEBUG']:
target += 'D'
target += '.pc'
libdir = bld.env['LIBDIR']
if libdir.startswith(pkg_prefix):
libdir = libdir.replace(pkg_prefix, '${exec_prefix}')
includedir = bld.env['INCLUDEDIR']
if includedir.startswith(pkg_prefix):
includedir = includedir.replace(pkg_prefix, '${prefix}')
obj = bld(features = 'subst',
source = '%s.pc.in' % name.lower(),
target = target,
install_path = os.path.join(bld.env['LIBDIR'], 'pkgconfig'),
exec_prefix = '${prefix}',
PREFIX = pkg_prefix,
EXEC_PREFIX = '${prefix}',
LIBDIR = libdir,
INCLUDEDIR = includedir)
if type(libs) != list:
libs = libs.split()
subst_dict[name + '_VERSION'] = version
subst_dict[name + '_MAJOR_VERSION'] = version[0:version.find('.')]
for i in libs:
subst_dict[i + '_LIBS'] = link_flags(bld.env, i)
lib_cflags = compile_flags(bld.env, i)
if lib_cflags == '':
lib_cflags = ' '
subst_dict[i + '_CFLAGS'] = lib_cflags
obj.__dict__.update(subst_dict)
def build_dir(name, subdir):
if is_child():
return os.path.join('build', name, subdir)
else:
return os.path.join('build', subdir)
# Clean up messy Doxygen documentation after it is built
def make_simple_dox(name):
name = name.lower()
NAME = name.upper()
try:
top = os.getcwd()
os.chdir(build_dir(name, 'doc/html'))
page = 'group__%s.html' % name
if not os.path.exists(page):
return
for i in [
['%s_API ' % NAME, ''],
['%s_DEPRECATED ' % NAME, ''],
['group__%s.html' % name, ''],
['&#160;', ''],
['<script.*><\/script>', ''],
['<hr\/><a name="details" id="details"><\/a><h2>.*<\/h2>', ''],
['<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text\/css\"\/>',
''],
['<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"\/>',
'Doxygen']]:
os.system("sed -i 's/%s/%s/g' %s" % (i[0], i[1], page))
os.rename('group__%s.html' % name, 'index.html')
for i in (glob.glob('*.png') +
glob.glob('*.html') +
glob.glob('*.js') +
glob.glob('*.css')):
if i != 'index.html' and i != 'style.css':
os.remove(i)
os.chdir(top)
os.chdir(build_dir(name, 'doc/man/man3'))
for i in glob.glob('*.3'):
os.system("sed -i 's/%s_API //' %s" % (NAME, i))
for i in glob.glob('_*'):
os.remove(i)
os.chdir(top)
except Exception as e:
Logs.error("Failed to fix up %s documentation: %s" % (name, e))
# Doxygen API documentation
def build_dox(bld, name, version, srcdir, blddir, outdir=''):
if not bld.env['DOCS']:
return
if is_child():
src_dir = os.path.join(srcdir, name.lower())
doc_dir = os.path.join(blddir, name.lower(), 'doc')
else:
src_dir = srcdir
doc_dir = os.path.join(blddir, 'doc')
subst_tg = bld(features = 'subst',
source = 'doc/reference.doxygen.in',
target = 'doc/reference.doxygen',
install_path = '',
name = 'doxyfile')
subst_dict = {
name + '_VERSION' : version,
name + '_SRCDIR' : os.path.abspath(src_dir),
name + '_DOC_DIR' : os.path.abspath(doc_dir)
}
subst_tg.__dict__.update(subst_dict)
subst_tg.post()
docs = bld(features = 'doxygen',
doxyfile = 'doc/reference.doxygen')
docs.post()
major = int(version[0:version.find('.')])
bld.install_files(
os.path.join('${DOCDIR}', '%s-%d' % (name.lower(), major), outdir, 'html'),
bld.path.get_bld().ant_glob('doc/html/*'))
for i in range(1, 8):
bld.install_files('${MANDIR}/man%d' % i,
bld.path.get_bld().ant_glob('doc/man/man%d/*' % i,
excl='**/_*'))
# Version code file generation
def build_version_files(header_path, source_path, domain, major, minor, micro):
header_path = os.path.abspath(header_path)
source_path = os.path.abspath(source_path)
text = "int " + domain + "_major_version = " + str(major) + ";\n"
text += "int " + domain + "_minor_version = " + str(minor) + ";\n"
text += "int " + domain + "_micro_version = " + str(micro) + ";\n"
try:
o = open(source_path, 'w')
o.write(text)
o.close()
except IOError:
Logs.error('Failed to open %s for writing\n' % source_path)
sys.exit(-1)
text = "#ifndef __" + domain + "_version_h__\n"
text += "#define __" + domain + "_version_h__\n"
text += " extern const char* " + domain + "_revision;\n"
text += " extern int " + domain + "_major_version;\n"
text += " extern int " + domain + "_minor_version;\n"
text += " extern int " + domain + "_micro_version;\n"
text += "#endif /* __" + domain + "_version_h__ */\n"
try:
o = open(header_path, 'w')
o.write(text)
o.close()
except IOError:
Logs.warn('Failed to open %s for writing\n' % header_path)
sys.exit(-1)
return None
def build_i18n_pot(bld, srcdir, dir, name, sources, copyright_holder=None):
Logs.info('Generating pot file from %s' % name)
pot_file = '%s.pot' % name
cmd = ['xgettext',
'--keyword=_',
'--keyword=N_',
'--keyword=S_',
'--keyword=P_:1,2',
'--from-code=UTF-8',
'-o', pot_file]
if copyright_holder:
cmd += ['--copyright-holder="%s"' % copyright_holder]
cmd += sources
Logs.info('Updating ' + pot_file)
subprocess.call(cmd, cwd=os.path.join(srcdir, dir))
def build_i18n_po(bld, srcdir, dir, name, sources, copyright_holder=None):
pwd = os.getcwd()
os.chdir(os.path.join(srcdir, dir))
pot_file = '%s.pot' % name
po_files = glob.glob('po/*.po')
for po_file in po_files:
cmd = ['msgmerge',
'--update',
'--no-fuzzy-matching',
po_file,
pot_file]
Logs.info('Updating ' + po_file)
subprocess.call(cmd)
os.chdir(pwd)
def build_i18n_mo(bld, srcdir, dir, name, sources, copyright_holder=None):
pwd = os.getcwd()
os.chdir(os.path.join(srcdir, dir))
pot_file = '%s.pot' % name
po_files = glob.glob('po/*.po')
for po_file in po_files:
mo_file = po_file.replace('.po', '.mo')
cmd = ['msgfmt',
'-c',
'-f',
'-o',
mo_file,
po_file]
Logs.info('Generating ' + po_file)
subprocess.call(cmd)
os.chdir(pwd)
def build_i18n(bld, srcdir, dir, name, sources, copyright_holder=None):
build_i18n_pot(bld, srcdir, dir, name, sources, copyright_holder)
build_i18n_po(bld, srcdir, dir, name, sources, copyright_holder)
build_i18n_mo(bld, srcdir, dir, name, sources, copyright_holder)
def cd_to_build_dir(ctx, appname):
orig_dir = os.path.abspath(os.curdir)
top_level = (len(ctx.stack_path) > 1)
if top_level:
os.chdir(os.path.join('build', appname))
else:
os.chdir('build')
Logs.pprint('GREEN', "Waf: Entering directory `%s'" % os.path.abspath(os.getcwd()))
def cd_to_orig_dir(ctx, child):
if child:
os.chdir(os.path.join('..', '..'))
else:
os.chdir('..')
def pre_test(ctx, appname, dirs=['src']):
diropts = ''
for i in dirs:
diropts += ' -d ' + i
cd_to_build_dir(ctx, appname)
clear_log = open('lcov-clear.log', 'w')
try:
try:
# Clear coverage data
subprocess.call(('lcov %s -z' % diropts).split(),
stdout=clear_log, stderr=clear_log)
except:
Logs.warn('Failed to run lcov, no coverage report will be generated')
finally:
clear_log.close()
def post_test(ctx, appname, dirs=['src'], remove=['*boost*', 'c++*']):
diropts = ''
for i in dirs:
diropts += ' -d ' + i
coverage_log = open('lcov-coverage.log', 'w')
coverage_lcov = open('coverage.lcov', 'w')
coverage_stripped_lcov = open('coverage-stripped.lcov', 'w')
try:
try:
base = '.'
if g_is_child:
base = '..'
# Generate coverage data
subprocess.call(('lcov -c %s -b %s' % (diropts, base)).split(),
stdout=coverage_lcov, stderr=coverage_log)
# Strip unwanted stuff
subprocess.call(
['lcov', '--remove', 'coverage.lcov'] + remove,
stdout=coverage_stripped_lcov, stderr=coverage_log)
# Generate HTML coverage output
if not os.path.isdir('coverage'):
os.makedirs('coverage')
subprocess.call('genhtml -o coverage coverage-stripped.lcov'.split(),
stdout=coverage_log, stderr=coverage_log)
except:
Logs.warn('Failed to run lcov, no coverage report will be generated')
finally:
coverage_stripped_lcov.close()
coverage_lcov.close()
coverage_log.close()
print('')
Logs.pprint('GREEN', "Waf: Leaving directory `%s'" % os.path.abspath(os.getcwd()))
top_level = (len(ctx.stack_path) > 1)
if top_level:
cd_to_orig_dir(ctx, top_level)
print('')
Logs.pprint('BOLD', 'Coverage:', sep='')
print('<file://%s>\n\n' % os.path.abspath('coverage/index.html'))
def run_tests(ctx, appname, tests, desired_status=0, dirs=['src'], name='*'):
failures = 0
diropts = ''
for i in dirs:
diropts += ' -d ' + i
# Run all tests
for i in tests:
s = i
if type(i) == type([]):
s = ' '.join(i)
print('')
Logs.pprint('BOLD', '** Test', sep='')
Logs.pprint('NORMAL', '%s' % s)
cmd = i
if Options.options.grind:
cmd = 'valgrind ' + i
if subprocess.call(cmd, shell=True) == desired_status:
Logs.pprint('GREEN', '** Pass')
else:
failures += 1
Logs.pprint('RED', '** FAIL')
print('')
if failures == 0:
Logs.pprint('GREEN', '** Pass: All %s.%s tests passed' % (appname, name))
else:
Logs.pprint('RED', '** FAIL: %d %s.%s tests failed' % (failures, appname, name))
def run_ldconfig(ctx):
if (ctx.cmd == 'install'
and not ctx.env['RAN_LDCONFIG']
and ctx.env['LIBDIR']
and not 'DESTDIR' in os.environ
and not Options.options.destdir):
try:
Logs.info("Waf: Running `/sbin/ldconfig %s'" % ctx.env['LIBDIR'])
subprocess.call(['/sbin/ldconfig', ctx.env['LIBDIR']])
ctx.env['RAN_LDCONFIG'] = True
except:
pass
def write_news(name, in_files, out_file, top_entries=None, extra_entries=None):
import rdflib
import textwrap
from time import strftime, strptime
doap = rdflib.Namespace('http://usefulinc.com/ns/doap#')
dcs = rdflib.Namespace('http://ontologi.es/doap-changeset#')
rdfs = rdflib.Namespace('http://www.w3.org/2000/01/rdf-schema#')
foaf = rdflib.Namespace('http://xmlns.com/foaf/0.1/')
rdf = rdflib.Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#')
m = rdflib.ConjunctiveGraph()
try:
for i in in_files:
m.parse(i, format='n3')
except:
Logs.warn('Error parsing data, unable to generate NEWS')
return
proj = m.value(None, rdf.type, doap.Project)
for f in m.triples([proj, rdfs.seeAlso, None]):
if f[2].endswith('.ttl'):
m.parse(f[2], format='n3')
entries = {}
for r in m.triples([proj, doap.release, None]):
release = r[2]
revision = m.value(release, doap.revision, None)
date = m.value(release, doap.created, None)
blamee = m.value(release, dcs.blame, None)
changeset = m.value(release, dcs.changeset, None)
dist = m.value(release, doap['file-release'], None)
if revision and date and blamee and changeset:
entry = '%s (%s) stable;\n' % (name, revision)
for i in m.triples([changeset, dcs.item, None]):
item = textwrap.wrap(m.value(i[2], rdfs.label, None), width=79)
entry += '\n * ' + '\n '.join(item)
if dist and top_entries is not None:
if not str(dist) in top_entries:
top_entries[str(dist)] = []
top_entries[str(dist)] += [
'%s: %s' % (name, '\n '.join(item))]
if extra_entries:
for i in extra_entries[str(dist)]:
entry += '\n * ' + i
entry += '\n\n --'
blamee_name = m.value(blamee, foaf.name, None)
blamee_mbox = m.value(blamee, foaf.mbox, None)
if blamee_name and blamee_mbox:
entry += ' %s <%s>' % (blamee_name,
blamee_mbox.replace('mailto:', ''))
entry += ' %s\n\n' % (
strftime('%a, %d %b %Y %H:%M:%S +0000', strptime(date, '%Y-%m-%d')))
entries[revision] = entry
else:
Logs.warn('Ignored incomplete %s release description' % name)
if len(entries) > 0:
news = open(out_file, 'w')
for e in sorted(entries.keys(), reverse=True):
news.write(entries[e])
news.close()

View file

@ -2,15 +2,24 @@
# this is sourced by build and package, and executed from within build/{osx,linux}_packaging
#
major_version=`grep -m 1 '^MAJOR = ' ../../wscript | awk '{print $3}' | sed "s/'//g"`
minor_version=`grep -m 1 '^MINOR = ' ../../wscript | awk '{print $3}' | sed "s/'//g"`
release_version=${major_version}.${minor_version}
r=`cut -d'"' -f2 < ../../libs/ardour/revision.cc | sed -e 1d -e "s/[0-9][0-9]*\.[0-9][0-9]*-//"`
if echo $r | grep -q -e - ; then
revcount=`echo $r | cut -d- -f1`
if uname -a | grep arwin >/dev/null 2>&1 ; then
EXTENDED_RE=-E
else
EXTENDED_RE=-r
fi
commit=`echo $r | cut -d- -f2`
version=${release_version}${revcount:+.$revcount}
GIT_REV_REGEXP='([0-9][0-9]*)\.([0-9][0-9]*)-?([0-9][0-9]*)?-?([a-z0-9]*)'
major_version=`cut -d'"' -f2 < ../../libs/ardour/revision.cc | sed $EXTENDED_RE -e 1d -e "s/$GIT_REV_REGEXP/\1/"`
minor_version=`cut -d'"' -f2 < ../../libs/ardour/revision.cc | sed $EXTENDED_RE -e 1d -e "s/$GIT_REV_REGEXP/\2/"`
r=`cut -d'"' -f2 < ../../libs/ardour/revision.cc | sed $EXTENDED_RE -e 1d -e "s/$GIT_REV_REGEXP/\3/"`
commit=`cut -d'"' -f2 < ../../libs/ardour/revision.cc | sed $EXTENDED_RE -e 1d -e "s/$GIT_REV_REGEXP/\4/"`
if [ "x$r" != "x" ] ; then
revcount=$r
fi
release_version=${major_version}.${minor_version}${revcount:+.$revcount}
#
# Figure out the Build Type

View file

@ -97,8 +97,12 @@ fi
. ../define_versions.sh
echo "Version is $version / $commit"
info_string="$version ($commit) built on `hostname` by `whoami` on `date`"
echo "Version is $release_version"
if [ "x$commit" != "x" ] ; then
info_string="$release_version ($commit) built on `hostname` by `whoami` on `date`"
else
info_string="$release_version built on `hostname` by `whoami` on `date`"
fi
echo "Info string is $info_string"
# Figure out our CPU type
@ -134,11 +138,11 @@ fi
# setup directory structure
if [ -z "${BUILDTYPE}" ]; then
APPDIR=${APPNAME}_${ARCH}-${version}
APP_VER_NAME=${APPNAME}-${version}
APPDIR=${APPNAME}_${ARCH}-${release_version}
APP_VER_NAME=${APPNAME}-${release_version}
else
APPDIR=${APPNAME}_${ARCH}-${version}-${BUILDTYPE}
APP_VER_NAME=${APPNAME}-${version}-${BUILDTYPE}
APPDIR=${APPNAME}_${ARCH}-${release_version}-${BUILDTYPE}
APP_VER_NAME=${APPNAME}-${release_version}-${BUILDTYPE}
fi
APPBIN=$APPDIR/bin
@ -569,7 +573,7 @@ fi
#
# Add the uninstaller
#
sed -e "s/%REPLACE_PGM%/${APPNAME}/" -e "s/%REPLACE_VENDOR%/${VENDOR}/" -e "s/%REPLACE_VERSION%/${version}/" -e "s/%REPLACE_TYPE%/${BUILDTYPE}/" < uninstall.sh.in > $APPBIN/${APP_VER_NAME}.uninstall.sh
sed -e "s/%REPLACE_PGM%/${APPNAME}/" -e "s/%REPLACE_VENDOR%/${VENDOR}/" -e "s/%REPLACE_VERSION%/${release_version}/" -e "s/%REPLACE_TYPE%/${BUILDTYPE}/" < uninstall.sh.in > $APPBIN/${APP_VER_NAME}.uninstall.sh
chmod a+x $APPBIN/${APP_VER_NAME}.uninstall.sh
#Sanity Check file

View file

@ -56,8 +56,8 @@ if [ x$DEBUG = xT ]; then
BUILDTYPE="dbg"
fi
X86_BUNDLE="${APPNAME}_x86-${version}"
X86_64_BUNDLE="${APPNAME}_x86_64-${version}"
X86_BUNDLE="${APPNAME}_x86-${release_version}"
X86_64_BUNDLE="${APPNAME}_x86_64-${release_version}"
if [ ! -z ${BUILDTYPE} ]; then
X86_BUNDLE="${X86_BUNDLE}-${BUILDTYPE}"
@ -112,22 +112,22 @@ fi
if [ -z ${BUILDTYPE} ]; then
if [ "${SINGLE_ARCH}" = "T" ]; then
if [ "${X86_BUNDLE_OK}" = "T" ]; then
PACKAGE="${APPNAME}_32bit-${version}"
PACKAGE="${APPNAME}_32bit-${release_version}"
else
PACKAGE="${APPNAME}_64bit-${version}"
PACKAGE="${APPNAME}_64bit-${release_version}"
fi
else
PACKAGE="${APPNAME}-${version}"
PACKAGE="${APPNAME}-${release_version}"
fi
else
if [ "${SINGLE_ARCH}" = "T" ]; then
if [ "${X86_BUNDLE_OK}" = "T" ]; then
PACKAGE="${APPNAME}_32bit-${version}-${BUILDTYPE}"
PACKAGE="${APPNAME}_32bit-${release_version}-${BUILDTYPE}"
else
PACKAGE="${APPNAME}_64bit-${version}-${BUILDTYPE}"
PACKAGE="${APPNAME}_64bit-${release_version}-${BUILDTYPE}"
fi
else
PACKAGE="${APPNAME}-${version}-${BUILDTYPE}"
PACKAGE="${APPNAME}-${release_version}-${BUILDTYPE}"
fi
fi

14
tools/nofuzz.sh Executable file
View file

@ -0,0 +1,14 @@
#!/bin/sh
## this script should be run from the top-level source dir
## it remove all fuzzy and obsolte translations and wraps
## long lines.
##
## update .po and .pot files:
./waf i18n_pot
TEMPFILE=`mktemp`
for file in `git ls-files | grep -e '.po$'`; do
cp $file $TEMPFILE
msgattrib -o $file --no-fuzzy --no-obsolete $TEMPFILE
done
rm $TEMPFILE

View file

@ -75,8 +75,12 @@ if test -z "$PRODUCT_PKG_DIR" -o -z "$APPNAME"; then
fi
. ../define_versions.sh
echo "Version is $release_version / $revision"
info_string="$version built on `hostname` by `whoami` on `date`"
echo "Version is $release_version"
if [ "x$commit" != "x" ] ; then
info_string="$release_version ($commit) built on `hostname` by `whoami` on `date`"
else
info_string="$release_version built on `hostname` by `whoami` on `date`"
fi
echo "Info string is $info_string"
# setup directory structure
@ -177,12 +181,12 @@ env="<key>LSEnvironment</key><dict>$env<key>ARDOUR_BUNDLED</key><string>true</st
# edit plist
sed -e "s?@ENV@?$env?g" \
-e "s?@VERSION@?$release_version/$revision?g" \
-e "s?@VERSION@?$release_version?g" \
-e "s?@INFOSTRING@?$info_string?g" < Info.plist.in > Info.plist
# and plist strings
sed -e "s?@APPNAME@?$appname?" \
-e "s?@ENV@?$env?g" \
-e "s?@VERSION@?$release_version/$revision?g" \
-e "s?@VERSION@?$release_version?g" \
-e "s?@INFOSTRING@?$info_string?g" < InfoPlist.strings.in > Resources/InfoPlist.strings || exit 1
# copy static files
@ -569,10 +573,10 @@ fi
echo "Building DMG ..."
# UC_DMG=$APPNAME-${release_version}-${revision}-UC.dmg
# FINAL_DMG=$APPNAME-${release_version}-${revision}.dmg
UC_DMG=$APPNAME-$version.dmg
VOLNAME=$APPNAME-$version
# UC_DMG=$APPNAME-${release_version}-UC.dmg
# FINAL_DMG=$APPNAME-${release_version}.dmg
UC_DMG=$APPNAME-$release_version.dmg
VOLNAME=$APPNAME-$release_version
# TODO use mktemp
export TMPDIR=`pwd`

BIN
waf vendored

Binary file not shown.

72
wscript
View file

@ -7,10 +7,42 @@ import string
import subprocess
import sys
MAJOR = '3'
MINOR = '5'
VERSION = MAJOR + '.' + MINOR
def fetch_git_revision ():
cmd = "git describe HEAD"
output = subprocess.Popen(cmd, shell=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE).communicate()[0].splitlines()
rev = output[0].decode ('utf-8')
return rev
def fetch_tarball_revision ():
if not os.path.exists ('libs/ardour/revision.cc'):
print 'This tarball was not created correctly - it is missing libs/ardour/revision.cc'
sys.exit (1)
with open('libs/ardour/revision.cc') as f:
content = f.readlines()
remove_punctuation_map = dict((ord(char), None) for char in '";')
return content[1].decode('utf-8').strip().split(' ')[7].translate (remove_punctuation_map)
if os.path.isdir (os.path.join(os.getcwd(), '.git')):
rev = fetch_git_revision ()
else:
rev = fetch_tarball_revision ()
#
# rev is now of the form MAJOR.MINOR-rev-commit
#
parts = rev.split ('.')
MAJOR = parts[0]
other = parts[1].split ('-')
MINOR = other[0]
MICRO = other[1]
V = MAJOR + '.' + MINOR + '.' + MICRO
#
# it is important that VERSION *not* be unicode string
# because if it is, it breaks waf somehow.
#
VERSION = V.encode ('ascii', 'ignore')
APPNAME = 'Ardour' + MAJOR
# Mandatory variables
@ -57,17 +89,11 @@ def fetch_gcc_version (CC):
version = o.split(' ')[2].split('.')
return version
def fetch_git_revision ():
cmd = "git describe HEAD"
output = subprocess.Popen(cmd, shell=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE).communicate()[0].splitlines()
rev = output[0].decode('utf-8')
return rev
def create_stored_revision():
rev = ""
if os.path.exists('.git'):
rev = fetch_git_revision();
print("ardour.git version: " + rev + "\n")
print("Git version: " + rev + "\n")
elif os.path.exists('libs/ardour/revision.cc'):
print("Using packaged revision")
return
@ -76,6 +102,10 @@ def create_stored_revision():
sys.exit(-1)
try:
#
# if you change the format of this, be sure to fix fetch_tarball_revision() above
# so that it still works.
#
text = '#include "ardour/revision.h"\n'
text += 'namespace ARDOUR { const char* revision = \"%s\"; }\n' % rev
print('Writing revision info to libs/ardour/revision.cc using ' + rev)
@ -294,12 +324,21 @@ def set_compiler_flags (conf,opt):
# prepend boiler plate optimization flags that work on all architectures
#
optimization_flags[:0] = ["-pipe"]
# don't prepend optimization flags if "-O<something>" is present
prepend_opt_flags = True
for flag in optimization_flags:
if flag.startswith("-O"):
prepend_opt_flags = False
break
if prepend_opt_flags:
optimization_flags[:0] = [
"-O3",
"-fomit-frame-pointer",
"-ffast-math",
"-fstrength-reduce",
"-pipe"
"-fstrength-reduce"
]
if opt.debug:
@ -419,6 +458,8 @@ def options(opt):
help='Build internal libs as shared libraries')
opt.add_option('--internal-static-libs', action='store_false', dest='internal_shared_libs',
help='Build internal libs as static libraries')
opt.add_option('--use-external-libs', action='store_true', default=False, dest='use_external_libs',
help='Use external/system versions of some bundled libraries')
opt.add_option('--lv2', action='store_true', default=True, dest='lv2',
help='Compile with support for LV2 (if Lilv+Suil is available)')
opt.add_option('--no-lv2', action='store_false', dest='lv2',
@ -591,6 +632,9 @@ def configure(conf):
if Options.options.internal_shared_libs:
conf.define('INTERNAL_SHARED_LIBS', 1)
if Options.options.use_external_libs:
conf.define('USE_EXTERNAL_LIBS', 1)
if Options.options.boost_include != '':
conf.env.append_value('CXXFLAGS', '-I' + Options.options.boost_include)
@ -729,6 +773,7 @@ const char* const ardour_config_info = "\\n\\
write_config_text('Install prefix', conf.env['PREFIX'])
write_config_text('Strict compiler flags', conf.env['STRICT'])
write_config_text('Internal Shared Libraries', conf.is_defined('INTERNAL_SHARED_LIBS'))
write_config_text('Use External Libraries', conf.is_defined('USE_EXTERNAL_LIBS'))
write_config_text('Architecture flags', opts.arch)
write_config_text('Aubio', conf.is_defined('HAVE_AUBIO'))
@ -774,13 +819,16 @@ def build(bld):
# add directories that contain only headers, to workaround an issue with waf
bld.path.find_dir ('libs/evoral/evoral')
if not bld.is_defined('USE_EXTERNAL_LIBS'):
bld.path.find_dir ('libs/vamp-sdk/vamp-sdk')
bld.path.find_dir ('libs/surfaces/control_protocol/control_protocol')
bld.path.find_dir ('libs/timecode/timecode')
if not bld.is_defined('USE_EXTERNAL_LIBS'):
bld.path.find_dir ('libs/libltc/ltc')
bld.path.find_dir ('libs/rubberband/rubberband')
bld.path.find_dir ('libs/gtkmm2ext/gtkmm2ext')
bld.path.find_dir ('libs/ardour/ardour')
if not bld.is_defined('USE_EXTERNAL_LIBS'):
bld.path.find_dir ('libs/taglib/taglib')
bld.path.find_dir ('libs/pbd/pbd')