#include <gtkmm2ext/gtk_ui.h>
-#include "ardour/midi_playlist.h"
#include "ardour/midi_region.h"
#include "ardour/midi_source.h"
-#include "ardour/midi_diskstream.h"
-#include "ardour/midi_track.h"
-#include "ardour/smf_source.h"
-#include "ardour/region_factory.h"
#include "automation_streamview.h"
#include "region_view.h"
: StreamView (*dynamic_cast<RouteTimeAxisView*>(tv.get_parent()),
new ArdourCanvas::Group(*tv.canvas_background()),
new ArdourCanvas::Group(*tv.canvas_display()))
- , _controller(tv.controller())
, _automation_view(tv)
, _pending_automation_state (Off)
{
RegionView*
AutomationStreamView::add_region_view_internal (boost::shared_ptr<Region> region, bool wfd, bool /*recording*/)
{
- if ( ! region) {
- cerr << "No region" << endl;
- return NULL;
- }
+ assert (region);
if (wfd) {
boost::shared_ptr<MidiRegion> mr = boost::dynamic_pointer_cast<MidiRegion>(region);
- if (mr)
+ if (mr) {
mr->midi_source()->load_model();
+ }
}
const boost::shared_ptr<AutomationControl> control = boost::dynamic_pointer_cast<AutomationControl> (
- region->control (_controller->controllable()->parameter(), true)
+ region->control (_automation_view.parameter(), true)
);
boost::shared_ptr<AutomationList> list;
/* great. we already have an AutomationRegionView for this Region. use it again. */
AutomationRegionView* arv = dynamic_cast<AutomationRegionView*>(*i);;
- if (arv->line())
+ if (arv->line()) {
arv->line()->set_list (list);
+ }
(*i)->set_valid (true);
(*i)->enable_display(wfd);
display_region(arv);
- return NULL;
+ return 0;
}
}
- region_view = new AutomationRegionView (_canvas_group, _automation_view, region,
- _controller->controllable()->parameter(), list,
- _samples_per_unit, region_color);
+ region_view = new AutomationRegionView (
+ _canvas_group, _automation_view, region,
+ _automation_view.parameter (), list,
+ _samples_per_unit, region_color
+ );
region_view->init (region_color, false);
region_views.push_front (region_view);
if (line && line->the_list()) {
line->the_list()->set_automation_state (automation_state ());
}
-
+
RegionViewAdded (region_view);
return region_view;
void
AutomationStreamView::set_automation_state (AutoState state)
{
- /* XXX: not sure if this is right, but for now the automation state is basically held by
- the regions' AutomationLists. Each region is always set to have the same AutoState.
- */
-
+ /* Setting the automation state for this view sets the state of all regions' lists to the same thing */
+
if (region_views.empty()) {
_pending_automation_state = state;
} else {
void
AutomationStreamView::redisplay_track ()
{
- list<RegionView *>::iterator i, tmp;
-
// Flag region views as invalid and disable drawing
- for (i = region_views.begin(); i != region_views.end(); ++i) {
+ for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
(*i)->set_valid (false);
(*i)->enable_display(false);
}
AutomationStreamView::has_automation () const
{
list<boost::shared_ptr<AutomationLine> > lines = get_lines ();
-
+
for (list<boost::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
if ((*i)->npoints() > 0) {
return true;
AutomationStreamView::set_interpolation (AutomationList::InterpolationStyle s)
{
list<boost::shared_ptr<AutomationLine> > lines = get_lines ();
-
+
for (list<boost::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
(*i)->the_list()->set_interpolation (s);
}
}
AutomationRegionView* v = dynamic_cast<AutomationRegionView*> (region_views.front());
- assert (v);
-
- return v->line()->the_list()->interpolation ();
+ if (v) {
+ return v->line()->the_list()->interpolation ();
+ }
+ return AutomationList::Linear;
}
/** Clear all automation displayed in this view */
AutomationStreamView::clear ()
{
list<boost::shared_ptr<AutomationLine> > lines = get_lines ();
-
+
for (list<boost::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
(*i)->clear ();
}
AutomationStreamView::set_selected_points (PointSelection& ps)
{
list<boost::shared_ptr<AutomationLine> > lines = get_lines ();
-
+
for (list<boost::shared_ptr<AutomationLine> >::iterator i = lines.begin(); i != lines.end(); ++i) {
(*i)->set_selected_points (ps);
}
AutomationStreamView::get_lines () const
{
list<boost::shared_ptr<AutomationLine> > lines;
-
+
for (list<RegionView*>::const_iterator i = region_views.begin(); i != region_views.end(); ++i) {
AutomationRegionView* arv = dynamic_cast<AutomationRegionView*> (*i);
assert (arv);
return a->region()->position() < b->region()->position();
}
};
-
+
/** @param pos Position, in session frames.
* @return AutomationLine to paste to for that position, or 0 if there is none appropriate.