miscellaneous stuff, SVN IS TEMPORARILY BROKEN. FIX WITHIN 18 HOURS
git-svn-id: svn://localhost/ardour2/trunk@1192 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
@@ -59,6 +59,8 @@ mantis and some not, fairly continuously for several months. He then
|
||||
moved on to write SSE assembler routines to handle the CPU-hungry
|
||||
metering and mixing routines.
|
||||
|
||||
Brian Ahr contributed many small fixes for ardour 2.0.
|
||||
|
||||
Smaller (but not necessarily minor) patches were received from the
|
||||
following people:
|
||||
|
||||
@@ -73,3 +75,4 @@ following people:
|
||||
Rob Holland
|
||||
Joshua Leachman
|
||||
Per Sigmond
|
||||
Nimal Ratnayake
|
||||
69
SConstruct
69
SConstruct
@@ -389,6 +389,57 @@ if env['VST']:
|
||||
print "OK, VST support will be enabled"
|
||||
|
||||
|
||||
#######################
|
||||
# Dependency Checking #
|
||||
#######################
|
||||
|
||||
deps = \
|
||||
{
|
||||
'glib-2.0' : '2.10.1',
|
||||
'gthread-2.0' : '2.10.1',
|
||||
'gtk+-2.0' : '2.8.1',
|
||||
'libxml-2.0' : '2.6.0',
|
||||
'samplerate' : '0.1.2',
|
||||
'raptor' : '1.4.8',
|
||||
'lrdf' : '0.4.0',
|
||||
'jack' : '0.101.1',
|
||||
'libgnomecanvas-2.0' : '2.0'
|
||||
}
|
||||
|
||||
def DependenciesRequiredMessage():
|
||||
print 'You do not have the necessary dependencies required to build ardour'
|
||||
print 'Please consult http://ardour.org/building for more information'
|
||||
|
||||
def CheckPKGConfig(context, version):
|
||||
context.Message( 'Checking for pkg-config version >= %s... ' %version )
|
||||
ret = context.TryAction('pkg-config --atleast-pkgconfig-version=%s' % version)[0]
|
||||
context.Result( ret )
|
||||
return ret
|
||||
|
||||
def CheckPKGVersion(context, name, version):
|
||||
context.Message( 'Checking for %s... ' % name )
|
||||
ret = context.TryAction('pkg-config --atleast-version=%s %s' %(version,name) )[0]
|
||||
context.Result( ret )
|
||||
return ret
|
||||
|
||||
conf = Configure(env, custom_tests = { 'CheckPKGConfig' : CheckPKGConfig,
|
||||
'CheckPKGVersion' : CheckPKGVersion })
|
||||
|
||||
# I think a more recent version is needed on win32
|
||||
min_pkg_config_version = '0.8.0'
|
||||
|
||||
if not conf.CheckPKGConfig(min_pkg_config_version):
|
||||
print 'pkg-config >= %s not found.' % min_pkg_config_version
|
||||
Exit(1)
|
||||
|
||||
for pkg, version in deps.iteritems():
|
||||
if not conf.CheckPKGVersion( pkg, version ):
|
||||
print '%s >= %s not found.' %(pkg, version)
|
||||
DependenciesRequiredMessage()
|
||||
Exit(1)
|
||||
|
||||
env = conf.Finish()
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# Construction environment setup
|
||||
# ----------------------------------------------------------------------
|
||||
@@ -540,6 +591,24 @@ else:
|
||||
env = conf.Finish()
|
||||
|
||||
if env['SYSLIBS']:
|
||||
|
||||
syslibdeps = \
|
||||
{
|
||||
'sigc++-2.0' : '2.0',
|
||||
'gtkmm-2.4' : '2.8',
|
||||
'libgnomecanvasmm-2.6' : '2.12.0'
|
||||
}
|
||||
|
||||
conf = Configure(env, custom_tests = { 'CheckPKGConfig' : CheckPKGConfig,
|
||||
'CheckPKGVersion' : CheckPKGVersion })
|
||||
|
||||
for pkg, version in syslibdeps.iteritems():
|
||||
if not conf.CheckPKGVersion( pkg, version ):
|
||||
print '%s >= %s not found.' %(pkg, version)
|
||||
DependenciesRequiredMessage()
|
||||
Exit(1)
|
||||
|
||||
env = conf.Finish()
|
||||
|
||||
libraries['sigc2'] = LibraryInfo()
|
||||
libraries['sigc2'].ParseConfig('pkg-config --cflags --libs sigc++-2.0')
|
||||
|
||||
@@ -145,6 +145,8 @@ static const char* authors[] = {
|
||||
N_("Stefan Kersten"),
|
||||
N_("Christopher George"),
|
||||
N_("Robert Jordens"),
|
||||
N_("Brian Ahr"),
|
||||
N_("Nimal Ratnayake"),
|
||||
0
|
||||
};
|
||||
|
||||
|
||||
@@ -444,6 +444,7 @@ ARDOUR_UI::ask_about_saving_session (const string & what)
|
||||
|
||||
save_the_session = 0;
|
||||
|
||||
window.set_keep_above (true);
|
||||
window.present ();
|
||||
|
||||
ResponseType r = (ResponseType) window.run();
|
||||
|
||||
@@ -685,6 +685,27 @@ Editor::Editor (AudioEngine& eng)
|
||||
|
||||
fade_context_menu.set_name ("ArdourContextMenu");
|
||||
|
||||
/* icons, titles, WM stuff */
|
||||
|
||||
list<Glib::RefPtr<Gdk::Pixbuf> > window_icons;
|
||||
Glib::RefPtr<Gdk::Pixbuf> icon;
|
||||
|
||||
if ((icon = ::get_icon ("ardour_icon_16px")) != 0) {
|
||||
window_icons.push_back (icon);
|
||||
}
|
||||
if ((icon = ::get_icon ("ardour_icon_22px")) != 0) {
|
||||
window_icons.push_back (icon);
|
||||
}
|
||||
if ((icon = ::get_icon ("ardour_icon_32px")) != 0) {
|
||||
window_icons.push_back (icon);
|
||||
}
|
||||
if ((icon = ::get_icon ("ardour_icon_48px")) != 0) {
|
||||
window_icons.push_back (icon);
|
||||
}
|
||||
if (!window_icons.empty()) {
|
||||
set_icon_list (window_icons);
|
||||
set_default_icon_list (window_icons);
|
||||
}
|
||||
set_title (_("ardour: editor"));
|
||||
set_wmclass (_("ardour_editor"), "Ardour");
|
||||
|
||||
@@ -1860,6 +1881,7 @@ Editor::add_selection_context_items (Menu_Helpers::MenuList& edit_items)
|
||||
items.push_back (SeparatorElem());
|
||||
items.push_back (MenuElem (_("Select all in range"), mem_fun(*this, &Editor::select_all_selectables_using_time_selection)));
|
||||
items.push_back (SeparatorElem());
|
||||
items.push_back (MenuElem (_("Add Range Markers"), mem_fun (*this, &Editor::add_location_from_selection)));
|
||||
items.push_back (MenuElem (_("Set range to loop range"), mem_fun(*this, &Editor::set_selection_from_loop)));
|
||||
items.push_back (MenuElem (_("Set range to punch range"), mem_fun(*this, &Editor::set_selection_from_punch)));
|
||||
items.push_back (SeparatorElem());
|
||||
|
||||
@@ -1208,7 +1208,7 @@ Editor::add_location_from_selection ()
|
||||
nframes_t start = selection->time[clicked_selection].start;
|
||||
nframes_t end = selection->time[clicked_selection].end;
|
||||
|
||||
Location *location = new Location (start, end, "selection");
|
||||
Location *location = new Location (start, end, "selection", Location::IsRangeMarker);
|
||||
|
||||
session->begin_reversible_command (_("add marker"));
|
||||
XMLNode &before = session->locations()->get_state();
|
||||
@@ -1242,7 +1242,7 @@ Editor::add_location_from_audio_region ()
|
||||
RegionView* rv = *(selection->regions.begin());
|
||||
boost::shared_ptr<Region> region = rv->region();
|
||||
|
||||
Location *location = new Location (region->position(), region->last_frame(), region->name());
|
||||
Location *location = new Location (region->position(), region->last_frame(), region->name(), Location::IsRangeMarker);
|
||||
session->begin_reversible_command (_("add marker"));
|
||||
XMLNode &before = session->locations()->get_state();
|
||||
session->locations()->add (location, true);
|
||||
|
||||
@@ -417,7 +417,7 @@ IOSelector::display_ports ()
|
||||
|
||||
really_short_name = port->short_name();
|
||||
really_short_name = really_short_name.substr (really_short_name.find ('/') + 1);
|
||||
|
||||
|
||||
tview = manage (new TreeView());
|
||||
RefPtr<ListStore> port_model = ListStore::create (port_display_columns);
|
||||
|
||||
@@ -437,7 +437,6 @@ IOSelector::display_ports ()
|
||||
|
||||
/* now fill the clist with the current connections */
|
||||
|
||||
|
||||
const char **connections = port->get_connections ();
|
||||
|
||||
if (connections) {
|
||||
@@ -446,7 +445,7 @@ IOSelector::display_ports ()
|
||||
row[port_display_columns.displayed_name] = connections[c];
|
||||
row[port_display_columns.full_name] = connections[c];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (for_input) {
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
*/
|
||||
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
|
||||
#include <sigc++/bind.h>
|
||||
|
||||
@@ -285,7 +286,7 @@ RedirectBox::redirect_button_press_event (GdkEventButton *ev)
|
||||
|
||||
if (redirect && Keyboard::is_delete_event (ev)) {
|
||||
|
||||
Glib::signal_idle().connect (bind (mem_fun(*this, &RedirectBox::idle_delete_redirect), redirect));
|
||||
Glib::signal_idle().connect (bind (mem_fun(*this, &RedirectBox::idle_delete_redirect), boost::weak_ptr<Redirect>(redirect)));
|
||||
ret = true;
|
||||
|
||||
} else if (redirect && (Keyboard::is_edit_event (ev) || (ev->button == 1 && ev->type == GDK_2BUTTON_PRESS && ev->state == 0))) {
|
||||
@@ -362,7 +363,7 @@ RedirectBox::insert_plugin_chosen (boost::shared_ptr<Plugin> plugin)
|
||||
|
||||
boost::shared_ptr<Redirect> redirect (new PluginInsert (_session, plugin, _placement));
|
||||
|
||||
redirect->active_changed.connect (mem_fun(*this, &RedirectBox::show_redirect_active));
|
||||
redirect->active_changed.connect (bind (mem_fun (*this, &RedirectBox::show_redirect_active), boost::weak_ptr<Redirect>(redirect), (void*) 0));
|
||||
|
||||
uint32_t err_streams;
|
||||
|
||||
@@ -440,7 +441,7 @@ void
|
||||
RedirectBox::choose_insert ()
|
||||
{
|
||||
boost::shared_ptr<Redirect> redirect (new PortInsert (_session, _placement));
|
||||
redirect->active_changed.connect (mem_fun(*this, &RedirectBox::show_redirect_active));
|
||||
redirect->active_changed.connect (bind (mem_fun(*this, &RedirectBox::show_redirect_active), boost::weak_ptr<Redirect>(redirect)));
|
||||
_route->add_redirect (redirect, this);
|
||||
}
|
||||
|
||||
@@ -456,15 +457,24 @@ RedirectBox::choose_send ()
|
||||
IOSelectorWindow *ios = new IOSelectorWindow (_session, send, false, true);
|
||||
|
||||
ios->show_all ();
|
||||
ios->selector().Finished.connect (bind (mem_fun(*this, &RedirectBox::send_io_finished), boost::static_pointer_cast<Redirect>(send), ios));
|
||||
|
||||
boost::shared_ptr<Redirect> r = boost::static_pointer_cast<Redirect>(send);
|
||||
|
||||
ios->selector().Finished.connect (bind (mem_fun(*this, &RedirectBox::send_io_finished), boost::weak_ptr<Redirect>(r), ios));
|
||||
}
|
||||
|
||||
void
|
||||
RedirectBox::send_io_finished (IOSelector::Result r, boost::shared_ptr<Redirect> redirect, IOSelectorWindow* ios)
|
||||
RedirectBox::send_io_finished (IOSelector::Result r, boost::weak_ptr<Redirect> weak_redirect, IOSelectorWindow* ios)
|
||||
{
|
||||
boost::shared_ptr<Redirect> redirect (weak_redirect.lock());
|
||||
|
||||
if (!redirect) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (r) {
|
||||
case IOSelector::Cancelled:
|
||||
// delete redirect; XXX SHAREDPTR HOW TO DESTROY THE REDIRECT ? do we even need to think about it?
|
||||
// redirect will go away when all shared_ptrs to it vanish
|
||||
break;
|
||||
|
||||
case IOSelector::Accepted:
|
||||
@@ -481,9 +491,10 @@ RedirectBox::redisplay_redirects (void *src)
|
||||
ENSURE_GUI_THREAD(bind (mem_fun(*this, &RedirectBox::redisplay_redirects), src));
|
||||
|
||||
if (no_redirect_redisplay) {
|
||||
cerr << "redisplay redirects skipped, no redisplay set\n";
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
ignore_delete = true;
|
||||
model->clear ();
|
||||
ignore_delete = false;
|
||||
@@ -514,16 +525,22 @@ RedirectBox::add_redirect_to_display (boost::shared_ptr<Redirect> redirect)
|
||||
Gtk::TreeModel::Row row = *(model->append());
|
||||
row[columns.text] = redirect_name (redirect);
|
||||
row[columns.redirect] = redirect;
|
||||
|
||||
show_redirect_active (redirect.get(), this);
|
||||
|
||||
redirect_active_connections.push_back (redirect->active_changed.connect (mem_fun(*this, &RedirectBox::show_redirect_active)));
|
||||
redirect_name_connections.push_back (redirect->name_changed.connect (bind (mem_fun(*this, &RedirectBox::show_redirect_name), redirect)));
|
||||
show_redirect_active (redirect, this);
|
||||
|
||||
redirect_active_connections.push_back (redirect->active_changed.connect (bind (mem_fun(*this, &RedirectBox::show_redirect_active), boost::weak_ptr<Redirect>(redirect))));
|
||||
redirect_name_connections.push_back (redirect->name_changed.connect (bind (mem_fun(*this, &RedirectBox::show_redirect_name), boost::weak_ptr<Redirect>(redirect))));
|
||||
}
|
||||
|
||||
string
|
||||
RedirectBox::redirect_name (boost::shared_ptr<Redirect> redirect)
|
||||
RedirectBox::redirect_name (boost::weak_ptr<Redirect> weak_redirect)
|
||||
{
|
||||
boost::shared_ptr<Redirect> redirect (weak_redirect.lock());
|
||||
|
||||
if (!redirect) {
|
||||
return string();
|
||||
}
|
||||
|
||||
boost::shared_ptr<Send> send;
|
||||
string name_display;
|
||||
|
||||
@@ -585,16 +602,22 @@ RedirectBox::build_redirect_tooltip (EventBox& box, string start)
|
||||
}
|
||||
|
||||
void
|
||||
RedirectBox::show_redirect_name (void* src, boost::shared_ptr<Redirect> redirect)
|
||||
RedirectBox::show_redirect_name (void* src, boost::weak_ptr<Redirect> redirect)
|
||||
{
|
||||
ENSURE_GUI_THREAD(bind (mem_fun(*this, &RedirectBox::show_redirect_name), src, redirect));
|
||||
show_redirect_active (redirect.get(), src);
|
||||
show_redirect_active (redirect, src);
|
||||
}
|
||||
|
||||
void
|
||||
RedirectBox::show_redirect_active (Redirect* redirect, void *src)
|
||||
RedirectBox::show_redirect_active (void *src, boost::weak_ptr<Redirect> weak_redirect)
|
||||
{
|
||||
ENSURE_GUI_THREAD(bind (mem_fun(*this, &RedirectBox::show_redirect_active), redirect, src));
|
||||
ENSURE_GUI_THREAD(bind (mem_fun(*this, &RedirectBox::show_redirect_active), weak_redirect, src));
|
||||
|
||||
boost::shared_ptr<Redirect> redirect (weak_redirect.lock());
|
||||
|
||||
if (!redirect) {
|
||||
return;
|
||||
}
|
||||
|
||||
Gtk::TreeModel::Children children = model->children();
|
||||
Gtk::TreeModel::Children::iterator iter = children.begin();
|
||||
@@ -603,7 +626,7 @@ RedirectBox::show_redirect_active (Redirect* redirect, void *src)
|
||||
|
||||
boost::shared_ptr<Redirect> r = (*iter)[columns.redirect];
|
||||
|
||||
if (r.get() == redirect) {
|
||||
if (r == redirect) {
|
||||
(*iter)[columns.text] = redirect_name (r);
|
||||
|
||||
if (redirect->active()) {
|
||||
@@ -698,6 +721,7 @@ RedirectBox::cut_redirects ()
|
||||
|
||||
_rr_selection.set (to_be_removed);
|
||||
|
||||
no_redirect_redisplay = true;
|
||||
for (vector<boost::shared_ptr<Redirect> >::iterator i = to_be_removed.begin(); i != to_be_removed.end(); ++i) {
|
||||
|
||||
void* gui = (*i)->get_gui ();
|
||||
@@ -712,6 +736,8 @@ RedirectBox::cut_redirects ()
|
||||
}
|
||||
|
||||
}
|
||||
no_redirect_redisplay = false;
|
||||
redisplay_redirects (this);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -734,12 +760,22 @@ RedirectBox::copy_redirects ()
|
||||
}
|
||||
|
||||
gint
|
||||
RedirectBox::idle_delete_redirect (boost::shared_ptr<Redirect> redirect)
|
||||
RedirectBox::idle_delete_redirect (boost::weak_ptr<Redirect> weak_redirect)
|
||||
{
|
||||
boost::shared_ptr<Redirect> redirect (weak_redirect.lock());
|
||||
|
||||
if (!redirect) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* NOT copied to _mixer.selection() */
|
||||
|
||||
no_redirect_redisplay = true;
|
||||
_route->remove_redirect (redirect, this);
|
||||
return FALSE;
|
||||
no_redirect_redisplay = false;
|
||||
redisplay_redirects (this);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -783,9 +819,12 @@ RedirectBox::cut_redirect (boost::shared_ptr<Redirect> redirect)
|
||||
static_cast<Gtk::Widget*>(gui)->hide ();
|
||||
}
|
||||
|
||||
no_redirect_redisplay = true;
|
||||
if (_route->remove_redirect (redirect, this)) {
|
||||
_rr_selection.remove (redirect);
|
||||
}
|
||||
no_redirect_redisplay = false;
|
||||
redisplay_redirects (this);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -979,7 +1018,7 @@ RedirectBox::edit_redirect (boost::shared_ptr<Redirect> redirect)
|
||||
plugin_insert->set_gui (plugin_ui);
|
||||
|
||||
// change window title when route name is changed
|
||||
_route->name_changed.connect (bind (mem_fun(*this, &RedirectBox::route_name_changed), plugin_ui, plugin_insert));
|
||||
_route->name_changed.connect (bind (mem_fun(*this, &RedirectBox::route_name_changed), plugin_ui, boost::weak_ptr<PluginInsert> (plugin_insert)));
|
||||
|
||||
|
||||
} else {
|
||||
@@ -1238,11 +1277,13 @@ RedirectBox::rb_edit ()
|
||||
}
|
||||
|
||||
void
|
||||
RedirectBox::route_name_changed (void* src, PluginUIWindow* plugin_ui, boost::shared_ptr<PluginInsert> pi)
|
||||
RedirectBox::route_name_changed (void* src, PluginUIWindow* plugin_ui, boost::weak_ptr<PluginInsert> wpi)
|
||||
{
|
||||
ENSURE_GUI_THREAD(bind (mem_fun (*this, &RedirectBox::route_name_changed), src, plugin_ui, pi));
|
||||
|
||||
plugin_ui->set_title (generate_redirect_title (pi));
|
||||
ENSURE_GUI_THREAD(bind (mem_fun (*this, &RedirectBox::route_name_changed), src, plugin_ui, wpi));
|
||||
boost::shared_ptr<PluginInsert> pi (wpi.lock());
|
||||
if (pi) {
|
||||
plugin_ui->set_title (generate_redirect_title (pi));
|
||||
}
|
||||
}
|
||||
|
||||
string
|
||||
|
||||
@@ -97,7 +97,9 @@ class RedirectBox : public Gtk::HBox
|
||||
|
||||
PluginSelector & _plugin_selector;
|
||||
RouteRedirectSelection & _rr_selection;
|
||||
|
||||
|
||||
void route_going_away ();
|
||||
|
||||
struct ModelColumns : public Gtk::TreeModel::ColumnRecord {
|
||||
ModelColumns () {
|
||||
add (text);
|
||||
@@ -140,7 +142,7 @@ class RedirectBox : public Gtk::HBox
|
||||
void show_redirect_menu (gint arg);
|
||||
|
||||
void choose_send ();
|
||||
void send_io_finished (IOSelector::Result, boost::shared_ptr<ARDOUR::Redirect>, IOSelectorWindow*);
|
||||
void send_io_finished (IOSelector::Result, boost::weak_ptr<ARDOUR::Redirect>, IOSelectorWindow*);
|
||||
void choose_insert ();
|
||||
void choose_plugin ();
|
||||
void insert_plugin_chosen (boost::shared_ptr<ARDOUR::Plugin>);
|
||||
@@ -152,15 +154,15 @@ class RedirectBox : public Gtk::HBox
|
||||
void redisplay_redirects (void* src);
|
||||
void add_redirect_to_display (boost::shared_ptr<ARDOUR::Redirect>);
|
||||
void row_deleted (const Gtk::TreeModel::Path& path);
|
||||
void show_redirect_name (void*, boost::shared_ptr<ARDOUR::Redirect>);
|
||||
void show_redirect_name (void*, boost::weak_ptr<ARDOUR::Redirect>);
|
||||
|
||||
/* these are handlers for Redirect signals, so they take Redirect*
|
||||
directly, rather than shared_ptr<Redirect>
|
||||
*/
|
||||
|
||||
void show_redirect_active (ARDOUR::Redirect*, void *);
|
||||
void show_redirect_active (boost::weak_ptr<ARDOUR::Redirect>, void *);
|
||||
|
||||
string redirect_name (boost::shared_ptr<ARDOUR::Redirect>);
|
||||
string redirect_name (boost::weak_ptr<ARDOUR::Redirect>);
|
||||
|
||||
void remove_redirect_gui (boost::shared_ptr<ARDOUR::Redirect>);
|
||||
|
||||
@@ -195,7 +197,7 @@ class RedirectBox : public Gtk::HBox
|
||||
void hide_redirect_editor (boost::shared_ptr<ARDOUR::Redirect>);
|
||||
void rename_redirect (boost::shared_ptr<ARDOUR::Redirect>);
|
||||
|
||||
gint idle_delete_redirect (boost::shared_ptr<ARDOUR::Redirect>);
|
||||
gint idle_delete_redirect (boost::weak_ptr<ARDOUR::Redirect>);
|
||||
|
||||
void wierd_plugin_dialog (ARDOUR::Plugin& p, uint32_t streams, boost::shared_ptr<ARDOUR::IO> io);
|
||||
|
||||
@@ -219,7 +221,7 @@ class RedirectBox : public Gtk::HBox
|
||||
static void rb_deactivate_all ();
|
||||
static void rb_edit ();
|
||||
|
||||
void route_name_changed (void* src, PluginUIWindow* plugin_ui, boost::shared_ptr<ARDOUR::PluginInsert> pi);
|
||||
void route_name_changed (void* src, PluginUIWindow* plugin_ui, boost::weak_ptr<ARDOUR::PluginInsert> pi);
|
||||
std::string generate_redirect_title (boost::shared_ptr<ARDOUR::PluginInsert> pi);
|
||||
};
|
||||
|
||||
|
||||
@@ -173,6 +173,8 @@ class Route : public IO
|
||||
void all_redirects_flip();
|
||||
void all_redirects_active (bool state);
|
||||
|
||||
uint32_t count_sends ();
|
||||
|
||||
virtual nframes_t update_total_latency();
|
||||
nframes_t signal_latency() const { return _own_latency; }
|
||||
virtual void set_latency_delay (nframes_t);
|
||||
|
||||
@@ -53,6 +53,8 @@ class Send : public Redirect {
|
||||
uint32_t pans_required() const { return expected_inputs; }
|
||||
void expect_inputs (uint32_t);
|
||||
|
||||
static uint32_t how_many_sends();
|
||||
|
||||
private:
|
||||
bool _metering;
|
||||
uint32_t expected_inputs;
|
||||
|
||||
@@ -58,6 +58,7 @@ Redirect::Redirect (Session& s, const string& name, Placement p,
|
||||
|
||||
Redirect::~Redirect ()
|
||||
{
|
||||
notify_callbacks ();
|
||||
}
|
||||
|
||||
boost::shared_ptr<Redirect>
|
||||
|
||||
@@ -780,6 +780,21 @@ Route::set_mute (bool yn, void *src)
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t
|
||||
Route::count_sends ()
|
||||
{
|
||||
uint32_t cnt = 0;
|
||||
Glib::RWLock::ReaderLock lm (redirect_lock);
|
||||
|
||||
for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
|
||||
if (boost::dynamic_pointer_cast<Send> (*i)) {
|
||||
++cnt;
|
||||
}
|
||||
}
|
||||
|
||||
return cnt;
|
||||
}
|
||||
|
||||
int
|
||||
Route::add_redirect (boost::shared_ptr<Redirect> redirect, void *src, uint32_t* err_streams)
|
||||
{
|
||||
@@ -923,6 +938,10 @@ Route::clear_redirects (void *src)
|
||||
|
||||
{
|
||||
Glib::RWLock::WriterLock lm (redirect_lock);
|
||||
RedirectList::iterator i;
|
||||
for (i = _redirects.begin(); i != _redirects.end(); ++i) {
|
||||
(*i)->drop_references ();
|
||||
}
|
||||
_redirects.clear ();
|
||||
}
|
||||
|
||||
@@ -1019,6 +1038,8 @@ Route::remove_redirect (boost::shared_ptr<Redirect> redirect, void *src, uint32_
|
||||
reset_panner ();
|
||||
}
|
||||
|
||||
redirect->drop_references ();
|
||||
|
||||
redirects_changed (src); /* EMIT SIGNAL */
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -3313,6 +3313,8 @@ Session::remove_redirect (Redirect* redirect)
|
||||
PortInsert* port_insert;
|
||||
PluginInsert* plugin_insert;
|
||||
|
||||
cerr << "Removing a redirect!\n";
|
||||
|
||||
if ((insert = dynamic_cast<Insert *> (redirect)) != 0) {
|
||||
if ((port_insert = dynamic_cast<PortInsert *> (insert)) != 0) {
|
||||
_port_inserts.remove (port_insert);
|
||||
@@ -3323,7 +3325,9 @@ Session::remove_redirect (Redirect* redirect)
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
} else if ((send = dynamic_cast<Send *> (redirect)) != 0) {
|
||||
cerr << "Remove send, used to have " << _sends.size() << endl;
|
||||
_sends.remove (send);
|
||||
cerr << "post removal, have " << _sends.size() << endl;
|
||||
} else {
|
||||
fatal << _("programming error: unknown type of Redirect deleted!") << endmsg;
|
||||
/*NOTREACHED*/
|
||||
@@ -3451,9 +3455,15 @@ Session::ensure_passthru_buffers (uint32_t howmany)
|
||||
string
|
||||
Session::next_send_name ()
|
||||
{
|
||||
char buf[32];
|
||||
snprintf (buf, sizeof (buf), "send %" PRIu32, ++send_cnt);
|
||||
return buf;
|
||||
uint32_t cnt = 0;
|
||||
|
||||
shared_ptr<RouteList> r = routes.reader ();
|
||||
|
||||
for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
|
||||
cnt += (*i)->count_sends ();
|
||||
}
|
||||
|
||||
return string_compose (_("send %1"), ++cnt);
|
||||
}
|
||||
|
||||
string
|
||||
|
||||
@@ -123,7 +123,6 @@ Session::first_stage_init (string fullpath, string snapshot_name)
|
||||
_tempo_map->StateChanged.connect (mem_fun (*this, &Session::tempo_map_changed));
|
||||
|
||||
g_atomic_int_set (&processing_prohibited, 0);
|
||||
send_cnt = 0;
|
||||
insert_cnt = 0;
|
||||
_transport_speed = 0;
|
||||
_last_transport_speed = 0;
|
||||
|
||||
@@ -127,7 +127,7 @@ TearOff::close_click (GdkEventButton* ev)
|
||||
gint
|
||||
TearOff::window_button_press (GdkEventButton* ev)
|
||||
{
|
||||
if (dragging) {
|
||||
if (dragging || ev->button != 1) {
|
||||
dragging = false;
|
||||
own_window.remove_modal_grab();
|
||||
return true;
|
||||
@@ -172,6 +172,12 @@ TearOff::window_motion (GdkEventMotion* ev)
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!(ev->state & GDK_BUTTON1_MASK)) {
|
||||
dragging = false;
|
||||
own_window.remove_modal_grab();
|
||||
return true;
|
||||
}
|
||||
|
||||
x_delta = ev->x_root - drag_x;
|
||||
y_delta = ev->y_root - drag_y;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user