#include "ardour/event_type_map.h"
#include "ardour/pannable.h"
#include "ardour/panner.h"
+#include "ardour/plugin_insert.h"
#include "ardour/processor.h"
#include "ardour/profile.h"
#include "ardour/route_group.h"
#include "item_counts.h"
#include "keyboard.h"
#include "paste_context.h"
+#include "patch_change_widget.h"
#include "playlist_selector.h"
#include "point_selection.h"
#include "public_editor.h"
items.back().set_sensitive (_editor.get_selection().tracks.size() <= 1);
}
+ if (!is_midi_track () && _route->the_instrument ()) {
+ /* MIDI Bus */
+ items.push_back (MenuElem (_("Patch Selector..."),
+ sigc::mem_fun(*this, &RouteUI::select_midi_patch)));
+ items.push_back (SeparatorElem());
+ }
+
route_group_menu->detach ();
WeakRouteList r;
}
void
-RouteTimeAxisView::show_timestretch (framepos_t start, framepos_t end, int layers, int layer)
+RouteTimeAxisView::show_timestretch (samplepos_t start, samplepos_t end, int layers, int layer)
{
TimeAxisView::show_timestretch (start, end, layers, layer);
void
RouteTimeAxisView::set_samples_per_pixel (double fpp)
{
- double speed = 1.0;
-
- if (track()) {
- speed = track()->speed();
- }
-
if (_view) {
- _view->set_samples_per_pixel (fpp * speed);
+ _view->set_samples_per_pixel (fpp);
}
- StripableTimeAxisView::set_samples_per_pixel (fpp * speed);
+ StripableTimeAxisView::set_samples_per_pixel (fpp);
}
void
if (copy) {
tr->use_copy_playlist ();
} else {
- tr->use_new_playlist ();
+ tr->use_default_new_playlist ();
}
tr->playlist()->set_name (name);
}
* @param results List to add things to.
*/
void
-RouteTimeAxisView::get_selectables (framepos_t start, framepos_t end, double top, double bot, list<Selectable*>& results, bool within)
+RouteTimeAxisView::get_selectables (samplepos_t start, samplepos_t end, double top, double bot, list<Selectable*>& results, bool within)
{
- double speed = 1.0;
-
- if (track() != 0) {
- speed = track()->speed();
- }
-
- framepos_t const start_adjusted = session_frame_to_track_frame(start, speed);
- framepos_t const end_adjusted = session_frame_to_track_frame(end, speed);
-
if ((_view && ((top < 0.0 && bot < 0.0))) || touched (top, bot)) {
- _view->get_selectables (start_adjusted, end_adjusted, top, bot, results, within);
+ _view->get_selectables (start, end, top, bot, results, within);
}
/* pick up visible automation tracks */
- StripableTimeAxisView::get_selectables (start_adjusted, end_adjusted, top, bot, results, within);
+ for (Children::iterator i = children.begin(); i != children.end(); ++i) {
+ if (!(*i)->hidden()) {
+ (*i)->get_selectables (start, end, top, bot, results, within);
+ }
+ }
}
void
}
boost::shared_ptr<Region>
-RouteTimeAxisView::find_next_region (framepos_t pos, RegionPoint point, int32_t dir)
+RouteTimeAxisView::find_next_region (samplepos_t pos, RegionPoint point, int32_t dir)
{
boost::shared_ptr<Playlist> pl = playlist ();
return boost::shared_ptr<Region> ();
}
-framepos_t
-RouteTimeAxisView::find_next_region_boundary (framepos_t pos, int32_t dir)
+samplepos_t
+RouteTimeAxisView::find_next_region_boundary (samplepos_t pos, int32_t dir)
{
boost::shared_ptr<Playlist> pl = playlist ();
playlist = tr->playlist();
TimeSelection time (selection);
- float const speed = tr->speed();
- if (speed != 1.0f) {
- for (TimeSelection::iterator i = time.begin(); i != time.end(); ++i) {
- (*i).start = session_frame_to_track_frame((*i).start, speed);
- (*i).end = session_frame_to_track_frame((*i).end, speed);
- }
- }
playlist->clear_changes ();
playlist->clear_owned_changes ();
playlist = tr->playlist();
TimeSelection time (selection.time);
- float const speed = tr->speed();
- if (speed != 1.0f) {
- for (TimeSelection::iterator i = time.begin(); i != time.end(); ++i) {
- (*i).start = session_frame_to_track_frame((*i).start, speed);
- (*i).end = session_frame_to_track_frame((*i).end, speed);
- }
- }
playlist->clear_changes ();
playlist->clear_owned_changes ();
}
bool
-RouteTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx, const int32_t sub_num)
+RouteTimeAxisView::paste (samplepos_t pos, const Selection& selection, PasteContext& ctx, const int32_t sub_num)
{
if (!is_track()) {
return false;
DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("paste to %1\n", pos));
- if (track()->speed() != 1.0f) {
- pos = session_frame_to_track_frame (pos, track()->speed());
- DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("modified paste to %1\n", pos));
- }
-
/* add multi-paste offset if applicable */
- std::pair<framepos_t, framepos_t> extent = (*p)->get_extent();
- const framecnt_t duration = extent.second - extent.first;
+ std::pair<samplepos_t, samplepos_t> extent = (*p)->get_extent();
+ const samplecnt_t duration = extent.second - extent.first;
pos += _editor.get_paste_offset(pos, ctx.count, duration);
pl->clear_changes ();
pl->clear_owned_changes ();
if (Config->get_edit_mode() == Ripple) {
- std::pair<framepos_t, framepos_t> extent = (*p)->get_extent_with_endspace();
- framecnt_t amount = extent.second - extent.first;
+ std::pair<samplepos_t, samplepos_t> extent = (*p)->get_extent_with_endspace();
+ samplecnt_t amount = extent.second - extent.first;
pl->ripple(pos, amount * ctx.times, boost::shared_ptr<Region>());
}
pl->paste (*p, pos, ctx.times, sub_num);
return;
}
- track()->use_playlist (pl);
+ track()->use_playlist (track()->data_type(), pl);
RouteGroup* rg = route_group();
boost::shared_ptr<Playlist> ipl = session()->playlists->by_name(playlist_name);
if (!ipl) {
// No playlist for this track for this take yet, make it
- track->use_new_playlist();
+ track->use_default_new_playlist();
track->playlist()->set_name(playlist_name);
} else {
- track->use_playlist(ipl);
+ track->use_playlist(track->data_type(), ipl);
}
}
}
}
}
+void
+RouteTimeAxisView::reread_midnam ()
+{
+ boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (_route->the_instrument ());
+ assert (pi);
+ bool rv = pi->plugin ()->read_midnam();
+
+ if (rv && patch_change_dialog ()) {
+ patch_change_dialog ()->refresh ();
+ }
+}
+
+void
+RouteTimeAxisView::drop_instrument_ref ()
+{
+ midnam_connection.drop_connections ();
+}
+
void
RouteTimeAxisView::processors_changed (RouteProcessorChange c)
{
+ if (_route) {
+ boost::shared_ptr<Processor> the_instrument (_route->the_instrument());
+ boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (the_instrument);
+ if (pi && pi->plugin ()->has_midnam ()) {
+ midnam_connection.drop_connections ();
+ the_instrument->DropReferences.connect (midnam_connection, invalidator (*this),
+ boost::bind (&RouteTimeAxisView::drop_instrument_ref, this),
+ gui_context());
+ pi->plugin()->UpdateMidnam.connect (midnam_connection, invalidator (*this),
+ boost::bind (&RouteTimeAxisView::reread_midnam, this),
+ gui_context());
+
+ reread_midnam ();
+ }
+ }
+
if (c.type == RouteProcessorChange::MeterPointChange) {
/* nothing to do if only the meter point has changed */
return;