[Summary] Merging from git

[Details]
59e6694405
to
002dfbd0862cabce925056cee566ee0cd8a19134

[git-p4: depot-paths = "//Abdaw/dev_main/tracks/": change = 453713]
This commit is contained in:
Grygorii Zharun 2014-04-18 06:21:34 -05:00
parent ce2a519afa
commit 1f79aea284
12 changed files with 135 additions and 48 deletions

View file

@ -1423,18 +1423,25 @@ AudioRegionView::set_one_waveform_color (ArdourCanvas::WaveView* wave)
} }
} }
} }
#if 0 //Removed for Tracks
if (ARDOUR_UI::config()->get_color_regions_using_track_color()) {
//if (ARDOUR_UI::config()->get_color_regions_using_track_color()) { /* just use a slightly transparent version of the selected
* color so that some of the track color bleeds through
*/
// /* just use a slightly transparent version of the selected double r, g, b, a;
// * color so that some of the track color bleeds through ArdourCanvas::color_to_rgba (fill, r, g, b, a);
// */ fill = ArdourCanvas::rgba_to_color (r, g, b, 0.85); /* magic number, not user controllable */
outline = ARDOUR_UI::config()->get_canvasvar_WaveForm();
// double r, g, b, a; if (!Config->get_show_name_highlight()) {
// ArdourCanvas::color_to_rgba (fill, r, g, b, a); /* recolor name text because it needs to contrast with
// fill = ArdourCanvas::rgba_to_color (r, g, b, 0.85); /* magic number, not user controllable */ the waveform background, not the name highlight.
// outline = ARDOUR_UI::config()->get_canvasvar_WaveForm(); */
//} }
}
#endif
wave->set_fill_color (fill); wave->set_fill_color (fill);
wave->set_outline_color (outline); wave->set_outline_color (outline);

View file

