mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-06 14:54:56 +01:00
a boatload of minor and middle-sized changes to try to speed up undo. imperfect, unfinished, but probably right to commit now
git-svn-id: svn://localhost/ardour2/branches/3.0@6561 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
10395d2fee
commit
832aa18a81
26 changed files with 289 additions and 194 deletions
|
|
@ -366,7 +366,7 @@ AddRouteDialog::refill_channel_setups ()
|
||||||
chn.channels = 12;
|
chn.channels = 12;
|
||||||
channel_setups.push_back (chn);
|
channel_setups.push_back (chn);
|
||||||
|
|
||||||
chn.name = X_("Custom");
|
chn.name = _("Custom");
|
||||||
chn.channels = 0;
|
chn.channels = 0;
|
||||||
channel_setups.push_back (chn);
|
channel_setups.push_back (chn);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,8 @@
|
||||||
|
|
||||||
#include <gtkmm2ext/gtk_ui.h>
|
#include <gtkmm2ext/gtk_ui.h>
|
||||||
|
|
||||||
|
#include "pbd/stacktrace.h"
|
||||||
|
|
||||||
#include "ardour/audioplaylist.h"
|
#include "ardour/audioplaylist.h"
|
||||||
#include "ardour/audioregion.h"
|
#include "ardour/audioregion.h"
|
||||||
#include "ardour/audiofilesource.h"
|
#include "ardour/audiofilesource.h"
|
||||||
|
|
@ -202,14 +204,14 @@ AudioStreamView::remove_region_view (boost::weak_ptr<Region> weak_r)
|
||||||
{
|
{
|
||||||
ENSURE_GUI_THREAD (*this, &AudioStreamView::remove_region_view, weak_r);
|
ENSURE_GUI_THREAD (*this, &AudioStreamView::remove_region_view, weak_r);
|
||||||
|
|
||||||
cerr << "a region went way, it appears to be ours (" << this << ")\n";
|
|
||||||
|
|
||||||
boost::shared_ptr<Region> r (weak_r.lock());
|
boost::shared_ptr<Region> r (weak_r.lock());
|
||||||
|
|
||||||
if (!r) {
|
if (!r) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cerr << "a region went way, it appears to be ours (" << this << ")\n";
|
||||||
|
|
||||||
if (!_trackview.session()->deletion_in_progress()) {
|
if (!_trackview.session()->deletion_in_progress()) {
|
||||||
|
|
||||||
for (CrossfadeViewList::iterator i = crossfade_views.begin(); i != crossfade_views.end();) {
|
for (CrossfadeViewList::iterator i = crossfade_views.begin(); i != crossfade_views.end();) {
|
||||||
|
|
@ -244,46 +246,41 @@ AudioStreamView::undisplay_diskstream ()
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
AudioStreamView::playlist_modified_weak (boost::weak_ptr<Diskstream> ds)
|
AudioStreamView::playlist_layered (boost::weak_ptr<Diskstream> wds)
|
||||||
{
|
{
|
||||||
boost::shared_ptr<Diskstream> sp (ds.lock());
|
boost::shared_ptr<Diskstream> ds (wds.lock());
|
||||||
if (sp) {
|
|
||||||
playlist_modified (sp);
|
if (!ds) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void
|
cerr << "AS, call SV::modified @ " << get_microseconds() << endl;
|
||||||
AudioStreamView::playlist_modified (boost::shared_ptr<Diskstream> ds)
|
|
||||||
{
|
|
||||||
/* we do not allow shared_ptr<T> to be bound to slots */
|
|
||||||
ENSURE_GUI_THREAD (*this, &AudioStreamView::playlist_modified_weak, ds)
|
|
||||||
|
|
||||||
StreamView::playlist_modified (ds);
|
StreamView::playlist_layered (wds);
|
||||||
|
|
||||||
|
cerr << "AS, done with SV::modified @ " << get_microseconds() << endl;
|
||||||
|
|
||||||
/* make sure xfades are on top and all the regionviews are stacked correctly. */
|
/* make sure xfades are on top and all the regionviews are stacked correctly. */
|
||||||
|
|
||||||
|
cerr << "AS, raise xfades @ " << get_microseconds() << endl;
|
||||||
for (CrossfadeViewList::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
|
for (CrossfadeViewList::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
|
||||||
i->second->get_canvas_group()->raise_to_top();
|
i->second->get_canvas_group()->raise_to_top();
|
||||||
}
|
}
|
||||||
|
cerr << "AS, done with xfades @ " << get_microseconds() << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
AudioStreamView::playlist_changed_weak (boost::weak_ptr<Diskstream> ds)
|
AudioStreamView::playlist_switched (boost::weak_ptr<Diskstream> wds)
|
||||||
{
|
{
|
||||||
boost::shared_ptr<Diskstream> sp (ds.lock());
|
boost::shared_ptr<Diskstream> ds (wds.lock());
|
||||||
if (sp) {
|
|
||||||
playlist_changed (sp);
|
if (!ds) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
AudioStreamView::playlist_changed (boost::shared_ptr<Diskstream> ds)
|
|
||||||
{
|
|
||||||
ENSURE_GUI_THREAD (*this, &AudioStreamView::playlist_changed_weak, boost::weak_ptr<Diskstream> (ds));
|
|
||||||
|
|
||||||
playlist_connections.drop_connections ();
|
playlist_connections.drop_connections ();
|
||||||
|
|
||||||
StreamView::playlist_changed(ds);
|
StreamView::playlist_switched (ds);
|
||||||
|
|
||||||
boost::shared_ptr<AudioPlaylist> apl = boost::dynamic_pointer_cast<AudioPlaylist>(ds->playlist());
|
boost::shared_ptr<AudioPlaylist> apl = boost::dynamic_pointer_cast<AudioPlaylist>(ds->playlist());
|
||||||
|
|
||||||
|
|
@ -293,27 +290,17 @@ AudioStreamView::playlist_changed (boost::shared_ptr<Diskstream> ds)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
AudioStreamView::add_crossfade_weak (boost::weak_ptr<Crossfade> crossfade)
|
AudioStreamView::add_crossfade (boost::weak_ptr<Crossfade> wc)
|
||||||
{
|
{
|
||||||
boost::shared_ptr<Crossfade> sp (crossfade.lock());
|
boost::shared_ptr<Crossfade> crossfade (wc.lock());
|
||||||
|
|
||||||
if (!sp) {
|
if (!crossfade) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
add_crossfade (sp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
AudioStreamView::add_crossfade (boost::shared_ptr<Crossfade> crossfade)
|
|
||||||
{
|
|
||||||
AudioRegionView* lview = 0;
|
AudioRegionView* lview = 0;
|
||||||
AudioRegionView* rview = 0;
|
AudioRegionView* rview = 0;
|
||||||
|
|
||||||
/* we do not allow shared_ptr<T> to be bound to slots */
|
|
||||||
|
|
||||||
ENSURE_GUI_THREAD (*this, &AudioStreamView::add_crossfade_weak, boost::weak_ptr<Crossfade> (crossfade));
|
|
||||||
|
|
||||||
/* first see if we already have a CrossfadeView for this Crossfade */
|
/* first see if we already have a CrossfadeView for this Crossfade */
|
||||||
|
|
||||||
CrossfadeViewList::iterator i = crossfade_views.find (crossfade);
|
CrossfadeViewList::iterator i = crossfade_views.find (crossfade);
|
||||||
|
|
|
||||||
|
|
@ -88,13 +88,10 @@ class AudioStreamView : public StreamView
|
||||||
|
|
||||||
void undisplay_diskstream ();
|
void undisplay_diskstream ();
|
||||||
void redisplay_diskstream ();
|
void redisplay_diskstream ();
|
||||||
void playlist_modified_weak (boost::weak_ptr<ARDOUR::Diskstream>);
|
void playlist_layered (boost::weak_ptr<ARDOUR::Diskstream>);
|
||||||
void playlist_modified (boost::shared_ptr<ARDOUR::Diskstream>);
|
void playlist_switched (boost::weak_ptr<ARDOUR::Diskstream>);
|
||||||
void playlist_changed_weak (boost::weak_ptr<ARDOUR::Diskstream>);
|
|
||||||
void playlist_changed (boost::shared_ptr<ARDOUR::Diskstream>);
|
|
||||||
|
|
||||||
void add_crossfade (boost::shared_ptr<ARDOUR::Crossfade>);
|
void add_crossfade (boost::weak_ptr<ARDOUR::Crossfade>);
|
||||||
void add_crossfade_weak (boost::weak_ptr<ARDOUR::Crossfade>);
|
|
||||||
void remove_crossfade (boost::shared_ptr<ARDOUR::Region>);
|
void remove_crossfade (boost::shared_ptr<ARDOUR::Region>);
|
||||||
|
|
||||||
void color_handler ();
|
void color_handler ();
|
||||||
|
|
|
||||||
|
|
@ -2198,6 +2198,8 @@ Editor::set_state (const XMLNode& node, int /*version*/)
|
||||||
int x, y, xoff, yoff;
|
int x, y, xoff, yoff;
|
||||||
Gdk::Geometry g;
|
Gdk::Geometry g;
|
||||||
|
|
||||||
|
// return 0;
|
||||||
|
|
||||||
if ((prop = node.property ("id")) != 0) {
|
if ((prop = node.property ("id")) != 0) {
|
||||||
_id = prop->value ();
|
_id = prop->value ();
|
||||||
}
|
}
|
||||||
|
|
@ -2355,7 +2357,8 @@ Editor::set_state (const XMLNode& node, int /*version*/)
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((prop = node.property ("region-list-sort-type"))) {
|
if ((prop = node.property ("region-list-sort-type"))) {
|
||||||
_regions->reset_sort_type (str2regionlistsorttype(prop->value()), true);
|
RegionListSortType st;
|
||||||
|
_regions->reset_sort_type ((RegionListSortType) string_2_enum (prop->value(), st), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((prop = node.property ("xfades-visible"))) {
|
if ((prop = node.property ("xfades-visible"))) {
|
||||||
|
|
@ -2458,7 +2461,7 @@ Editor::get_state ()
|
||||||
node->add_property ("show-measures", _show_measures ? "yes" : "no");
|
node->add_property ("show-measures", _show_measures ? "yes" : "no");
|
||||||
node->add_property ("follow-playhead", _follow_playhead ? "yes" : "no");
|
node->add_property ("follow-playhead", _follow_playhead ? "yes" : "no");
|
||||||
node->add_property ("xfades-visible", _xfade_visibility ? "yes" : "no");
|
node->add_property ("xfades-visible", _xfade_visibility ? "yes" : "no");
|
||||||
node->add_property ("region-list-sort-type", enum2str (_regions->sort_type ()));
|
node->add_property ("region-list-sort-type", enum_2_string (_regions->sort_type ()));
|
||||||
node->add_property ("mouse-mode", enum2str(mouse_mode));
|
node->add_property ("mouse-mode", enum2str(mouse_mode));
|
||||||
node->add_property ("internal-edit", _internal_editing ? "yes" : "no");
|
node->add_property ("internal-edit", _internal_editing ? "yes" : "no");
|
||||||
node->add_property ("join-object-range", join_object_range_button.get_active () ? "yes" : "no");
|
node->add_property ("join-object-range", join_object_range_button.get_active () ? "yes" : "no");
|
||||||
|
|
|
||||||
|
|
@ -340,6 +340,7 @@ Editor::register_actions ()
|
||||||
ActionManager::region_selection_sensitive_actions.push_back (act);
|
ActionManager::region_selection_sensitive_actions.push_back (act);
|
||||||
act = ActionManager::register_action (editor_actions, "set-punch-from-edit-range", _("Set Punch from Edit Range"), sigc::mem_fun(*this, &Editor::set_punch_from_edit_range));
|
act = ActionManager::register_action (editor_actions, "set-punch-from-edit-range", _("Set Punch from Edit Range"), sigc::mem_fun(*this, &Editor::set_punch_from_edit_range));
|
||||||
ActionManager::session_sensitive_actions.push_back (act);
|
ActionManager::session_sensitive_actions.push_back (act);
|
||||||
|
ActionManager::region_selection_sensitive_actions.push_back (act);
|
||||||
act = ActionManager::register_action (editor_actions, "set-punch-from-region", _("Set Punch From Region"), sigc::mem_fun(*this, &Editor::set_punch_from_region));
|
act = ActionManager::register_action (editor_actions, "set-punch-from-region", _("Set Punch From Region"), sigc::mem_fun(*this, &Editor::set_punch_from_region));
|
||||||
ActionManager::session_sensitive_actions.push_back (act);
|
ActionManager::session_sensitive_actions.push_back (act);
|
||||||
ActionManager::region_selection_sensitive_actions.push_back (act);
|
ActionManager::region_selection_sensitive_actions.push_back (act);
|
||||||
|
|
|
||||||
|
|
@ -1003,20 +1003,19 @@ RegionMoveDrag::finished (GdkEvent* /*event*/, bool movement_occurred)
|
||||||
rv->region()->set_layer (dest_layer);
|
rv->region()->set_layer (dest_layer);
|
||||||
rv->region()->set_pending_explicit_relayer (true);
|
rv->region()->set_pending_explicit_relayer (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* freeze playlist to avoid lots of relayering in the case of a multi-region drag */
|
||||||
|
|
||||||
insert_result = modified_playlists.insert (playlist);
|
|
||||||
|
|
||||||
if (insert_result.second) {
|
|
||||||
_editor->session()->add_command (new MementoCommand<Playlist>(*playlist, &playlist->get_state(), 0));
|
|
||||||
}
|
|
||||||
/* freeze to avoid lots of relayering in the case of a multi-region drag */
|
|
||||||
frozen_insert_result = frozen_playlists.insert(playlist);
|
frozen_insert_result = frozen_playlists.insert(playlist);
|
||||||
|
|
||||||
if (frozen_insert_result.second) {
|
if (frozen_insert_result.second) {
|
||||||
playlist->freeze();
|
playlist->freeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
XMLNode& before (rv->region()->get_state());
|
||||||
rv->region()->set_position (where, (void*) this);
|
rv->region()->set_position (where, (void*) this);
|
||||||
|
_editor->session()->add_command (new MementoCommand<Region>(*rv->region(), &before, &playlist->get_state()));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changed_tracks && !_copy) {
|
if (changed_tracks && !_copy) {
|
||||||
|
|
|
||||||
|
|
@ -2454,13 +2454,14 @@ Editor::mouse_brush_insert_region (RegionView* rv, nframes64_t pos)
|
||||||
double speed = rtv->get_diskstream()->speed();
|
double speed = rtv->get_diskstream()->speed();
|
||||||
|
|
||||||
XMLNode &before = playlist->get_state();
|
XMLNode &before = playlist->get_state();
|
||||||
playlist->add_region (RegionFactory::create (rv->region()), (nframes64_t) (pos * speed));
|
boost::shared_ptr<Region> new_region (RegionFactory::create (rv->region()));
|
||||||
|
playlist->add_region (new_region, (nframes64_t) (pos * speed));
|
||||||
XMLNode &after = playlist->get_state();
|
XMLNode &after = playlist->get_state();
|
||||||
_session->add_command(new MementoCommand<Playlist>(*playlist.get(), &before, &after));
|
_session->add_command(new MementoCommand<Playlist>(*playlist.get(), &before, &after));
|
||||||
|
|
||||||
// playlist is frozen, so we have to update manually
|
// playlist is frozen, so we have to update manually XXX this is disgusting
|
||||||
|
|
||||||
playlist->Modified(); /* EMIT SIGNAL */
|
playlist->RegionAdded (new_region); /* EMIT SIGNAL */
|
||||||
}
|
}
|
||||||
|
|
||||||
gint
|
gint
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
#include "pbd/basename.h"
|
#include "pbd/basename.h"
|
||||||
|
#include "pbd/enumwriter.h"
|
||||||
|
|
||||||
#include "ardour/audioregion.h"
|
#include "ardour/audioregion.h"
|
||||||
#include "ardour/audiofilesource.h"
|
#include "ardour/audiofilesource.h"
|
||||||
|
|
@ -54,11 +55,13 @@ using namespace Editing;
|
||||||
using Gtkmm2ext::Keyboard;
|
using Gtkmm2ext::Keyboard;
|
||||||
|
|
||||||
EditorRegions::EditorRegions (Editor* e)
|
EditorRegions::EditorRegions (Editor* e)
|
||||||
: EditorComponent (e),
|
: EditorComponent (e)
|
||||||
_menu (0),
|
, _menu (0)
|
||||||
_show_automatic_regions (true),
|
, _show_automatic_regions (true)
|
||||||
_sort_type ((Editing::RegionListSortType) 0),
|
, _sort_type ((Editing::RegionListSortType) 0)
|
||||||
_no_redisplay (false)
|
, _no_redisplay (false)
|
||||||
|
, ignore_region_list_selection_change (false)
|
||||||
|
, ignore_selected_region_change (false)
|
||||||
{
|
{
|
||||||
_display.set_size_request (100, -1);
|
_display.set_size_request (100, -1);
|
||||||
_display.set_name ("RegionListDisplay");
|
_display.set_name ("RegionListDisplay");
|
||||||
|
|
@ -383,37 +386,42 @@ EditorRegions::region_changed (Change what_changed, boost::weak_ptr<Region> regi
|
||||||
void
|
void
|
||||||
EditorRegions::selection_changed ()
|
EditorRegions::selection_changed ()
|
||||||
{
|
{
|
||||||
|
if (ignore_region_list_selection_change) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (_display.get_selection()->count_selected_rows() > 0) {
|
if (_display.get_selection()->count_selected_rows() > 0) {
|
||||||
|
|
||||||
TreeIter iter;
|
TreeIter iter;
|
||||||
TreeView::Selection::ListHandle_Path rows = _display.get_selection()->get_selected_rows ();
|
TreeView::Selection::ListHandle_Path rows = _display.get_selection()->get_selected_rows ();
|
||||||
|
|
||||||
_editor->deselect_all ();
|
_editor->get_selection().clear_regions ();
|
||||||
|
|
||||||
for (TreeView::Selection::ListHandle_Path::iterator i = rows.begin(); i != rows.end(); ++i) {
|
for (TreeView::Selection::ListHandle_Path::iterator i = rows.begin(); i != rows.end(); ++i) {
|
||||||
|
|
||||||
if (iter = _model->get_iter (*i)) { // they could have clicked on a row that is just a placeholder, like "Hidden"
|
if (iter = _model->get_iter (*i)) {
|
||||||
boost::shared_ptr<Region> region = (*iter)[_columns.region];
|
boost::shared_ptr<Region> region = (*iter)[_columns.region];
|
||||||
|
|
||||||
|
// they could have clicked on a row that is just a placeholder, like "Hidden"
|
||||||
|
|
||||||
if (region) {
|
if (region) {
|
||||||
|
|
||||||
if (region->automatic()) {
|
if (region->automatic()) {
|
||||||
|
|
||||||
_display.get_selection()->unselect(*i);
|
_display.get_selection()->unselect(*i);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
_change_connection.block (true);
|
_change_connection.block (true);
|
||||||
//editor_regions_selection_changed_connection.block(true);
|
cerr << "\tpush to region selection\n";
|
||||||
|
|
||||||
_editor->set_selected_regionview_from_region_list (region, Selection::Add);
|
_editor->set_selected_regionview_from_region_list (region, Selection::Add);
|
||||||
|
|
||||||
_change_connection.block (false);
|
_change_connection.block (false);
|
||||||
//editor_regions_selection_changed_connection.block(false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_editor->deselect_all ();
|
_editor->get_selection().clear_regions ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -431,11 +439,13 @@ EditorRegions::set_selected (RegionSelection& regions)
|
||||||
boost::shared_ptr<Region> compared_region = (*i)[_columns.region];
|
boost::shared_ptr<Region> compared_region = (*i)[_columns.region];
|
||||||
|
|
||||||
if (r == compared_region) {
|
if (r == compared_region) {
|
||||||
|
cerr << "\tpush into region list\n";
|
||||||
_display.get_selection()->select(*i);
|
_display.get_selection()->select(*i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(*i).children().empty()) {
|
if (!(*i).children().empty()) {
|
||||||
|
cerr << "\tlook for " << r->name() << " among children of " << (compared_region ? compared_region->name() : string ("NO REGION")) << endl;
|
||||||
if (set_selected_in_subrow(r, (*i), 2)) {
|
if (set_selected_in_subrow(r, (*i), 2)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -524,6 +534,8 @@ EditorRegions::update_row (boost::shared_ptr<Region> region)
|
||||||
|
|
||||||
TreeModel::iterator i;
|
TreeModel::iterator i;
|
||||||
TreeModel::Children rows = _model->children();
|
TreeModel::Children rows = _model->children();
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
for (i = rows.begin(); i != rows.end(); ++i) {
|
for (i = rows.begin(); i != rows.end(); ++i) {
|
||||||
|
|
||||||
|
|
@ -543,6 +555,7 @@ EditorRegions::update_row (boost::shared_ptr<Region> region)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// cerr << "Returning - No match\n";
|
// cerr << "Returning - No match\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -570,6 +583,7 @@ EditorRegions::update_subrows (boost::shared_ptr<Region> region, TreeModel::Row
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -579,7 +593,7 @@ EditorRegions::update_all_rows ()
|
||||||
if (!_session) {
|
if (!_session) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
TreeModel::iterator i;
|
TreeModel::iterator i;
|
||||||
TreeModel::Children rows = _model->children();
|
TreeModel::Children rows = _model->children();
|
||||||
|
|
||||||
|
|
@ -1049,6 +1063,7 @@ EditorRegions::sorter (TreeModel::iterator a, TreeModel::iterator b)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ByEndInFile:
|
case ByEndInFile:
|
||||||
|
// cerr << "Compare " << (region1->start() + region1->length()) << " and " << (region2->start() + region2->length()) << endl;
|
||||||
cmp = (region1->start() + region1->length()) - (region2->start() + region2->length());
|
cmp = (region1->start() + region1->length()) - (region2->start() + region2->length());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
@ -1073,6 +1088,8 @@ EditorRegions::sorter (TreeModel::iterator a, TreeModel::iterator b)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// cerr << "Comparison on " << enum_2_string (_sort_type) << " gives " << cmp << endl;
|
||||||
|
|
||||||
if (cmp < 0) {
|
if (cmp < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
} else if (cmp > 0) {
|
} else if (cmp > 0) {
|
||||||
|
|
|
||||||
|
|
@ -150,6 +150,8 @@ private:
|
||||||
bool _no_redisplay;
|
bool _no_redisplay;
|
||||||
std::list<boost::shared_ptr<ARDOUR::Region> > tmp_region_list;
|
std::list<boost::shared_ptr<ARDOUR::Region> > tmp_region_list;
|
||||||
PBD::ScopedConnection region_property_connection;
|
PBD::ScopedConnection region_property_connection;
|
||||||
|
bool ignore_region_list_selection_change;
|
||||||
|
bool ignore_selected_region_change;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __gtk_ardour_editor_regions_h__ */
|
#endif /* __gtk_ardour_editor_regions_h__ */
|
||||||
|
|
|
||||||
|
|
@ -870,6 +870,8 @@ Editor::region_selection_changed ()
|
||||||
_regions->block_change_connection (true);
|
_regions->block_change_connection (true);
|
||||||
editor_regions_selection_changed_connection.block(true);
|
editor_regions_selection_changed_connection.block(true);
|
||||||
|
|
||||||
|
_regions->unselect_all ();
|
||||||
|
|
||||||
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
|
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
|
||||||
(*i)->set_selected_regionviews (selection->regions);
|
(*i)->set_selected_regionviews (selection->regions);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,7 @@ setup_gtk_ardour_enums ()
|
||||||
ImportMode import_mode;
|
ImportMode import_mode;
|
||||||
EditPoint edit_point;
|
EditPoint edit_point;
|
||||||
LayerDisplay layer_display;
|
LayerDisplay layer_display;
|
||||||
|
RegionListSortType region_list_sort_type;
|
||||||
|
|
||||||
#define REGISTER(e) enum_writer.register_distinct (typeid(e).name(), i, s); i.clear(); s.clear()
|
#define REGISTER(e) enum_writer.register_distinct (typeid(e).name(), i, s); i.clear(); s.clear()
|
||||||
#define REGISTER_BITS(e) enum_writer.register_bits (typeid(e).name(), i, s); i.clear(); s.clear()
|
#define REGISTER_BITS(e) enum_writer.register_bits (typeid(e).name(), i, s); i.clear(); s.clear()
|
||||||
|
|
@ -71,4 +72,16 @@ setup_gtk_ardour_enums ()
|
||||||
REGISTER_ENUM (Overlaid);
|
REGISTER_ENUM (Overlaid);
|
||||||
REGISTER_ENUM (Stacked);
|
REGISTER_ENUM (Stacked);
|
||||||
REGISTER (layer_display);
|
REGISTER (layer_display);
|
||||||
|
|
||||||
|
REGISTER_ENUM (ByEndInFile);
|
||||||
|
REGISTER_ENUM (ByLength);
|
||||||
|
REGISTER_ENUM (ByName);
|
||||||
|
REGISTER_ENUM (ByPosition);
|
||||||
|
REGISTER_ENUM (BySourceFileCreationDate);
|
||||||
|
REGISTER_ENUM (BySourceFileFS);
|
||||||
|
REGISTER_ENUM (BySourceFileLength);
|
||||||
|
REGISTER_ENUM (BySourceFileName);
|
||||||
|
REGISTER_ENUM (ByStartInFile);
|
||||||
|
REGISTER_ENUM (ByTimestamp);
|
||||||
|
REGISTER (region_list_sort_type);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
#ifndef __ardour_gtk_midi_tracer_h__
|
#ifndef __ardour_gtk_midi_tracer_h__
|
||||||
#define __ardour_gtk_midi_tracer_h__
|
#define __ardour_gtk_midi_tracer_h__
|
||||||
|
|
||||||
#include <types.h>
|
|
||||||
#include <gtkmm/textview.h>
|
#include <gtkmm/textview.h>
|
||||||
#include <gtkmm/scrolledwindow.h>
|
#include <gtkmm/scrolledwindow.h>
|
||||||
#include <gtkmm/togglebutton.h>
|
#include <gtkmm/togglebutton.h>
|
||||||
|
|
|
||||||
|
|
@ -1019,10 +1019,11 @@ ProcessorBox::compute_processor_sort_keys ()
|
||||||
Label label;
|
Label label;
|
||||||
|
|
||||||
label.set_text (_("\
|
label.set_text (_("\
|
||||||
You cannot reorder this set of processors\n\
|
You cannot reorder these plugins/sends/inserts\n\
|
||||||
in that way because the inputs and\n\
|
in that way because the inputs and\n\
|
||||||
outputs do not work correctly."));
|
outputs will not work correctly."));
|
||||||
|
|
||||||
|
dialog.get_vbox()->set_border_width (12);
|
||||||
dialog.get_vbox()->pack_start (label);
|
dialog.get_vbox()->pack_start (label);
|
||||||
dialog.add_button (Stock::OK, RESPONSE_ACCEPT);
|
dialog.add_button (Stock::OK, RESPONSE_ACCEPT);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -169,20 +169,12 @@ StreamView::set_samples_per_unit (gdouble spp)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
StreamView::add_region_view_weak (boost::weak_ptr<Region> r)
|
StreamView::add_region_view (boost::weak_ptr<Region> wr)
|
||||||
{
|
{
|
||||||
boost::shared_ptr<Region> sp (r.lock());
|
boost::shared_ptr<Region> r (wr.lock());
|
||||||
|
if (!r) {
|
||||||
if (sp) {
|
return;
|
||||||
add_region_view (sp);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
StreamView::add_region_view (boost::shared_ptr<Region> r)
|
|
||||||
{
|
|
||||||
ENSURE_GUI_THREAD (*this, &StreamView::add_region_view_weak, boost::weak_ptr<Region>(r));
|
|
||||||
|
|
||||||
add_region_view_internal (r, true);
|
add_region_view_internal (r, true);
|
||||||
|
|
||||||
|
|
@ -229,9 +221,9 @@ StreamView::undisplay_diskstream ()
|
||||||
void
|
void
|
||||||
StreamView::display_diskstream (boost::shared_ptr<Diskstream> ds)
|
StreamView::display_diskstream (boost::shared_ptr<Diskstream> ds)
|
||||||
{
|
{
|
||||||
playlist_change_connection.disconnect();
|
playlist_switched_connection.disconnect();
|
||||||
playlist_changed (ds);
|
playlist_switched (ds);
|
||||||
ds->PlaylistChanged.connect (playlist_change_connection, boost::bind (&StreamView::playlist_changed_weak, this, boost::weak_ptr<Diskstream> (ds)), gui_context());
|
ds->PlaylistChanged.connect (playlist_switched_connection, boost::bind (&StreamView::playlist_switched, this, boost::weak_ptr<Diskstream> (ds)), gui_context());
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -292,20 +284,13 @@ StreamView::layer_regions()
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
StreamView::playlist_modified_weak (boost::weak_ptr<Diskstream> ds)
|
StreamView::playlist_layered (boost::weak_ptr<Diskstream> wds)
|
||||||
{
|
{
|
||||||
boost::shared_ptr<Diskstream> sp (ds.lock());
|
boost::shared_ptr<Diskstream> ds (wds.lock());
|
||||||
|
|
||||||
if (sp) {
|
if (!ds) {
|
||||||
playlist_modified (sp);
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
StreamView::playlist_modified (boost::shared_ptr<Diskstream> ds)
|
|
||||||
{
|
|
||||||
/* we do not allow shared_ptr<T> to be bound to slots */
|
|
||||||
ENSURE_GUI_THREAD (*this, &StreamView::playlist_modified_weak, ds)
|
|
||||||
|
|
||||||
/* update layers count and the y positions and heights of our regions */
|
/* update layers count and the y positions and heights of our regions */
|
||||||
if (ds->playlist()) {
|
if (ds->playlist()) {
|
||||||
|
|
@ -322,18 +307,13 @@ StreamView::playlist_modified (boost::shared_ptr<Diskstream> ds)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
StreamView::playlist_changed_weak (boost::weak_ptr<Diskstream> ds)
|
StreamView::playlist_switched (boost::weak_ptr<Diskstream> wds)
|
||||||
{
|
{
|
||||||
boost::shared_ptr<Diskstream> sp (ds.lock());
|
boost::shared_ptr<Diskstream> ds (wds.lock());
|
||||||
if (sp) {
|
|
||||||
playlist_changed (sp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
if (!ds) {
|
||||||
StreamView::playlist_changed (boost::shared_ptr<Diskstream> ds)
|
return;
|
||||||
{
|
}
|
||||||
ENSURE_GUI_THREAD (*this, &StreamView::playlist_changed_weak, boost::weak_ptr<Diskstream> (ds));
|
|
||||||
|
|
||||||
/* disconnect from old playlist */
|
/* disconnect from old playlist */
|
||||||
|
|
||||||
|
|
@ -353,8 +333,8 @@ StreamView::playlist_changed (boost::shared_ptr<Diskstream> ds)
|
||||||
|
|
||||||
/* catch changes */
|
/* catch changes */
|
||||||
|
|
||||||
ds->playlist()->Modified.connect (playlist_connections, boost::bind (&StreamView::playlist_modified_weak, this, ds), gui_context());
|
ds->playlist()->LayeringChanged.connect (playlist_connections, boost::bind (&StreamView::playlist_layered, this, boost::weak_ptr<Diskstream>(ds)), gui_context());
|
||||||
ds->playlist()->RegionAdded.connect (playlist_connections, ui_bind (&StreamView::add_region_view_weak, this, _1), gui_context());
|
ds->playlist()->RegionAdded.connect (playlist_connections, ui_bind (&StreamView::add_region_view, this, _1), gui_context());
|
||||||
ds->playlist()->RegionRemoved.connect (playlist_connections, ui_bind (&StreamView::remove_region_view, this, _1), gui_context());
|
ds->playlist()->RegionRemoved.connect (playlist_connections, ui_bind (&StreamView::remove_region_view, this, _1), gui_context());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -99,8 +99,7 @@ public:
|
||||||
|
|
||||||
virtual void update_contents_metrics(boost::shared_ptr<ARDOUR::Region>) {}
|
virtual void update_contents_metrics(boost::shared_ptr<ARDOUR::Region>) {}
|
||||||
|
|
||||||
void add_region_view_weak (boost::weak_ptr<ARDOUR::Region> r);
|
void add_region_view (boost::weak_ptr<ARDOUR::Region>);
|
||||||
void add_region_view (boost::shared_ptr<ARDOUR::Region>);
|
|
||||||
|
|
||||||
void region_layered (RegionView*);
|
void region_layered (RegionView*);
|
||||||
virtual void update_contents_height ();
|
virtual void update_contents_height ();
|
||||||
|
|
@ -135,10 +134,8 @@ protected:
|
||||||
void diskstream_changed ();
|
void diskstream_changed ();
|
||||||
void layer_regions ();
|
void layer_regions ();
|
||||||
|
|
||||||
virtual void playlist_changed_weak (boost::weak_ptr<ARDOUR::Diskstream>);
|
virtual void playlist_switched (boost::weak_ptr<ARDOUR::Diskstream>);
|
||||||
virtual void playlist_changed (boost::shared_ptr<ARDOUR::Diskstream>);
|
virtual void playlist_layered (boost::weak_ptr<ARDOUR::Diskstream>);
|
||||||
virtual void playlist_modified_weak (boost::weak_ptr<ARDOUR::Diskstream>);
|
|
||||||
virtual void playlist_modified (boost::shared_ptr<ARDOUR::Diskstream>);
|
|
||||||
|
|
||||||
virtual void color_handler () = 0;
|
virtual void color_handler () = 0;
|
||||||
|
|
||||||
|
|
@ -164,7 +161,7 @@ protected:
|
||||||
uint32_t stream_base_color; ///< Background color
|
uint32_t stream_base_color; ///< Background color
|
||||||
|
|
||||||
PBD::ScopedConnectionList playlist_connections;
|
PBD::ScopedConnectionList playlist_connections;
|
||||||
PBD::ScopedConnection playlist_change_connection;
|
PBD::ScopedConnection playlist_switched_connection;
|
||||||
|
|
||||||
ARDOUR::layer_t _layers;
|
ARDOUR::layer_t _layers;
|
||||||
LayerDisplay _layer_display;
|
LayerDisplay _layer_display;
|
||||||
|
|
|
||||||
|
|
@ -130,11 +130,12 @@ class Playlist : public SessionObject
|
||||||
XMLNode& get_template ();
|
XMLNode& get_template ();
|
||||||
|
|
||||||
PBD::Signal1<void,bool> InUse;
|
PBD::Signal1<void,bool> InUse;
|
||||||
PBD::Signal0<void> Modified;
|
PBD::Signal0<void> ContentsChanged;
|
||||||
PBD::Signal1<void,boost::weak_ptr<Region> > RegionAdded;
|
PBD::Signal1<void,boost::weak_ptr<Region> > RegionAdded;
|
||||||
PBD::Signal1<void,boost::weak_ptr<Region> > RegionRemoved;
|
PBD::Signal1<void,boost::weak_ptr<Region> > RegionRemoved;
|
||||||
PBD::Signal0<void> NameChanged;
|
PBD::Signal0<void> NameChanged;
|
||||||
PBD::Signal0<void> LengthChanged;
|
PBD::Signal0<void> LengthChanged;
|
||||||
|
PBD::Signal0<void> LayeringChanged;
|
||||||
PBD::Signal1<void,std::list< Evoral::RangeMove<nframes_t> > const &> RangesMoved;
|
PBD::Signal1<void,std::list< Evoral::RangeMove<nframes_t> > const &> RangesMoved;
|
||||||
|
|
||||||
static std::string bump_name (std::string old_name, Session&);
|
static std::string bump_name (std::string old_name, Session&);
|
||||||
|
|
@ -201,7 +202,8 @@ class Playlist : public SessionObject
|
||||||
std::set<boost::shared_ptr<Region> > pending_adds;
|
std::set<boost::shared_ptr<Region> > pending_adds;
|
||||||
std::set<boost::shared_ptr<Region> > pending_removes;
|
std::set<boost::shared_ptr<Region> > pending_removes;
|
||||||
RegionList pending_bounds;
|
RegionList pending_bounds;
|
||||||
bool pending_modified;
|
bool pending_contents_change;
|
||||||
|
bool pending_layering;
|
||||||
bool pending_length;
|
bool pending_length;
|
||||||
std::list< Evoral::RangeMove<nframes_t> > pending_range_moves;
|
std::list< Evoral::RangeMove<nframes_t> > pending_range_moves;
|
||||||
bool save_on_thaw;
|
bool save_on_thaw;
|
||||||
|
|
@ -240,12 +242,13 @@ class Playlist : public SessionObject
|
||||||
void delay_notifications ();
|
void delay_notifications ();
|
||||||
void release_notifications ();
|
void release_notifications ();
|
||||||
virtual void flush_notifications ();
|
virtual void flush_notifications ();
|
||||||
|
void clear_pending ();
|
||||||
|
|
||||||
void notify_region_removed (boost::shared_ptr<Region>);
|
void notify_region_removed (boost::shared_ptr<Region>);
|
||||||
void notify_region_added (boost::shared_ptr<Region>);
|
void notify_region_added (boost::shared_ptr<Region>);
|
||||||
void notify_length_changed ();
|
void notify_length_changed ();
|
||||||
void notify_layering_changed ();
|
void notify_layering_changed ();
|
||||||
void notify_modified ();
|
void notify_contents_changed ();
|
||||||
void notify_state_changed (Change);
|
void notify_state_changed (Change);
|
||||||
void notify_region_moved (boost::shared_ptr<Region>);
|
void notify_region_moved (boost::shared_ptr<Region>);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1451,7 +1451,7 @@ AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_ca
|
||||||
process. this problem is deferred to the UI.
|
process. this problem is deferred to the UI.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
_playlist->Modified();
|
_playlist->LayeringChanged(); // XXX this may not get the UI to do the right thing
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -738,7 +738,7 @@ AudioPlaylist::crossfade_changed (Change)
|
||||||
that occured.
|
that occured.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
notify_modified ();
|
notify_contents_changed ();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
@ -760,7 +760,7 @@ AudioPlaylist::region_changed (Change what_changed, boost::shared_ptr<Region> re
|
||||||
parent_wants_notify = Playlist::region_changed (what_changed, region);
|
parent_wants_notify = Playlist::region_changed (what_changed, region);
|
||||||
|
|
||||||
if ((parent_wants_notify || (what_changed & our_interests))) {
|
if ((parent_wants_notify || (what_changed & our_interests))) {
|
||||||
notify_modified ();
|
notify_contents_changed ();
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -294,6 +294,8 @@ AudioRegion::connect_to_header_position_offset_changed ()
|
||||||
void
|
void
|
||||||
AudioRegion::listen_to_my_curves ()
|
AudioRegion::listen_to_my_curves ()
|
||||||
{
|
{
|
||||||
|
cerr << _name << ": listeing my own curves\n";
|
||||||
|
|
||||||
_envelope->StateChanged.connect_same_thread (*this, boost::bind (&AudioRegion::envelope_changed, this));
|
_envelope->StateChanged.connect_same_thread (*this, boost::bind (&AudioRegion::envelope_changed, this));
|
||||||
_fade_in->StateChanged.connect_same_thread (*this, boost::bind (&AudioRegion::fade_in_changed, this));
|
_fade_in->StateChanged.connect_same_thread (*this, boost::bind (&AudioRegion::fade_in_changed, this));
|
||||||
_fade_out->StateChanged.connect_same_thread (*this, boost::bind (&AudioRegion::fade_out_changed, this));
|
_fade_out->StateChanged.connect_same_thread (*this, boost::bind (&AudioRegion::fade_out_changed, this));
|
||||||
|
|
@ -637,8 +639,15 @@ AudioRegion::set_live_state (const XMLNode& node, int version, Change& what_chan
|
||||||
const XMLNodeList& nlist = node.children();
|
const XMLNodeList& nlist = node.children();
|
||||||
const XMLProperty *prop;
|
const XMLProperty *prop;
|
||||||
LocaleGuard lg (X_("POSIX"));
|
LocaleGuard lg (X_("POSIX"));
|
||||||
|
boost::shared_ptr<Playlist> the_playlist (_playlist.lock());
|
||||||
|
|
||||||
|
freeze ();
|
||||||
|
if (the_playlist) {
|
||||||
|
the_playlist->freeze ();
|
||||||
|
}
|
||||||
|
|
||||||
Region::set_live_state (node, version, what_changed, false);
|
Region::set_live_state (node, version, what_changed, false);
|
||||||
|
cerr << "After region SLS, wc = " << what_changed << endl;
|
||||||
|
|
||||||
uint32_t old_flags = _flags;
|
uint32_t old_flags = _flags;
|
||||||
|
|
||||||
|
|
@ -661,23 +670,32 @@ AudioRegion::set_live_state (const XMLNode& node, int version, Change& what_chan
|
||||||
|
|
||||||
if ((old_flags ^ _flags) & Muted) {
|
if ((old_flags ^ _flags) & Muted) {
|
||||||
what_changed = Change (what_changed|MuteChanged);
|
what_changed = Change (what_changed|MuteChanged);
|
||||||
|
cerr << _name << " mute changed\n";
|
||||||
}
|
}
|
||||||
if ((old_flags ^ _flags) & Opaque) {
|
if ((old_flags ^ _flags) & Opaque) {
|
||||||
what_changed = Change (what_changed|OpacityChanged);
|
what_changed = Change (what_changed|OpacityChanged);
|
||||||
|
cerr << _name << " opacity changed\n";
|
||||||
}
|
}
|
||||||
if ((old_flags ^ _flags) & Locked) {
|
if ((old_flags ^ _flags) & Locked) {
|
||||||
what_changed = Change (what_changed|LockChanged);
|
what_changed = Change (what_changed|LockChanged);
|
||||||
|
cerr << _name << " lock changed\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((prop = node.property ("scale-gain")) != 0) {
|
if ((prop = node.property ("scale-gain")) != 0) {
|
||||||
_scale_amplitude = atof (prop->value().c_str());
|
float a = atof (prop->value().c_str());
|
||||||
what_changed = Change (what_changed|ScaleAmplitudeChanged);
|
if (a != _scale_amplitude) {
|
||||||
|
_scale_amplitude = a;
|
||||||
|
what_changed = Change (what_changed|ScaleAmplitudeChanged);
|
||||||
|
cerr << _name << " amp changed\n";
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
_scale_amplitude = 1.0;
|
_scale_amplitude = 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now find envelope description and other misc child items */
|
/* Now find envelope description and other misc child items */
|
||||||
|
|
||||||
|
_envelope->freeze ();
|
||||||
|
|
||||||
for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
|
for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
|
||||||
|
|
||||||
XMLNode *child;
|
XMLNode *child;
|
||||||
|
|
@ -685,6 +703,7 @@ AudioRegion::set_live_state (const XMLNode& node, int version, Change& what_chan
|
||||||
|
|
||||||
child = (*niter);
|
child = (*niter);
|
||||||
|
|
||||||
|
#if 0
|
||||||
if (child->name() == "Envelope") {
|
if (child->name() == "Envelope") {
|
||||||
|
|
||||||
_envelope->clear ();
|
_envelope->clear ();
|
||||||
|
|
@ -696,6 +715,9 @@ AudioRegion::set_live_state (const XMLNode& node, int version, Change& what_chan
|
||||||
_envelope->set_max_xval (_length);
|
_envelope->set_max_xval (_length);
|
||||||
_envelope->truncate_end (_length);
|
_envelope->truncate_end (_length);
|
||||||
|
|
||||||
|
cerr << _name << " envelope changd\n";
|
||||||
|
|
||||||
|
|
||||||
} else if (child->name() == "FadeIn") {
|
} else if (child->name() == "FadeIn") {
|
||||||
|
|
||||||
_fade_in->clear ();
|
_fade_in->clear ();
|
||||||
|
|
@ -716,6 +738,7 @@ AudioRegion::set_live_state (const XMLNode& node, int version, Change& what_chan
|
||||||
set_fade_in_active (false);
|
set_fade_in_active (false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
cerr << _name << " fadein changd\n";
|
||||||
|
|
||||||
} else if (child->name() == "FadeOut") {
|
} else if (child->name() == "FadeOut") {
|
||||||
|
|
||||||
|
|
@ -737,14 +760,24 @@ AudioRegion::set_live_state (const XMLNode& node, int version, Change& what_chan
|
||||||
set_fade_out_active (false);
|
set_fade_out_active (false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
cerr << _name << " fadeout changd\n";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_envelope->thaw ();
|
||||||
|
thaw ("");
|
||||||
|
|
||||||
if (send) {
|
if (send) {
|
||||||
|
cerr << _name << ": audio final change: " << hex << what_changed << dec << endl;
|
||||||
send_change (what_changed);
|
send_change (what_changed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (the_playlist) {
|
||||||
|
the_playlist->thaw ();
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -836,8 +869,6 @@ AudioRegion::set_fade_in (FadeShape shape, nframes_t len)
|
||||||
}
|
}
|
||||||
|
|
||||||
_fade_in->thaw ();
|
_fade_in->thaw ();
|
||||||
|
|
||||||
send_change (FadeInChanged);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -903,8 +934,6 @@ AudioRegion::set_fade_out (FadeShape shape, nframes_t len)
|
||||||
}
|
}
|
||||||
|
|
||||||
_fade_out->thaw ();
|
_fade_out->thaw ();
|
||||||
|
|
||||||
send_change (FadeOutChanged);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -1175,7 +1204,7 @@ AudioRegion::set_scale_amplitude (gain_t g)
|
||||||
/* tell the diskstream we're in */
|
/* tell the diskstream we're in */
|
||||||
|
|
||||||
if (pl) {
|
if (pl) {
|
||||||
pl->Modified();
|
pl->ContentsChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* tell everybody else */
|
/* tell everybody else */
|
||||||
|
|
@ -1245,7 +1274,7 @@ AudioRegion::normalize_to (float target_dB)
|
||||||
boost::shared_ptr<Playlist> pl (playlist());
|
boost::shared_ptr<Playlist> pl (playlist());
|
||||||
|
|
||||||
if (pl) {
|
if (pl) {
|
||||||
pl->Modified();
|
pl->ContentsChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* tell everybody else */
|
/* tell everybody else */
|
||||||
|
|
|
||||||
|
|
@ -219,6 +219,7 @@ AutomationList::thaw ()
|
||||||
ControlList::thaw();
|
ControlList::thaw();
|
||||||
|
|
||||||
if (_changed_when_thawed) {
|
if (_changed_when_thawed) {
|
||||||
|
_changed_when_thawed = false;
|
||||||
StateChanged(); /* EMIT SIGNAL */
|
StateChanged(); /* EMIT SIGNAL */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,7 @@ Crossfade::Crossfade (boost::shared_ptr<AudioRegion> in, boost::shared_ptr<Audio
|
||||||
nframes_t length,
|
nframes_t length,
|
||||||
nframes_t position,
|
nframes_t position,
|
||||||
AnchorPoint ap)
|
AnchorPoint ap)
|
||||||
: AudioRegion (in->session(), position, length, "foobar"),
|
: AudioRegion (in->session(), position, length, in->name() + string ("<>") + out->name()),
|
||||||
_fade_in (Evoral::Parameter(FadeInAutomation)), // linear (gain coefficient) => -inf..+6dB
|
_fade_in (Evoral::Parameter(FadeInAutomation)), // linear (gain coefficient) => -inf..+6dB
|
||||||
_fade_out (Evoral::Parameter(FadeOutAutomation)) // linear (gain coefficient) => -inf..+6dB
|
_fade_out (Evoral::Parameter(FadeOutAutomation)) // linear (gain coefficient) => -inf..+6dB
|
||||||
|
|
||||||
|
|
@ -89,7 +89,7 @@ Crossfade::Crossfade (boost::shared_ptr<AudioRegion> in, boost::shared_ptr<Audio
|
||||||
}
|
}
|
||||||
|
|
||||||
Crossfade::Crossfade (boost::shared_ptr<AudioRegion> a, boost::shared_ptr<AudioRegion> b, CrossfadeModel model, bool act)
|
Crossfade::Crossfade (boost::shared_ptr<AudioRegion> a, boost::shared_ptr<AudioRegion> b, CrossfadeModel model, bool act)
|
||||||
: AudioRegion (a->session(), 0, 0, "foobar"),
|
: AudioRegion (a->session(), 0, 0, a->name() + string ("<>") + b->name()),
|
||||||
_fade_in (Evoral::Parameter(FadeInAutomation)), // linear (gain coefficient) => -inf..+6dB
|
_fade_in (Evoral::Parameter(FadeInAutomation)), // linear (gain coefficient) => -inf..+6dB
|
||||||
_fade_out (Evoral::Parameter(FadeOutAutomation)) // linear (gain coefficient) => -inf..+6dB
|
_fade_out (Evoral::Parameter(FadeOutAutomation)) // linear (gain coefficient) => -inf..+6dB
|
||||||
{
|
{
|
||||||
|
|
@ -107,7 +107,7 @@ Crossfade::Crossfade (boost::shared_ptr<AudioRegion> a, boost::shared_ptr<AudioR
|
||||||
}
|
}
|
||||||
|
|
||||||
Crossfade::Crossfade (const Playlist& playlist, XMLNode& node)
|
Crossfade::Crossfade (const Playlist& playlist, XMLNode& node)
|
||||||
: AudioRegion (playlist.session(), 0, 0, "foobar"),
|
: AudioRegion (playlist.session(), 0, 0, "unnamed crossfade"),
|
||||||
_fade_in (Evoral::Parameter(FadeInAutomation)), // linear (gain coefficient) => -inf..+6dB
|
_fade_in (Evoral::Parameter(FadeInAutomation)), // linear (gain coefficient) => -inf..+6dB
|
||||||
_fade_out (Evoral::Parameter(FadeOutAutomation)) // linear (gain coefficient) => -inf..+6dB
|
_fade_out (Evoral::Parameter(FadeOutAutomation)) // linear (gain coefficient) => -inf..+6dB
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -339,7 +339,7 @@ Diskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
|
||||||
reset_write_sources (false);
|
reset_write_sources (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
_playlist->Modified.connect_same_thread (playlist_connections, boost::bind (&Diskstream::playlist_modified, this));
|
_playlist->ContentsChanged.connect_same_thread (playlist_connections, boost::bind (&Diskstream::playlist_modified, this));
|
||||||
_playlist->DropReferences.connect_same_thread (playlist_connections, boost::bind (&Diskstream::playlist_deleted, this, boost::weak_ptr<Playlist>(_playlist)));
|
_playlist->DropReferences.connect_same_thread (playlist_connections, boost::bind (&Diskstream::playlist_deleted, this, boost::weak_ptr<Playlist>(_playlist)));
|
||||||
_playlist->RangesMoved.connect_same_thread (playlist_connections, boost::bind (&Diskstream::playlist_ranges_moved, this, _1));
|
_playlist->RangesMoved.connect_same_thread (playlist_connections, boost::bind (&Diskstream::playlist_ranges_moved, this, _1));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -435,7 +435,7 @@ MidiPlaylist::region_changed (Change what_changed, boost::shared_ptr<Region> reg
|
||||||
parent_wants_notify = Playlist::region_changed (what_changed, region);
|
parent_wants_notify = Playlist::region_changed (what_changed, region);
|
||||||
|
|
||||||
if ((parent_wants_notify || (what_changed & our_interests))) {
|
if ((parent_wants_notify || (what_changed & our_interests))) {
|
||||||
notify_modified ();
|
notify_contents_changed ();
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -251,8 +251,9 @@ Playlist::init (bool hide)
|
||||||
{
|
{
|
||||||
g_atomic_int_set (&block_notifications, 0);
|
g_atomic_int_set (&block_notifications, 0);
|
||||||
g_atomic_int_set (&ignore_state_changes, 0);
|
g_atomic_int_set (&ignore_state_changes, 0);
|
||||||
pending_modified = false;
|
pending_contents_change = false;
|
||||||
pending_length = false;
|
pending_length = false;
|
||||||
|
pending_layering = false;
|
||||||
first_set_state = true;
|
first_set_state = true;
|
||||||
_refcnt = 0;
|
_refcnt = 0;
|
||||||
_hidden = hide;
|
_hidden = hide;
|
||||||
|
|
@ -270,7 +271,7 @@ Playlist::init (bool hide)
|
||||||
freeze_length = 0;
|
freeze_length = 0;
|
||||||
_explicit_relayering = false;
|
_explicit_relayering = false;
|
||||||
|
|
||||||
Modified.connect_same_thread (*this, boost::bind (&Playlist::mark_session_dirty, this));
|
ContentsChanged.connect_same_thread (*this, boost::bind (&Playlist::mark_session_dirty, this));
|
||||||
}
|
}
|
||||||
|
|
||||||
Playlist::~Playlist ()
|
Playlist::~Playlist ()
|
||||||
|
|
@ -343,13 +344,28 @@ Playlist::release_notifications ()
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Playlist::notify_modified ()
|
Playlist::notify_contents_changed ()
|
||||||
{
|
{
|
||||||
if (holding_state ()) {
|
if (holding_state ()) {
|
||||||
pending_modified = true;
|
pending_contents_change = true;
|
||||||
} else {
|
} else {
|
||||||
pending_modified = false;
|
pending_contents_change = false;
|
||||||
Modified(); /* EMIT SIGNAL */
|
cerr << _name << "send contents change @ " << get_microseconds() << endl;
|
||||||
|
ContentsChanged(); /* EMIT SIGNAL */
|
||||||
|
cerr << _name << "done with cc @ " << get_microseconds() << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Playlist::notify_layering_changed ()
|
||||||
|
{
|
||||||
|
if (holding_state ()) {
|
||||||
|
pending_layering = true;
|
||||||
|
} else {
|
||||||
|
pending_layering = false;
|
||||||
|
cerr << _name << "send layering @ " << get_microseconds() << endl;
|
||||||
|
LayeringChanged(); /* EMIT SIGNAL */
|
||||||
|
cerr << _name << "done with layering @ " << get_microseconds() << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -358,7 +374,7 @@ Playlist::notify_region_removed (boost::shared_ptr<Region> r)
|
||||||
{
|
{
|
||||||
if (holding_state ()) {
|
if (holding_state ()) {
|
||||||
pending_removes.insert (r);
|
pending_removes.insert (r);
|
||||||
pending_modified = true;
|
pending_contents_change = true;
|
||||||
pending_length = true;
|
pending_length = true;
|
||||||
} else {
|
} else {
|
||||||
/* this might not be true, but we have to act
|
/* this might not be true, but we have to act
|
||||||
|
|
@ -366,9 +382,9 @@ Playlist::notify_region_removed (boost::shared_ptr<Region> r)
|
||||||
*/
|
*/
|
||||||
pending_length = false;
|
pending_length = false;
|
||||||
LengthChanged (); /* EMIT SIGNAL */
|
LengthChanged (); /* EMIT SIGNAL */
|
||||||
pending_modified = false;
|
pending_contents_change = false;
|
||||||
RegionRemoved (boost::weak_ptr<Region> (r)); /* EMIT SIGNAL */
|
RegionRemoved (boost::weak_ptr<Region> (r)); /* EMIT SIGNAL */
|
||||||
Modified (); /* EMIT SIGNAL */
|
ContentsChanged (); /* EMIT SIGNAL */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -399,14 +415,16 @@ Playlist::notify_region_added (boost::shared_ptr<Region> r)
|
||||||
|
|
||||||
if (holding_state()) {
|
if (holding_state()) {
|
||||||
pending_adds.insert (r);
|
pending_adds.insert (r);
|
||||||
pending_modified = true;
|
pending_contents_change = true;
|
||||||
pending_length = true;
|
pending_length = true;
|
||||||
} else {
|
} else {
|
||||||
pending_length = false;
|
pending_length = false;
|
||||||
LengthChanged (); /* EMIT SIGNAL */
|
LengthChanged (); /* EMIT SIGNAL */
|
||||||
pending_modified = false;
|
pending_contents_change = false;
|
||||||
RegionAdded (boost::weak_ptr<Region> (r)); /* EMIT SIGNAL */
|
RegionAdded (boost::weak_ptr<Region> (r)); /* EMIT SIGNAL */
|
||||||
Modified (); /* EMIT SIGNAL */
|
cerr << _name << "send3 contents changed @ " << get_microseconds() << endl;
|
||||||
|
ContentsChanged (); /* EMIT SIGNAL */
|
||||||
|
cerr << _name << "done contents changed @ " << get_microseconds() << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -418,8 +436,10 @@ Playlist::notify_length_changed ()
|
||||||
} else {
|
} else {
|
||||||
pending_length = false;
|
pending_length = false;
|
||||||
LengthChanged(); /* EMIT SIGNAL */
|
LengthChanged(); /* EMIT SIGNAL */
|
||||||
pending_modified = false;
|
pending_contents_change = false;
|
||||||
Modified (); /* EMIT SIGNAL */
|
cerr << _name << "send4 contents change @ " << get_microseconds() << endl;
|
||||||
|
ContentsChanged (); /* EMIT SIGNAL */
|
||||||
|
cerr << _name << "done contents change @ " << get_microseconds() << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -428,7 +448,9 @@ Playlist::flush_notifications ()
|
||||||
{
|
{
|
||||||
set<boost::shared_ptr<Region> > dependent_checks_needed;
|
set<boost::shared_ptr<Region> > dependent_checks_needed;
|
||||||
set<boost::shared_ptr<Region> >::iterator s;
|
set<boost::shared_ptr<Region> >::iterator s;
|
||||||
uint32_t n = 0;
|
uint32_t regions_changed = false;
|
||||||
|
bool check_length = false;
|
||||||
|
nframes64_t old_length = 0;
|
||||||
|
|
||||||
if (in_flush) {
|
if (in_flush) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -436,6 +458,14 @@ Playlist::flush_notifications ()
|
||||||
|
|
||||||
in_flush = true;
|
in_flush = true;
|
||||||
|
|
||||||
|
if (!pending_bounds.empty() || !pending_removes.empty() || !pending_adds.empty()) {
|
||||||
|
regions_changed = true;
|
||||||
|
if (!pending_length) {
|
||||||
|
old_length = _get_maximum_extent ();
|
||||||
|
check_length = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* we have no idea what order the regions ended up in pending
|
/* we have no idea what order the regions ended up in pending
|
||||||
bounds (it could be based on selection order, for example).
|
bounds (it could be based on selection order, for example).
|
||||||
so, to preserve layering in the "most recently moved is higher"
|
so, to preserve layering in the "most recently moved is higher"
|
||||||
|
|
@ -449,37 +479,42 @@ Playlist::flush_notifications ()
|
||||||
if (_session.config.get_layer_model() == MoveAddHigher) {
|
if (_session.config.get_layer_model() == MoveAddHigher) {
|
||||||
timestamp_layer_op (*r);
|
timestamp_layer_op (*r);
|
||||||
}
|
}
|
||||||
|
|
||||||
pending_length = true;
|
|
||||||
dependent_checks_needed.insert (*r);
|
dependent_checks_needed.insert (*r);
|
||||||
|
|
||||||
n++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (s = pending_removes.begin(); s != pending_removes.end(); ++s) {
|
for (s = pending_removes.begin(); s != pending_removes.end(); ++s) {
|
||||||
remove_dependents (*s);
|
remove_dependents (*s);
|
||||||
|
cerr << _name << " sends RegionRemoved\n";
|
||||||
RegionRemoved (boost::weak_ptr<Region> (*s)); /* EMIT SIGNAL */
|
RegionRemoved (boost::weak_ptr<Region> (*s)); /* EMIT SIGNAL */
|
||||||
n++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (s = pending_adds.begin(); s != pending_adds.end(); ++s) {
|
for (s = pending_adds.begin(); s != pending_adds.end(); ++s) {
|
||||||
|
cerr << _name << " sends RegionAdded\n";
|
||||||
RegionAdded (boost::weak_ptr<Region> (*s)); /* EMIT SIGNAL */
|
RegionAdded (boost::weak_ptr<Region> (*s)); /* EMIT SIGNAL */
|
||||||
dependent_checks_needed.insert (*s);
|
dependent_checks_needed.insert (*s);
|
||||||
n++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((freeze_length != _get_maximum_extent()) || pending_length) {
|
if (check_length) {
|
||||||
pending_length = 0;
|
if (old_length != _get_maximum_extent()) {
|
||||||
|
pending_length = true;
|
||||||
|
cerr << _name << " length has changed\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pending_length || (freeze_length != _get_maximum_extent())) {
|
||||||
|
pending_length = false;
|
||||||
|
cerr << _name << " sends LengthChanged\n";
|
||||||
LengthChanged(); /* EMIT SIGNAL */
|
LengthChanged(); /* EMIT SIGNAL */
|
||||||
n++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n || pending_modified) {
|
if (regions_changed || pending_contents_change) {
|
||||||
if (!in_set_state) {
|
if (!in_set_state) {
|
||||||
relayer ();
|
relayer ();
|
||||||
}
|
}
|
||||||
pending_modified = false;
|
pending_contents_change = false;
|
||||||
Modified (); /* EMIT SIGNAL */
|
cerr << _name << " sends 5 contents change @ " << get_microseconds() << endl;
|
||||||
|
ContentsChanged (); /* EMIT SIGNAL */
|
||||||
|
cerr << _name << "done contents change @ " << get_microseconds() << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (s = dependent_checks_needed.begin(); s != dependent_checks_needed.end(); ++s) {
|
for (s = dependent_checks_needed.begin(); s != dependent_checks_needed.end(); ++s) {
|
||||||
|
|
@ -487,15 +522,24 @@ Playlist::flush_notifications ()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pending_range_moves.empty ()) {
|
if (!pending_range_moves.empty ()) {
|
||||||
|
cerr << _name << " sends RangesMoved\n";
|
||||||
RangesMoved (pending_range_moves);
|
RangesMoved (pending_range_moves);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clear_pending ();
|
||||||
|
|
||||||
|
in_flush = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Playlist::clear_pending ()
|
||||||
|
{
|
||||||
pending_adds.clear ();
|
pending_adds.clear ();
|
||||||
pending_removes.clear ();
|
pending_removes.clear ();
|
||||||
pending_bounds.clear ();
|
pending_bounds.clear ();
|
||||||
pending_range_moves.clear ();
|
pending_range_moves.clear ();
|
||||||
|
pending_contents_change = false;
|
||||||
in_flush = false;
|
pending_length = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************
|
/*************************************************************
|
||||||
|
|
@ -638,6 +682,7 @@ Playlist::remove_region_internal (boost::shared_ptr<Region> region)
|
||||||
{
|
{
|
||||||
RegionList::iterator i;
|
RegionList::iterator i;
|
||||||
nframes_t old_length = 0;
|
nframes_t old_length = 0;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
if (!holding_state()) {
|
if (!holding_state()) {
|
||||||
old_length = _get_maximum_extent();
|
old_length = _get_maximum_extent();
|
||||||
|
|
@ -648,6 +693,8 @@ Playlist::remove_region_internal (boost::shared_ptr<Region> region)
|
||||||
region->set_playlist (boost::weak_ptr<Playlist>());
|
region->set_playlist (boost::weak_ptr<Playlist>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* XXX should probably freeze here .... */
|
||||||
|
|
||||||
for (i = regions.begin(); i != regions.end(); ++i) {
|
for (i = regions.begin(); i != regions.end(); ++i) {
|
||||||
if (*i == region) {
|
if (*i == region) {
|
||||||
|
|
||||||
|
|
@ -668,13 +715,14 @@ Playlist::remove_region_internal (boost::shared_ptr<Region> region)
|
||||||
}
|
}
|
||||||
|
|
||||||
notify_region_removed (region);
|
notify_region_removed (region);
|
||||||
return 0;
|
ret = 0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* XXX and thaw ... */
|
||||||
|
|
||||||
|
return ret;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -1348,6 +1396,11 @@ Playlist::region_changed (Change what_changed, boost::shared_ptr<Region> region)
|
||||||
notify_region_moved (region);
|
notify_region_moved (region);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* don't notify about layer changes, since we are the only object that can initiate
|
||||||
|
them, and we notify in ::relayer()
|
||||||
|
*/
|
||||||
|
|
||||||
if (what_changed & our_interests) {
|
if (what_changed & our_interests) {
|
||||||
save = true;
|
save = true;
|
||||||
}
|
}
|
||||||
|
|
@ -1381,8 +1434,10 @@ Playlist::clear (bool with_signals)
|
||||||
if (with_signals) {
|
if (with_signals) {
|
||||||
pending_length = false;
|
pending_length = false;
|
||||||
LengthChanged ();
|
LengthChanged ();
|
||||||
pending_modified = false;
|
pending_contents_change = false;
|
||||||
Modified ();
|
cerr << _name << "send2 contents change @ " << get_microseconds() << endl;
|
||||||
|
ContentsChanged ();
|
||||||
|
cerr << _name << "done with contents changed @ " << get_microseconds() << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -1842,12 +1897,16 @@ Playlist::set_state (const XMLNode& node, int version)
|
||||||
|
|
||||||
Change what_changed = Change (0);
|
Change what_changed = Change (0);
|
||||||
|
|
||||||
if (region->set_live_state (*child, version, what_changed, true)) {
|
region->freeze ();
|
||||||
error << _("Playlist: cannot reset region state from XML") << endmsg;
|
|
||||||
|
if (region->set_live_state (*child, version, what_changed, false)) {
|
||||||
|
region->thaw ("");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if ((region = RegionFactory::create (_session, *child, true)) == 0) {
|
} else if ((region = RegionFactory::create (_session, *child, true)) != 0) {
|
||||||
|
region->freeze ();
|
||||||
|
} else {
|
||||||
error << _("Playlist: cannot create region from XML") << endmsg;
|
error << _("Playlist: cannot create region from XML") << endmsg;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
@ -1856,14 +1915,10 @@ Playlist::set_state (const XMLNode& node, int version)
|
||||||
|
|
||||||
// So that layer_op ordering doesn't get screwed up
|
// So that layer_op ordering doesn't get screwed up
|
||||||
region->set_last_layer_op( region->layer());
|
region->set_last_layer_op( region->layer());
|
||||||
|
region->thaw ("");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
notify_modified ();
|
|
||||||
|
|
||||||
thaw ();
|
|
||||||
|
|
||||||
/* update dependents, which was not done during add_region_internal
|
/* update dependents, which was not done during add_region_internal
|
||||||
due to in_set_state being true
|
due to in_set_state being true
|
||||||
*/
|
*/
|
||||||
|
|
@ -1872,6 +1927,10 @@ Playlist::set_state (const XMLNode& node, int version)
|
||||||
check_dependents (*r, false);
|
check_dependents (*r, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clear_pending (); // this makes thaw() do nothing
|
||||||
|
thaw ();
|
||||||
|
notify_contents_changed ();
|
||||||
|
|
||||||
in_set_state--;
|
in_set_state--;
|
||||||
first_set_state = false;
|
first_set_state = false;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -1993,11 +2052,7 @@ Playlist::set_edit_mode (EditMode mode)
|
||||||
void
|
void
|
||||||
Playlist::relayer ()
|
Playlist::relayer ()
|
||||||
{
|
{
|
||||||
/* don't send multiple Modified notifications
|
bool changed = false;
|
||||||
when multiple regions are relayered.
|
|
||||||
*/
|
|
||||||
|
|
||||||
freeze ();
|
|
||||||
|
|
||||||
/* Build up a new list of regions on each layer, stored in a set of lists
|
/* Build up a new list of regions on each layer, stored in a set of lists
|
||||||
each of which represent some period of time on some layer. The idea
|
each of which represent some period of time on some layer. The idea
|
||||||
|
|
@ -2093,21 +2148,17 @@ Playlist::relayer ()
|
||||||
for (int k = start_division; k <= end_division; ++k) {
|
for (int k = start_division; k <= end_division; ++k) {
|
||||||
layers[j][k].push_back (*i);
|
layers[j][k].push_back (*i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((*i)->layer() != j) {
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
(*i)->set_layer (j);
|
(*i)->set_layer (j);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* sending Modified means that various kinds of layering
|
if (changed) {
|
||||||
models operate correctly at the GUI
|
notify_layering_changed ();
|
||||||
level. slightly inefficient, but only slightly.
|
}
|
||||||
|
|
||||||
We force a Modified signal here in case no layers actually
|
|
||||||
changed.
|
|
||||||
*/
|
|
||||||
|
|
||||||
notify_modified ();
|
|
||||||
|
|
||||||
thaw ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX these layer functions are all deprecated */
|
/* XXX these layer functions are all deprecated */
|
||||||
|
|
@ -2454,7 +2505,7 @@ Playlist::shuffle (boost::shared_ptr<Region> region, int dir)
|
||||||
relayer ();
|
relayer ();
|
||||||
check_dependents (region, false);
|
check_dependents (region, false);
|
||||||
|
|
||||||
notify_modified();
|
notify_contents_changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1148,6 +1148,7 @@ Region::set_live_state (const XMLNode& node, int /*version*/, Change& what_chang
|
||||||
sscanf (prop->value().c_str(), "%" PRIu32, &val);
|
sscanf (prop->value().c_str(), "%" PRIu32, &val);
|
||||||
if (val != _start) {
|
if (val != _start) {
|
||||||
what_changed = Change (what_changed|StartChanged);
|
what_changed = Change (what_changed|StartChanged);
|
||||||
|
cerr << _name << " start changed\n";
|
||||||
_start = val;
|
_start = val;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -1158,6 +1159,7 @@ Region::set_live_state (const XMLNode& node, int /*version*/, Change& what_chang
|
||||||
sscanf (prop->value().c_str(), "%" PRIu32, &val);
|
sscanf (prop->value().c_str(), "%" PRIu32, &val);
|
||||||
if (val != _length) {
|
if (val != _length) {
|
||||||
what_changed = Change (what_changed|LengthChanged);
|
what_changed = Change (what_changed|LengthChanged);
|
||||||
|
cerr << _name << " length changed\n";
|
||||||
_last_length = _length;
|
_last_length = _length;
|
||||||
_length = val;
|
_length = val;
|
||||||
}
|
}
|
||||||
|
|
@ -1170,6 +1172,7 @@ Region::set_live_state (const XMLNode& node, int /*version*/, Change& what_chang
|
||||||
sscanf (prop->value().c_str(), "%" PRIu32, &val);
|
sscanf (prop->value().c_str(), "%" PRIu32, &val);
|
||||||
if (val != _position) {
|
if (val != _position) {
|
||||||
what_changed = Change (what_changed|PositionChanged);
|
what_changed = Change (what_changed|PositionChanged);
|
||||||
|
cerr << _name << " position changed\n";
|
||||||
_last_position = _position;
|
_last_position = _position;
|
||||||
_position = val;
|
_position = val;
|
||||||
}
|
}
|
||||||
|
|
@ -1183,6 +1186,7 @@ Region::set_live_state (const XMLNode& node, int /*version*/, Change& what_chang
|
||||||
x = (layer_t) atoi (prop->value().c_str());
|
x = (layer_t) atoi (prop->value().c_str());
|
||||||
if (x != _layer) {
|
if (x != _layer) {
|
||||||
what_changed = Change (what_changed|LayerChanged);
|
what_changed = Change (what_changed|LayerChanged);
|
||||||
|
cerr << _name << " layer changed\n";
|
||||||
_layer = x;
|
_layer = x;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -1193,6 +1197,7 @@ Region::set_live_state (const XMLNode& node, int /*version*/, Change& what_chang
|
||||||
sscanf (prop->value().c_str(), "%" PRIu32, &val);
|
sscanf (prop->value().c_str(), "%" PRIu32, &val);
|
||||||
if (val != _sync_position) {
|
if (val != _sync_position) {
|
||||||
what_changed = Change (what_changed|SyncOffsetChanged);
|
what_changed = Change (what_changed|SyncOffsetChanged);
|
||||||
|
cerr << _name << " sync changed\n";
|
||||||
_sync_position = val;
|
_sync_position = val;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -1281,6 +1286,7 @@ Region::set_live_state (const XMLNode& node, int /*version*/, Change& what_chang
|
||||||
}
|
}
|
||||||
|
|
||||||
if (send) {
|
if (send) {
|
||||||
|
cerr << _name << ": final change to be sent: " << hex << what_changed << dec << endl;
|
||||||
send_change (what_changed);
|
send_change (what_changed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1346,12 +1352,13 @@ Region::thaw (const string& /*why*/)
|
||||||
recompute_at_end ();
|
recompute_at_end ();
|
||||||
}
|
}
|
||||||
|
|
||||||
StateChanged (what_changed);
|
send_change (what_changed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Region::send_change (Change what_changed)
|
Region::send_change (Change what_changed)
|
||||||
{
|
{
|
||||||
|
|
||||||
{
|
{
|
||||||
Glib::Mutex::Lock lm (_lock);
|
Glib::Mutex::Lock lm (_lock);
|
||||||
if (_frozen) {
|
if (_frozen) {
|
||||||
|
|
@ -1360,7 +1367,9 @@ Region::send_change (Change what_changed)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cerr << _name << " actually sends " << hex << what_changed << dec << " @" << get_microseconds() << endl;
|
||||||
StateChanged (what_changed);
|
StateChanged (what_changed);
|
||||||
|
cerr << _name << " done with " << hex << what_changed << dec << " @" << get_microseconds() << endl;
|
||||||
|
|
||||||
if (!(_flags & DoNotSendPropertyChanges)) {
|
if (!(_flags & DoNotSendPropertyChanges)) {
|
||||||
|
|
||||||
|
|
@ -1370,7 +1379,9 @@ Region::send_change (Change what_changed)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
boost::shared_ptr<Region> rptr = shared_from_this();
|
boost::shared_ptr<Region> rptr = shared_from_this();
|
||||||
|
cerr << _name << " actually sends prop change " << hex << what_changed << dec << " @ " << get_microseconds() << endl;
|
||||||
RegionPropertyChanged (rptr);
|
RegionPropertyChanged (rptr);
|
||||||
|
cerr << _name << " done with prop change @ " << get_microseconds() << endl;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
/* no shared_ptr available, relax; */
|
/* no shared_ptr available, relax; */
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@
|
||||||
$Id$
|
$Id$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue