summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/ardour-sae-ansi.bindings.in1
-rw-r--r--gtk2_ardour/ardour-sae.menus1
-rw-r--r--gtk2_ardour/editor.cc1
-rw-r--r--gtk2_ardour/editor.h8
-rw-r--r--gtk2_ardour/editor_actions.cc7
-rw-r--r--gtk2_ardour/editor_ops.cc49
-rw-r--r--gtk2_ardour/editor_region_list.cc6
-rw-r--r--gtk2_ardour/editor_route_list.cc19
-rw-r--r--gtk2_ardour/editor_selection.cc2
-rw-r--r--gtk2_ardour/plugin_selector.cc3
-rw-r--r--libs/ardour/ardour/audio_unit.h27
-rw-r--r--libs/ardour/ardour/session.h4
-rw-r--r--libs/ardour/audio_unit.cc59
-rw-r--r--libs/ardour/enums.cc1
-rw-r--r--libs/ardour/session_events.cc8
-rw-r--r--libs/ardour/session_state.cc1
-rw-r--r--libs/ardour/session_transport.cc34
-rw-r--r--libs/gtkmm2ext/gtkmm2ext/dndtreeview.h6
-rw-r--r--tools/osx_packaging/Info.plist.in2
-rwxr-xr-xtools/osx_packaging/osx_build6
20 files changed, 183 insertions, 62 deletions
diff --git a/gtk2_ardour/ardour-sae-ansi.bindings.in b/gtk2_ardour/ardour-sae-ansi.bindings.in
index 82f967c765..a8edaef378 100644
--- a/gtk2_ardour/ardour-sae-ansi.bindings.in
+++ b/gtk2_ardour/ardour-sae-ansi.bindings.in
@@ -341,4 +341,5 @@
(gtk_accel_path "<Actions>/Editor/toggle-zoom" "o")
(gtk_accel_path "<Actions>/Editor/zoom-to-region" "y")
(gtk_accel_path "<Actions>/Editor/pitch-shift-region" "F5")
+(gtk_accel_path "<Actions>/Editor/play-from-edit-point-and-return" "<%LEVEL4%>space")
diff --git a/gtk2_ardour/ardour-sae.menus b/gtk2_ardour/ardour-sae.menus
index 7a74beb00b..bf7f326784 100644
--- a/gtk2_ardour/ardour-sae.menus
+++ b/gtk2_ardour/ardour-sae.menus
@@ -30,6 +30,7 @@
</menu>
<menu name='Transport' action='Transport'>
<menuitem action='ToggleRoll'/>
+ <menuitem action='play-from-edit-point-and-return'/>
<menuitem action='record-roll'/>
<menuitem action='ToggleRollForgetCapture'/>
<menuitem action='Loop'/>
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index 6dc7ecde41..c850b835d7 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -3980,6 +3980,7 @@ Editor::swap_visual_state ()
set_zoom_focus (last_visual_state.zoom_focus);
reposition_and_zoom (last_visual_state.leftmost_frame, last_visual_state.frames_per_unit);
+ zoomed_to_region = false;
}
void
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index 71a8440ea3..faec9d19ec 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -999,6 +999,7 @@ class Editor : public PublicEditor
void play_from_start ();
void play_from_edit_point ();
+ void play_from_edit_point_and_return ();
void play_selected_region ();
void loop_selected_region ();
void play_location (ARDOUR::Location&);
@@ -1581,6 +1582,13 @@ class Editor : public PublicEditor
bool ignore_route_order_sync;
bool route_list_display_button_press (GdkEventButton*);
+ void route_list_display_drag_data_received (const Glib::RefPtr<Gdk::DragContext>& context,
+ gint x,
+ gint y,
+ const Gtk::SelectionData& data,
+ guint info,
+ guint time);
+
bool route_list_selection_filter (const Glib::RefPtr<Gtk::TreeModel>& model, const Gtk::TreeModel::Path& path, bool yn);
void route_list_change (const Gtk::TreeModel::Path&,const Gtk::TreeModel::iterator&);
diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc
index 35ea88a20f..a3c8679819 100644
--- a/gtk2_ardour/editor_actions.cc
+++ b/gtk2_ardour/editor_actions.cc
@@ -293,7 +293,12 @@ Editor::register_actions ()
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_action (editor_actions, "align-regions-sync-relative", _("Align Regions Sync Relative"), bind (mem_fun(*this, &Editor::align_relative), ARDOUR::SyncPoint));
ActionManager::session_sensitive_actions.push_back (act);
-
+
+ act = ActionManager::register_action (editor_actions, "play-from-edit-point", _("Play From Edit Point"), mem_fun(*this, &Editor::play_from_edit_point));
+ ActionManager::session_sensitive_actions.push_back (act);
+ act = ActionManager::register_action (editor_actions, "play-from-edit-point-and-return", _("Play from Edit Point & Return"), mem_fun(*this, &Editor::play_from_edit_point_and_return));
+ ActionManager::session_sensitive_actions.push_back (act);
+
act = ActionManager::register_action (editor_actions, "play-selected-regions", _("Play Selected Region(s)"), mem_fun(*this, &Editor::play_selected_region));
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_action (editor_actions, "brush-at-mouse", _("Brush at Mouse"), mem_fun(*this, &Editor::kbd_brush));
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc
index f3a493e195..dc170e938f 100644
--- a/gtk2_ardour/editor_ops.cc
+++ b/gtk2_ardour/editor_ops.cc
@@ -2119,6 +2119,32 @@ Editor::play_from_edit_point ()
}
void
+Editor::play_from_edit_point_and_return ()
+{
+ nframes64_t start_frame;
+ nframes64_t return_frame;
+
+ if (session->transport_rolling()) {
+ session->request_stop ();
+ return;
+ }
+
+ switch (_edit_point) {
+ case EditAtPlayhead:
+ session->request_transport_speed (1.0f);
+ break;
+
+ default:
+ return_frame = session->transport_frame();
+ start_frame = get_preferred_edit_position ();
+ if (start_frame >= 0) {
+ session->request_roll_at_and_return (start_frame, return_frame);
+ }
+ break;
+ }
+}
+
+void
Editor::play_selection ()
{
if (selection->time.empty()) {
@@ -4193,31 +4219,38 @@ Editor::toggle_fade_active (bool in)
}
const char* cmd = (in ? _("toggle fade in active") : _("toggle fade out active"));
+ bool have_switch = false;
+ bool yn;
+ bool in_command = false;
begin_reversible_command (cmd);
for (RegionSelection::iterator x = selection->regions.begin(); x != selection->regions.end(); ++x) {
AudioRegionView* tmp = dynamic_cast<AudioRegionView*> (*x);
-
+
if (!tmp) {
return;
}
boost::shared_ptr<AudioRegion> region (tmp->audio_region());
- XMLNode &before = region->get_state();
-
- if (in) {
- region->set_fade_in_active (!region->fade_in_active());
- } else {
- region->set_fade_out_active (!region->fade_out_active());
+ /* make the behaviour consistent across all regions */
+
+ if (!have_switch) {
+ yn = region->fade_in_active();
+ have_switch = true;
}
+ XMLNode &before = region->get_state();
+ region->set_fade_in_active (!yn);
XMLNode &after = region->get_state();
session->add_command(new MementoCommand<AudioRegion>(*region.get(), &before, &after));
+ in_command = true;
}
- commit_reversible_command ();
+ if (in_command) {
+ commit_reversible_command ();
+ }
}
void
diff --git a/gtk2_ardour/editor_region_list.cc b/gtk2_ardour/editor_region_list.cc
index 1678b3961f..6f54165900 100644
--- a/gtk2_ardour/editor_region_list.cc
+++ b/gtk2_ardour/editor_region_list.cc
@@ -611,7 +611,11 @@ Editor::region_list_display_drag_data_received (const RefPtr<Gdk::DragContext>&
{
vector<ustring> paths;
- cerr << "ERLD:dddr target = " << data.get_target() << endl;
+ if (data.get_target() == "GTK_TREE_MODEL_ROW") {
+ cerr << "Delete drag data drop to treeview\n";
+ region_list_display.on_drag_data_received (context, x, y, data, info, time);
+ return;
+ }
if (convert_drop_to_paths (paths, context, x, y, data, info, time) == 0) {
nframes64_t pos = 0;
diff --git a/gtk2_ardour/editor_route_list.cc b/gtk2_ardour/editor_route_list.cc
index 86e516d17c..ff9d55f3f8 100644
--- a/gtk2_ardour/editor_route_list.cc
+++ b/gtk2_ardour/editor_route_list.cc
@@ -38,6 +38,7 @@ using namespace sigc;
using namespace ARDOUR;
using namespace PBD;
using namespace Gtk;
+using namespace Glib;
void
Editor::handle_new_route (Session::RouteList& routes)
@@ -546,3 +547,21 @@ Editor::route_list_delete (const Gtk::TreeModel::Path& path)
session->set_remote_control_ids();
redisplay_route_list ();
}
+
+
+void
+Editor::route_list_display_drag_data_received (const RefPtr<Gdk::DragContext>& context,
+ int x, int y,
+ const SelectionData& data,
+ guint info, guint time)
+{
+ cerr << "RouteLD::dddr target = " << data.get_target() << endl;
+
+ if (data.get_target() == "GTK_TREE_MODEL_ROW") {
+ cerr << "Delete drag data drop to treeview\n";
+ route_list_display.on_drag_data_received (context, x, y, data, info, time);
+ return;
+ }
+ cerr << "some other kind of drag\n";
+ context->drag_finish (true, false, time);
+}
diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc
index d31bbd2340..29d7a8a6bb 100644
--- a/gtk2_ardour/editor_selection.cc
+++ b/gtk2_ardour/editor_selection.cc
@@ -675,6 +675,8 @@ Editor::region_selection_changed ()
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
(*i)->set_selected_regionviews (selection->regions);
}
+
+ zoomed_to_region = false;
}
void
diff --git a/gtk2_ardour/plugin_selector.cc b/gtk2_ardour/plugin_selector.cc
index c48a5b775e..cd597af8e4 100644
--- a/gtk2_ardour/plugin_selector.cc
+++ b/gtk2_ardour/plugin_selector.cc
@@ -379,7 +379,8 @@ PluginSelector::run ()
switch (r) {
case RESPONSE_APPLY:
for (i = amodel->children().begin(); i != amodel->children().end(); ++i) {
- use_plugin ((*i)[acols.plugin]);
+ PluginInfoPtr pp = (*i)[acols.plugin];
+ use_plugin (pp);
}
break;
diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h
index 7f51d39738..68498f9074 100644
--- a/libs/ardour/ardour/audio_unit.h
+++ b/libs/ardour/ardour/audio_unit.h
@@ -22,6 +22,7 @@
#define __ardour_audio_unit_h__
#include <stdint.h>
+#include <boost/shared_ptr.hpp>
#include <list>
#include <set>
@@ -47,7 +48,7 @@ class Session;
class AUPlugin : public ARDOUR::Plugin
{
public:
- AUPlugin (AudioEngine& engine, Session& session, CAComponent* comp);
+ AUPlugin (AudioEngine& engine, Session& session, boost::shared_ptr<CAComponent> comp);
virtual ~AUPlugin ();
std::string unique_id () const;
@@ -92,20 +93,21 @@ class AUPlugin : public ARDOUR::Plugin
uint32_t output_streams() const;
uint32_t input_streams() const;
- CAAudioUnit* get_au () { return unit; }
- CAComponent* get_comp () { return comp; }
+ boost::shared_ptr<CAAudioUnit> get_au () { return unit; }
+ boost::shared_ptr<CAComponent> get_comp () { return comp; }
- OSStatus render_callback(AudioUnitRenderActionFlags *ioActionFlags,
- const AudioTimeStamp *inTimeStamp,
- UInt32 inBusNumber,
- UInt32 inNumberFrames,
- AudioBufferList* ioData);
+ OSStatus render_callback(AudioUnitRenderActionFlags *ioActionFlags,
+ const AudioTimeStamp *inTimeStamp,
+ UInt32 inBusNumber,
+ UInt32 inNumberFrames,
+ AudioBufferList* ioData);
private:
- CAComponent* comp;
- CAAudioUnit* unit;
+ boost::shared_ptr<CAComponent> comp;
+ boost::shared_ptr<CAAudioUnit> unit;
AudioStreamBasicDescription streamFormat;
bool initialized;
+ int format_set;
AudioBufferList* buffers;
UInt32 global_elements;
@@ -129,7 +131,7 @@ typedef boost::shared_ptr<AUPlugin> AUPluginPtr;
class AUPluginInfo : public PluginInfo {
public:
- AUPluginInfo (CAComponentDescription*);
+ AUPluginInfo (boost::shared_ptr<CAComponentDescription>);
~AUPluginInfo ();
PluginPtr load (Session& session);
@@ -139,7 +141,8 @@ class AUPluginInfo : public PluginInfo {
static std::string stringify_descriptor (const CAComponentDescription&);
private:
- CAComponentDescription* descriptor;
+ boost::shared_ptr<CAComponentDescription> descriptor;
+
static void discover_music (PluginInfoList&);
static void discover_fx (PluginInfoList&);
static void discover_by_description (PluginInfoList&, CAComponentDescription&);
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index 102db331ac..7318303d33 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -125,6 +125,7 @@ class Session : public PBD::StatefulDestructible
SetDiskstreamSpeed,
Locate,
LocateRoll,
+ LocateRollLocate,
SetLoop,
PunchIn,
PunchOut,
@@ -347,7 +348,7 @@ class Session : public PBD::StatefulDestructible
sigc::signal<void,RouteList&> RouteAdded;
- void request_roll ();
+ void request_roll_at_and_return (nframes_t start, nframes_t return_to);
void request_bounded_roll (nframes_t start, nframes_t end);
void request_stop (bool abort = false);
void request_locate (nframes_t frame, bool with_roll = false);
@@ -985,6 +986,7 @@ class Session : public PBD::StatefulDestructible
nframes_t _last_slave_transport_frame;
nframes_t maximum_output_latency;
nframes_t last_stop_frame;
+ nframes64_t requested_return_frame;
vector<Sample *> _passthru_buffers;
vector<Sample *> _silent_buffers;
vector<Sample *> _send_buffers;
diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc
index 502ce2c080..c8dae0406a 100644
--- a/libs/ardour/audio_unit.cc
+++ b/libs/ardour/audio_unit.cc
@@ -53,7 +53,7 @@ _render_callback(void *userData,
return ((AUPlugin*)userData)->render_callback (ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData);
}
-AUPlugin::AUPlugin (AudioEngine& engine, Session& session, CAComponent* _comp)
+AUPlugin::AUPlugin (AudioEngine& engine, Session& session, boost::shared_ptr<CAComponent> _comp)
:
Plugin (engine, session),
comp (_comp),
@@ -65,12 +65,10 @@ AUPlugin::AUPlugin (AudioEngine& engine, Session& session, CAComponent* _comp)
current_buffers (0),
frames_processed (0)
{
- OSErr err = CAAudioUnit::Open (*comp, *unit);
+ OSErr err = CAAudioUnit::Open (*(comp.get()), *unit);
if (err != noErr) {
error << _("AudioUnit: Could not convert CAComponent to CAAudioUnit") << endmsg;
- delete unit;
- delete comp;
throw failed_constructor ();
}
@@ -82,8 +80,6 @@ AUPlugin::AUPlugin (AudioEngine& engine, Session& session, CAComponent* _comp)
if ((err = unit->SetProperty (kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input,
0, (void*) &renderCallbackInfo, sizeof(renderCallbackInfo))) != 0) {
cerr << "cannot install render callback (err = " << err << ')' << endl;
- delete unit;
- delete comp;
throw failed_constructor();
}
@@ -104,10 +100,10 @@ AUPlugin::AUPlugin (AudioEngine& engine, Session& session, CAComponent* _comp)
streamFormat.mBytesPerFrame = 4;
streamFormat.mChannelsPerFrame = 1;
+ format_set = 0;
+
if (_set_block_size (_session.get_block_size())) {
error << _("AUPlugin: cannot set processing block size") << endmsg;
- delete unit;
- delete comp;
throw failed_constructor();
}
}
@@ -116,16 +112,11 @@ AUPlugin::~AUPlugin ()
{
if (unit) {
unit->Uninitialize ();
- delete unit;
}
if (buffers) {
free (buffers);
}
-
- if (comp) {
- delete comp;
- }
}
string
@@ -224,9 +215,6 @@ AUPlugin::_set_block_size (nframes_t nframes)
unit->Uninitialize ();
}
- set_input_format ();
- set_output_format ();
-
if ((err = unit->SetProperty (kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global,
0, &numFrames, sizeof (numFrames))) != noErr) {
cerr << "cannot set max frames (err = " << err << ')' << endl;
@@ -242,10 +230,13 @@ AUPlugin::_set_block_size (nframes_t nframes)
int32_t
AUPlugin::can_support_input_configuration (int32_t in)
-{
- streamFormat.mBytesPerPacket = 4 * in;
- streamFormat.mBytesPerFrame = 4 * in;
+{
streamFormat.mChannelsPerFrame = in;
+ /* apple says that for non-interleaved data, these
+ values always refer to a single channel.
+ */
+ streamFormat.mBytesPerPacket = 4;
+ streamFormat.mBytesPerFrame = 4;
if (set_input_format () == 0) {
return 1;
@@ -273,12 +264,18 @@ AUPlugin::set_stream_format (int scope, uint32_t cnt)
for (uint32_t i = 0; i < cnt; ++i) {
if ((result = unit->SetFormat (scope, i, streamFormat)) != 0) {
- error << string_compose (_("AUPlugin: could not set stream format for %1/%2"),
- (scope == kAudioUnitScope_Input ? "input" : "output"), i) << endmsg;
+ error << string_compose (_("AUPlugin: could not set stream format for %1/%2 (err = %3)"),
+ (scope == kAudioUnitScope_Input ? "input" : "output"), i, result) << endmsg;
return -1;
}
}
+ if (scope == kAudioUnitScope_Input) {
+ format_set |= 0x1;
+ } else {
+ format_set |= 0x2;
+ }
+
return 0;
}
@@ -311,8 +308,8 @@ AUPlugin::compute_output_streams (int32_t nplugins)
uint32_t
AUPlugin::output_streams() const
{
- if (!initialized) {
- warning << _("AUPlugin: output_streams() called without calling Initialize!") << endmsg;
+ if (!(format_set & 0x2)) {
+ warning << _("AUPlugin: output_streams() called without any format set!") << endmsg;
return 1;
}
return streamFormat.mChannelsPerFrame;
@@ -322,8 +319,8 @@ AUPlugin::output_streams() const
uint32_t
AUPlugin::input_streams() const
{
- if (!initialized) {
- warning << _("AUPlugin: input_streams() called without calling Initialize!") << endmsg;
+ if (!(format_set & 0x1)) {
+ warning << _("AUPlugin: input_streams() called without any format set!") << endmsg;
return 1;
}
return streamFormat.mChannelsPerFrame;
@@ -478,7 +475,7 @@ AUPlugin::has_editor () const
return true;
}
-AUPluginInfo::AUPluginInfo (CAComponentDescription* d)
+AUPluginInfo::AUPluginInfo (boost::shared_ptr<CAComponentDescription> d)
: descriptor (d)
{
@@ -486,9 +483,6 @@ AUPluginInfo::AUPluginInfo (CAComponentDescription* d)
AUPluginInfo::~AUPluginInfo ()
{
- if (descriptor) {
- delete descriptor;
- }
}
PluginPtr
@@ -497,7 +491,7 @@ AUPluginInfo::load (Session& session)
try {
PluginPtr plugin;
- CAComponent* comp = new CAComponent(*descriptor);
+ boost::shared_ptr<CAComponent> comp (new CAComponent(*descriptor));
if (!comp->IsValid()) {
error << ("AudioUnit: not a valid Component") << endmsg;
@@ -505,7 +499,7 @@ AUPluginInfo::load (Session& session)
plugin.reset (new AUPlugin (session.engine(), session, comp));
}
- plugin->set_info(PluginInfoPtr(new AUPluginInfo(*this)));
+ plugin->set_info (PluginInfoPtr (new AUPluginInfo (*this)));
return plugin;
}
@@ -562,7 +556,8 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip
CAComponentDescription temp;
GetComponentInfo (comp, &temp, NULL, NULL, NULL);
- AUPluginInfoPtr info (new AUPluginInfo (new CAComponentDescription(temp)));
+ AUPluginInfoPtr info (new AUPluginInfo
+ (boost::shared_ptr<CAComponentDescription> (new CAComponentDescription(temp))));
/* no panners, format converters or i/o AU's for our purposes
*/
diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc
index 2f119918cc..17dff0bda6 100644
--- a/libs/ardour/enums.cc
+++ b/libs/ardour/enums.cc
@@ -231,6 +231,7 @@ setup_enum_writer ()
REGISTER_CLASS_ENUM (Session::Event, SetDiskstreamSpeed);
REGISTER_CLASS_ENUM (Session::Event, Locate);
REGISTER_CLASS_ENUM (Session::Event, LocateRoll);
+ REGISTER_CLASS_ENUM (Session::Event, LocateRollLocate);
REGISTER_CLASS_ENUM (Session::Event, SetLoop);
REGISTER_CLASS_ENUM (Session::Event, PunchIn);
REGISTER_CLASS_ENUM (Session::Event, PunchOut);
diff --git a/libs/ardour/session_events.cc b/libs/ardour/session_events.cc
index d736784396..a0c556b516 100644
--- a/libs/ardour/session_events.cc
+++ b/libs/ardour/session_events.cc
@@ -41,6 +41,7 @@ static const char* event_names[] = {
"SetDiskstreamSpeed",
"Locate",
"LocateRoll",
+ "LocateRollLocate",
"SetLoop",
"PunchIn",
"PunchOut",
@@ -347,6 +348,13 @@ Session::process_event (Event* ev)
}
break;
+ case Event::LocateRollLocate:
+ // locate is handled by ::request_roll_at_and_return()
+ requested_return_frame = ev->target_frame;
+ set_transport_speed (ev->speed, true);
+ break;
+
+
case Event::SetTransportSpeed:
set_transport_speed (ev->speed, ev->yes_or_no);
break;
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc
index 10c813a18d..76e6d6196e 100644
--- a/libs/ardour/session_state.cc
+++ b/libs/ardour/session_state.cc
@@ -138,6 +138,7 @@ Session::first_stage_init (string fullpath, string snapshot_name)
transport_sub_state = 0;
_transport_frame = 0;
last_stop_frame = 0;
+ requested_return_frame = -1;
end_location = new Location (0, 0, _("end"), Location::Flags ((Location::IsMark|Location::IsEnd)));
start_location = new Location (0, 0, _("start"), Location::Flags ((Location::IsMark|Location::IsStart)));
_end_location_is_free = true;
diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc
index c5cbae11c9..c01f6ed063 100644
--- a/libs/ardour/session_transport.cc
+++ b/libs/ardour/session_transport.cc
@@ -371,17 +371,35 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
update_latency_compensation (true, abort);
}
- if ((Config->get_slave_source() == None && Config->get_auto_return()) || (post_transport_work & PostTransportLocate) || synced_to_jack()) {
+ if ((Config->get_slave_source() == None && Config->get_auto_return()) ||
+ (post_transport_work & PostTransportLocate) ||
+ (requested_return_frame >= 0) ||
+ synced_to_jack()) {
if (pending_locate_flush) {
flush_all_redirects ();
}
- if (((Config->get_slave_source() == None && Config->get_auto_return()) || synced_to_jack()) && !(post_transport_work & PostTransportLocate)) {
+ if (((Config->get_slave_source() == None && Config->get_auto_return()) ||
+ synced_to_jack() ||
+ requested_return_frame >= 0) &&
+ !(post_transport_work & PostTransportLocate)) {
- _transport_frame = last_stop_frame;
+ bool do_locate = false;
+
+ if (requested_return_frame >= 0) {
+ _transport_frame = requested_return_frame;
+ requested_return_frame = -1;
+ do_locate = true;
+ } else {
+ _transport_frame = last_stop_frame;
+ }
if (synced_to_jack() && !play_loop) {
+ do_locate = true;
+ }
+
+ if (do_locate) {
// cerr << "non-realtimestop: transport locate to " << _transport_frame << endl;
_engine.transport_locate (_transport_frame);
}
@@ -1165,6 +1183,16 @@ Session::setup_auto_play ()
}
void
+Session::request_roll_at_and_return (nframes_t start, nframes_t return_to)
+{
+ request_stop ();
+ request_locate (start, false);
+
+ Event *ev = new Event (Event::LocateRollLocate, Event::Add, Event::Immediate, return_to, 1.0);
+ queue_event (ev);
+}
+
+void
Session::request_bounded_roll (nframes_t start, nframes_t end)
{
request_stop ();
diff --git a/libs/gtkmm2ext/gtkmm2ext/dndtreeview.h b/libs/gtkmm2ext/gtkmm2ext/dndtreeview.h
index fbc5ea90ef..0bdfe081b2 100644
--- a/libs/gtkmm2ext/gtkmm2ext/dndtreeview.h
+++ b/libs/gtkmm2ext/gtkmm2ext/dndtreeview.h
@@ -93,15 +93,18 @@ class DnDTreeView : public DnDTreeViewBase
*/
suggested_action = Gdk::DragAction (0);
TreeView::on_drag_data_received (context, x, y, selection_data, info, time);
+ std::cerr << "DDR, suggested action\n";
return;
}
if (selection_data.get_target() == "GTK_TREE_MODEL_ROW") {
TreeView::on_drag_data_received (context, x, y, selection_data, info, time);
-
+ std::cerr << "\n\nREGULAR TREEVIEW DRAG HAS DROPPED HERE @ " << x << '.' << y << std::endl;
+
} else if (data_column >= 0) {
+ std::cerr << "DDR, data/object drop\n";
/* object D-n-D */
const void* data = selection_data.get_data();
@@ -112,6 +115,7 @@ class DnDTreeView : public DnDTreeViewBase
}
} else {
+ std::cerr << "DDR, unknown drop\n";
/* some kind of target type added by the app, which will be handled by a signal handler */
}
}
diff --git a/tools/osx_packaging/Info.plist.in b/tools/osx_packaging/Info.plist.in
index a0cfb76155..7038de6938 100644
--- a/tools/osx_packaging/Info.plist.in
+++ b/tools/osx_packaging/Info.plist.in
@@ -23,7 +23,7 @@
<key>CFBundleExecutable</key>
<string>Ardour2</string>
<key>CFBundleGetInfoString</key>
- <string>Ardour @VERSION@ Copyright 2007 Paul Davis</string>
+ <string>@INFOSTRING@</string>
<key>CFBundleIconFile</key>
<string>appIcon.icns</string>
<key>CFBundleIdentifier</key>
diff --git a/tools/osx_packaging/osx_build b/tools/osx_packaging/osx_build
index 19ff79fef7..fdd7aaac3e 100755
--- a/tools/osx_packaging/osx_build
+++ b/tools/osx_packaging/osx_build
@@ -23,6 +23,8 @@ done
version=`grep -m 1 '^ardour_version' ../../SConstruct | cut -d' ' -f 3 | sed "s/'//g"`
echo "Version is $version"
+info_string="$version built on `hostname` by `whoami` on `date`"
+echo "Info string is $info_string"
# setup directory structure
@@ -79,7 +81,9 @@ fi
env="<key>LSEnvironment</key><dict><key>ARDOUR_BUNDLED</key><string>true</string>$env</dict>"
# edit plist
-sed -e "s?@ENV@?$env?g" -e "s?@VERSION@?$version?g" < Info.plist.in > Info.plist
+sed -e "s?@ENV@?$env?g" \
+ -e "s?@VERSION@?$version?g" \
+ -e "s?@INFOSTRING@?$info_string?g" < Info.plist.in > Info.plist
# copy static files