@ -311,8 +311,11 @@ PluginSelector::refiller (const PluginInfoList& plugs, const::std::string& filte
string::size_type pos = 0; string::size_type pos = 0;
/* stupid LADSPA creator strings */ /* stupid LADSPA creator strings */
#ifdef PLATFORM_WINDOWS
while (pos < creator.length() && creator[pos] > -2 && creator[pos] < 256 && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
#else
while (pos < creator.length() && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos; while (pos < creator.length() && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
#endif
creator = creator.substr (0, pos); creator = creator.substr (0, pos);
newrow[plugin_columns.creator] = creator; newrow[plugin_columns.creator] = creator;
@ -681,7 +684,11 @@ PluginSelector::create_by_creator_menu (ARDOUR::PluginInfoList& all_plugs)
/* stupid LADSPA creator strings */ /* stupid LADSPA creator strings */
string::size_type pos = 0; string::size_type pos = 0;
#ifdef PLATFORM_WINDOWS
while (pos < creator.length() && creator[pos] > -2 && creator[pos] < 256 && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
#else
while (pos < creator.length() && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos; while (pos < creator.length() && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
#endif
creator = creator.substr (0, pos); creator = creator.substr (0, pos);
SubmenuMap::iterator x; SubmenuMap::iterator x;

View file

@ -227,7 +227,7 @@ PluginUIWindow::create_windows_vst_editor(boost::shared_ptr<PluginInsert>)
<< endmsg; << endmsg;
throw failed_constructor (); throw failed_constructor ();
} else { } else {
WindowsVSTPluginUI* vpu = new WindowsVSTPluginUI (insert, vp); WindowsVSTPluginUI* vpu = new WindowsVSTPluginUI (insert, vp, GTK_WIDGET(this->gobj()));
_pluginui = vpu; _pluginui = vpu;
_pluginui->KeyboardFocused.connect (sigc::mem_fun (*this, &PluginUIWindow::keyboard_focused)); _pluginui->KeyboardFocused.connect (sigc::mem_fun (*this, &PluginUIWindow::keyboard_focused));

View file

@ -1358,6 +1358,16 @@ RCOptionEditor::RCOptionEditor ()
Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(),
string_compose (_("<b>When enabled</b> %1 will stop recording if an over- or underrun is detected by the audio engine"), string_compose (_("<b>When enabled</b> %1 will stop recording if an over- or underrun is detected by the audio engine"),
PROGRAM_NAME)); PROGRAM_NAME));
tsf = new BoolOption (
"loop-is-mode",
_("Play loop is a transport mode"),
sigc::mem_fun (*_rc_config, &RCConfiguration::get_loop_is_mode),
sigc::mem_fun (*_rc_config, &RCConfiguration::set_loop_is_mode)
);
Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(),
(_("<b>When enabled</b> the loop button does not start playback but forces playback to always play the loop\n\n"
"<b>When disabled</b> the loop button starts playing the loop, but stop then cancels loop playback")));
add_option (_("Transport"), tsf); add_option (_("Transport"), tsf);
tsf = new BoolOption ( tsf = new BoolOption (

View file

@ -209,7 +209,11 @@ TimeAxisViewItem::init (ArdourCanvas::Group* parent, double fpp, Gdk::Color cons
CANVAS_DEBUG_NAME (frame, string_compose ("frame for %1", get_item_name())); CANVAS_DEBUG_NAME (frame, string_compose ("frame for %1", get_item_name()));
if (Config->get_show_name_highlight()) {
frame->set_outline_what (ArdourCanvas::Rectangle::What (ArdourCanvas::Rectangle::LEFT|ArdourCanvas::Rectangle::RIGHT)); frame->set_outline_what (ArdourCanvas::Rectangle::What (ArdourCanvas::Rectangle::LEFT|ArdourCanvas::Rectangle::RIGHT));
} else {
frame->set_outline_what (ArdourCanvas::Rectangle::What (ArdourCanvas::Rectangle::LEFT|ArdourCanvas::Rectangle::RIGHT|ArdourCanvas::Rectangle::BOTTOM));
}
if (_recregion) { if (_recregion) {
frame->set_outline_color (ARDOUR_UI::config()->get_canvasvar_RecordingRect()); frame->set_outline_color (ARDOUR_UI::config()->get_canvasvar_RecordingRect());
@ -217,8 +221,6 @@ TimeAxisViewItem::init (ArdourCanvas::Group* parent, double fpp, Gdk::Color cons
frame->set_outline_color (ARDOUR_UI::config()->get_canvasvar_TimeAxisFrame()); frame->set_outline_color (ARDOUR_UI::config()->get_canvasvar_TimeAxisFrame());
} }
frame->set_outline_what (ArdourCanvas::Rectangle::What (ArdourCanvas::Rectangle::RIGHT|ArdourCanvas::Rectangle::LEFT));
} else { } else {
frame = 0; frame = 0;

View file

@ -38,22 +38,18 @@ using namespace Gtk;
using namespace ARDOUR; using namespace ARDOUR;
using namespace PBD; using namespace PBD;
WindowsVSTPluginUI::WindowsVSTPluginUI (boost::shared_ptr<PluginInsert> pi, boost::shared_ptr<VSTPlugin> vp) WindowsVSTPluginUI::WindowsVSTPluginUI (boost::shared_ptr<PluginInsert> pi, boost::shared_ptr<VSTPlugin> vp, GtkWidget *parent)
: VSTPluginUI (pi, vp) : VSTPluginUI (pi, vp)
{ {
#ifdef GDK_WINDOWING_WIN32 #ifdef GDK_WINDOWING_WIN32
gtk_widget_realize(parent);
#if 0 // TODO verify window vs vbox-widget WRT to plugin_analysis_expander void* hWndHost = gdk_win32_drawable_get_handle(parent->window);
GtkWindow* wobj = GTK_WINDOW(gtk_widget_get_toplevel(this->gobj()));
#else
GtkVBox* wobj = this->gobj();
#endif
gtk_widget_realize(GTK_WIDGET(wobj));
void* hWndHost = gdk_win32_drawable_get_handle(GTK_WIDGET(wobj)->window);
fst_run_editor (_vst->state(), hWndHost); fst_run_editor (_vst->state(), hWndHost);
// TODO pack a placeholder (compare to VSTPluginUI::VSTPluginUI X11 socket)
// have placeholder use VSTPluginUI::get_preferred_height(), width()
// TODO pack plugin_analysis_expander at the bottom.
#else #else
fst_run_editor (_vst->state(), NULL); fst_run_editor (_vst->state(), NULL);
pack_start (plugin_analysis_expander, true, true); pack_start (plugin_analysis_expander, true, true);

View file

@ -22,7 +22,7 @@
class WindowsVSTPluginUI : public VSTPluginUI class WindowsVSTPluginUI : public VSTPluginUI
{ {
public: public:
WindowsVSTPluginUI (boost::shared_ptr<ARDOUR::PluginInsert>, boost::shared_ptr<ARDOUR::VSTPlugin>); WindowsVSTPluginUI (boost::shared_ptr<ARDOUR::PluginInsert>, boost::shared_ptr<ARDOUR::VSTPlugin>, GtkWidget *parent);
~WindowsVSTPluginUI (); ~WindowsVSTPluginUI ();
bool start_updating (GdkEventAny*) { return false; } bool start_updating (GdkEventAny*) { return false; }

View file

@ -135,6 +135,7 @@ CONFIG_VARIABLE (bool, stop_recording_on_xrun, "stop-recording-on-xrun", false)
CONFIG_VARIABLE (bool, create_xrun_marker, "create-xrun-marker", true) CONFIG_VARIABLE (bool, create_xrun_marker, "create-xrun-marker", true)
CONFIG_VARIABLE (bool, stop_at_session_end, "stop-at-session-end", false) CONFIG_VARIABLE (bool, stop_at_session_end, "stop-at-session-end", false)
CONFIG_VARIABLE (bool, seamless_loop, "seamless-loop", false) CONFIG_VARIABLE (bool, seamless_loop, "seamless-loop", false)
CONFIG_VARIABLE (bool, loop_is_mode, "loop-is-mode", false)
CONFIG_VARIABLE (framecnt_t, preroll, "preroll", 0) CONFIG_VARIABLE (framecnt_t, preroll, "preroll", 0)
CONFIG_VARIABLE (framecnt_t, postroll, "postroll", 0) CONFIG_VARIABLE (framecnt_t, postroll, "postroll", 0)
CONFIG_VARIABLE (float, rf_speed, "rf-speed", 2.0f) CONFIG_VARIABLE (float, rf_speed, "rf-speed", 2.0f)

View file

@ -1263,7 +1263,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
int start_midi_thread (); int start_midi_thread ();
void set_play_loop (bool yn); void set_play_loop (bool yn, double speed);
void unset_play_loop (); void unset_play_loop ();
void overwrite_some_buffers (Track *); void overwrite_some_buffers (Track *);
void flush_all_inserts (); void flush_all_inserts ();

View file

@ -1010,7 +1010,7 @@ Session::process_event (SessionEvent* ev)
switch (ev->type) { switch (ev->type) {
case SessionEvent::SetLoop: case SessionEvent::SetLoop:
set_play_loop (ev->yes_or_no); set_play_loop (ev->yes_or_no, ev->speed);
break; break;
case SessionEvent::AutoLoop: case SessionEvent::AutoLoop:

View file

@ -30,6 +30,7 @@
#include "pbd/enumwriter.h" #include "pbd/enumwriter.h"
#include "pbd/pthread_utils.h" #include "pbd/pthread_utils.h"
#include "pbd/memento_command.h" #include "pbd/memento_command.h"
#include "pbd/stacktrace.h"
#include "midi++/mmc.h" #include "midi++/mmc.h"
#include "midi++/port.h" #include "midi++/port.h"
@ -40,6 +41,7 @@
#include "ardour/click.h" #include "ardour/click.h"
#include "ardour/debug.h" #include "ardour/debug.h"
#include "ardour/location.h" #include "ardour/location.h"
#include "ardour/profile.h"
#include "ardour/session.h" #include "ardour/session.h"
#include "ardour/slave.h" #include "ardour/slave.h"
#include "ardour/operations.h" #include "ardour/operations.h"
@ -158,10 +160,11 @@ Session::force_locate (framepos_t target_frame, bool with_roll)
} }
void void
Session::request_play_loop (bool yn, bool leave_rolling) Session::request_play_loop (bool yn, bool change_transport_roll)
{ {
SessionEvent* ev; SessionEvent* ev;
Location *location = _locations->auto_loop_location(); Location *location = _locations->auto_loop_location();
double target_speed;
if (location == 0 && yn) { if (location == 0 && yn) {
error << _("Cannot loop - no loop range defined") error << _("Cannot loop - no loop range defined")
@ -169,16 +172,46 @@ Session::request_play_loop (bool yn, bool leave_rolling)
return; return;
} }
ev = new SessionEvent (SessionEvent::SetLoop, SessionEvent::Add, SessionEvent::Immediate, 0, (leave_rolling ? 1.0 : 0.0), yn); if (change_transport_roll) {
DEBUG_TRACE (DEBUG::Transport, string_compose ("Request set loop = %1, leave rolling ? %2\n", yn, leave_rolling)); if (transport_rolling()) {
/* start looping at current speed */
target_speed = transport_speed ();
} else {
/* currently stopped */
if (yn) {
/* start looping at normal speed */
target_speed = 1.0;
} else {
target_speed = 0.0;
}
}
} else {
/* leave the speed alone */
target_speed = transport_speed ();
}
ev = new SessionEvent (SessionEvent::SetLoop, SessionEvent::Add, SessionEvent::Immediate, 0, target_speed, yn);
DEBUG_TRACE (DEBUG::Transport, string_compose ("Request set loop = %1, change roll state ? %2\n", yn, change_transport_roll));
queue_event (ev); queue_event (ev);
if (!leave_rolling && !yn && Config->get_seamless_loop() && transport_rolling()) { if (yn) {
if (!change_transport_roll) {
if (!transport_rolling()) {
/* we're not changing transport state, but we do want
to set up position for the new loop. Don't
do this if we're rolling already.
*/
request_locate (location->start(), false);
}
}
} else {
if (!change_transport_roll && Config->get_seamless_loop() && transport_rolling()) {
// request an immediate locate to refresh the tracks // request an immediate locate to refresh the tracks
// after disabling looping // after disabling looping
request_locate (_transport_frame-1, false); request_locate (_transport_frame-1, false);
} }
} }
}
void void
Session::request_play_range (list<AudioRange>* range, bool leave_rolling) Session::request_play_range (list<AudioRange>* range, bool leave_rolling)
@ -531,8 +564,6 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
/* explicit return request pre-queued in event list. overrides everything else */ /* explicit return request pre-queued in event list. overrides everything else */
cerr << "explicit auto-return to " << _requested_return_frame << endl;
_transport_frame = _requested_return_frame; _transport_frame = _requested_return_frame;
do_locate = true; do_locate = true;
@ -589,9 +620,11 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
*/ */
if (ptw & PostTransportClearSubstate) { if (ptw & PostTransportClearSubstate) {
_play_range = false; unset_play_range ();
if (!Config->get_loop_is_mode()) {
unset_play_loop (); unset_play_loop ();
} }
}
/* this for() block can be put inside the previous if() and has the effect of ... ??? what */ /* this for() block can be put inside the previous if() and has the effect of ... ??? what */
@ -657,8 +690,10 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
} }
if (ptw & PostTransportStop) { if (ptw & PostTransportStop) {
_play_range = false; unset_play_range ();
play_loop = false; if (!Config->get_loop_is_mode()) {
unset_play_loop ();
}
} }
PositionChanged (_transport_frame); /* EMIT SIGNAL */ PositionChanged (_transport_frame); /* EMIT SIGNAL */
@ -723,7 +758,7 @@ Session::unset_play_loop ()
} }
void void
Session::set_play_loop (bool yn) Session::set_play_loop (bool yn, double speed)
{ {
/* Called from event-handling context */ /* Called from event-handling context */
@ -782,13 +817,25 @@ Session::set_play_loop (bool yn)
merge_event (new SessionEvent (SessionEvent::AutoLoopDeclick, SessionEvent::Replace, dcp, dcl, 0.0f)); merge_event (new SessionEvent (SessionEvent::AutoLoopDeclick, SessionEvent::Replace, dcp, dcl, 0.0f));
merge_event (new SessionEvent (SessionEvent::AutoLoop, SessionEvent::Replace, loc->end(), loc->start(), 0.0f)); merge_event (new SessionEvent (SessionEvent::AutoLoop, SessionEvent::Replace, loc->end(), loc->start(), 0.0f));
/* locate to start of loop and roll. /* if requested to roll, locate to start of loop and
* roll but ONLY if we're not already rolling.
args: positition, roll=true, flush=true, with_loop=false, force buffer refill if seamless looping args: positition, roll=true, flush=true, with_loop=false, force buffer refill if seamless looping
*/ */
if (Config->get_loop_is_mode()) {
/* loop IS a transport mode: if already
rolling, do not locate to loop start.
*/
if (!transport_rolling() && (speed != 0.0)) {
start_locate (loc->start(), true, true, false, Config->get_seamless_loop()); start_locate (loc->start(), true, true, false, Config->get_seamless_loop());
} }
} else {
if (speed != 0.0) {
start_locate (loc->start(), true, true, false, Config->get_seamless_loop());
}
}
}
} else { } else {
@ -983,7 +1030,9 @@ Session::locate (framepos_t target_frame, bool with_roll, bool with_flush, bool
// located outside the loop: cancel looping directly, this is called from event handling context // located outside the loop: cancel looping directly, this is called from event handling context
set_play_loop (false); if (!Config->get_loop_is_mode()) {
set_play_loop (false, _transport_speed);
}
} else if (_transport_frame == al->start()) { } else if (_transport_frame == al->start()) {
@ -1080,12 +1129,27 @@ Session::set_transport_speed (double speed, bool abort, bool clear_state, bool a
stop_transport (abort); stop_transport (abort);
} }
if (!Config->get_loop_is_mode()) {
unset_play_loop (); unset_play_loop ();
}
} else if (transport_stopped() && speed == 1.0) { } else if (transport_stopped() && speed == 1.0) {
/* we are stopped and we want to start rolling at speed 1 */ /* we are stopped and we want to start rolling at speed 1 */
if (Config->get_loop_is_mode() && play_loop) {
Location *location = _locations->auto_loop_location();
if (location != 0) {
if (_transport_frame != location->start()) {
/* jump to start and then roll from there */
request_locate (location->start(), true);
return;
}
}
}
if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) { if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
set_track_monitor_input_status (false); set_track_monitor_input_status (false);
} }

View file

@ -223,7 +223,7 @@ fst_new (void)
fst->n_pending_keys = 0; fst->n_pending_keys = 0;
fst->has_editor = 0; fst->has_editor = 0;
#ifdef PLATFORM_WINDOWS #ifdef PLATFORM_WINDOWS
fst->voffset = 36; fst->voffset = 50;
fst->hoffset = 0; fst->hoffset = 0;
#else /* linux + wine */ #else /* linux + wine */
fst->voffset = 24; fst->voffset = 24;
@ -465,7 +465,7 @@ fst_move_window_into_view (VSTState* fst)
{ {
if (fst->windows_window) { if (fst->windows_window) {
#ifdef PLATFORM_WINDOWS #ifdef PLATFORM_WINDOWS
SetWindowPos ((HWND)(fst->windows_window), 0, fst->hoffset, fst->voffset, fst->width, fst->height, 0); SetWindowPos ((HWND)(fst->windows_window), 0, fst->hoffset, fst->voffset, fst->width + fst->hoffset, fst->height + fst->voffset, 0);
#else /* linux + wine */ #else /* linux + wine */
SetWindowPos ((HWND)(fst->windows_window), 0, 0, 0, fst->width + fst->hoffset, fst->height + fst->voffset, 0); SetWindowPos ((HWND)(fst->windows_window), 0, 0, 0, fst->width + fst->hoffset, fst->height + fst->voffset, 0);
#endif #endif