merge 2.0-ongoing into 3.0 @ 3581 - 3710

git-svn-id: svn://localhost/ardour2/branches/3.0@3712 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2008-09-10 21:27:39 +00:00
parent 68e943265e
commit c86210a9d5
51 changed files with 1230 additions and 713 deletions

View file

@ -54,7 +54,7 @@ opts.AddOptions(
BoolOption('UNIVERSAL', 'Compile as universal binary. Requires that external libraries are already universal.', 0), BoolOption('UNIVERSAL', 'Compile as universal binary. Requires that external libraries are already universal.', 0),
BoolOption('VERSIONED', 'Add revision information to ardour/gtk executable name inside the build directory', 0), BoolOption('VERSIONED', 'Add revision information to ardour/gtk executable name inside the build directory', 0),
BoolOption('VST', 'Compile with support for VST', 0), BoolOption('VST', 'Compile with support for VST', 0),
BoolOption('LV2', 'Compile with support for LV2 (if slv2 is available)', 0), BoolOption('LV2', 'Compile with support for LV2 (if slv2 is available)', 1),
BoolOption('GPROFILE', 'Compile with support for gprofile (Developers only)', 0), BoolOption('GPROFILE', 'Compile with support for gprofile (Developers only)', 0),
BoolOption('FREEDESKTOP', 'Install MIME type, icons and .desktop file as per the freedesktop.org spec (requires xdg-utils and shared-mime-info). "scons uninstall" removes associations in desktop database', 0), BoolOption('FREEDESKTOP', 'Install MIME type, icons and .desktop file as per the freedesktop.org spec (requires xdg-utils and shared-mime-info). "scons uninstall" removes associations in desktop database', 0),
BoolOption('TRANZPORT', 'Compile with support for Frontier Designs (if libusb is available)', 1), BoolOption('TRANZPORT', 'Compile with support for Frontier Designs (if libusb is available)', 1),
@ -565,17 +565,14 @@ else:
print 'FREESOUND support is not enabled. Build with \'scons FREESOUND=1\' to enable.' print 'FREESOUND support is not enabled. Build with \'scons FREESOUND=1\' to enable.'
if env['LV2']: if env['LV2']:
conf = env.Configure(custom_tests = { 'CheckPKGExists' : CheckPKGExists }) conf = env.Configure(custom_tests = { 'CheckPKGVersion' : CheckPKGVersion})
if conf.CheckPKGExists ('slv2'): if conf.CheckPKGVersion('slv2', '0.6.0'):
libraries['slv2'] = LibraryInfo() libraries['slv2'] = LibraryInfo()
libraries['slv2'].ParseConfig('pkg-config --cflags --libs slv2') libraries['slv2'].ParseConfig('pkg-config --cflags --libs slv2')
env.Append (CCFLAGS="-DHAVE_LV2") env.Append (CCFLAGS="-DHAVE_LV2")
else: else:
print 'Building Ardour with LV2 support requires SLV2 >= 0.6.0' print 'LV2 support is not enabled (SLV2 not found or older than 0.6.0)'
print 'WARNING: SLV2 not found, or too old. Ardour will be built without LV2 support.'
print 'Until the 2.4 release, Ardour requires SLV2 out of SVN.'
print 'Testing would be very much appreciated! svn co http://svn.drobilla.net/lad/slv2'
env['LV2'] = 0 env['LV2'] = 0
conf.Finish() conf.Finish()
else: else:
@ -767,6 +764,13 @@ if env['DIST_TARGET'] in ['panther', 'tiger', 'leopard' ]:
# force tiger or later, to avoid issues on PPC which defaults # force tiger or later, to avoid issues on PPC which defaults
# back to 10.1 if we don't tell it otherwise. # back to 10.1 if we don't tell it otherwise.
env.Append (CCFLAGS="-DMAC_OS_X_VERSION_MIN_REQUIRED=1040") env.Append (CCFLAGS="-DMAC_OS_X_VERSION_MIN_REQUIRED=1040")
if env['DIST_TARGET'] == 'leopard':
# need this to really build against the 10.4 SDK when building on leopard
# ideally this would be configurable, but lets just do that later when we need it
env.Append(CCFLAGS="-mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk")
env.Append(LINKFLAGS="-mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk")
else: else:
env['IS_OSX'] = 0 env['IS_OSX'] = 0
@ -836,12 +840,13 @@ def prep_libcheck(topenv, libinfo):
# #
# rationale: GTK-Quartz uses jhbuild and installs to /opt/gtk by default. # rationale: GTK-Quartz uses jhbuild and installs to /opt/gtk by default.
# All libraries needed should be built against this location # All libraries needed should be built against this location
# However.. now jhbuild installs to ~/gtk/inst by default.. changed to accomodate this
if topenv['GTKOSX']: if topenv['GTKOSX']:
gtkroot = os.path.expanduser ("~"); GTKROOT = os.path.expanduser ('~/gtk/inst')
libinfo.Append(CPPPATH="$GTKROOT/include", LIBPATH="$GTKROOT/lib") libinfo.Append(CPPPATH= GTKROOT + "/include", LIBPATH= GTKROOT + "/lib")
libinfo.Append(CXXFLAGS="-I$GTKROOT/include", LINKFLAGS="-L$GTKROOT/lib") libinfo.Append(CXXFLAGS="-I" + GTKROOT + "/include", LINKFLAGS="-L" + GTKROOT + "/lib")
libinfo.Append(CPPPATH="/opt/local/include", LIBPATH="/opt/local/lib") #libinfo.Append(CPPPATH="/opt/local/include", LIBPATH="/opt/local/lib")
libinfo.Append(CXXFLAGS="-I/opt/local/include", LINKFLAGS="-L/opt/local/lib") #libinfo.Append(CXXFLAGS="-I/opt/local/include", LINKFLAGS="-L/opt/local/lib")
prep_libcheck(env, env) prep_libcheck(env, env)
@ -859,25 +864,25 @@ libraries['vamphost'] = LibraryInfo (LIBS='vamphostsdk',
env['RUBBERBAND'] = False env['RUBBERBAND'] = False
#conf = Configure (env) conf = Configure (env)
#
#if conf.CheckHeader ('fftw3.h'): if conf.CheckHeader ('fftw3.h'):
# env['RUBBERBAND'] = True env['RUBBERBAND'] = True
# libraries['rubberband'] = LibraryInfo (LIBS='rubberband', libraries['rubberband'] = LibraryInfo (LIBS='rubberband',
# LIBPATH='#libs/rubberband', LIBPATH='#libs/rubberband',
# CPPPATH='#libs/rubberband', CPPPATH='#libs/rubberband',
# CCFLAGS='-DUSE_RUBBERBAND') CCFLAGS='-DUSE_RUBBERBAND')
#else: else:
# print "" print ""
# print "-------------------------------------------------------------------------" print "-------------------------------------------------------------------------"
# print "You do not have the FFTW single-precision development package installed." print "You do not have the FFTW single-precision development package installed."
# print "This prevents Ardour from using the Rubberband library for timestretching" print "This prevents Ardour from using the Rubberband library for timestretching"
# print "and pitchshifting. It will fall back on SoundTouch for timestretch, and " print "and pitchshifting. It will fall back on SoundTouch for timestretch, and "
# print "pitchshifting will not be available." print "pitchshifting will not be available."
# print "-------------------------------------------------------------------------" print "-------------------------------------------------------------------------"
# print "" print ""
#
#conf.Finish() conf.Finish()
# #
# Check for libusb # Check for libusb

View file

@ -286,8 +286,11 @@ if env['VST']:
extra_sources += vst_files extra_sources += vst_files
gtkardour.Append (CCFLAGS="-DVST_SUPPORT", CPPPATH="#libs/fst") gtkardour.Append (CCFLAGS="-DVST_SUPPORT", CPPPATH="#libs/fst")
lv2_files = [ 'lv2_plugin_ui.cc' ]
if env['LV2']: if env['LV2']:
gtkardour.Append (CCFLAGS="-DHAVE_SLV2") extra_sources += lv2_files
gtkardour.Append (CCFLAGS="-DHAVE_LV2")
gtkardour.Merge ([libraries['slv2']]) gtkardour.Merge ([libraries['slv2']])
@ -432,7 +435,7 @@ else:
keybindings_dict['%LEVEL4%'] = env['WINDOWS_KEY'] keybindings_dict['%LEVEL4%'] = env['WINDOWS_KEY']
keybindings_dict['%WINDOW%'] = 'Alt' keybindings_dict['%WINDOW%'] = 'Alt'
for b in [ 'SAE-de', 'mnemonic-us', 'ergonomic-us' ]: for b in [ 'SAE-de', 'SAE-us', 'mnemonic-us', 'ergonomic-us' ]:
target_file = b + '.bindings' target_file = b + '.bindings'
src_file = target_file + '.in' src_file = target_file + '.in'
Default (env.SubstInFile (target_file, src_file, SUBST_DICT = keybindings_dict)) Default (env.SubstInFile (target_file, src_file, SUBST_DICT = keybindings_dict))

View file

@ -1344,7 +1344,7 @@ ARDOUR_UI::do_transport_locate (nframes_t new_position)
} }
void void
ARDOUR_UI::transport_goto_start () ARDOUR_UI::transport_goto_start ()
{ {
if (session) { if (session) {
session->goto_start(); session->goto_start();

View file

@ -104,6 +104,9 @@ AudioClock::AudioClock (std::string clock_name, bool transient, std::string widg
Gtkmm2ext::set_size_request_to_display_given_text(*smpte_upper_info_label, "23.98",0,0); Gtkmm2ext::set_size_request_to_display_given_text(*smpte_upper_info_label, "23.98",0,0);
Gtkmm2ext::set_size_request_to_display_given_text(*smpte_lower_info_label, "NDF",0,0); Gtkmm2ext::set_size_request_to_display_given_text(*smpte_lower_info_label, "NDF",0,0);
Gtkmm2ext::set_size_request_to_display_given_text(*bbt_upper_info_label, "88|88",0,0);
Gtkmm2ext::set_size_request_to_display_given_text(*bbt_lower_info_label, "888.88",0,0);
frames_info_box.pack_start (*frames_upper_info_label, true, true); frames_info_box.pack_start (*frames_upper_info_label, true, true);
frames_info_box.pack_start (*frames_lower_info_label, true, true); frames_info_box.pack_start (*frames_lower_info_label, true, true);
smpte_info_box.pack_start (*smpte_upper_info_label, true, true); smpte_info_box.pack_start (*smpte_upper_info_label, true, true);
@ -644,11 +647,17 @@ AudioClock::set_bbt (nframes_t when, bool force)
} }
sprintf (buf, "%03" PRIu32, bbt.bars); sprintf (buf, "%03" PRIu32, bbt.bars);
bars_label.set_text (buf); if (force || bars_label.get_text () != buf) {
bars_label.set_text (buf);
}
sprintf (buf, "%02" PRIu32, bbt.beats); sprintf (buf, "%02" PRIu32, bbt.beats);
beats_label.set_text (buf); if (force || beats_label.get_text () != buf) {
beats_label.set_text (buf);
}
sprintf (buf, "%04" PRIu32, bbt.ticks); sprintf (buf, "%04" PRIu32, bbt.ticks);
ticks_label.set_text (buf); if (force || ticks_label.get_text () != buf) {
ticks_label.set_text (buf);
}
if (bbt_upper_info_label) { if (bbt_upper_info_label) {
nframes64_t pos; nframes64_t pos;

View file

@ -209,8 +209,7 @@ Editor::Editor ()
range_mark_label (_("Range Markers")), range_mark_label (_("Range Markers")),
transport_mark_label (_("Loop/Punch Ranges")), transport_mark_label (_("Loop/Punch Ranges")),
cd_mark_label (_("CD Markers")), cd_mark_label (_("CD Markers")),
edit_packer (3, 4, true),
edit_packer (3, 3, true),
/* the values here don't matter: layout widgets /* the values here don't matter: layout widgets
reset them as needed. reset them as needed.
@ -219,9 +218,6 @@ Editor::Editor ()
vertical_adjustment (0.0, 0.0, 10.0, 400.0), vertical_adjustment (0.0, 0.0, 10.0, 400.0),
horizontal_adjustment (0.0, 0.0, 20.0, 1200.0), horizontal_adjustment (0.0, 0.0, 20.0, 1200.0),
tempo_lines(0),
marker_tempo_lines(0),
/* tool bar related */ /* tool bar related */
edit_point_clock (X_("editpoint"), false, X_("EditPointClock"), true), edit_point_clock (X_("editpoint"), false, X_("EditPointClock"), true),
@ -375,7 +371,6 @@ Editor::Editor ()
range_marker_drag_rect = 0; range_marker_drag_rect = 0;
marker_drag_line = 0; marker_drag_line = 0;
tempo_map_change_idle_handler_id = -1; tempo_map_change_idle_handler_id = -1;
canvas_hroizontally_scrolled_handler_id = -1;
set_midi_edit_mode (MidiEditPencil, true); set_midi_edit_mode (MidiEditPencil, true);
set_mouse_mode (MouseObject, true); set_mouse_mode (MouseObject, true);
@ -390,16 +385,10 @@ Editor::Editor ()
initialize_canvas (); initialize_canvas ();
edit_controls_vbox.set_spacing (0); edit_controls_vbox.set_spacing (0);
horizontal_adjustment.signal_value_changed().connect (mem_fun(*this, &Editor::canvas_horizontally_scrolled), false); horizontal_adjustment.signal_value_changed().connect (mem_fun(*this, &Editor::scroll_canvas_horizontally), false);
vertical_adjustment.signal_value_changed().connect (mem_fun(*this, &Editor::tie_vertical_scrolling), true); vertical_adjustment.signal_value_changed().connect (mem_fun(*this, &Editor::tie_vertical_scrolling), true);
track_canvas->set_hadjustment (horizontal_adjustment);
track_canvas->set_vadjustment (vertical_adjustment);
time_canvas->set_hadjustment (horizontal_adjustment);
track_canvas->signal_map_event().connect (mem_fun (*this, &Editor::track_canvas_map_handler)); track_canvas->signal_map_event().connect (mem_fun (*this, &Editor::track_canvas_map_handler));
time_canvas->signal_map_event().connect (mem_fun (*this, &Editor::time_canvas_map_handler));
controls_layout.add (edit_controls_vbox); controls_layout.add (edit_controls_vbox);
controls_layout.set_name ("EditControlsBase"); controls_layout.set_name ("EditControlsBase");
controls_layout.add_events (Gdk::SCROLL_MASK); controls_layout.add_events (Gdk::SCROLL_MASK);
@ -436,9 +425,8 @@ Editor::Editor ()
time_canvas_vbox.pack_start (*smpte_ruler, false, false); time_canvas_vbox.pack_start (*smpte_ruler, false, false);
time_canvas_vbox.pack_start (*frames_ruler, false, false); time_canvas_vbox.pack_start (*frames_ruler, false, false);
time_canvas_vbox.pack_start (*bbt_ruler, false, false); time_canvas_vbox.pack_start (*bbt_ruler, false, false);
time_canvas_vbox.pack_start (*time_canvas, true, true); //time_canvas_vbox.set_size_request (-1, (int)(timebar_height * visible_timebars) + 2);
time_canvas_vbox.set_size_request (-1, (int)(timebar_height * visible_timebars) + 5); time_canvas_vbox.set_size_request (-1, -1);
bbt_label.set_name ("EditorTimeButton"); bbt_label.set_name ("EditorTimeButton");
bbt_label.set_size_request (-1, (int)timebar_height); bbt_label.set_size_request (-1, (int)timebar_height);
bbt_label.set_alignment (1.0, 0.5); bbt_label.set_alignment (1.0, 0.5);
@ -455,6 +443,7 @@ Editor::Editor ()
frame_label.set_size_request (-1, (int)timebar_height); frame_label.set_size_request (-1, (int)timebar_height);
frame_label.set_alignment (1.0, 0.5); frame_label.set_alignment (1.0, 0.5);
frame_label.set_padding (5,0); frame_label.set_padding (5,0);
tempo_label.set_name ("EditorTimeButton"); tempo_label.set_name ("EditorTimeButton");
tempo_label.set_size_request (-1, (int)timebar_height); tempo_label.set_size_request (-1, (int)timebar_height);
tempo_label.set_alignment (1.0, 0.5); tempo_label.set_alignment (1.0, 0.5);
@ -479,26 +468,26 @@ Editor::Editor ()
transport_mark_label.set_size_request (-1, (int)timebar_height); transport_mark_label.set_size_request (-1, (int)timebar_height);
transport_mark_label.set_alignment (1.0, 0.5); transport_mark_label.set_alignment (1.0, 0.5);
transport_mark_label.set_padding (5,0); transport_mark_label.set_padding (5,0);
ruler_label_vbox.pack_start (minsec_label, false, false);
ruler_label_vbox.pack_start (smpte_label, false, false);
ruler_label_vbox.pack_start (frame_label, false, false);
ruler_label_vbox.pack_start (bbt_label, false, false);
time_button_vbox.pack_start (minsec_label, false, false); ruler_label_event_box.add (ruler_label_vbox);
time_button_vbox.pack_start (smpte_label, false, false); ruler_label_event_box.set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
time_button_vbox.pack_start (frame_label, false, false); ruler_label_event_box.set_name ("TimebarLabelBase");
time_button_vbox.pack_start (bbt_label, false, false); ruler_label_event_box.signal_button_release_event().connect (mem_fun(*this, &Editor::ruler_label_button_release));
time_button_vbox.pack_start (meter_label, false, false); time_button_vbox.pack_start (meter_label, false, false);
time_button_vbox.pack_start (tempo_label, false, false); time_button_vbox.pack_start (tempo_label, false, false);
time_button_vbox.pack_start (mark_label, false, false); time_button_vbox.pack_start (mark_label, false, false);
time_button_event_box.add (time_button_vbox); time_button_event_box.add (time_button_vbox);
time_button_event_box.set_name ("TimebarLabelBase"); time_button_event_box.set_name ("TimebarLabelBase");
time_button_frame.set_shadow_type (Gtk::SHADOW_NONE);
time_button_event_box.set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); time_button_event_box.set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
time_button_event_box.signal_button_release_event().connect (mem_fun(*this, &Editor::ruler_label_button_release)); time_button_event_box.signal_button_release_event().connect (mem_fun(*this, &Editor::ruler_label_button_release));
time_button_frame.add (time_button_event_box);
time_button_frame.set_name ("TimebarLabelBase");
time_button_frame.set_shadow_type (Gtk::SHADOW_ETCHED_OUT);
/* these enable us to have a dedicated window (for cursor setting, etc.) /* these enable us to have a dedicated window (for cursor setting, etc.)
for the canvas areas. for the canvas areas.
*/ */
@ -514,16 +503,16 @@ Editor::Editor ()
edit_packer.set_border_width (0); edit_packer.set_border_width (0);
edit_packer.set_name ("EditorWindow"); edit_packer.set_name ("EditorWindow");
edit_packer.attach (edit_vscrollbar, 3, 4, 1, 2, FILL, FILL|EXPAND, 0, 0); edit_packer.attach (edit_vscrollbar, 0, 1, 0, 4, FILL, FILL|EXPAND, 0, 0);
edit_packer.attach (ruler_label_event_box, 1, 2, 0, 1, FILL, SHRINK, 0, 0);
edit_packer.attach (time_button_event_box, 1, 2, 1, 2, FILL, SHRINK, 0, 0);
edit_packer.attach (time_canvas_event_box, 2, 3, 0, 1, FILL|EXPAND, FILL, 0, 0);
edit_packer.attach (time_button_frame, 0, 2, 0, 1, FILL, SHRINK, 0, 0); edit_packer.attach (controls_layout, 1, 2, 2, 3, FILL, FILL|EXPAND, 0, 0);
edit_packer.attach (time_canvas_event_box, 2, 4, 0, 1, FILL|EXPAND, FILL, 0, 0); edit_packer.attach (track_canvas_event_box, 2, 3, 1, 3, FILL|EXPAND, FILL|EXPAND, 0, 0);
edit_packer.attach (controls_layout, 1, 2, 1, 2, FILL, FILL|EXPAND, 0, 0); edit_packer.attach (zoom_box, 1, 2, 3, 4, FILL, FILL, 0, 0);
edit_packer.attach (track_canvas_event_box, 2, 3, 1, 2, FILL|EXPAND, FILL|EXPAND, 0, 0); edit_packer.attach (edit_hscrollbar, 2, 3, 3, 4, FILL|EXPAND, FILL, 0, 0);
edit_packer.attach (zoom_box, 1, 2, 2, 3, FILL, FILL, 0, 0);
edit_packer.attach (edit_hscrollbar, 2, 3, 2, 3, FILL|EXPAND, FILL, 0, 0);
bottom_hbox.set_border_width (2); bottom_hbox.set_border_width (2);
bottom_hbox.set_spacing (3); bottom_hbox.set_spacing (3);
@ -854,20 +843,10 @@ Editor::~Editor()
track_canvas = 0; track_canvas = 0;
} }
if (time_canvas) {
delete time_canvas;
time_canvas = 0;
}
if (track_canvas) { if (track_canvas) {
delete track_canvas; delete track_canvas;
track_canvas = 0; track_canvas = 0;
} }
if (time_canvas) {
delete time_canvas;
time_canvas = 0;
}
} }
void void
@ -1103,6 +1082,7 @@ Editor::start_scrolling ()
{ {
scroll_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect scroll_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect
(mem_fun(*this, &Editor::update_current_screen)); (mem_fun(*this, &Editor::update_current_screen));
} }
void void
@ -1161,7 +1141,7 @@ Editor::handle_new_duration ()
if (new_end > last_canvas_frame) { if (new_end > last_canvas_frame) {
last_canvas_frame = new_end; last_canvas_frame = new_end;
horizontal_adjustment.set_upper (last_canvas_frame / frames_per_unit); horizontal_adjustment.set_upper (last_canvas_frame / frames_per_unit);
reset_scrolling_region (); //reset_scrolling_region ();
} }
horizontal_adjustment.set_value (leftmost_frame/frames_per_unit); horizontal_adjustment.set_value (leftmost_frame/frames_per_unit);
@ -3562,13 +3542,23 @@ Editor::hide_verbose_canvas_cursor ()
double double
Editor::clamp_verbose_cursor_x (double x) Editor::clamp_verbose_cursor_x (double x)
{ {
return min (horizontal_adjustment.get_value() + canvas_width - 75.0, x); if (x < 0) {
x = 0;
} else {
x = min (canvas_width - 200.0, x);
}
return x;
} }
double double
Editor::clamp_verbose_cursor_y (double y) Editor::clamp_verbose_cursor_y (double y)
{ {
return min (vertical_adjustment.get_value() + canvas_height - 50.0, y); if (y < canvas_timebars_vsize) {
y = canvas_timebars_vsize;
} else {
y = min (canvas_height - 50, y);
}
return y;
} }
void void
@ -3577,7 +3567,7 @@ Editor::set_verbose_canvas_cursor (const string & txt, double x, double y)
verbose_canvas_cursor->property_text() = txt.c_str(); verbose_canvas_cursor->property_text() = txt.c_str();
/* don't get too close to the edge */ /* don't get too close to the edge */
verbose_canvas_cursor->property_x() = clamp_verbose_cursor_x (x); verbose_canvas_cursor->property_x() = clamp_verbose_cursor_x (x);
verbose_canvas_cursor->property_y() = clamp_verbose_cursor_x (y); verbose_canvas_cursor->property_y() = clamp_verbose_cursor_y (y);
} }
void void
@ -4014,7 +4004,8 @@ void
Editor::end_location_changed (Location* location) Editor::end_location_changed (Location* location)
{ {
ENSURE_GUI_THREAD (bind (mem_fun(*this, &Editor::end_location_changed), location)); ENSURE_GUI_THREAD (bind (mem_fun(*this, &Editor::end_location_changed), location));
reset_scrolling_region (); //reset_scrolling_region ();
horizontal_adjustment.set_upper ( location->start());
} }
int int
@ -4405,6 +4396,7 @@ Editor::on_key_release_event (GdkEventKey* ev)
void void
Editor::reset_x_origin (nframes64_t frame) Editor::reset_x_origin (nframes64_t frame)
{ {
//cerr << "resetting x origin" << endl;
queue_visual_change (frame); queue_visual_change (frame);
} }
@ -4532,10 +4524,6 @@ Editor::set_frames_per_unit (double fpu)
return; return;
} }
if (fpu == frames_per_unit) {
return;
}
frames_per_unit = fpu; frames_per_unit = fpu;
post_zoom (); post_zoom ();
} }
@ -4566,9 +4554,11 @@ Editor::post_zoom ()
ZoomChanged (); /* EMIT_SIGNAL */ ZoomChanged (); /* EMIT_SIGNAL */
reset_hscrollbar_stepping (); reset_hscrollbar_stepping ();
reset_scrolling_region (); //reset_scrolling_region ();
if (playhead_cursor) playhead_cursor->set_position (playhead_cursor->current_frame); if (playhead_cursor) {
playhead_cursor->set_position (playhead_cursor->current_frame);
}
instant_save (); instant_save ();
} }
@ -4576,10 +4566,12 @@ Editor::post_zoom ()
void void
Editor::queue_visual_change (nframes64_t where) Editor::queue_visual_change (nframes64_t where)
{ {
pending_visual_change.pending = VisualChange::Type (pending_visual_change.pending | VisualChange::TimeOrigin); // pending_visual_change.pending = VisualChange::Type (pending_visual_change.pending | VisualChange::TimeOrigin);
pending_visual_change.time_origin = where; // pending_visual_change.time_origin = where;
if (pending_visual_change.idle_handler_id < 0) { if (pending_visual_change.idle_handler_id < 0) {
pending_visual_change.pending = VisualChange::Type (pending_visual_change.pending | VisualChange::TimeOrigin);
pending_visual_change.time_origin = where;
pending_visual_change.idle_handler_id = g_idle_add (_idle_visual_changer, this); pending_visual_change.idle_handler_id = g_idle_add (_idle_visual_changer, this);
} }
} }
@ -4606,13 +4598,6 @@ int
Editor::idle_visual_changer () Editor::idle_visual_changer ()
{ {
VisualChange::Type p = pending_visual_change.pending; VisualChange::Type p = pending_visual_change.pending;
nframes64_t csf, cef;
if (session) {
csf = session->current_start_frame();
cef = session->current_end_frame() + (current_page_frames() / 24);// Add a little extra so we can see the end marker
}
pending_visual_change.pending = (VisualChange::Type) 0; pending_visual_change.pending = (VisualChange::Type) 0;
if (p & VisualChange::ZoomLevel) { if (p & VisualChange::ZoomLevel) {
@ -4624,26 +4609,29 @@ Editor::idle_visual_changer ()
update_tempo_based_rulers (); update_tempo_based_rulers ();
} }
if (p & VisualChange::TimeOrigin) { if (p & VisualChange::TimeOrigin) {
nframes64_t time_origin = (nframes64_t) floor (horizontal_adjustment.get_value() * frames_per_unit); nframes64_t csf, cef;
nframes64_t current_time_origin = (nframes64_t) floor (horizontal_adjustment.get_value() * frames_per_unit);
if (session) {
csf = session->current_start_frame();
cef = session->current_end_frame() + (current_page_frames() / 24);// Add a little extra so we can see the end marker
}
/* if we seek beyond the current end of the canvas, move the end */ /* if we seek beyond the current end of the canvas, move the end */
if (time_origin != pending_visual_change.time_origin) { if (current_time_origin != pending_visual_change.time_origin) {
//if (horizontal_adjustment.get_upper() < pending_visual_change.time_origin) {
if (horizontal_adjustment.get_upper() < pending_visual_change.time_origin) { last_canvas_frame = (cef > (pending_visual_change.time_origin + current_page_frames())) ? cef : pending_visual_change.time_origin + current_page_frames();
last_canvas_frame = (cef > (pending_visual_change.time_origin + current_page_frames())) ? cef : pending_visual_change.time_origin + current_page_frames(); horizontal_adjustment.set_upper ((cef - csf) / frames_per_unit);
horizontal_adjustment.set_upper ((cef - csf) / frames_per_unit); //}
reset_scrolling_region (); horizontal_adjustment.set_value (pending_visual_change.time_origin / frames_per_unit);
}
horizontal_adjustment.set_value (pending_visual_change.time_origin/frames_per_unit);
} else { } else {
update_fixed_rulers(); update_fixed_rulers();
redisplay_tempo (true); redisplay_tempo (true);
} }
} }
//cerr << "Editor::idle_visual_changer () called ha v:l:u:ps:fpu = " << horizontal_adjustment.get_value() << ":" << horizontal_adjustment.get_lower() << ":" << horizontal_adjustment.get_upper() << ":" << horizontal_adjustment.get_page_size() << ":" << frames_per_unit << endl;//DEBUG
pending_visual_change.idle_handler_id = -1; pending_visual_change.idle_handler_id = -1;
return 0; /* this is always a one-shot call */ return 0; /* this is always a one-shot call */
} }
@ -5020,7 +5008,7 @@ Editor::queue_draw_resize_line (int at)
/* redraw where it used to be */ /* redraw where it used to be */
Gdk::Rectangle r (xroot, old_resize_line_y - 1, controls_width + (int) canvas_width, 3); Gdk::Rectangle r (0, old_resize_line_y - 1, controls_width + (int) canvas_width, 3);
win->invalidate_rect (r, true); win->invalidate_rect (r, true);
cerr << "invalidate " << xroot << "," << old_resize_line_y - 1 << ' ' cerr << "invalidate " << xroot << "," << old_resize_line_y - 1 << ' '
<< controls_width + canvas_width << " x 3\n"; << controls_width + canvas_width << " x 3\n";
@ -5028,7 +5016,7 @@ Editor::queue_draw_resize_line (int at)
/* draw where it is */ /* draw where it is */
Gdk::Rectangle r (xroot, at - 1, controls_width + (int) canvas_width, 3); Gdk::Rectangle r (0, at - 1, controls_width + (int) canvas_width, 3);
win->invalidate_rect (r, true); win->invalidate_rect (r, true);
} }
#endif #endif
@ -5063,7 +5051,7 @@ Editor::on_expose_event (GdkEventExpose* ev)
GdkRectangle lr; GdkRectangle lr;
GdkRectangle intersection; GdkRectangle intersection;
lr.x = xroot; lr.x = 0;
lr.y = resize_line_y; lr.y = resize_line_y;
lr.width = controls_width + (int) canvas_width; lr.width = controls_width + (int) canvas_width;
lr.height = 3; lr.height = 3;
@ -5084,15 +5072,17 @@ Editor::on_expose_event (GdkEventExpose* ev)
Gdk::JOIN_MITER); Gdk::JOIN_MITER);
gdk_draw_line (win, gc->gobj(), gdk_draw_line (win, gc->gobj(),
xroot, 0,
yroot + resize_line_y, resize_line_y,
xroot + (int) canvas_width + controls_width, (int) canvas_width + controls_width,
yroot + resize_line_y); resize_line_y);
#if 0
cerr << "drew line @ " << xroot << ", " << yroot + resize_line_y cerr << "drew line @ " << xroot << ", " << yroot + resize_line_y
<< " to " << xroot + (int) canvas_width + controls_width << " to " << xroot + (int) canvas_width + controls_width
<< ", " << yroot + resize_line_y << ", " << yroot + resize_line_y
<< endl; << endl;
old_resize_line_y = yroot + resize_line_y; #endif
old_resize_line_y = resize_line_y;
cerr << "NEXT EXPOSE SHOULD BE AT " << old_resize_line_y << endl; cerr << "NEXT EXPOSE SHOULD BE AT " << old_resize_line_y << endl;
} else { } else {
cerr << "no intersect with " cerr << "no intersect with "

View file

@ -600,7 +600,6 @@ class Editor : public PublicEditor
Gdk::Cursor* which_grabber_cursor (); Gdk::Cursor* which_grabber_cursor ();
ArdourCanvas::Canvas* track_canvas; ArdourCanvas::Canvas* track_canvas;
ArdourCanvas::Canvas* time_canvas;
ArdourCanvas::Text* first_action_message; ArdourCanvas::Text* first_action_message;
ArdourCanvas::Text* verbose_canvas_cursor; ArdourCanvas::Text* verbose_canvas_cursor;
@ -620,7 +619,7 @@ class Editor : public PublicEditor
Gtk::EventBox time_canvas_event_box; Gtk::EventBox time_canvas_event_box;
Gtk::EventBox track_canvas_event_box; Gtk::EventBox track_canvas_event_box;
Gtk::EventBox time_button_event_box; Gtk::EventBox time_button_event_box;
Gtk::Frame time_button_frame; Gtk::EventBox ruler_label_event_box;
ArdourCanvas::Group *minsec_group; ArdourCanvas::Group *minsec_group;
ArdourCanvas::Pixbuf *logo_item; ArdourCanvas::Pixbuf *logo_item;
@ -633,6 +632,34 @@ class Editor : public PublicEditor
ArdourCanvas::Group *range_marker_group; ArdourCanvas::Group *range_marker_group;
ArdourCanvas::Group *transport_marker_group; ArdourCanvas::Group *transport_marker_group;
ArdourCanvas::Group* cd_marker_group; ArdourCanvas::Group* cd_marker_group;
ArdourCanvas::Group* timebar_group;
/* These bars never need to be scrolled */
ArdourCanvas::Group* meter_bar_group;
ArdourCanvas::Group* tempo_bar_group;
ArdourCanvas::Group* marker_bar_group;
ArdourCanvas::Group* range_marker_bar_group;
ArdourCanvas::Group* transport_marker_bar_group;
ArdourCanvas::Group* cd_marker_bar_group;
/*
The _master_group is the group containing all items
that require horizontal scrolling..
It is primarily used to separate canvas items
that require horizontal scrolling from those that do not.
*/
ArdourCanvas::Group* _master_group;
/*
The _trackview_group is the group containing all trackviews.
It is only scrolled vertically.
*/
ArdourCanvas::Group* _trackview_group;
/*
This canvas group is used for region motion.
It sits on top of the _trackview_group
*/
ArdourCanvas::Group* _region_motion_group;
enum RulerType { enum RulerType {
ruler_metric_smpte = 0, ruler_metric_smpte = 0,
@ -755,6 +782,7 @@ class Editor : public PublicEditor
static const double timebar_height; static const double timebar_height;
guint32 visible_timebars; guint32 visible_timebars;
gdouble canvas_timebars_vsize;
Gtk::Menu *editor_ruler_menu; Gtk::Menu *editor_ruler_menu;
ArdourCanvas::SimpleRect* tempo_bar; ArdourCanvas::SimpleRect* tempo_bar;
@ -858,12 +886,12 @@ class Editor : public PublicEditor
nframes64_t last_canvas_frame; nframes64_t last_canvas_frame;
bool track_canvas_map_handler (GdkEventAny*); bool track_canvas_map_handler (GdkEventAny*);
bool time_canvas_map_handler (GdkEventAny*);
gint edit_controls_button_release (GdkEventButton*); gint edit_controls_button_release (GdkEventButton*);
Gtk::Menu *edit_controls_left_menu; Gtk::Menu *edit_controls_left_menu;
Gtk::Menu *edit_controls_right_menu; Gtk::Menu *edit_controls_right_menu;
Gtk::VBox ruler_label_vbox;
Gtk::VBox track_canvas_vbox; Gtk::VBox track_canvas_vbox;
Gtk::VBox time_canvas_vbox; Gtk::VBox time_canvas_vbox;
Gtk::VBox edit_controls_vbox; Gtk::VBox edit_controls_vbox;
@ -874,7 +902,11 @@ class Editor : public PublicEditor
bool deferred_control_scroll (nframes64_t); bool deferred_control_scroll (nframes64_t);
sigc::connection control_scroll_connection; sigc::connection control_scroll_connection;
gdouble get_trackview_group_vertical_offset () const { return vertical_adjustment.get_value () - canvas_timebars_vsize;}
ArdourCanvas::Group* get_trackview_group () const { return _trackview_group; }
void tie_vertical_scrolling (); void tie_vertical_scrolling ();
void scroll_canvas_horizontally ();
void scroll_canvas_vertically ();
void canvas_horizontally_scrolled (); void canvas_horizontally_scrolled ();
void canvas_scroll_to (nframes64_t); void canvas_scroll_to (nframes64_t);
@ -1464,15 +1496,12 @@ public:
bool canvas_playhead_cursor_event (GdkEvent* event, ArdourCanvas::Item*); bool canvas_playhead_cursor_event (GdkEvent* event, ArdourCanvas::Item*);
bool track_canvas_scroll (GdkEventScroll* event); bool track_canvas_scroll (GdkEventScroll* event);
bool time_canvas_scroll (GdkEventScroll* event);
bool track_canvas_scroll_event (GdkEventScroll* event); bool track_canvas_scroll_event (GdkEventScroll* event);
bool track_canvas_button_press_event (GdkEventButton* event); bool track_canvas_button_press_event (GdkEventButton* event);
bool track_canvas_button_release_event (GdkEventButton* event); bool track_canvas_button_release_event (GdkEventButton* event);
bool track_canvas_motion_notify_event (GdkEventMotion* event); bool track_canvas_motion_notify_event (GdkEventMotion* event);
bool time_canvas_scroll_event (GdkEventScroll* event);
Gtk::Allocation canvas_allocation; Gtk::Allocation canvas_allocation;
bool canvas_idle_queued; bool canvas_idle_queued;
void track_canvas_allocate (Gtk::Allocation alloc); void track_canvas_allocate (Gtk::Allocation alloc);
@ -1489,9 +1518,6 @@ public:
void handle_new_duration (); void handle_new_duration ();
void initialize_canvas (); void initialize_canvas ();
int canvas_hroizontally_scrolled_handler_id;
void reset_horizontally_scrolling_region (Gtk::Allocation* alloc = 0);
void reset_scrolling_region (Gtk::Allocation* alloc = 0);
/* display control */ /* display control */
@ -1505,11 +1531,12 @@ public:
ARDOUR::TempoMap::BBTPointList *current_bbt_points; ARDOUR::TempoMap::BBTPointList *current_bbt_points;
typedef vector<ArdourCanvas::SimpleLine*> TimeLineList;
TimeLineList free_measure_lines;
TimeLineList used_measure_lines;
ArdourCanvas::Group* time_line_group; ArdourCanvas::Group* time_line_group;
ArdourCanvas::Group* marker_time_line_group; ArdourCanvas::SimpleLine* get_time_line ();
TempoLines* tempo_lines;
TempoLines* marker_tempo_lines;
void hide_measures (); void hide_measures ();
void draw_measures (); void draw_measures ();
@ -1887,12 +1914,13 @@ public:
uint32_t autoscroll_cnt; uint32_t autoscroll_cnt;
nframes64_t autoscroll_x_distance; nframes64_t autoscroll_x_distance;
double autoscroll_y_distance; double autoscroll_y_distance;
static gint _autoscroll_canvas (void *); static gint _autoscroll_canvas (void *);
bool autoscroll_canvas (); bool autoscroll_canvas ();
void start_canvas_autoscroll (int x, int y); void start_canvas_autoscroll (int x, int y);
void stop_canvas_autoscroll (); void stop_canvas_autoscroll ();
void maybe_autoscroll (GdkEventMotion*); void maybe_autoscroll (GdkEventMotion*);
void maybe_autoscroll_horizontally (GdkEventMotion*);
bool allow_vertical_scroll; bool allow_vertical_scroll;
/* trimming */ /* trimming */

View file

@ -100,10 +100,8 @@ Editor::initialize_canvas ()
{ {
if (getenv ("ARDOUR_NON_AA_CANVAS")) { if (getenv ("ARDOUR_NON_AA_CANVAS")) {
track_canvas = new ArdourCanvas::Canvas (); track_canvas = new ArdourCanvas::Canvas ();
time_canvas = new ArdourCanvas::Canvas ();
} else { } else {
track_canvas = new ArdourCanvas::CanvasAA (); track_canvas = new ArdourCanvas::CanvasAA ();
time_canvas = new ArdourCanvas::CanvasAA ();
} }
ArdourCanvas::init (); ArdourCanvas::init ();
@ -112,7 +110,7 @@ Editor::initialize_canvas ()
/* don't try to center the canvas */ /* don't try to center the canvas */
track_canvas->set_center_scroll_region (false); track_canvas->set_center_scroll_region (false);
track_canvas->set_dither (Gdk::RGB_DITHER_NONE); track_canvas->set_dither (Gdk::RGB_DITHER_NONE);
/* need to handle 4 specific types of events as catch-alls */ /* need to handle 4 specific types of events as catch-alls */
@ -121,9 +119,6 @@ Editor::initialize_canvas ()
track_canvas->signal_button_press_event().connect (mem_fun (*this, &Editor::track_canvas_button_press_event)); track_canvas->signal_button_press_event().connect (mem_fun (*this, &Editor::track_canvas_button_press_event));
track_canvas->signal_button_release_event().connect (mem_fun (*this, &Editor::track_canvas_button_release_event)); track_canvas->signal_button_release_event().connect (mem_fun (*this, &Editor::track_canvas_button_release_event));
/* just scroll stuff for the timecanvas */
time_canvas->signal_scroll_event().connect (mem_fun (*this, &Editor::time_canvas_scroll_event));
track_canvas->set_name ("EditorMainCanvas"); track_canvas->set_name ("EditorMainCanvas");
track_canvas->add_events (Gdk::POINTER_MOTION_HINT_MASK|Gdk::SCROLL_MASK); track_canvas->add_events (Gdk::POINTER_MOTION_HINT_MASK|Gdk::SCROLL_MASK);
track_canvas->signal_leave_notify_event().connect (mem_fun(*this, &Editor::left_track_canvas)); track_canvas->signal_leave_notify_event().connect (mem_fun(*this, &Editor::left_track_canvas));
@ -166,97 +161,100 @@ Editor::initialize_canvas ()
// logo_item->property_width_set() = true; // logo_item->property_width_set() = true;
logo_item->show (); logo_item->show ();
} }
/* a group to hold time (measure) lines */
time_line_group = new ArdourCanvas::Group (*track_canvas->root(), 0.0, 0.0);
tempo_lines = new TempoLines(*track_canvas, time_line_group);
cursor_group = new ArdourCanvas::Group (*track_canvas->root(), 0.0, 0.0);
time_canvas->set_name ("EditorTimeCanvas"); _master_group = new ArdourCanvas::Group (*track_canvas->root());
time_canvas->add_events (Gdk::POINTER_MOTION_HINT_MASK);
time_canvas->set_flags (CAN_FOCUS);
time_canvas->set_center_scroll_region (false);
time_canvas->set_dither (Gdk::RGB_DITHER_NONE);
marker_time_line_group = new ArdourCanvas::Group (*time_canvas->root(), 0.0, 0.0);
marker_tempo_lines = new TempoLines(*time_canvas, marker_time_line_group);
meter_group = new ArdourCanvas::Group (*time_canvas->root(), 0.0, 0.0);
tempo_group = new ArdourCanvas::Group (*time_canvas->root(), 0.0, timebar_height);
range_marker_group = new ArdourCanvas::Group (*time_canvas->root(), 0.0, timebar_height * 2.0);
transport_marker_group = new ArdourCanvas::Group (*time_canvas->root(), 0.0, timebar_height * 3.0);
marker_group = new ArdourCanvas::Group (*time_canvas->root(), 0.0, timebar_height * 4.0);
cd_marker_group = new ArdourCanvas::Group (*time_canvas->root(), 0.0, timebar_height * 5.0);
tempo_bar = new ArdourCanvas::SimpleRect (*tempo_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0);
tempo_bar->property_outline_what() = (0x1 | 0x8); _trackview_group = new ArdourCanvas::Group (*_master_group);
tempo_bar->property_outline_pixels() = 1; _region_motion_group = new ArdourCanvas::Group (*_master_group);
meter_bar = new ArdourCanvas::SimpleRect (*meter_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0); meter_bar_group = new ArdourCanvas::Group (*track_canvas->root());
meter_bar = new ArdourCanvas::SimpleRect (*meter_bar_group, 0.0, 0.0, 100, timebar_height);
meter_bar->property_outline_what() = (0x1 | 0x8); meter_bar->property_outline_what() = (0x1 | 0x8);
meter_bar->property_outline_pixels() = 1; meter_bar->property_outline_pixels() = 1;
marker_bar = new ArdourCanvas::SimpleRect (*marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0);
marker_bar->property_outline_what() = (0x1 | 0x8); tempo_bar_group = new ArdourCanvas::Group (*track_canvas->root());
marker_bar->property_outline_pixels() = 1; tempo_bar = new ArdourCanvas::SimpleRect (*tempo_bar_group, 0.0, 0.0, 100, (timebar_height));
tempo_bar->property_outline_what() = (0x1 | 0x8);
tempo_bar->property_outline_pixels() = 0;
cd_marker_bar = new ArdourCanvas::SimpleRect (*cd_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0); range_marker_bar_group = new ArdourCanvas::Group (*track_canvas->root());
range_marker_bar = new ArdourCanvas::SimpleRect (*range_marker_bar_group, 0.0, 0.0, 100, (timebar_height));
cd_marker_bar->property_outline_what() = (0x1 | 0x8);
cd_marker_bar->property_outline_pixels() = 1;
range_marker_bar = new ArdourCanvas::SimpleRect (*range_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0);
range_marker_bar->property_outline_what() = (0x1 | 0x8); range_marker_bar->property_outline_what() = (0x1 | 0x8);
range_marker_bar->property_outline_pixels() = 1; range_marker_bar->property_outline_pixels() = 1;
transport_marker_bar = new ArdourCanvas::SimpleRect (*transport_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0); transport_marker_bar_group = new ArdourCanvas::Group (*track_canvas->root());
transport_marker_bar = new ArdourCanvas::SimpleRect (*transport_marker_bar_group, 0.0, 0.0, 100, (timebar_height));
transport_marker_bar->property_outline_what() = (0x1 | 0x8); transport_marker_bar->property_outline_what() = (0x1 | 0x8);
transport_marker_bar->property_outline_pixels() = 1; transport_marker_bar->property_outline_pixels() = 1;
marker_bar_group = new ArdourCanvas::Group (*track_canvas->root());
marker_bar = new ArdourCanvas::SimpleRect (*marker_bar_group, 0.0, 0.0, 100, (timebar_height));
marker_bar->property_outline_what() = (0x1 | 0x8);
marker_bar->property_outline_pixels() = 0;
cd_marker_bar_drag_rect = new ArdourCanvas::SimpleRect (*cd_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0); cd_marker_bar_group = new ArdourCanvas::Group (*track_canvas->root());
cd_marker_bar_drag_rect->property_outline_pixels() = 0; cd_marker_bar = new ArdourCanvas::SimpleRect (*cd_marker_bar_group, 0.0, 0.0, 100, (timebar_height));
cd_marker_bar_drag_rect->hide (); cd_marker_bar->property_outline_what() = (0x1 | 0x8);
cd_marker_bar->property_outline_pixels() = 0;
range_bar_drag_rect = new ArdourCanvas::SimpleRect (*range_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0);
range_bar_drag_rect->property_outline_pixels() = 0;
transport_bar_drag_rect = new ArdourCanvas::SimpleRect (*transport_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0); /* a group to hold time (measure) lines */
transport_bar_drag_rect->property_outline_pixels() = 0;
transport_bar_drag_rect->hide ();
marker_drag_line_points.push_back(Gnome::Art::Point(0.0, 0.0)); time_line_group = new ArdourCanvas::Group (*_master_group, 0.0, 0.0);
marker_drag_line_points.push_back(Gnome::Art::Point(0.0, 0.0));
marker_drag_line = new ArdourCanvas::Line (*track_canvas->root()); range_marker_drag_rect = new ArdourCanvas::SimpleRect (*time_line_group, 0.0, 0.0, 0.0, 0.0);
//range_marker_drag_rect = new ArdourCanvas::SimpleRect (*_master_group, 0.0, 0.0, 0.0, 0.0);
range_marker_drag_rect->hide ();
timebar_group = new ArdourCanvas::Group (*track_canvas->root());
cursor_group = new ArdourCanvas::Group (*track_canvas->root(), 0.0, 0.0);
meter_group = new ArdourCanvas::Group (*timebar_group, 0.0, timebar_height * 5.0);
tempo_group = new ArdourCanvas::Group (*timebar_group, 0.0, timebar_height * 4.0);
range_marker_group = new ArdourCanvas::Group (*timebar_group, 0.0, timebar_height * 3.0);
transport_marker_group = new ArdourCanvas::Group (*timebar_group, 0.0, timebar_height * 2.0);
marker_group = new ArdourCanvas::Group (*timebar_group, 0.0, timebar_height);
cd_marker_group = new ArdourCanvas::Group (*timebar_group, 0.0, 0.0);
marker_drag_line_points.push_back(Gnome::Art::Point(0.0, 0.0));
marker_drag_line_points.push_back(Gnome::Art::Point(0.0, 1.0));
marker_drag_line = new ArdourCanvas::Line (*timebar_group);
marker_drag_line->property_width_pixels() = 1; marker_drag_line->property_width_pixels() = 1;
marker_drag_line->property_points() = marker_drag_line_points; marker_drag_line->property_points() = marker_drag_line_points;
marker_drag_line->hide(); marker_drag_line->hide();
range_marker_drag_rect = new ArdourCanvas::SimpleRect (*track_canvas->root(), 0.0, 0.0, 0.0, 0.0); cd_marker_bar_drag_rect = new ArdourCanvas::SimpleRect (*cd_marker_group, 0.0, 0.0, 100, timebar_height);
range_marker_drag_rect->hide (); cd_marker_bar_drag_rect->property_outline_pixels() = 0;
cd_marker_bar_drag_rect->hide ();
transport_loop_range_rect = new ArdourCanvas::SimpleRect (*time_line_group, 0.0, 0.0, 0.0, 0.0);
range_bar_drag_rect = new ArdourCanvas::SimpleRect (*range_marker_group, 0.0, 0.0, 100, timebar_height);
range_bar_drag_rect->property_outline_pixels() = 0;
transport_bar_drag_rect = new ArdourCanvas::SimpleRect (*transport_marker_group, 0.0, 0.0, 100, timebar_height);
transport_bar_drag_rect->property_outline_pixels() = 0;
transport_bar_drag_rect->hide ();
transport_loop_range_rect = new ArdourCanvas::SimpleRect (*_master_group, 0.0, 0.0, 0.0, 0.0);
transport_loop_range_rect->property_outline_pixels() = 1; transport_loop_range_rect->property_outline_pixels() = 1;
transport_loop_range_rect->hide(); transport_loop_range_rect->hide();
transport_punch_range_rect = new ArdourCanvas::SimpleRect (*time_line_group, 0.0, 0.0, 0.0, 0.0); transport_punch_range_rect = new ArdourCanvas::SimpleRect (*_master_group, 0.0, 0.0, 0.0, 0.0);
transport_punch_range_rect->property_outline_pixels() = 0; transport_punch_range_rect->property_outline_pixels() = 0;
transport_punch_range_rect->hide(); transport_punch_range_rect->hide();
transport_loop_range_rect->lower_to_bottom (); // loop on the bottom transport_loop_range_rect->lower_to_bottom (); // loop on the bottom
transport_punchin_line = new ArdourCanvas::SimpleLine (*time_line_group); transport_punchin_line = new ArdourCanvas::SimpleLine (*_master_group);
transport_punchin_line->property_x1() = 0.0; transport_punchin_line->property_x1() = 0.0;
transport_punchin_line->property_y1() = 0.0; transport_punchin_line->property_y1() = 0.0;
transport_punchin_line->property_x2() = 0.0; transport_punchin_line->property_x2() = 0.0;
transport_punchin_line->property_y2() = 0.0; transport_punchin_line->property_y2() = 0.0;
transport_punchin_line->hide (); transport_punchin_line->hide ();
transport_punchout_line = new ArdourCanvas::SimpleLine (*time_line_group); transport_punchout_line = new ArdourCanvas::SimpleLine (*_master_group);
transport_punchout_line->property_x1() = 0.0; transport_punchout_line->property_x1() = 0.0;
transport_punchout_line->property_y1() = 0.0; transport_punchout_line->property_y1() = 0.0;
transport_punchout_line->property_x2() = 0.0; transport_punchout_line->property_x2() = 0.0;
@ -264,14 +262,15 @@ Editor::initialize_canvas ()
transport_punchout_line->hide(); transport_punchout_line->hide();
// used to show zoom mode active zooming // used to show zoom mode active zooming
zoom_rect = new ArdourCanvas::SimpleRect (*track_canvas->root(), 0.0, 0.0, 0.0, 0.0); zoom_rect = new ArdourCanvas::SimpleRect (*_master_group, 0.0, 0.0, 0.0, 0.0);
zoom_rect->property_outline_pixels() = 1; zoom_rect->property_outline_pixels() = 1;
zoom_rect->hide(); zoom_rect->hide();
zoom_rect->signal_event().connect (bind (mem_fun (*this, &Editor::canvas_zoom_rect_event), (ArdourCanvas::Item*) 0)); zoom_rect->signal_event().connect (bind (mem_fun (*this, &Editor::canvas_zoom_rect_event), (ArdourCanvas::Item*) 0));
// used as rubberband rect // used as rubberband rect
rubberband_rect = new ArdourCanvas::SimpleRect (*track_canvas->root(), 0.0, 0.0, 0.0, 0.0); rubberband_rect = new ArdourCanvas::SimpleRect (*_trackview_group, 0.0, 0.0, 0.0, 0.0);
rubberband_rect->property_outline_pixels() = 1; rubberband_rect->property_outline_pixels() = 1;
rubberband_rect->hide(); rubberband_rect->hide();
@ -284,10 +283,6 @@ Editor::initialize_canvas ()
ZoomChanged.connect (bind (mem_fun(*this, &Editor::update_loop_range_view), false)); ZoomChanged.connect (bind (mem_fun(*this, &Editor::update_loop_range_view), false));
ZoomChanged.connect (bind (mem_fun(*this, &Editor::update_punch_range_view), false)); ZoomChanged.connect (bind (mem_fun(*this, &Editor::update_punch_range_view), false));
double time_height = timebar_height * 5;
double time_width = FLT_MAX/frames_per_unit;
time_canvas->set_scroll_region(0.0, 0.0, time_width, time_height);
playhead_cursor = new Cursor (*this, &Editor::canvas_playhead_cursor_event); playhead_cursor = new Cursor (*this, &Editor::canvas_playhead_cursor_event);
@ -343,72 +338,47 @@ Editor::track_canvas_size_allocated ()
} }
} }
full_canvas_height = height; full_canvas_height = height + canvas_timebars_vsize;
} }
zoom_range_clock.set ((nframes64_t) floor ((canvas_width * frames_per_unit))); zoom_range_clock.set ((nframes64_t) floor ((canvas_width * frames_per_unit)));
playhead_cursor->set_position (playhead_cursor->current_frame); playhead_cursor->set_position (playhead_cursor->current_frame);
horizontal_adjustment.set_upper (session->current_end_frame()/frames_per_unit);
horizontal_adjustment.set_page_size (current_page_frames()/frames_per_unit);
reset_hscrollbar_stepping (); reset_hscrollbar_stepping ();
reset_scrolling_region ();
if (playhead_cursor) playhead_cursor->set_length (canvas_height); if (playhead_cursor) {
playhead_cursor->set_length (canvas_height);
}
double y1 = vertical_adjustment.get_value (); vertical_adjustment.set_page_size (canvas_height);
for (MarkerSelection::iterator x = selection->markers.begin(); x != selection->markers.end(); ++x) { for (MarkerSelection::iterator x = selection->markers.begin(); x != selection->markers.end(); ++x) {
(*x)->set_line_vpos (y1, canvas_height); (*x)->set_line_vpos (0, canvas_height);
} }
range_marker_drag_rect->property_y1() = y1; marker_drag_line_points.back().set_y(canvas_height);
range_marker_drag_rect->property_y2() = full_canvas_height;
transport_loop_range_rect->property_y1() = y1;
transport_loop_range_rect->property_y2() = full_canvas_height;
transport_punch_range_rect->property_y1() = y1;
transport_punch_range_rect->property_y2() = full_canvas_height;
transport_punchin_line->property_y1() = y1;
transport_punchin_line->property_y2() = full_canvas_height;
transport_punchout_line->property_y1() = y1;
transport_punchout_line->property_y2() = full_canvas_height;
update_fixed_rulers();
redisplay_tempo (true);
Resized (); /* EMIT_SIGNAL */
return false;
}
void
Editor::reset_scrolling_region (Gtk::Allocation* alloc)
{
TreeModel::Children rows = route_display_model->children();
TreeModel::Children::iterator i;
double pos;
for (pos = 0, i = rows.begin(); i != rows.end(); ++i) {
TimeAxisView *tv = (*i)[route_display_columns.tv];
if (tv != 0 && !tv->hidden()) {
pos += tv->effective_height;
}
}
double last_canvas_unit = max ((last_canvas_frame / frames_per_unit), canvas_width);
//cerr << "Editor::reset_scrolling_region () lcf:fpu:cw:lcu " << last_canvas_frame << ":" << frames_per_unit << ":" << canvas_width << ":" << last_canvas_unit << endl;//DEBUG
track_canvas->set_scroll_region (0.0, 0.0, last_canvas_unit, pos);
// XXX what is the correct height value for the time canvas ? this overstates it
time_canvas->set_scroll_region ( 0.0, 0.0, last_canvas_unit, canvas_height);
range_marker_drag_rect->property_y2() = canvas_height; range_marker_drag_rect->property_y2() = canvas_height;
transport_loop_range_rect->property_y2() = canvas_height; transport_loop_range_rect->property_y2() = canvas_height;
transport_punch_range_rect->property_y2() = canvas_height; transport_punch_range_rect->property_y2() = canvas_height;
transport_punchin_line->property_y2() = canvas_height; transport_punchin_line->property_y2() = canvas_height;
transport_punchout_line->property_y2() = canvas_height; transport_punchout_line->property_y2() = canvas_height;
update_punch_range_view (true); tempo_bar->property_x2() = canvas_width;
meter_bar->property_x2() = canvas_width;
marker_bar->property_x2() = canvas_width;
cd_marker_bar->property_x2() = canvas_width;
range_marker_bar->property_x2() = canvas_width;
transport_marker_bar->property_x2() = canvas_width;
controls_layout.queue_resize(); update_fixed_rulers();
redisplay_tempo (true);
Resized (); /* EMIT_SIGNAL */
return false;
} }
void void
@ -446,7 +416,18 @@ Editor::controls_layout_size_request (Requisition* req)
controls_layout.set_size (edit_controls_vbox.get_width(), (gint) pos); controls_layout.set_size (edit_controls_vbox.get_width(), (gint) pos);
controls_layout.set_size_request(edit_controls_vbox.get_width(), -1); controls_layout.set_size_request(edit_controls_vbox.get_width(), -1);
zoom_box.set_size_request(edit_controls_vbox.get_width(), -1); zoom_box.set_size_request(edit_controls_vbox.get_width(), -1);
time_button_frame.set_size_request(edit_controls_vbox.get_width(), -1); time_button_event_box.set_size_request(edit_controls_vbox.get_width(), -1);
if ((vertical_adjustment.get_value() + canvas_height) >= vertical_adjustment.get_upper()) {
/*
We're increasing the size of the canvas while the bottom is visible.
We scroll down to keep in step with the controls layout.
*/
vertical_adjustment.set_upper (pos + canvas_timebars_vsize);
vertical_adjustment.set_value (pos + canvas_timebars_vsize - canvas_height);
} else {
vertical_adjustment.set_upper (pos + canvas_timebars_vsize);
}
//cerr << "sizes = " << req->width << " " << edit_controls_vbox.get_width() << " " << controls_layout.get_width() << " " << zoom_box.get_width() << " " << time_button_frame.get_width() << endl;//DEBUG //cerr << "sizes = " << req->width << " " << edit_controls_vbox.get_width() << " " << controls_layout.get_width() << " " << zoom_box.get_width() << " " << time_button_frame.get_width() << endl;//DEBUG
} }
@ -458,13 +439,6 @@ Editor::track_canvas_map_handler (GdkEventAny* ev)
return false; return false;
} }
bool
Editor::time_canvas_map_handler (GdkEventAny* ev)
{
time_canvas->get_window()->set_cursor (*timebar_cursor);
return false;
}
void void
Editor::track_canvas_drag_data_received (const RefPtr<Gdk::DragContext>& context, Editor::track_canvas_drag_data_received (const RefPtr<Gdk::DragContext>& context,
int x, int y, int x, int y,
@ -509,8 +483,8 @@ Editor::drop_paths (const RefPtr<Gdk::DragContext>& context,
double wy; double wy;
track_canvas->window_to_world (x, y, wx, wy); track_canvas->window_to_world (x, y, wx, wy);
wx += horizontal_adjustment.get_value(); //wx += horizontal_adjustment.get_value();
wy += vertical_adjustment.get_value(); //wy += vertical_adjustment.get_value();
ev.type = GDK_BUTTON_RELEASE; ev.type = GDK_BUTTON_RELEASE;
ev.button.x = wx; ev.button.x = wx;
@ -596,16 +570,25 @@ Editor::maybe_autoscroll (GdkEventMotion* event)
nframes64_t frame = drag_info.current_pointer_frame; nframes64_t frame = drag_info.current_pointer_frame;
bool startit = false; bool startit = false;
double vertical_pos = vertical_adjustment.get_value(); double vertical_pos = vertical_adjustment.get_value();
double upper = vertical_adjustment.get_upper();
/*
adjust the event.y to take account of the bounds
of the _trackview_group
*/
double vsx1, vsx2, vsy1, vsy2;
_trackview_group->get_bounds (vsx1, vsy1, vsx2, vsy2);
autoscroll_y = 0; autoscroll_y = 0;
autoscroll_x = 0; autoscroll_x = 0;
if (event->y < vertical_pos) { if ((event->y - vsy1) < vertical_pos) {
autoscroll_y = -1; autoscroll_y = -1;
startit = true; startit = true;
} }
if (event->y > vertical_pos + canvas_height) { if ((event->y - vsy1) > (vertical_pos + canvas_height - canvas_timebars_vsize) && vertical_pos <= upper) {
autoscroll_y = 1; autoscroll_y = 1;
startit = true; startit = true;
} }
@ -618,7 +601,6 @@ Editor::maybe_autoscroll (GdkEventMotion* event)
} }
} else if (frame < leftmost_frame) { } else if (frame < leftmost_frame) {
if (leftmost_frame > 0) { if (leftmost_frame > 0) {
autoscroll_x = -1; autoscroll_x = -1;
startit = true; startit = true;
@ -642,6 +624,43 @@ Editor::maybe_autoscroll (GdkEventMotion* event)
last_autoscroll_y = autoscroll_y; last_autoscroll_y = autoscroll_y;
} }
void
Editor::maybe_autoscroll_horizontally (GdkEventMotion* event)
{
nframes64_t rightmost_frame = leftmost_frame + current_page_frames();
nframes64_t frame = drag_info.current_pointer_frame;
bool startit = false;
autoscroll_y = 0;
autoscroll_x = 0;
if (frame > rightmost_frame) {
if (rightmost_frame < max_frames) {
autoscroll_x = 1;
startit = true;
}
} else if (frame < leftmost_frame) {
if (leftmost_frame > 0) {
autoscroll_x = -1;
startit = true;
}
}
if ((autoscroll_x != last_autoscroll_x) || (autoscroll_y != last_autoscroll_y) || (autoscroll_x == 0 && autoscroll_y == 0)) {
stop_canvas_autoscroll ();
}
if (startit && autoscroll_timeout_tag < 0) {
start_canvas_autoscroll (autoscroll_x, autoscroll_y);
}
last_autoscroll_x = autoscroll_x;
last_autoscroll_y = autoscroll_y;
}
gint gint
Editor::_autoscroll_canvas (void *arg) Editor::_autoscroll_canvas (void *arg)
{ {
@ -654,97 +673,9 @@ Editor::autoscroll_canvas ()
nframes64_t new_frame; nframes64_t new_frame;
nframes64_t limit = max_frames - current_page_frames(); nframes64_t limit = max_frames - current_page_frames();
GdkEventMotion ev; GdkEventMotion ev;
nframes64_t target_frame;
double new_pixel; double new_pixel;
double target_pixel; double target_pixel;
if (autoscroll_x < 0) {
if (leftmost_frame < autoscroll_x_distance) {
new_frame = 0;
} else {
new_frame = leftmost_frame - autoscroll_x_distance;
}
target_frame = drag_info.current_pointer_frame - autoscroll_x_distance;
} else if (autoscroll_x > 0) {
if (leftmost_frame > limit - autoscroll_x_distance) {
new_frame = limit;
} else {
new_frame = leftmost_frame + autoscroll_x_distance;
}
target_frame = drag_info.current_pointer_frame + autoscroll_x_distance;
} else {
target_frame = drag_info.current_pointer_frame;
new_frame = leftmost_frame;
}
double vertical_pos = vertical_adjustment.get_value();
if (autoscroll_y < 0) {
if (vertical_pos < autoscroll_y_distance) {
new_pixel = 0;
} else {
new_pixel = vertical_pos - autoscroll_y_distance;
}
target_pixel = drag_info.current_pointer_y - autoscroll_y_distance;
target_pixel = max (target_pixel, 0.0);
} else if (autoscroll_y > 0) {
double top_of_bottom_of_canvas = full_canvas_height - canvas_height;
if (vertical_pos > full_canvas_height - autoscroll_y_distance) {
new_pixel = full_canvas_height;
} else {
new_pixel = vertical_pos + autoscroll_y_distance;
}
new_pixel = min (top_of_bottom_of_canvas, new_pixel);
target_pixel = drag_info.current_pointer_y + autoscroll_y_distance;
/* don't move to the full canvas height because the item will be invisible
(its top edge will line up with the bottom of the visible canvas.
*/
target_pixel = min (target_pixel, full_canvas_height - 10);
} else {
target_pixel = drag_info.current_pointer_y;
new_pixel = vertical_pos;
}
/* now fake a motion event to get the object that is being dragged to move too */
ev.type = GDK_MOTION_NOTIFY;
ev.state &= Gdk::BUTTON1_MASK;
ev.x = frame_to_unit (target_frame);
ev.y = target_pixel;
motion_handler (drag_info.item, (GdkEvent*) &ev, drag_info.item_type, true);
if ((new_frame == 0 || new_frame == limit) && (new_pixel == 0 || new_pixel == DBL_MAX)) {
/* we are done */
return false;
}
autoscroll_cnt++;
if (autoscroll_cnt == 1) {
/* connect the timeout so that we get called repeatedly */
autoscroll_timeout_tag = g_idle_add ( _autoscroll_canvas, this);
return false;
}
if (new_frame != leftmost_frame) {
reset_x_origin (new_frame);
}
vertical_adjustment.set_value (new_pixel);
if (autoscroll_x_distance != 0) { if (autoscroll_x_distance != 0) {
if (autoscroll_cnt == 50) { /* 0.5 seconds */ if (autoscroll_cnt == 50) { /* 0.5 seconds */
@ -786,6 +717,97 @@ Editor::autoscroll_canvas ()
} }
} }
if (autoscroll_x < 0) {
if (leftmost_frame < autoscroll_x_distance) {
new_frame = 0;
} else {
new_frame = leftmost_frame - autoscroll_x_distance;
}
} else if (autoscroll_x > 0) {
if (leftmost_frame > limit - autoscroll_x_distance) {
new_frame = limit;
} else {
new_frame = leftmost_frame + autoscroll_x_distance;
}
} else {
new_frame = leftmost_frame;
}
double vertical_pos = vertical_adjustment.get_value();
if (autoscroll_y < 0) {
if (vertical_pos < autoscroll_y_distance) {
new_pixel = 0;
} else {
new_pixel = vertical_pos - autoscroll_y_distance;
}
target_pixel = drag_info.current_pointer_y - autoscroll_y_distance;
target_pixel = max (target_pixel, 0.0);
} else if (autoscroll_y > 0) {
double top_of_bottom_of_canvas = full_canvas_height - canvas_height;
if (vertical_pos > full_canvas_height - autoscroll_y_distance) {
new_pixel = full_canvas_height;
} else {
new_pixel = vertical_pos + autoscroll_y_distance;
}
new_pixel = min (top_of_bottom_of_canvas, new_pixel);
target_pixel = drag_info.current_pointer_y + autoscroll_y_distance;
/* don't move to the full canvas height because the item will be invisible
(its top edge will line up with the bottom of the visible canvas.
*/
target_pixel = min (target_pixel, full_canvas_height - 10);
} else {
target_pixel = drag_info.current_pointer_y;
new_pixel = vertical_pos;
}
if ((new_frame == 0 || new_frame == limit) && (new_pixel == 0 || new_pixel == DBL_MAX)) {
/* we are done */
return false;
}
if (new_frame != leftmost_frame) {
reset_x_origin (new_frame);
}
vertical_adjustment.set_value (new_pixel);
/* fake an event. */
Glib::RefPtr<Gdk::Window> canvas_window = const_cast<Editor*>(this)->track_canvas->get_window();
gint x, y;
Gdk::ModifierType mask;
canvas_window->get_pointer (x, y, mask);
ev.type = GDK_MOTION_NOTIFY;
ev.state &= Gdk::BUTTON1_MASK;
ev.x = x;
ev.y = y;
motion_handler (drag_info.item, (GdkEvent*) &ev, drag_info.item_type, true);
autoscroll_cnt++;
if (autoscroll_cnt == 1) {
/* connect the timeout so that we get called repeatedly */
autoscroll_timeout_tag = g_idle_add ( _autoscroll_canvas, this);
return false;
}
return true; return true;
} }
@ -813,6 +835,7 @@ Editor::start_canvas_autoscroll (int dx, int dy)
void void
Editor::stop_canvas_autoscroll () Editor::stop_canvas_autoscroll ()
{ {
if (autoscroll_timeout_tag >= 0) { if (autoscroll_timeout_tag >= 0) {
g_source_remove (autoscroll_timeout_tag); g_source_remove (autoscroll_timeout_tag);
autoscroll_timeout_tag = -1; autoscroll_timeout_tag = -1;
@ -840,34 +863,49 @@ Editor::entered_track_canvas (GdkEventCrossing *ev)
void void
Editor::tie_vertical_scrolling () Editor::tie_vertical_scrolling ()
{ {
double y1 = vertical_adjustment.get_value(); scroll_canvas_vertically ();
playhead_cursor->set_y_axis (y1);
range_marker_drag_rect->property_y1() = y1;
range_marker_drag_rect->property_y2() = full_canvas_height;
transport_loop_range_rect->property_y1() = y1;
transport_loop_range_rect->property_y2() = full_canvas_height;
transport_punch_range_rect->property_y1() = y1;
transport_punch_range_rect->property_y2() = full_canvas_height;
transport_punchin_line->property_y1() = y1;
transport_punchin_line->property_y2() = full_canvas_height;
transport_punchout_line->property_y1() = y1;
transport_punchout_line->property_y2() = full_canvas_height;
if (!selection->markers.empty()) {
for (MarkerSelection::iterator x = selection->markers.begin(); x != selection->markers.end(); ++x) {
(*x)->set_line_vpos (y1, canvas_height);
}
}
if (logo_item) {
logo_item->property_y() = y1;
}
/* this will do an immediate redraw */ /* this will do an immediate redraw */
controls_layout.get_vadjustment()->set_value (y1); controls_layout.get_vadjustment()->set_value (vertical_adjustment.get_value());
}
void
Editor::scroll_canvas_horizontally ()
{
nframes64_t time_origin = (nframes64_t) floor (horizontal_adjustment.get_value() * frames_per_unit);
if (time_origin != leftmost_frame) {
canvas_scroll_to (time_origin);
}
/* horizontal scrolling only */
double x1, x2, y1, y2, x_delta;
_master_group->get_bounds(x1, y1, x2, y2);
x_delta = x1 + horizontal_adjustment.get_value();
_master_group->move (-x_delta, 0);
timebar_group->move (-x_delta, 0);
cursor_group->move (-x_delta, 0);
}
void
Editor::scroll_canvas_vertically ()
{
/* vertical scrolling only */
double x1, x2, y1, y2, y_delta;
_trackview_group->get_bounds(x1, y1, x2, y2);
y_delta = y1 + vertical_adjustment.get_value() - canvas_timebars_vsize;
_trackview_group->move (0, -y_delta);
_region_motion_group->move (0, -y_delta);
#ifndef GTKOSX
/* required to keep the controls_layout in lock step with the canvas group */
track_canvas->update_now ();
#endif
} }
void void
@ -884,18 +922,13 @@ void
Editor::canvas_scroll_to (nframes64_t time_origin) Editor::canvas_scroll_to (nframes64_t time_origin)
{ {
leftmost_frame = time_origin; leftmost_frame = time_origin;
nframes64_t rightmost_frame = leftmost_frame + current_page_frames (); nframes64_t rightmost_frame = leftmost_frame + current_page_frames ();
if (rightmost_frame > last_canvas_frame) { if (rightmost_frame > last_canvas_frame) {
last_canvas_frame = rightmost_frame; last_canvas_frame = rightmost_frame;
reset_scrolling_region (); //reset_scrolling_region ();
} }
if (logo_item) {
logo_item->property_x() = horizontal_adjustment.get_value ();
}
update_fixed_rulers (); update_fixed_rulers ();
redisplay_tempo (!_dragging_hscrollbar); redisplay_tempo (!_dragging_hscrollbar);

View file

@ -72,9 +72,7 @@ Editor::track_canvas_scroll (GdkEventScroll* ev)
*/ */
track_canvas->get_pointer (x, y); track_canvas->get_pointer (x, y);
track_canvas->window_to_world (x, y, wx, wy); track_canvas->window_to_world (x, y, wx, wy);
wx += horizontal_adjustment.get_value();
wy += vertical_adjustment.get_value();
GdkEvent event; GdkEvent event;
event.type = GDK_BUTTON_RELEASE; event.type = GDK_BUTTON_RELEASE;
event.button.x = wx; event.button.x = wx;
@ -89,7 +87,7 @@ Editor::track_canvas_scroll (GdkEventScroll* ev)
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) { } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
if (!current_stepping_trackview) { if (!current_stepping_trackview) {
step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500); step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500);
if (!(current_stepping_trackview = trackview_by_y_position (ev->y))) { if (!(current_stepping_trackview = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize))) {
return false; return false;
} }
} }
@ -110,9 +108,7 @@ Editor::track_canvas_scroll (GdkEventScroll* ev)
//if (ev->state == GDK_CONTROL_MASK) { //if (ev->state == GDK_CONTROL_MASK) {
track_canvas->get_pointer (x, y); track_canvas->get_pointer (x, y);
track_canvas->window_to_world (x, y, wx, wy); track_canvas->window_to_world (x, y, wx, wy);
wx += horizontal_adjustment.get_value();
wy += vertical_adjustment.get_value();
GdkEvent event; GdkEvent event;
event.type = GDK_BUTTON_RELEASE; event.type = GDK_BUTTON_RELEASE;
event.button.x = wx; event.button.x = wx;
@ -127,7 +123,7 @@ Editor::track_canvas_scroll (GdkEventScroll* ev)
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) { } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
if (!current_stepping_trackview) { if (!current_stepping_trackview) {
step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500); step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500);
if (!(current_stepping_trackview = trackview_by_y_position (ev->y))) { if (!(current_stepping_trackview = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize))) {
return false; return false;
} }
} }
@ -177,55 +173,6 @@ Editor::track_canvas_scroll_event (GdkEventScroll *event)
return false; return false;
} }
bool
Editor::time_canvas_scroll (GdkEventScroll* ev)
{
nframes64_t xdelta;
int direction = ev->direction;
switch (direction) {
case GDK_SCROLL_UP:
temporal_zoom_step (true);
break;
case GDK_SCROLL_DOWN:
temporal_zoom_step (false);
break;
case GDK_SCROLL_LEFT:
xdelta = (current_page_frames() / 2);
if (leftmost_frame > xdelta) {
reset_x_origin (leftmost_frame - xdelta);
} else {
reset_x_origin (0);
}
break;
case GDK_SCROLL_RIGHT:
xdelta = (current_page_frames() / 2);
if (max_frames - xdelta > leftmost_frame) {
reset_x_origin (leftmost_frame + xdelta);
} else {
reset_x_origin (max_frames - current_page_frames());
}
break;
default:
/* what? */
break;
}
return false;
}
bool
Editor::time_canvas_scroll_event (GdkEventScroll *event)
{
time_canvas->grab_focus();
time_canvas_scroll (event);
return false;
}
bool bool
Editor::track_canvas_button_press_event (GdkEventButton *event) Editor::track_canvas_button_press_event (GdkEventButton *event)
{ {
@ -260,10 +207,6 @@ Editor::track_canvas_motion (GdkEvent *ev)
verbose_canvas_cursor->property_y() = clamp_verbose_cursor_y (ev->motion.y + 20); verbose_canvas_cursor->property_y() = clamp_verbose_cursor_y (ev->motion.y + 20);
} }
#ifdef GTKOSX
flush_canvas ();
#endif
return false; return false;
} }

View file

@ -38,8 +38,8 @@ Editor::Cursor::Cursor (Editor& ed, bool (Editor::*callbck)(GdkEvent*,ArdourCanv
/* "randomly" initialize coords */ /* "randomly" initialize coords */
points.push_back(Gnome::Art::Point(-9383839.0, 0.0));
points.push_back(Gnome::Art::Point(1.0, 0.0)); points.push_back(Gnome::Art::Point(1.0, 0.0));
points.push_back(Gnome::Art::Point(1.0, 1.0));
canvas_item.property_points() = points; canvas_item.property_points() = points;
canvas_item.property_width_pixels() = 1; canvas_item.property_width_pixels() = 1;
@ -51,7 +51,6 @@ Editor::Cursor::Cursor (Editor& ed, bool (Editor::*callbck)(GdkEvent*,ArdourCanv
canvas_item.set_data ("cursor", this); canvas_item.set_data ("cursor", this);
canvas_item.signal_event().connect (bind (mem_fun (ed, callbck), &canvas_item)); canvas_item.signal_event().connect (bind (mem_fun (ed, callbck), &canvas_item));
current_frame = 1; /* force redraw at 0 */ current_frame = 1; /* force redraw at 0 */
} }
@ -67,23 +66,15 @@ Editor::Cursor::set_position (nframes64_t frame)
if (editor.session == 0) { if (editor.session == 0) {
canvas_item.hide(); canvas_item.hide();
} else {
canvas_item.show();
} }
current_frame = frame; current_frame = frame;
if (new_pos != points.front().get_x()) { if (new_pos != points.front().get_x()) {
points.front().set_x (new_pos); points.front().set_x (new_pos);
points.back().set_x (new_pos); points.back().set_x (new_pos);
canvas_item.property_points() = points; canvas_item.property_points() = points;
ArdourCanvas::Points p = canvas_item.property_points();
} }
canvas_item.raise_to_top();
} }
void void
@ -92,6 +83,9 @@ Editor::Cursor::set_length (double units)
length = units; length = units;
points.back().set_y (points.front().get_y() + length); points.back().set_y (points.front().get_y() + length);
canvas_item.property_points() = points; canvas_item.property_points() = points;
if (editor.session != 0) {
canvas_item.show();
}
} }
void void

View file

@ -1243,7 +1243,7 @@ Editor::marker_selection_changed ()
} }
for (MarkerSelection::iterator x = selection->markers.begin(); x != selection->markers.end(); ++x) { for (MarkerSelection::iterator x = selection->markers.begin(); x != selection->markers.end(); ++x) {
(*x)->add_line (cursor_group, vertical_adjustment.get_value(), canvas_height); (*x)->add_line (cursor_group, 0, canvas_height);
(*x)->show_line (); (*x)->show_line ();
} }

View file

@ -203,7 +203,7 @@ Editor::update_current_screen ()
if (_follow_playhead && session->requested_return_frame() < 0) { if (_follow_playhead && session->requested_return_frame() < 0) {
playhead_cursor->canvas_item.show(); //playhead_cursor->canvas_item.show();
if (frame != last_update_frame) { if (frame != last_update_frame) {
@ -259,7 +259,10 @@ Editor::update_current_screen ()
almost_done: almost_done:
last_update_frame = frame; last_update_frame = frame;
#ifdef GTKOSX
/*XXX in a perfect world we would not have to do this. */
track_canvas->update_now();
#endif
if (current_mixer_strip) { if (current_mixer_strip) {
current_mixer_strip->fast_update (); current_mixer_strip->fast_update ();
} }

View file

@ -1,3 +1,4 @@
/* /*
Copyright (C) 2000-2001 Paul Davis Copyright (C) 2000-2001 Paul Davis
@ -92,23 +93,15 @@ Editor::mouse_frame (nframes64_t& where, bool& in_track_canvas) const
pointer_window = canvas_window->get_pointer (x, y, mask); pointer_window = canvas_window->get_pointer (x, y, mask);
if (pointer_window == track_canvas->get_bin_window()) { if (pointer_window == track_canvas->get_bin_window()) {
wx = x;
track_canvas->window_to_world (x, y, wx, wy); wy = y;
in_track_canvas = true; in_track_canvas = true;
} else { } else {
in_track_canvas = false; in_track_canvas = false;
if (pointer_window == time_canvas->get_bin_window()) {
time_canvas->window_to_world (x, y, wx, wy);
} else {
return false; return false;
}
} }
wx += horizontal_adjustment.get_value();
wy += vertical_adjustment.get_value();
GdkEvent event; GdkEvent event;
event.type = GDK_BUTTON_RELEASE; event.type = GDK_BUTTON_RELEASE;
event.button.x = wx; event.button.x = wx;
@ -138,10 +131,16 @@ Editor::event_frame (GdkEvent* event, double* pcx, double* pcy) const
case GDK_BUTTON_PRESS: case GDK_BUTTON_PRESS:
case GDK_2BUTTON_PRESS: case GDK_2BUTTON_PRESS:
case GDK_3BUTTON_PRESS: case GDK_3BUTTON_PRESS:
track_canvas->w2c(event->button.x, event->button.y, *pcx, *pcy);
*pcx = event->button.x;
*pcy = event->button.y;
_trackview_group->w2i(*pcx, *pcy);
break; break;
case GDK_MOTION_NOTIFY: case GDK_MOTION_NOTIFY:
track_canvas->w2c(event->motion.x, event->motion.y, *pcx, *pcy);
*pcx = event->motion.x;
*pcy = event->motion.y;
_trackview_group->w2i(*pcx, *pcy);
break; break;
case GDK_ENTER_NOTIFY: case GDK_ENTER_NOTIFY:
case GDK_LEAVE_NOTIFY: case GDK_LEAVE_NOTIFY:
@ -227,9 +226,9 @@ Editor::which_grabber_cursor ()
return grabber_edit_point_cursor; return grabber_edit_point_cursor;
break; break;
default: default:
return grabber_cursor;
break; break;
} }
return grabber_cursor;
} }
void void
@ -609,7 +608,6 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp
pointer_window = canvas_window->get_pointer (x, y, mask); pointer_window = canvas_window->get_pointer (x, y, mask);
if (pointer_window == track_canvas->get_bin_window()) { if (pointer_window == track_canvas->get_bin_window()) {
track_canvas->window_to_world (x, y, wx, wy); track_canvas->window_to_world (x, y, wx, wy);
allow_vertical_scroll = true; allow_vertical_scroll = true;
} else { } else {
@ -770,8 +768,8 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp
case RegionViewName: case RegionViewName:
/* rename happens on edit clicks */ /* rename happens on edit clicks */
start_trim (clicked_regionview->get_name_highlight(), event); start_trim (clicked_regionview->get_name_highlight(), event);
return true; return true;
break; break;
case ControlPointItem: case ControlPointItem:
@ -1442,7 +1440,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
case MeterBarItem: case MeterBarItem:
case TempoBarItem: case TempoBarItem:
if (is_drawable()) { if (is_drawable()) {
time_canvas->get_window()->set_cursor (*timebar_cursor); track_canvas->get_window()->set_cursor (*timebar_cursor);
} }
break; break;
@ -1456,7 +1454,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
case MeterMarkerItem: case MeterMarkerItem:
case TempoMarkerItem: case TempoMarkerItem:
if (is_drawable()) { if (is_drawable()) {
time_canvas->get_window()->set_cursor (*timebar_cursor); track_canvas->get_window()->set_cursor (*timebar_cursor);
} }
break; break;
case FadeInHandleItem: case FadeInHandleItem:
@ -1569,7 +1567,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
case TempoBarItem: case TempoBarItem:
case MarkerBarItem: case MarkerBarItem:
if (is_drawable()) { if (is_drawable()) {
time_canvas->get_window()->set_cursor (*timebar_cursor); track_canvas->get_window()->set_cursor (*timebar_cursor);
} }
break; break;
@ -1586,7 +1584,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
case TempoMarkerItem: case TempoMarkerItem:
if (is_drawable()) { if (is_drawable()) {
time_canvas->get_window()->set_cursor (*timebar_cursor); track_canvas->get_window()->set_cursor (*timebar_cursor);
} }
break; break;
@ -1721,7 +1719,7 @@ Editor::motion_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item
where DISPLAY = :0.0, and given the cost of what the motion where DISPLAY = :0.0, and given the cost of what the motion
event might do, its a good tradeoff. event might do, its a good tradeoff.
*/ */
track_canvas->get_pointer (x, y); track_canvas->get_pointer (x, y);
} }
@ -1781,6 +1779,9 @@ Editor::motion_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item
case PlayheadCursorItem: case PlayheadCursorItem:
case MarkerItem: case MarkerItem:
case ControlPointItem: case ControlPointItem:
case RangeMarkerBarItem:
case TransportMarkerBarItem:
case CdMarkerBarItem:
case TempoMarkerItem: case TempoMarkerItem:
case MeterMarkerItem: case MeterMarkerItem:
case RegionViewNameHighlight: case RegionViewNameHighlight:
@ -1802,13 +1803,13 @@ Editor::motion_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item
if (drag_info.item && (event->motion.state & Gdk::BUTTON1_MASK || if (drag_info.item && (event->motion.state & Gdk::BUTTON1_MASK ||
(event->motion.state & Gdk::BUTTON2_MASK))) { (event->motion.state & Gdk::BUTTON2_MASK))) {
if (!from_autoscroll) { if (!from_autoscroll) {
maybe_autoscroll (&event->motion); maybe_autoscroll_horizontally (&event->motion);
} }
(this->*(drag_info.motion_callback)) (item, event); (this->*(drag_info.motion_callback)) (item, event);
goto handled; goto handled;
} }
goto not_handled; goto not_handled;
break;
default: default:
break; break;
} }
@ -2352,7 +2353,7 @@ Editor::start_marker_grab (ArdourCanvas::Item* item, GdkEvent* event)
// marker_drag_line->raise_to_top(); // marker_drag_line->raise_to_top();
} else { } else {
range_marker_drag_rect->show(); range_marker_drag_rect->show();
range_marker_drag_rect->raise_to_top(); //range_marker_drag_rect->raise_to_top();
} }
if (is_start) { if (is_start) {
@ -3087,6 +3088,18 @@ Editor::start_region_grab (ArdourCanvas::Item* item, GdkEvent* event)
show_verbose_time_cursor (drag_info.last_frame_position, 10); show_verbose_time_cursor (drag_info.last_frame_position, 10);
begin_reversible_command (_("move region(s)")); begin_reversible_command (_("move region(s)"));
/*
the group containing moved regions may have been
offset during autoscroll. reset its y offset
(we should really handle this in the same way
we do with the x axis, but a simple way of achieving that
eludes me right now).
*/
_region_motion_group->property_y() = 0;
/* sync the canvas to what we think is its current state */
track_canvas->update_now();
} }
void void
@ -3133,6 +3146,8 @@ Editor::start_region_copy_grab (ArdourCanvas::Item* item, GdkEvent* event)
drag_info.motion_callback = &Editor::region_drag_motion_callback; drag_info.motion_callback = &Editor::region_drag_motion_callback;
drag_info.finished_callback = &Editor::region_drag_finished_callback; drag_info.finished_callback = &Editor::region_drag_finished_callback;
show_verbose_time_cursor (drag_info.last_frame_position, 10); show_verbose_time_cursor (drag_info.last_frame_position, 10);
_region_motion_group->property_y() = 0;
} }
void void
@ -3181,7 +3196,6 @@ Editor::possibly_copy_regions_during_grab (GdkEvent* event)
vector<RegionView*> new_regionviews; vector<RegionView*> new_regionviews;
for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i) { for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i) {
RegionView* rv; RegionView* rv;
RegionView* nrv; RegionView* nrv;
@ -3197,7 +3211,7 @@ Editor::possibly_copy_regions_during_grab (GdkEvent* event)
} else { } else {
continue; continue;
} }
const boost::shared_ptr<const Region> original = arv->region(); const boost::shared_ptr<const Region> original = arv->region();
boost::shared_ptr<Region> region_copy = RegionFactory::create (original); boost::shared_ptr<Region> region_copy = RegionFactory::create (original);
boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (region_copy); boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (region_copy);
@ -3225,6 +3239,14 @@ Editor::possibly_copy_regions_during_grab (GdkEvent* event)
drag_info.data = new_regionviews.front(); drag_info.data = new_regionviews.front();
swap_grab (new_regionviews.front()->get_canvas_group (), 0, event->motion.time); swap_grab (new_regionviews.front()->get_canvas_group (), 0, event->motion.time);
/*
sync the canvas to what we think is its current state
without it, the canvas seems to
"forget" to update properly after the upcoming reparent()
..only if the mouse is in rapid motion at the time of the grab.
something to do with regionview creation raking so long?
*/
track_canvas->update_now();
} }
} }
@ -3344,7 +3366,7 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
} }
original_pointer_order = drag_info.dest_trackview->order; original_pointer_order = drag_info.dest_trackview->order;
/************************************************************ /************************************************************
Y-Delta Computation Y-Delta Computation
************************************************************/ ************************************************************/
@ -3427,6 +3449,8 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
rv2->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2); rv2->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
rv2->get_canvas_group()->i2w (ix1, iy1); rv2->get_canvas_group()->i2w (ix1, iy1);
iy1 += vertical_adjustment.get_value() - canvas_timebars_vsize;
TimeAxisView* tvp2 = trackview_by_y_position (iy1); TimeAxisView* tvp2 = trackview_by_y_position (iy1);
RouteTimeAxisView* rtv2 = dynamic_cast<RouteTimeAxisView*>(tvp2); RouteTimeAxisView* rtv2 = dynamic_cast<RouteTimeAxisView*>(tvp2);
@ -3512,10 +3536,9 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
/* compute the amount of pointer motion in frames, and where /* compute the amount of pointer motion in frames, and where
the region would be if we moved it by that much. the region would be if we moved it by that much.
*/ */
if ( drag_info.move_threshold_passed ) { if ( drag_info.move_threshold_passed ) {
if (drag_info.current_pointer_frame > drag_info.pointer_frame_offset) { if (drag_info.current_pointer_frame >= drag_info.pointer_frame_offset) {
nframes64_t sync_frame; nframes64_t sync_frame;
nframes64_t sync_offset; nframes64_t sync_offset;
@ -3550,7 +3573,7 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
if (pending_region_position > max_frames - rv->region()->length()) { if (pending_region_position > max_frames - rv->region()->length()) {
pending_region_position = drag_info.last_frame_position; pending_region_position = drag_info.last_frame_position;
} }
// printf ("3: pending_region_position= %lu %lu\n", pending_region_position, drag_info.last_frame_position ); // printf ("3: pending_region_position= %lu %lu\n", pending_region_position, drag_info.last_frame_position );
bool x_move_allowed; bool x_move_allowed;
@ -3566,7 +3589,7 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
x_move_allowed = !drag_info.x_constrained; x_move_allowed = !drag_info.x_constrained;
} }
if ( pending_region_position != drag_info.last_frame_position && x_move_allowed ) { if (( pending_region_position != drag_info.last_frame_position) && x_move_allowed ) {
/* now compute the canvas unit distance we need to move the regionview /* now compute the canvas unit distance we need to move the regionview
to make it appear at the new location. to make it appear at the new location.
@ -3576,10 +3599,29 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
x_delta = ((double) (pending_region_position - drag_info.last_frame_position) / frames_per_unit); x_delta = ((double) (pending_region_position - drag_info.last_frame_position) / frames_per_unit);
} else { } else {
x_delta = -((double) (drag_info.last_frame_position - pending_region_position) / frames_per_unit); x_delta = -((double) (drag_info.last_frame_position - pending_region_position) / frames_per_unit);
} for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i) {
RegionView* rv2 = (*i);
// If any regionview is at zero, we need to know so we can stop further leftward motion.
double ix1, ix2, iy1, iy2;
rv2->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
rv2->get_canvas_group()->i2w (ix1, iy1);
if (-x_delta > ix1 + horizontal_adjustment.get_value()) {
// do_move = false;
cerr << "illegal move" << endl;
x_delta = 0;
pending_region_position = drag_info.last_frame_position;
break;
}
}
}
drag_info.last_frame_position = pending_region_position; drag_info.last_frame_position = pending_region_position;
} else { } else {
x_delta = 0; x_delta = 0;
} }
@ -3599,41 +3641,16 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
trackviews. nothing to do. trackviews. nothing to do.
*/ */
return; return;
}
if (x_delta < 0) {
for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i) {
RegionView* rv2 = (*i);
// If any regionview is at zero, we need to know so we can stop further leftward motion.
double ix1, ix2, iy1, iy2;
rv2->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
rv2->get_canvas_group()->i2w (ix1, iy1);
if (ix1 <= 1) {
x_delta = 0;
break;
}
}
} }
/************************************************************* /*************************************************************
MOTION MOTION
************************************************************/ ************************************************************/
bool do_move = true;
bool do_move;
if (drag_info.first_move) { if (drag_info.first_move) {
if (drag_info.move_threshold_passed) { if (!drag_info.move_threshold_passed) {
do_move = true;
} else {
do_move = false; do_move = false;
} }
} else {
do_move = true;
} }
if (do_move) { if (do_move) {
@ -3658,6 +3675,30 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
rv->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2); rv->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
rv->get_canvas_group()->i2w (ix1, iy1); rv->get_canvas_group()->i2w (ix1, iy1);
if (drag_info.first_move) {
// hide any dependent views
rv->get_time_axis_view().hide_dependent_views (*rv);
/*
reparent to a non scrolling group so that we can keep the
region selection above all time axis views.
reparenting means we have to move the rv as the two
parent groups have different coordinates.
*/
rv->get_canvas_group()->property_y() = iy1 - 1;
rv->get_canvas_group()->reparent(*_region_motion_group);
rv->fake_set_opaque (true);
}
/* for evaluation of the track position of iy1, we have to adjust
to allow for the vertical scrolling adjustment and the height of the timebars.
*/
iy1 += vertical_adjustment.get_value() - canvas_timebars_vsize;
TimeAxisView* tvp2 = trackview_by_y_position (iy1); TimeAxisView* tvp2 = trackview_by_y_position (iy1);
RouteTimeAxisView* canvas_rtv = dynamic_cast<RouteTimeAxisView*>(tvp2); RouteTimeAxisView* canvas_rtv = dynamic_cast<RouteTimeAxisView*>(tvp2);
RouteTimeAxisView* temp_rtv; RouteTimeAxisView* temp_rtv;
@ -3720,7 +3761,6 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
} }
} }
/* prevent the regionview from being moved to before /* prevent the regionview from being moved to before
the zero position on the canvas. the zero position on the canvas.
*/ */
@ -3734,30 +3774,10 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
x_delta = max_frames - rv->region()->last_frame(); x_delta = max_frames - rv->region()->last_frame();
} }
if (drag_info.first_move) {
/* hide any dependent views */
rv->get_time_axis_view().hide_dependent_views (*rv);
/* this is subtle. raising the regionview itself won't help,
because raise_to_top() just puts the item on the top of
its parent's stack. so, we need to put the trackview canvas_display group
on the top, since its parent is the whole canvas.
*/
rv->get_canvas_group()->raise_to_top();
rv->get_time_axis_view().canvas_display->raise_to_top();
cursor_group->raise_to_top();
rv->fake_set_opaque (true);
}
if (drag_info.brushing) { if (drag_info.brushing) {
mouse_brush_insert_region (rv, pending_region_position); mouse_brush_insert_region (rv, pending_region_position);
} else { } else {
rv->move (x_delta, y_delta); rv->move (x_delta, y_delta);
} }
} /* foreach region */ } /* foreach region */
@ -3785,7 +3805,9 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
vector<RegionView*> new_selection; vector<RegionView*> new_selection;
typedef set<boost::shared_ptr<Playlist> > PlaylistSet; typedef set<boost::shared_ptr<Playlist> > PlaylistSet;
PlaylistSet modified_playlists; PlaylistSet modified_playlists;
pair<PlaylistSet::iterator,bool> insert_result; PlaylistSet frozen_playlists;
list <sigc::connection> modified_playlist_connections;
pair<PlaylistSet::iterator,bool> insert_result, frozen_insert_result;
/* first_move is set to false if the regionview has been moved in the /* first_move is set to false if the regionview has been moved in the
motion handler. motion handler.
@ -3798,11 +3820,12 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
nocommit = false; nocommit = false;
/* The regionview has been moved at some stage during the grab so we need /* XXX is this true??? i can''t tell the difference.
The regionview has been moved at some stage during the grab so we need
to account for any mouse movement between this event and the last one. to account for any mouse movement between this event and the last one.
*/ */
region_drag_motion_callback (item, event); //region_drag_motion_callback (item, event);
if (Config->get_edit_mode() == Splice && !pre_drag_region_selection.empty()) { if (Config->get_edit_mode() == Splice && !pre_drag_region_selection.empty()) {
selection->set (pre_drag_region_selection); selection->set (pre_drag_region_selection);
@ -3853,11 +3876,12 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
double ix1, ix2, iy1, iy2; double ix1, ix2, iy1, iy2;
rv->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2); rv->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
rv->get_canvas_group()->i2w (ix1, iy1); rv->get_canvas_group()->i2w (ix1, iy1);
iy1 += vertical_adjustment.get_value() - canvas_timebars_vsize;
TimeAxisView* dest_tv = trackview_by_y_position (iy1); TimeAxisView* dest_tv = trackview_by_y_position (iy1);
RouteTimeAxisView* dest_rtv = dynamic_cast<RouteTimeAxisView*>(dest_tv); RouteTimeAxisView* dest_rtv = dynamic_cast<RouteTimeAxisView*>(dest_tv);
double speed; double speed;
bool changed_tracks; bool changed_tracks, changed_position;
bool changed_position;
nframes64_t where; nframes64_t where;
if (rv->region()->locked()) { if (rv->region()->locked()) {
@ -3877,24 +3901,26 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
changed_tracks = (dest_tv != &rv->get_time_axis_view()); changed_tracks = (dest_tv != &rv->get_time_axis_view());
if (changed_position && !drag_info.x_constrained) { if (changed_position && !drag_info.x_constrained) {
_master_group->w2i(ix1, iy1);
where = (nframes64_t) (unit_to_frame (ix1) * speed); where = (nframes64_t) (unit_to_frame (ix1) * speed);
} else { } else {
where = rv->region()->position(); where = rv->region()->position();
} }
/* undo the previous hide_dependent_views so that xfades don't
disappear on copying regions
*/
rv->get_time_axis_view().reveal_dependent_views (*rv);
boost::shared_ptr<Region> new_region; boost::shared_ptr<Region> new_region;
if (drag_info.copy) { if (drag_info.copy) {
/* we already made a copy */ /* we already made a copy */
new_region = rv->region(); new_region = rv->region();
} else {
/* undo the previous hide_dependent_views so that xfades don't
disappear on copying regions
*/
//rv->get_time_axis_view().reveal_dependent_views (*rv);
} else if (changed_tracks) {
new_region = RegionFactory::create (rv->region()); new_region = RegionFactory::create (rv->region());
} }
@ -3908,7 +3934,7 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
insert_result = modified_playlists.insert (to_playlist); insert_result = modified_playlists.insert (to_playlist);
if (insert_result.second) { if (insert_result.second) {
session->add_command (new MementoCommand<Playlist>(*to_playlist, &to_playlist->get_state(), 0)); session->add_command (new MementoCommand<Playlist>(*to_playlist, &to_playlist->get_state(), 0));
} }
to_playlist->add_region (new_region, where); to_playlist->add_region (new_region, where);
@ -3917,19 +3943,33 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
if (!latest_regionviews.empty()) { if (!latest_regionviews.empty()) {
// XXX why just the first one ? we only expect one // XXX why just the first one ? we only expect one
dest_rtv->reveal_dependent_views (*latest_regionviews.front()); // commented out in nick_m's canvas reworking. is that intended?
//dest_atv->reveal_dependent_views (*latest_regionviews.front());
new_selection.push_back (latest_regionviews.front()); new_selection.push_back (latest_regionviews.front());
} }
} else { } else {
/*
motion on the same track. plonk the previously reparented region
back to its original canvas group (its streamview).
No need to do anything for copies as they are fake regions which will be deleted.
*/
rv->get_canvas_group()->reparent (*dest_rtv->view()->canvas_item());
rv->get_canvas_group()->property_y() = 0;
/* just change the model */ /* just change the model */
boost::shared_ptr<Playlist> playlist = dest_rtv->playlist(); boost::shared_ptr<Playlist> playlist = dest_rtv->playlist();
insert_result = modified_playlists.insert (playlist); insert_result = modified_playlists.insert (playlist);
if (insert_result.second) { if (insert_result.second) {
session->add_command (new MementoCommand<Playlist>(*playlist, &playlist->get_state(), 0)); 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);
if (frozen_insert_result.second) {
playlist->freeze();
} }
rv->region()->set_position (where, (void*) this); rv->region()->set_position (where, (void*) this);
@ -3960,7 +4000,7 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
insert_result = modified_playlists.insert (from_playlist); insert_result = modified_playlists.insert (from_playlist);
if (insert_result.second) { if (insert_result.second) {
session->add_command (new MementoCommand<Playlist>(*from_playlist, &from_playlist->get_state(), 0)); session->add_command (new MementoCommand<Playlist>(*from_playlist, &from_playlist->get_state(), 0));
} }
from_playlist->remove_region ((rv->region())); from_playlist->remove_region ((rv->region()));
@ -3996,7 +4036,6 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
copies.push_back (rv); copies.push_back (rv);
} }
} }
if (new_selection.empty()) { if (new_selection.empty()) {
if (drag_info.copy) { if (drag_info.copy) {
@ -4012,6 +4051,10 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
*/ */
selection->set (new_selection); selection->set (new_selection);
} }
for (set<boost::shared_ptr<Playlist> >::iterator p = frozen_playlists.begin(); p != frozen_playlists.end(); ++p) {
(*p)->thaw();
}
out: out:
if (!nocommit) { if (!nocommit) {
@ -4024,6 +4067,7 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
for (vector<RegionView*>::iterator x = copies.begin(); x != copies.end(); ++x) { for (vector<RegionView*>::iterator x = copies.begin(); x != copies.end(); ++x) {
delete *x; delete *x;
} }
} }
void void
@ -4167,7 +4211,7 @@ Editor::show_verbose_time_cursor (nframes64_t frame, double offset, double xpos,
set_verbose_canvas_cursor (buf, xpos + offset, ypos + offset); set_verbose_canvas_cursor (buf, xpos + offset, ypos + offset);
} }
else { else {
set_verbose_canvas_cursor (buf, drag_info.current_pointer_x + offset, drag_info.current_pointer_y + offset); set_verbose_canvas_cursor (buf, drag_info.current_pointer_x + offset - horizontal_adjustment.get_value(), drag_info.current_pointer_y + offset - vertical_adjustment.get_value() + canvas_timebars_vsize);
} }
show_verbose_canvas_cursor (); show_verbose_canvas_cursor ();
} }
@ -5088,7 +5132,7 @@ Editor::drag_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event)
update_marker_drag_item (temp_location); update_marker_drag_item (temp_location);
range_marker_drag_rect->show(); range_marker_drag_rect->show();
range_marker_drag_rect->raise_to_top(); //range_marker_drag_rect->raise_to_top();
} }
break; break;
@ -5369,8 +5413,7 @@ Editor::end_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event)
if (drag_info.current_pointer_y < drag_info.grab_y) { if (drag_info.current_pointer_y < drag_info.grab_y) {
y1 = drag_info.current_pointer_y; y1 = drag_info.current_pointer_y;
y2 = drag_info.grab_y; y2 = drag_info.grab_y;
} } else {
else {
y2 = drag_info.current_pointer_y; y2 = drag_info.current_pointer_y;
y1 = drag_info.grab_y; y1 = drag_info.grab_y;
} }
@ -5478,18 +5521,18 @@ Editor::end_time_fx (ArdourCanvas::Item* item, GdkEvent* event)
nframes64_t newlen = drag_info.last_pointer_frame - clicked_regionview->region()->position(); nframes64_t newlen = drag_info.last_pointer_frame - clicked_regionview->region()->position();
float percentage = (double) newlen / (double) clicked_regionview->region()->length(); float percentage = (double) newlen / (double) clicked_regionview->region()->length();
#ifndef USE_RUBBERBAND #ifndef USE_RUBBERBAND
// Soundtouch uses percentage / 100 instead of normal (/ 1) // Soundtouch uses percentage / 100 instead of normal (/ 1)
if (clicked_regionview->region()->data_type() == DataType::AUDIO) { if (clicked_regionview->region()->data_type() == DataType::AUDIO) {
percentage = (float) ((double) newlen - (double) clicked_regionview->region()->length()) / ((double) newlen) * 100.0f; percentage = (float) ((double) newlen - (double) clicked_regionview->region()->length()) / ((double) newlen) * 100.0f;
#endif
} }
#endif
begin_reversible_command (_("timestretch")); begin_reversible_command (_("timestretch"));
// XXX how do timeFX on multiple regions ? // XXX how do timeFX on multiple regions ?
RegionSelection rs; RegionSelection rs;
rs.add (clicked_regionview); rs.add (clicked_regionview);

View file

@ -1549,7 +1549,7 @@ Editor::scroll_tracks_down_line ()
{ {
Gtk::Adjustment* adj = edit_vscrollbar.get_adjustment(); Gtk::Adjustment* adj = edit_vscrollbar.get_adjustment();
double vert_value = adj->get_value() + 20; double vert_value = adj->get_value() + 60;
if (vert_value>adj->get_upper() - canvas_height) { if (vert_value>adj->get_upper() - canvas_height) {
vert_value = adj->get_upper() - canvas_height; vert_value = adj->get_upper() - canvas_height;
@ -1561,7 +1561,7 @@ void
Editor::scroll_tracks_up_line () Editor::scroll_tracks_up_line ()
{ {
Gtk::Adjustment* adj = edit_vscrollbar.get_adjustment(); Gtk::Adjustment* adj = edit_vscrollbar.get_adjustment();
adj->set_value (adj->get_value() - 20); adj->set_value (adj->get_value() - 60);
} }
/* ZOOM */ /* ZOOM */
@ -1875,8 +1875,9 @@ Editor::temporal_zoom_by_frame (nframes64_t start, nframes64_t end, const string
void void
Editor::temporal_zoom_to_frame (bool coarser, nframes64_t frame) Editor::temporal_zoom_to_frame (bool coarser, nframes64_t frame)
{ {
if (!session) return; if (!session) {
return;
}
double range_before = frame - leftmost_frame; double range_before = frame - leftmost_frame;
double new_fpu; double new_fpu;
@ -1890,12 +1891,15 @@ Editor::temporal_zoom_to_frame (bool coarser, nframes64_t frame)
range_before /= 1.61803399; range_before /= 1.61803399;
} }
if (new_fpu == frames_per_unit) return; if (new_fpu == frames_per_unit) {
return;
}
nframes64_t new_leftmost = frame - (nframes64_t)range_before; nframes64_t new_leftmost = frame - (nframes64_t)range_before;
if (new_leftmost > frame) new_leftmost = 0; if (new_leftmost > frame) {
new_leftmost = 0;
}
// begin_reversible_command (_("zoom to frame")); // begin_reversible_command (_("zoom to frame"));
// session->add_undo (bind (mem_fun(*this, &Editor::reposition_and_zoom), leftmost_frame, frames_per_unit)); // session->add_undo (bind (mem_fun(*this, &Editor::reposition_and_zoom), leftmost_frame, frames_per_unit));
// session->add_redo (bind (mem_fun(*this, &Editor::reposition_and_zoom), new_leftmost, new_fpu)); // session->add_redo (bind (mem_fun(*this, &Editor::reposition_and_zoom), new_leftmost, new_fpu));
@ -2213,8 +2217,8 @@ Editor::insert_region_list_drag (boost::shared_ptr<Region> region, int x, int y)
boost::shared_ptr<Playlist> playlist; boost::shared_ptr<Playlist> playlist;
track_canvas->window_to_world (x, y, wx, wy); track_canvas->window_to_world (x, y, wx, wy);
wx += horizontal_adjustment.get_value(); //wx += horizontal_adjustment.get_value();
wy += vertical_adjustment.get_value(); //wy += vertical_adjustment.get_value();
GdkEvent event; GdkEvent event;
event.type = GDK_BUTTON_RELEASE; event.type = GDK_BUTTON_RELEASE;
@ -6038,7 +6042,6 @@ Editor::fit_tracks ()
first_y_pos = std::min ((*t)->y_position, first_y_pos); first_y_pos = std::min ((*t)->y_position, first_y_pos);
} }
vertical_adjustment.set_value (first_y_pos); vertical_adjustment.set_value (first_y_pos);
redo_visual_stack.push_back (current_visual_state()); redo_visual_stack.push_back (current_visual_state());

View file

@ -140,8 +140,8 @@ Editor::add_region_to_region_display (boost::shared_ptr<Region> region)
for (i = rows.begin(); i != rows.end(); ++i) { for (i = rows.begin(); i != rows.end(); ++i) {
boost::shared_ptr<Region> rr = (*i)[region_list_columns.region]; boost::shared_ptr<Region> rr = (*i)[region_list_columns.region];
if (region->region_list_equivalent (rr)) { if (rr && region->region_list_equivalent (rr)) {
return; return;
} }
} }

View file

@ -364,7 +364,7 @@ Editor::redisplay_route_list ()
cursor_group->raise_to_top (); cursor_group->raise_to_top ();
reset_scrolling_region (); //reset_scrolling_region ();
if (Config->get_sync_all_route_ordering() && !ignore_route_list_reorder) { if (Config->get_sync_all_route_ordering() && !ignore_route_list_reorder) {
ignore_route_order_sync = true; ignore_route_order_sync = true;
@ -401,7 +401,7 @@ Editor::hide_all_tracks (bool with_select)
otherwise. otherwise.
*/ */
reset_scrolling_region (); //reset_scrolling_region ();
} }
void void
@ -625,7 +625,9 @@ void
Editor::route_list_delete (const Gtk::TreeModel::Path& path) Editor::route_list_delete (const Gtk::TreeModel::Path& path)
{ {
session->set_remote_control_ids(); session->set_remote_control_ids();
ignore_route_list_reorder = true;
redisplay_route_list (); redisplay_route_list ();
ignore_route_list_reorder = false;
} }
void void

View file

@ -88,7 +88,7 @@ Editor::initialize_rulers ()
minsec_ruler->set_size_request (-1, (int)timebar_height); minsec_ruler->set_size_request (-1, (int)timebar_height);
gtk_custom_ruler_set_metric (GTK_CUSTOM_RULER(_minsec_ruler), &ruler_metrics[ruler_metric_minsec]); gtk_custom_ruler_set_metric (GTK_CUSTOM_RULER(_minsec_ruler), &ruler_metrics[ruler_metric_minsec]);
visible_timebars = 7; /* 4 here, 3 in time_canvas */ visible_timebars = 1; /*this will be changed below */
ruler_pressed_button = 0; ruler_pressed_button = 0;
} }
@ -559,7 +559,9 @@ Editor::update_ruler_visibility ()
{ {
using namespace Box_Helpers; using namespace Box_Helpers;
BoxList & lab_children = time_button_vbox.children(); BoxList & lab_children = time_button_vbox.children();
BoxList & ruler_lab_children = ruler_label_vbox.children();
BoxList & ruler_children = time_canvas_vbox.children(); BoxList & ruler_children = time_canvas_vbox.children();
int visible_rulers = 0;
if (no_ruler_shown_update) { if (no_ruler_shown_update) {
return; return;
@ -568,9 +570,10 @@ Editor::update_ruler_visibility ()
visible_timebars = 0; visible_timebars = 0;
lab_children.clear(); lab_children.clear();
ruler_lab_children.clear();
// leave the last one (the time_canvas) intact // leave the last one (the time_canvas) intact
while (ruler_children.size() > 1) { while (ruler_children.size() > 0) {
ruler_children.pop_front(); ruler_children.pop_front();
} }
@ -628,31 +631,32 @@ Editor::update_ruler_visibility ()
ruler_children.insert (canvaspos, Element(*_ruler_separator, PACK_SHRINK, PACK_START)); ruler_children.insert (canvaspos, Element(*_ruler_separator, PACK_SHRINK, PACK_START));
if (ruler_minsec_action->get_active()) { if (ruler_minsec_action->get_active()) {
lab_children.push_back (Element(minsec_label, PACK_SHRINK, PACK_START)); ruler_lab_children.push_back (Element(minsec_label, PACK_SHRINK, PACK_START));
ruler_children.insert (canvaspos, Element(*minsec_ruler, PACK_SHRINK, PACK_START)); ruler_children.insert (canvaspos, Element(*minsec_ruler, PACK_SHRINK, PACK_START));
visible_timebars++; visible_rulers++;
} }
if (ruler_timecode_action->get_active()) { if (ruler_timecode_action->get_active()) {
lab_children.push_back (Element(smpte_label, PACK_SHRINK, PACK_START)); ruler_lab_children.push_back (Element(smpte_label, PACK_SHRINK, PACK_START));
ruler_children.insert (canvaspos, Element(*smpte_ruler, PACK_SHRINK, PACK_START)); ruler_children.insert (canvaspos, Element(*smpte_ruler, PACK_SHRINK, PACK_START));
visible_timebars++; visible_rulers++;
} }
if (ruler_samples_action->get_active()) { if (ruler_samples_action->get_active()) {
lab_children.push_back (Element(frame_label, PACK_SHRINK, PACK_START)); ruler_lab_children.push_back (Element(frame_label, PACK_SHRINK, PACK_START));
ruler_children.insert (canvaspos, Element(*frames_ruler, PACK_SHRINK, PACK_START)); ruler_children.insert (canvaspos, Element(*frames_ruler, PACK_SHRINK, PACK_START));
visible_timebars++; visible_rulers++;
} }
if (ruler_bbt_action->get_active()) { if (ruler_bbt_action->get_active()) {
lab_children.push_back (Element(bbt_label, PACK_SHRINK, PACK_START)); ruler_lab_children.push_back (Element(bbt_label, PACK_SHRINK, PACK_START));
ruler_children.insert (canvaspos, Element(*bbt_ruler, PACK_SHRINK, PACK_START)); ruler_children.insert (canvaspos, Element(*bbt_ruler, PACK_SHRINK, PACK_START));
visible_timebars++; visible_rulers++;
} }
double tbpos = 1.0; double tbpos = 0.0;
double old_unit_pos ; double tbgpos = 0.0;
double old_unit_pos;
if (ruler_meter_action->get_active()) { if (ruler_meter_action->get_active()) {
lab_children.push_back (Element(meter_label, PACK_SHRINK, PACK_START)); lab_children.push_back (Element(meter_label, PACK_SHRINK, PACK_START));
@ -661,11 +665,17 @@ Editor::update_ruler_visibility ()
if (tbpos != old_unit_pos) { if (tbpos != old_unit_pos) {
meter_group->move ( 0.0, tbpos - old_unit_pos); meter_group->move ( 0.0, tbpos - old_unit_pos);
} }
old_unit_pos = meter_bar_group->property_y();
if (tbgpos != old_unit_pos) {
meter_bar_group->move ( 0.0, tbgpos - old_unit_pos);
}
meter_bar_group->show();
meter_group->show(); meter_group->show();
tbpos += timebar_height; tbpos += timebar_height;
tbgpos += timebar_height;
visible_timebars++; visible_timebars++;
} } else {
else { meter_bar_group->hide();
meter_group->hide(); meter_group->hide();
} }
@ -675,11 +685,17 @@ Editor::update_ruler_visibility ()
if (tbpos != old_unit_pos) { if (tbpos != old_unit_pos) {
tempo_group->move(0.0, tbpos - old_unit_pos); tempo_group->move(0.0, tbpos - old_unit_pos);
} }
old_unit_pos = tempo_bar_group->property_y();
if (tbgpos != old_unit_pos) {
tempo_bar_group->move ( 0.0, tbgpos - old_unit_pos);
}
tempo_bar_group->show();
tempo_group->show(); tempo_group->show();
tbpos += timebar_height; tbpos += timebar_height;
tbgpos += timebar_height;
visible_timebars++; visible_timebars++;
} } else {
else { tempo_bar_group->hide();
tempo_group->hide(); tempo_group->hide();
} }
@ -689,10 +705,17 @@ Editor::update_ruler_visibility ()
if (tbpos != old_unit_pos) { if (tbpos != old_unit_pos) {
range_marker_group->move (0.0, tbpos - old_unit_pos); range_marker_group->move (0.0, tbpos - old_unit_pos);
} }
old_unit_pos = range_marker_bar_group->property_y();
if (tbgpos != old_unit_pos) {
range_marker_bar_group->move (0.0, tbgpos - old_unit_pos);
}
range_marker_bar_group->show();
range_marker_group->show(); range_marker_group->show();
tbpos += timebar_height; tbpos += timebar_height;
tbgpos += timebar_height;
visible_timebars++; visible_timebars++;
} else { } else {
range_marker_bar_group->hide();
range_marker_group->hide(); range_marker_group->hide();
} }
@ -702,11 +725,17 @@ Editor::update_ruler_visibility ()
if (tbpos != old_unit_pos) { if (tbpos != old_unit_pos) {
transport_marker_group->move ( 0.0, tbpos - old_unit_pos); transport_marker_group->move ( 0.0, tbpos - old_unit_pos);
} }
old_unit_pos = transport_marker_bar_group->property_y();
if (tbgpos != old_unit_pos) {
transport_marker_bar_group->move ( 0.0, tbgpos - old_unit_pos);
}
transport_marker_bar_group->show();
transport_marker_group->show(); transport_marker_group->show();
tbpos += timebar_height; tbpos += timebar_height;
tbgpos += timebar_height;
visible_timebars++; visible_timebars++;
} } else {
else { transport_marker_bar_group->hide();
transport_marker_group->hide(); transport_marker_group->hide();
} }
@ -716,13 +745,19 @@ Editor::update_ruler_visibility ()
if (tbpos != old_unit_pos) { if (tbpos != old_unit_pos) {
cd_marker_group->move (0.0, tbpos - old_unit_pos); cd_marker_group->move (0.0, tbpos - old_unit_pos);
} }
old_unit_pos = cd_marker_bar_group->property_y();
if (tbgpos != old_unit_pos) {
cd_marker_bar_group->move (0.0, tbgpos - old_unit_pos);
}
cd_marker_bar_group->show();
cd_marker_group->show(); cd_marker_group->show();
tbpos += timebar_height; tbpos += timebar_height;
tbgpos += timebar_height;
visible_timebars++; visible_timebars++;
// make sure all cd markers show up in their respective places // make sure all cd markers show up in their respective places
update_cd_marker_display(); update_cd_marker_display();
} } else {
else { cd_marker_bar_group->hide();
cd_marker_group->hide(); cd_marker_group->hide();
// make sure all cd markers show up in their respective places // make sure all cd markers show up in their respective places
update_cd_marker_display(); update_cd_marker_display();
@ -734,21 +769,42 @@ Editor::update_ruler_visibility ()
if (tbpos != old_unit_pos) { if (tbpos != old_unit_pos) {
marker_group->move ( 0.0, tbpos - old_unit_pos); marker_group->move ( 0.0, tbpos - old_unit_pos);
} }
old_unit_pos = marker_bar_group->property_y();
if (tbgpos != old_unit_pos) {
marker_bar_group->move ( 0.0, tbgpos - old_unit_pos);
}
marker_bar_group->show();
marker_group->show(); marker_group->show();
tbpos += timebar_height; tbpos += timebar_height;
tbgpos += timebar_height;
visible_timebars++; visible_timebars++;
} } else {
else { marker_bar_group->hide();
marker_group->hide(); marker_group->hide();
} }
time_canvas_vbox.set_size_request (-1, (int)(timebar_height * visible_timebars)); gdouble old_canvas_timebars_vsize = canvas_timebars_vsize;
canvas_timebars_vsize = timebar_height * visible_timebars;
gdouble vertical_pos_delta = canvas_timebars_vsize - old_canvas_timebars_vsize;
if (vertical_pos_delta < 0 && (vertical_adjustment.get_value() + canvas_height) >= vertical_adjustment.get_upper()) {
/*if we're at the bottom of the canvas, don't move the _trackview_grooup*/
vertical_adjustment.set_upper(vertical_adjustment.get_upper() + vertical_pos_delta);
} else {
vertical_adjustment.set_upper(vertical_adjustment.get_upper() + vertical_pos_delta);
_trackview_group->move (0, vertical_pos_delta);
}
ruler_label_vbox.set_size_request (-1, (int)(timebar_height * visible_rulers));
time_canvas_vbox.set_size_request (-1,-1);
time_canvas_event_box.queue_resize(); time_canvas_event_box.queue_resize();
compute_fixed_ruler_scale(); compute_fixed_ruler_scale();
update_fixed_rulers(); update_fixed_rulers();
redisplay_tempo (false);
time_canvas_event_box.show_all(); time_canvas_event_box.show_all();
time_button_frame.show_all(); ruler_label_event_box.show_all();
time_button_event_box.show_all();
compute_current_bbt_points (leftmost_frame, leftmost_frame + (nframes64_t)(edit_packer.get_width() * frames_per_unit)); compute_current_bbt_points (leftmost_frame, leftmost_frame + (nframes64_t)(edit_packer.get_width() * frames_per_unit));
compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + (nframes64_t)(edit_packer.get_width() * frames_per_unit)); compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + (nframes64_t)(edit_packer.get_width() * frames_per_unit));
@ -1704,7 +1760,7 @@ Editor::metric_get_frames (GtkCustomRulerMark **marks, gdouble lower, gdouble up
nmarks = 5; nmarks = 5;
*marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks); *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks);
for (n = 0, pos = ilower; n < nmarks; pos += mark_interval, ++n) { for (n = 0, pos = ilower; n < nmarks; pos += mark_interval, ++n) {
snprintf (buf, sizeof(buf), "%u", pos); snprintf (buf, sizeof(buf), "%" PRIi64, pos);
(*marks)[n].label = g_strdup (buf); (*marks)[n].label = g_strdup (buf);
(*marks)[n].position = pos; (*marks)[n].position = pos;
(*marks)[n].style = GtkCustomRulerMarkMajor; (*marks)[n].style = GtkCustomRulerMarkMajor;

View file

@ -171,11 +171,36 @@ Editor::compute_current_bbt_points (nframes_t leftmost, nframes_t rightmost)
current_bbt_points = session->tempo_map().get_points (session->tempo_map().frame_time (previous_beat), session->tempo_map().frame_time (next_beat) + 1); current_bbt_points = session->tempo_map().get_points (session->tempo_map().frame_time (previous_beat), session->tempo_map().frame_time (next_beat) + 1);
} }
ArdourCanvas::SimpleLine *
Editor::get_time_line ()
{
ArdourCanvas::SimpleLine *line;
if (free_measure_lines.empty()) {
line = new ArdourCanvas::SimpleLine (*time_line_group);
used_measure_lines.push_back (line);
} else {
line = free_measure_lines.front();
free_measure_lines.erase (free_measure_lines.begin());
used_measure_lines.push_back (line);
}
return line;
}
void void
Editor::hide_measures () Editor::hide_measures ()
{ {
tempo_lines->hide(); // from old pre-merge 3.0
marker_tempo_lines->hide(); // tempo_lines->hide();
// marker_tempo_lines->hide();
for (TimeLineList::iterator i = used_measure_lines.begin(); i != used_measure_lines.end(); ++i) {
(*i)->hide();
free_measure_lines.push_back (*i);
}
used_measure_lines.clear ();
} }
bool bool
@ -195,16 +220,68 @@ Editor::draw_measures ()
return; return;
} }
tempo_lines->draw(*current_bbt_points, frames_per_unit); TempoMap::BBTPointList::iterator i;
marker_tempo_lines->draw(*current_bbt_points, frames_per_unit); ArdourCanvas::SimpleLine *line;
gdouble xpos;
double beat_density;
uint32_t beats = 0;
uint32_t bars = 0;
uint32_t color;
if (current_bbt_points == 0 || current_bbt_points->empty()) {
return;
}
/* get the first bar spacing */
i = current_bbt_points->end();
i--;
bars = (*i).bar - (*current_bbt_points->begin()).bar;
beats = current_bbt_points->size() - bars;
beat_density = (beats * 10.0f) / track_canvas->get_width ();
if (beat_density > 4.0f) {
/* if the lines are too close together, they become useless
*/
return;
}
for (i = current_bbt_points->begin(); i != current_bbt_points->end(); ++i) {
switch ((*i).type) {
case TempoMap::Bar:
break;
case TempoMap::Beat:
if ((*i).beat == 1) {
color = ARDOUR_UI::config()->canvasvar_MeasureLineBar.get();
} else {
color = ARDOUR_UI::config()->canvasvar_MeasureLineBeat.get();
if (beat_density > 2.0) {
/* only draw beat lines if the gaps between beats are large.
*/
break;
}
}
xpos = frame_to_unit ((nframes64_t) (*i).frame);
line = get_time_line ();
line->property_x1() = xpos;
line->property_x2() = xpos;
line->property_y2() = canvas_height;
line->property_color_rgba() = color;
//line->raise_to_top();
line->show();
break;
}
}
/*time_line_group->raise_to_top();
time_line_group->lower(1);*/
marker_time_line_group->raise_to_top();
//marker_time_line_group->lower(1);
/* the cursors are always on top of everything */ /* the cursors are always on top of everything */
cursor_group->raise_to_top(); //cursor_group->raise_to_top();
return; return;
} }

View file

@ -0,0 +1,113 @@
/*
Copyright (C) 2008 Paul Davis
Author: Dave Robillard
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <ardour/insert.h>
#include <ardour/lv2_plugin.h>
#include "lv2_plugin_ui.h"
using namespace Gtk;
using namespace ARDOUR;
using namespace PBD;
void
LV2PluginUI::lv2_ui_write(LV2UI_Controller controller,
uint32_t port_index,
uint32_t buffer_size,
uint32_t format,
const void* buffer)
{
LV2PluginUI* me = (LV2PluginUI*)controller;
if (*(float*)buffer != me->_values[port_index])
me->_lv2->set_parameter(port_index, *(float*)buffer);
}
void
LV2PluginUI::parameter_changed (uint32_t port_index, float val)
{
if (val != _values[port_index]) {
const LV2UI_Descriptor* ui_desc = slv2_ui_instance_get_descriptor(_inst);
LV2UI_Handle ui_handle = slv2_ui_instance_get_handle(_inst);
if (ui_desc->port_event)
ui_desc->port_event(ui_handle, port_index, 4, 0, &val);
_values[port_index] = val;
}
}
LV2PluginUI::LV2PluginUI (boost::shared_ptr<PluginInsert> pi, boost::shared_ptr<LV2Plugin> lv2p)
: PlugUIBase (pi)
, _lv2(lv2p)
{
_inst = slv2_ui_instantiate(
_lv2->slv2_plugin(), _lv2->slv2_ui(), LV2PluginUI::lv2_ui_write, this,
_lv2->features());
GtkWidget* c_widget = (GtkWidget*)slv2_ui_instance_get_widget(_inst);
_gui_widget = Glib::wrap(c_widget);
_gui_widget->show_all();
pack_start(*_gui_widget, true, true);
uint32_t num_ports = slv2_plugin_get_num_ports(lv2p->slv2_plugin());
_values = new float[num_ports];
for (uint32_t i = 0; i < num_ports; ++i) {
bool ok;
_values[i] = lv2p->nth_parameter(i, ok);
if (ok)
lv2_ui_write(this, i, 4, /* FIXME: format */0, &_values[i]);
}
_lv2->ParameterChanged.connect(mem_fun(*this, &LV2PluginUI::parameter_changed));
}
LV2PluginUI::~LV2PluginUI ()
{
delete[] _values;
// plugin destructor destroys the GUI
}
int
LV2PluginUI::get_preferred_height ()
{
Gtk::Requisition r = size_request();
return r.height;
}
int
LV2PluginUI::get_preferred_width ()
{
Gtk::Requisition r = size_request();
return r.width;
}
int
LV2PluginUI::package (Gtk::Window& win)
{
/* forward configure events to plugin window */
win.signal_configure_event().connect (mem_fun (*this, &LV2PluginUI::configure_handler));
return 0;
}
bool
LV2PluginUI::configure_handler (GdkEventConfigure* ev)
{
cout << "CONFIGURE" << endl;
return false;
}

View file

@ -0,0 +1,76 @@
/*
Copyright (C) 2008 Paul Davis
Author: Dave Robillard
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __ardour_lv2_plugin_ui_h__
#define __ardour_lv2_plugin_ui_h__
#include <vector>
#include <map>
#include <list>
#include <sigc++/signal.h>
#include <gtkmm/widget.h>
#include <ardour_dialog.h>
#include <ardour/types.h>
#include "plugin_ui.h"
#ifdef HAVE_LV2
namespace ARDOUR {
class PluginInsert;
class LV2Plugin;
}
class LV2PluginUI : public PlugUIBase, public Gtk::VBox
{
public:
LV2PluginUI (boost::shared_ptr<ARDOUR::PluginInsert>, boost::shared_ptr<ARDOUR::LV2Plugin>);
~LV2PluginUI ();
gint get_preferred_height ();
gint get_preferred_width ();
bool start_updating(GdkEventAny*) {return false;}
bool stop_updating(GdkEventAny*) {return false;}
int package (Gtk::Window&);
private:
boost::shared_ptr<ARDOUR::LV2Plugin> _lv2;
Gtk::Widget* _gui_widget;
SLV2UIInstance _inst;
float* _values;
static void lv2_ui_write(
LV2UI_Controller controller,
uint32_t port_index,
uint32_t buffer_size,
uint32_t format,
const void* buffer);
void parameter_changed(uint32_t, float);
bool configure_handler (GdkEventConfigure*);
void save_plugin_setting ();
};
#endif // HAVE_LV2
#endif /* __ardour_lv2_plugin_ui_h__ */

View file

@ -18,6 +18,7 @@
*/ */
#include <cstdlib> #include <cstdlib>
#include <signal.h>
#include <sigc++/bind.h> #include <sigc++/bind.h>
#include <gtkmm/settings.h> #include <gtkmm/settings.h>
@ -252,6 +253,7 @@ fixup_bundle_environment ()
path += "/../Resources/gdk-pixbuf.loaders"; path += "/../Resources/gdk-pixbuf.loaders";
setenv ("GDK_PIXBUF_MODULE_FILE", path.c_str(), 1); setenv ("GDK_PIXBUF_MODULE_FILE", path.c_str(), 1);
cerr << "Set GDK_PIXBUF_MODULE_FILE to " << path << endl;
if (getenv ("ARDOUR_WITH_JACK")) { if (getenv ("ARDOUR_WITH_JACK")) {
// JACK driver dir // JACK driver dir
@ -265,6 +267,12 @@ fixup_bundle_environment ()
#endif #endif
static void
sigpipe_handler (int sig)
{
cerr << _("SIGPIPE received - JACK has probably died") << endl;
}
#ifdef VST_SUPPORT #ifdef VST_SUPPORT
/* this is called from the entry point of a wine-compiled /* this is called from the entry point of a wine-compiled
executable that is linked against gtk2_ardour built executable that is linked against gtk2_ardour built
@ -278,9 +286,12 @@ int main (int argc, char *argv[])
{ {
vector<Glib::ustring> null_file_list; vector<Glib::ustring> null_file_list;
cerr << "here we go\n";
#ifdef __APPLE__ #ifdef __APPLE__
fixup_bundle_environment (); fixup_bundle_environment ();
#endif #endif
cerr << "just did it\n";
Glib::thread_init(); Glib::thread_init();
gtk_set_locale (); gtk_set_locale ();
@ -339,6 +350,10 @@ int main (int argc, char *argv[])
PBD::ID::init (); PBD::ID::init ();
if (::signal (SIGPIPE, sigpipe_handler)) {
cerr << _("Cannot install SIGPIPE error handler") << endl;
}
try { try {
ui = new ARDOUR_UI (&argc, &argv); ui = new ARDOUR_UI (&argc, &argv);
} catch (failed_constructor& err) { } catch (failed_constructor& err) {

View file

@ -245,7 +245,7 @@ Marker::Marker (PublicEditor& ed, ArdourCanvas::Group& parent, guint32 rgba, con
mark->property_outline_color_rgba() = rgba; mark->property_outline_color_rgba() = rgba;
mark->property_width_pixels() = 1; mark->property_width_pixels() = 1;
Pango::FontDescription* font = get_font_for_style (N_("MarkerText")); Pango::FontDescription* font = get_font_for_style (N_("MarkerText"));
//cerr << " font->get_size() = " << font->get_size() << " is_absolute = " << pango_font_description_get_size_is_absolute(font->gobj()) << " to_string = " << font->to_string() << endl;
text = new Text (*group); text = new Text (*group);
text->property_font_desc() = *font; text->property_font_desc() = *font;
text->property_text() = annotation.c_str(); text->property_text() = annotation.c_str();

View file

@ -665,7 +665,9 @@ void
Mixer_UI::track_list_delete (const Gtk::TreeModel::Path& path) Mixer_UI::track_list_delete (const Gtk::TreeModel::Path& path)
{ {
session->set_remote_control_ids(); session->set_remote_control_ids();
ignore_route_reorder = true;
redisplay_track_list (); redisplay_track_list ();
ignore_route_reorder = false;
} }
void void

View file

@ -314,7 +314,7 @@ PluginSelector::ladspa_refiller (const std::string& filterstr)
void void
PluginSelector::lv2_refiller (const std::string& filterstr) PluginSelector::lv2_refiller (const std::string& filterstr)
{ {
#ifdef HAVE_SLV2 #ifdef HAVE_LV2
refiller (manager->lv2_plugin_info(), filterstr, "LV2"); refiller (manager->lv2_plugin_info(), filterstr, "LV2");
#endif #endif
} }
@ -520,7 +520,7 @@ PluginSelector::plugin_menu()
#ifdef HAVE_AUDIOUNITS #ifdef HAVE_AUDIOUNITS
all_plugs.insert (all_plugs.end(), manager->au_plugin_info().begin(), manager->au_plugin_info().end()); all_plugs.insert (all_plugs.end(), manager->au_plugin_info().begin(), manager->au_plugin_info().end());
#endif #endif
#ifdef HAVE_SLV2 #ifdef HAVE_LV2
all_plugs.insert (all_plugs.end(), manager->lv2_plugin_info().begin(), manager->lv2_plugin_info().end()); all_plugs.insert (all_plugs.end(), manager->lv2_plugin_info().begin(), manager->lv2_plugin_info().end());
#endif #endif

View file

@ -42,6 +42,10 @@
#ifdef VST_SUPPORT #ifdef VST_SUPPORT
#include <ardour/vst_plugin.h> #include <ardour/vst_plugin.h>
#endif #endif
#ifdef HAVE_LV2
#include <ardour/lv2_plugin.h>
#include "lv2_plugin_ui.h"
#endif
#include <lrdf.h> #include <lrdf.h>
@ -86,6 +90,10 @@ PluginUIWindow::PluginUIWindow (Gtk::Window* win, boost::shared_ptr<PluginInsert
error << _("Eh? LADSPA plugins don't have editors!") << endmsg; error << _("Eh? LADSPA plugins don't have editors!") << endmsg;
break; break;
case ARDOUR::LV2:
have_gui = create_lv2_editor (insert);
break;
default: default:
#ifndef VST_SUPPORT #ifndef VST_SUPPORT
error << _("unknown type of editor-supplying plugin (note: no VST support in this version of ardour)") error << _("unknown type of editor-supplying plugin (note: no VST support in this version of ardour)")
@ -250,6 +258,30 @@ PluginUIWindow::app_activated (bool yn)
#endif #endif
} }
bool
PluginUIWindow::create_lv2_editor(boost::shared_ptr<PluginInsert> insert)
{
#ifndef HAVE_LV2
return false;
#else
boost::shared_ptr<LV2Plugin> vp;
if ((vp = boost::dynamic_pointer_cast<LV2Plugin> (insert->plugin())) == 0) {
error << _("create_lv2_editor called on non-LV2 plugin") << endmsg;
throw failed_constructor ();
} else {
LV2PluginUI* lpu = new LV2PluginUI (insert, vp);
_pluginui = lpu;
add (*lpu);
lpu->package (*this);
}
non_gtk_gui = false;
return true;
#endif
}
bool bool
PluginUIWindow::on_key_press_event (GdkEventKey* event) PluginUIWindow::on_key_press_event (GdkEventKey* event)
{ {

View file

@ -234,6 +234,7 @@ class PluginUIWindow : public Gtk::Window
bool create_vst_editor (boost::shared_ptr<ARDOUR::PluginInsert>); bool create_vst_editor (boost::shared_ptr<ARDOUR::PluginInsert>);
bool create_audiounit_editor (boost::shared_ptr<ARDOUR::PluginInsert>); bool create_audiounit_editor (boost::shared_ptr<ARDOUR::PluginInsert>);
bool create_lv2_editor (boost::shared_ptr<ARDOUR::PluginInsert>);
}; };
#ifdef VST_SUPPORT #ifdef VST_SUPPORT

View file

@ -336,7 +336,12 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulThingWithGoingAway
static const int vertical_spacing; static const int vertical_spacing;
static const int horizontal_spacing; static const int horizontal_spacing;
virtual gdouble get_trackview_group_vertical_offset () const = 0;
virtual ArdourCanvas::Group* get_trackview_group () const = 0;
/// Singleton instance, set up by Editor::Editor() /// Singleton instance, set up by Editor::Editor()
static PublicEditor* _instance; static PublicEditor* _instance;
friend class PluginUIWindow; friend class PluginUIWindow;

View file

@ -230,7 +230,8 @@ RegionView::region_changed (Change what_changed)
*/ */
/* /*
if (what_changed & Region::LayerChanged) { if (what_changed & Region::LayerChanged) {
region_layered (); // this is handled by the playlist i believe
//region_layered ();
} }
*/ */
if (what_changed & Region::LockChanged) { if (what_changed & Region::LockChanged) {
@ -285,7 +286,7 @@ RegionView::region_layered ()
{ {
RouteTimeAxisView *rtv = dynamic_cast<RouteTimeAxisView*>(&get_time_axis_view()); RouteTimeAxisView *rtv = dynamic_cast<RouteTimeAxisView*>(&get_time_axis_view());
assert(rtv); assert(rtv);
rtv->view()->region_layered (this); //rtv->view()->region_layered (this);
} }
void void

View file

@ -266,8 +266,10 @@ SoundFileBox::setup_labels (const ustring& filename)
samplerate.set_name ("NewSessionSR2Label"); samplerate.set_name ("NewSessionSR2Label");
} }
length_clock.set (sf_info.length, true); double src_coef = (double) _session->nominal_frame_rate() / sf_info.samplerate;
timecode_clock.set (sf_info.timecode, true);
length_clock.set (sf_info.length * src_coef + 0.5, true);
timecode_clock.set (sf_info.timecode * src_coef + 0.5, true);
// this is a hack that is fixed in trunk, i think (august 26th, 2007) // this is a hack that is fixed in trunk, i think (august 26th, 2007)

View file

@ -49,7 +49,6 @@ StreamView::StreamView (RouteTimeAxisView& tv, ArdourCanvas::Group* group)
: _trackview (tv) : _trackview (tv)
, owns_canvas_group(group == 0) , owns_canvas_group(group == 0)
, canvas_group(group ? group : new ArdourCanvas::Group(*_trackview.canvas_display)) , canvas_group(group ? group : new ArdourCanvas::Group(*_trackview.canvas_display))
, canvas_rect(new ArdourCanvas::SimpleRect (*canvas_group))
, _samples_per_unit(_trackview.editor.get_current_zoom()) , _samples_per_unit(_trackview.editor.get_current_zoom())
, rec_updating(false) , rec_updating(false)
, rec_active(false) , rec_active(false)
@ -63,11 +62,15 @@ StreamView::StreamView (RouteTimeAxisView& tv, ArdourCanvas::Group* group)
{ {
/* set_position() will position the group */ /* set_position() will position the group */
canvas_rect = new ArdourCanvas::SimpleRect (*canvas_group);
canvas_rect->property_x1() = 0.0; canvas_rect->property_x1() = 0.0;
canvas_rect->property_y1() = 0.0; canvas_rect->property_y1() = 0.0;
canvas_rect->property_x2() = _trackview.editor.frame_to_pixel (max_frames); canvas_rect->property_x2() = _trackview.editor.frame_to_pixel (max_frames - 1);
canvas_rect->property_y2() = (double) tv.current_height(); canvas_rect->property_y2() = (double) tv.current_height();
canvas_rect->property_outline_what() = (guint32) (0x2|0x8); // outline RHS and bottom
// DR-way
// canvas_rect->property_outline_what() = (guint32) (0x2|0x8); // outline RHS and bottom
canvas_rect->property_outline_what() = (guint32) (0x1|0x2|0x8); // outline ends and bottom
// (Fill/Outline colours set in derived classes) // (Fill/Outline colours set in derived classes)
canvas_rect->signal_event().connect (bind (mem_fun (_trackview.editor, &PublicEditor::canvas_stream_view_event), canvas_rect, &_trackview)); canvas_rect->signal_event().connect (bind (mem_fun (_trackview.editor, &PublicEditor::canvas_stream_view_event), canvas_rect, &_trackview));
@ -294,18 +297,12 @@ StreamView::apply_color (Gdk::Color& color, ColorTarget target)
void void
StreamView::region_layered (RegionView* rv) StreamView::region_layered (RegionView* rv)
{ {
/* don't ever leave it at the bottom, since then it doesn't
/* get events - the parent group does instead ...
Currently 'layer' has nothing to do with the desired canvas layer. we need to raise it above the streamview's
For now, ensure that multiple regionviews passed here in groups are canvas_rect, hence the layer+1 here
ordered by 'layer' (lowest to highest). */
rv->get_canvas_group()->raise (rv->region()->layer() + 1);
(see AudioStreamView::redisplay_diskstream ()).
We move them to the top layer as they arrive.
*/
rv->get_canvas_group()->raise_to_top();
} }
void void

View file

@ -74,7 +74,7 @@ public:
void set_layer_display (LayerDisplay); void set_layer_display (LayerDisplay);
ArdourCanvas::Item* canvas_item() { return canvas_group; } ArdourCanvas::Group* canvas_item() { return canvas_group; }
enum ColorTarget { enum ColorTarget {
RegionColor, RegionColor,

View file

@ -83,7 +83,7 @@ TimeAxisView::TimeAxisView (ARDOUR::Session& sess, PublicEditor& ed, TimeAxisVie
need_size_info = false; need_size_info = false;
} }
canvas_display = new Group (*canvas.root(), 0.0, 0.0); canvas_display = new Group (*ed.get_trackview_group (), 0.0, 0.0);
ghost_group = new Group (*canvas_display); ghost_group = new Group (*canvas_display);
ghost_group->lower_to_bottom(); ghost_group->lower_to_bottom();
@ -240,6 +240,7 @@ TimeAxisView::show_at (double y, int& nth, VBox *parent)
*/ */
canvas_display->get_bounds (ix1, iy1, ix2, iy2); canvas_display->get_bounds (ix1, iy1, ix2, iy2);
iy1 += editor.get_trackview_group_vertical_offset ();
Group* pg = canvas_display->property_parent(); Group* pg = canvas_display->property_parent();
pg->i2w (ix1, iy1); pg->i2w (ix1, iy1);

View file

@ -150,7 +150,7 @@ TimeAxisViewItem::init (const string& it_name, double spu, Gdk::Color& base_colo
vestigial_frame = new ArdourCanvas::SimpleRect (*group); vestigial_frame = new ArdourCanvas::SimpleRect (*group);
vestigial_frame->property_x1() = (double) 0.0; vestigial_frame->property_x1() = (double) 0.0;
vestigial_frame->property_y1() = (double) 1.0; vestigial_frame->property_y1() = (double) 1.0;
vestigial_frame->property_x2() = 2.0; vestigial_frame->property_x2() = (double) 2.0;
vestigial_frame->property_y2() = (double) trackview.current_height(); vestigial_frame->property_y2() = (double) trackview.current_height();
vestigial_frame->property_outline_what() = 0xF; vestigial_frame->property_outline_what() = 0xF;
vestigial_frame->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_VestigialFrame.get(); vestigial_frame->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_VestigialFrame.get();
@ -644,7 +644,7 @@ TimeAxisViewItem::get_canvas_frame()
/** /**
* *
*/ */
ArdourCanvas::Item* ArdourCanvas::Group*
TimeAxisViewItem::get_canvas_group() TimeAxisViewItem::get_canvas_group()
{ {
return (group) ; return (group) ;

View file

@ -216,7 +216,7 @@ class TimeAxisViewItem : public Selectable
/** /**
* *
*/ */
ArdourCanvas::Item* get_canvas_group(); ArdourCanvas::Group* get_canvas_group();
/** /**
* *

View file

@ -571,23 +571,21 @@ get_xpm (std::string name)
sys::path data_file_path; sys::path data_file_path;
if (!find_file_in_search_path (spath, name, data_file_path)) { if(!find_file_in_search_path (spath, name, data_file_path)) {
fatal << string_compose (_("cannot find XPM file for %1"), name) << endmsg; fatal << string_compose (_("cannot find XPM file for %1"), name) << endmsg;
/*NOTREACHED*/
} }
try { try {
xpm_map[name] = Gdk::Pixbuf::create_from_file (data_file_path.to_string()); xpm_map[name] = Gdk::Pixbuf::create_from_file (data_file_path.to_string());
} } catch(const Glib::Error& e) {
catch(const Glib::Error& e) {
warning << "Caught Glib::Error: " << e.what() << endmsg; warning << "Caught Glib::Error: " << e.what() << endmsg;
} }
} }
return xpm_map[name]; return xpm_map[name];
} }
Glib::RefPtr<Gdk::Pixbuf> Glib::RefPtr<Gdk::Pixbuf>
get_icon (const char* cname) get_icon (const char* cname)
{ {
@ -608,15 +606,11 @@ get_icon (const char* cname)
Glib::RefPtr<Gdk::Pixbuf> img; Glib::RefPtr<Gdk::Pixbuf> img;
try { try {
img = Gdk::Pixbuf::create_from_file (data_file_path.to_string()); img = Gdk::Pixbuf::create_from_file (data_file_path.to_string());
} catch (const Gdk::PixbufError &e) {
cerr << "Caught PixbufError: " << e.what() << endl;
} catch (...) {
g_message("Caught ... ");
} }
catch (const Gdk::PixbufError &e)
{
cerr << "Caught PixbufError: " << e.what() << endl;
}
catch (...)
{
g_message("Caught ... ");
}
return img; return img;
} }
@ -701,7 +695,7 @@ set_pango_fontsize ()
{ {
long val = ARDOUR::Config->get_font_scale(); long val = ARDOUR::Config->get_font_scale();
/* FT2 rendering */ /* FT2 rendering - used by GnomeCanvas, sigh */
pango_ft2_font_map_set_resolution ((PangoFT2FontMap*) pango_ft2_font_map_for_display(), val/1024, val/1024); pango_ft2_font_map_set_resolution ((PangoFT2FontMap*) pango_ft2_font_map_for_display(), val/1024, val/1024);

View file

@ -60,9 +60,14 @@ class LV2Plugin : public ARDOUR::Plugin
int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const; int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const;
uint32_t nth_parameter (uint32_t port, bool& ok) const; uint32_t nth_parameter (uint32_t port, bool& ok) const;
const void* extension_data(const char* uri) { return _instance->lv2_descriptor->extension_data(uri); }
SLV2Plugin slv2_plugin() { return _plugin; } SLV2Plugin slv2_plugin() { return _plugin; }
SLV2UI slv2_ui() { return _ui; }
SLV2Port slv2_port(uint32_t i) { return slv2_plugin_get_port_by_index(_plugin, i); } SLV2Port slv2_port(uint32_t i) { return slv2_plugin_get_port_by_index(_plugin, i); }
const LV2_Feature* const* features() { return _features; }
std::set<Parameter> automatable() const; std::set<Parameter> automatable() const;
void activate () { void activate () {
@ -104,14 +109,14 @@ class LV2Plugin : public ARDOUR::Plugin
int set_state(const XMLNode& node); int set_state(const XMLNode& node);
bool save_preset(std::string name); bool save_preset(std::string name);
bool has_editor() const { return false; } bool has_editor() const;
int require_output_streams (uint32_t);
private: private:
void* _module; void* _module;
LV2World& _world; LV2World& _world;
LV2_Feature** _features;
SLV2Plugin _plugin; SLV2Plugin _plugin;
SLV2UI _ui;
SLV2Value _name; SLV2Value _name;
SLV2Value _author; SLV2Value _author;
SLV2Instance _instance; SLV2Instance _instance;
@ -123,6 +128,11 @@ class LV2Plugin : public ARDOUR::Plugin
bool _was_activated; bool _was_activated;
vector<bool> _port_is_input; vector<bool> _port_is_input;
typedef struct { const void* (*extension_data)(const char* uri); } LV2_DataAccess;
LV2_DataAccess _data_access_extension_data;
LV2_Feature _data_access_feature;
LV2_Feature _instance_access_feature;
void init (LV2World& world, SLV2Plugin plugin, nframes_t rate); void init (LV2World& world, SLV2Plugin plugin, nframes_t rate);
void run (nframes_t nsamples); void run (nframes_t nsamples);
void latency_compute_run (); void latency_compute_run ();
@ -149,6 +159,7 @@ struct LV2World {
SLV2Value integer; SLV2Value integer;
SLV2Value toggled; SLV2Value toggled;
SLV2Value srate; SLV2Value srate;
SLV2Value gtk_gui;
}; };

View file

@ -217,7 +217,7 @@ class Region : public Automatable, public boost::enable_shared_from_this<Region>
const SourceList& master_sources() const { return _master_sources; } const SourceList& master_sources() const { return _master_sources; }
std::vector<string> master_source_names(); std::vector<string> master_source_names();
void set_master_sources (SourceList&); void set_master_sources (const SourceList&);
/* serialization */ /* serialization */

View file

@ -1081,10 +1081,19 @@ AUPluginInfo::cached_io_configuration (const std::string& unique_id,
ARDOUR::BootMessage (string_compose (_("Checking AudioUnit: %1"), name)); ARDOUR::BootMessage (string_compose (_("Checking AudioUnit: %1"), name));
if (CAAudioUnit::Open (comp, unit) != noErr) { try {
return false;
}
if (CAAudioUnit::Open (comp, unit) != noErr) {
return false;
}
} catch (...) {
warning << string_compose (_("Could not load AU plugin %1 - ignored"), name) << endmsg;
return false;
}
if ((ret = unit.GetChannelInfo (&channel_info, cnt)) < 0) { if ((ret = unit.GetChannelInfo (&channel_info, cnt)) < 0) {
return false; return false;
} }

View file

@ -95,6 +95,7 @@ AudioEngine::~AudioEngine ()
if (_running) { if (_running) {
jack_client_close (_jack); jack_client_close (_jack);
_jack = 0;
} }
stop_metering_thread (); stop_metering_thread ();
@ -121,6 +122,11 @@ _thread_init_callback (void *arg)
int int
AudioEngine::start () AudioEngine::start ()
{ {
if (!_jack) {
error << _("AudioEngine::start() called while disconnected from JACK") << endmsg;
return -1;
}
if (!_running) { if (!_running) {
if (session) { if (session) {
@ -179,17 +185,13 @@ AudioEngine::start ()
int int
AudioEngine::stop (bool forever) AudioEngine::stop (bool forever)
{ {
if (_running) { if (_jack) {
_running = false;
stop_metering_thread ();
if (forever) { if (forever) {
jack_client_t* foo = _jack; disconnect_from_jack ();
_jack = 0;
jack_client_close (foo);
} else { } else {
jack_deactivate (_jack); jack_deactivate (_jack);
Stopped(); /* EMIT SIGNAL */
} }
Stopped(); /* EMIT SIGNAL */
} }
return _running ? -1 : 0; return _running ? -1 : 0;
@ -204,11 +206,13 @@ AudioEngine::get_sync_offset (nframes_t& offset) const
jack_position_t pos; jack_position_t pos;
(void) jack_transport_query (_jack, &pos); if (_jack) {
(void) jack_transport_query (_jack, &pos);
if (pos.valid & JackVideoFrameOffset) {
offset = pos.video_offset; if (pos.valid & JackVideoFrameOffset) {
return true; offset = pos.video_offset;
return true;
}
} }
#endif #endif
@ -252,7 +256,7 @@ int
AudioEngine::_xrun_callback (void *arg) AudioEngine::_xrun_callback (void *arg)
{ {
AudioEngine* ae = static_cast<AudioEngine*> (arg); AudioEngine* ae = static_cast<AudioEngine*> (arg);
if (ae->jack()) { if (ae->connected()) {
ae->Xrun (); /* EMIT SIGNAL */ ae->Xrun (); /* EMIT SIGNAL */
} }
return 0; return 0;
@ -262,7 +266,7 @@ int
AudioEngine::_graph_order_callback (void *arg) AudioEngine::_graph_order_callback (void *arg)
{ {
AudioEngine* ae = static_cast<AudioEngine*> (arg); AudioEngine* ae = static_cast<AudioEngine*> (arg);
if (ae->jack()) { if (ae->connected()) {
ae->GraphReordered (); /* EMIT SIGNAL */ ae->GraphReordered (); /* EMIT SIGNAL */
} }
return 0; return 0;
@ -894,7 +898,8 @@ AudioEngine::halted (void *arg)
ae->_running = false; ae->_running = false;
ae->_buffer_size = 0; ae->_buffer_size = 0;
ae->_frame_rate = 0; ae->_frame_rate = 0;
ae->_jack = 0;
cerr << "!!! HALTED !!!\n";
if (was_running) { if (was_running) {
ae->Halted(); /* EMIT SIGNAL */ ae->Halted(); /* EMIT SIGNAL */
@ -1067,7 +1072,6 @@ AudioEngine::update_total_latency (const Port& port)
void void
AudioEngine::transport_stop () AudioEngine::transport_stop ()
{ {
// cerr << "tell JACK to stop\n";
if (_jack) { if (_jack) {
jack_transport_stop (_jack); jack_transport_stop (_jack);
} }
@ -1211,7 +1215,7 @@ AudioEngine::connect_to_jack (string client_name)
{ {
jack_client_name = client_name; jack_client_name = client_name;
if ((_jack = jack_client_new (client_name.c_str())) == NULL) { if ((_jack = jack_client_new (client_name.c_str())) == 0) {
return -1; return -1;
} }
@ -1223,29 +1227,36 @@ AudioEngine::connect_to_jack (string client_name)
int int
AudioEngine::disconnect_from_jack () AudioEngine::disconnect_from_jack ()
{ {
if (_jack == 0) { if (!_jack) {
return 0; return 0;
} }
jack_client_close (_jack);
if (_running) {
stop_metering_thread ();
}
{
Glib::Mutex::Lock lm (_process_lock);
jack_client_close (_jack);
_jack = 0;
}
_buffer_size = 0; _buffer_size = 0;
_frame_rate = 0; _frame_rate = 0;
if (_running) { if (_running) {
stop_metering_thread ();
_running = false; _running = false;
Stopped(); /* EMIT SIGNAL */ Stopped(); /* EMIT SIGNAL */
} }
_jack = 0;
return 0; return 0;
} }
int int
AudioEngine::reconnect_to_jack () AudioEngine::reconnect_to_jack ()
{ {
if (_jack) { if (_running) {
disconnect_from_jack (); disconnect_from_jack ();
/* XXX give jackd a chance */ /* XXX give jackd a chance */
Glib::usleep (250000); Glib::usleep (250000);
@ -1336,7 +1347,9 @@ void
AudioEngine::update_total_latencies () AudioEngine::update_total_latencies ()
{ {
#ifdef HAVE_JACK_RECOMPUTE_LATENCIES #ifdef HAVE_JACK_RECOMPUTE_LATENCIES
jack_recompute_total_latencies (_jack); if (_jack) {
jack_recompute_total_latencies (_jack);
}
#endif #endif
} }

View file

@ -43,10 +43,11 @@
using namespace std; using namespace std;
using namespace ARDOUR; using namespace ARDOUR;
using namespace PBD; using namespace PBD;
LV2Plugin::LV2Plugin (AudioEngine& e, Session& session, LV2World& world, SLV2Plugin plugin, nframes_t rate) LV2Plugin::LV2Plugin (AudioEngine& e, Session& session, LV2World& world, SLV2Plugin plugin, nframes_t rate)
: Plugin (e, session) : Plugin (e, session)
, _world(world) , _world(world)
, _features(NULL)
{ {
init (world, plugin, rate); init (world, plugin, rate);
} }
@ -54,6 +55,7 @@ LV2Plugin::LV2Plugin (AudioEngine& e, Session& session, LV2World& world, SLV2Plu
LV2Plugin::LV2Plugin (const LV2Plugin &other) LV2Plugin::LV2Plugin (const LV2Plugin &other)
: Plugin (other) : Plugin (other)
, _world(other._world) , _world(other._world)
, _features(NULL)
{ {
init (other._world, other._plugin, other._sample_rate); init (other._world, other._plugin, other._sample_rate);
@ -68,12 +70,13 @@ LV2Plugin::init (LV2World& world, SLV2Plugin plugin, nframes_t rate)
{ {
_world = world; _world = world;
_plugin = plugin; _plugin = plugin;
_ui = NULL;
_control_data = 0; _control_data = 0;
_shadow_data = 0; _shadow_data = 0;
_latency_control_port = 0; _latency_control_port = 0;
_was_activated = false; _was_activated = false;
_instance = slv2_plugin_instantiate(plugin, rate, NULL); _instance = slv2_plugin_instantiate(plugin, rate, _features);
_name = slv2_plugin_get_name(plugin); _name = slv2_plugin_get_name(plugin);
assert(_name); assert(_name);
_author = slv2_plugin_get_author_name(plugin); _author = slv2_plugin_get_author_name(plugin);
@ -90,6 +93,18 @@ LV2Plugin::init (LV2World& world, SLV2Plugin plugin, nframes_t rate)
slv2_value_free(_author); slv2_value_free(_author);
throw failed_constructor(); throw failed_constructor();
} }
_instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access";
_instance_access_feature.data = (void*)_instance->lv2_handle;
_data_access_extension_data.extension_data = _instance->lv2_descriptor->extension_data;
_data_access_feature.URI = "http://lv2plug.in/ns/ext/data-access";
_data_access_feature.data = &_data_access_extension_data;
_features = (LV2_Feature**)malloc(sizeof(LV2_Feature*) * 3);
_features[0] = &_instance_access_feature;
_features[1] = &_data_access_feature;
_features[2] = NULL;
_sample_rate = rate; _sample_rate = rate;
@ -124,6 +139,17 @@ LV2Plugin::init (LV2World& world, SLV2Plugin plugin, nframes_t rate)
_defaults[i] = 0.0f; _defaults[i] = 0.0f;
} }
} }
SLV2UIs uis = slv2_plugin_get_uis(_plugin);
if (slv2_uis_size(uis) > 0) {
for (unsigned i=0; i < slv2_uis_size(uis); ++i) {
SLV2UI ui = slv2_uis_get_at(uis, i);
if (slv2_ui_is_a(ui, _world.gtk_gui)) {
_ui = ui;
break;
}
}
}
latency_compute_run (); latency_compute_run ();
} }
@ -243,6 +269,12 @@ LV2Plugin::save_preset (string name)
{ {
return Plugin::save_preset (name, "lv2"); return Plugin::save_preset (name, "lv2");
} }
bool
LV2Plugin::has_editor() const
{
return (_ui != NULL);
}
int int
LV2Plugin::set_state(const XMLNode& node) LV2Plugin::set_state(const XMLNode& node)
@ -536,6 +568,7 @@ LV2World::LV2World()
integer = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "integer"); integer = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "integer");
toggled = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "toggled"); toggled = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "toggled");
srate = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "sampleRate"); srate = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "sampleRate");
gtk_gui = slv2_value_new_uri(world, "http://lv2plug.in/ns/extensions/ui#GtkUI");
} }
LV2World::~LV2World() LV2World::~LV2World()

View file

@ -60,8 +60,15 @@ RBEffect::~RBEffect ()
} }
int int
RBEffect::run (boost::shared_ptr<AudioRegion> region) RBEffect::run (boost::shared_ptr<Region> r)
{ {
boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (r);
if (!region) {
error << "RBEffect::run() passed a non-audio region! WTF?" << endmsg;
return -1;
}
SourceList nsrcs; SourceList nsrcs;
nframes_t done; nframes_t done;
int ret = -1; int ret = -1;
@ -158,9 +165,6 @@ RBEffect::run (boost::shared_ptr<AudioRegion> region)
stretcher.setExpectedInputDuration(read_duration); stretcher.setExpectedInputDuration(read_duration);
stretcher.setDebugLevel(1); stretcher.setDebugLevel(1);
stretcher.setExpectedInputDuration(duration);
stretcher.setDebugLevel(1);
/* the name doesn't need to be super-precise, but allow for 2 fractional /* the name doesn't need to be super-precise, but allow for 2 fractional
digits just to disambiguate close but not identical FX digits just to disambiguate close but not identical FX
*/ */
@ -288,8 +292,12 @@ RBEffect::run (boost::shared_ptr<AudioRegion> region)
for (uint32_t i = 0; i < nsrcs.size(); ++i) { for (uint32_t i = 0; i < nsrcs.size(); ++i) {
if (nsrcs[i]->write(buffers[i], this_read) != boost::shared_ptr<AudioSource> asrc = boost::dynamic_pointer_cast<AudioSource>(nsrcs[i]);
this_read) { if (!asrc) {
continue;
}
if (asrc->write(buffers[i], this_read) != this_read) {
error << string_compose (_("error writing tempo-adjusted data to %1"), nsrcs[i]->name()) << endmsg; error << string_compose (_("error writing tempo-adjusted data to %1"), nsrcs[i]->name()) << endmsg;
goto out; goto out;
} }
@ -305,7 +313,12 @@ RBEffect::run (boost::shared_ptr<AudioRegion> region)
for (uint32_t i = 0; i < nsrcs.size(); ++i) { for (uint32_t i = 0; i < nsrcs.size(); ++i) {
if (nsrcs[i]->write(buffers[i], this_read) != boost::shared_ptr<AudioSource> asrc = boost::dynamic_pointer_cast<AudioSource>(nsrcs[i]);
if (!asrc) {
continue;
}
if (asrc->write(buffers[i], this_read) !=
this_read) { this_read) {
error << string_compose (_("error writing tempo-adjusted data to %1"), nsrcs[i]->name()) << endmsg; error << string_compose (_("error writing tempo-adjusted data to %1"), nsrcs[i]->name()) << endmsg;
goto out; goto out;
@ -334,14 +347,13 @@ RBEffect::run (boost::shared_ptr<AudioRegion> region)
/* now reset ancestral data for each new region */ /* now reset ancestral data for each new region */
for (vector<boost::shared_ptr<AudioRegion> >::iterator x = results.begin(); x != results.end(); ++x) { for (vector<boost::shared_ptr<Region> >::iterator x = results.begin(); x != results.end(); ++x) {
(*x)->set_ancestral_data (read_start, (*x)->set_ancestral_data (read_start,
read_duration, read_duration,
stretch, stretch,
shift); shift);
(*x)->set_master_sources (region->get_master_sources()); (*x)->set_master_sources (region->master_sources());
} }
out: out:

View file

@ -1406,7 +1406,7 @@ Region::master_source_names ()
} }
void void
Region::set_master_sources (SourceList& srcs) Region::set_master_sources (const SourceList& srcs)
{ {
_master_sources = srcs; _master_sources = srcs;
} }

View file

@ -160,8 +160,12 @@ SndFileSource::SndFileSource (Session& s, ustring path, SampleFormat sfmt, Heade
memset (_broadcast_info, 0, sizeof (*_broadcast_info)); memset (_broadcast_info, 0, sizeof (*_broadcast_info));
snprintf_bounded_null_filled (_broadcast_info->description, sizeof (_broadcast_info->description), "BWF %s", _name.c_str()); snprintf_bounded_null_filled (_broadcast_info->description, sizeof (_broadcast_info->description), "BWF %s", _name.c_str());
snprintf_bounded_null_filled (_broadcast_info->originator, sizeof (_broadcast_info->originator), "ardour %s)", Glib::get_real_name().c_str()); snprintf_bounded_null_filled (_broadcast_info->originator, sizeof (_broadcast_info->originator), "ardour %d.%d.%d %s",
libardour3_major_version,
libardour3_minor_version,
libardour3_micro_version,
Glib::get_real_name().c_str());
_broadcast_info->version = 1; _broadcast_info->version = 1;
_broadcast_info->time_reference_low = 0; _broadcast_info->time_reference_low = 0;
_broadcast_info->time_reference_high = 0; _broadcast_info->time_reference_high = 0;
@ -551,14 +555,14 @@ SndFileSource::setup_broadcast_info (nframes_t when, struct tm& now, time_t tnow
snprintf_bounded_null_filled (_broadcast_info->origination_date, sizeof (_broadcast_info->origination_date), "%4d-%02d-%02d", snprintf_bounded_null_filled (_broadcast_info->origination_date, sizeof (_broadcast_info->origination_date), "%4d-%02d-%02d",
1900 + now.tm_year, 1900 + now.tm_year,
now.tm_mon + 1, // move from 0..11 to 1..12 now.tm_mon + 1, // shift range from 0..11 to 1..12
now.tm_mday); now.tm_mday);
snprintf_bounded_null_filled (_broadcast_info->origination_time, sizeof (_broadcast_info->origination_time), "%02d:%02d:%02d", snprintf_bounded_null_filled (_broadcast_info->origination_time, sizeof (_broadcast_info->origination_time), "%02d:%02d:%02d",
now.tm_hour, now.tm_hour,
now.tm_min, now.tm_min,
now.tm_sec); now.tm_sec);
/* now update header position taking header offset into account */ /* now update header position taking header offset into account */
set_header_timeline_position (); set_header_timeline_position ();

View file

@ -78,6 +78,7 @@ private:
XMLNodeList _children; XMLNodeList _children;
XMLPropertyList _proplist; XMLPropertyList _proplist;
XMLPropertyMap _propmap; XMLPropertyMap _propmap;
mutable XMLNodeList _selected_children;
public: public:
XMLNode(const string& name); XMLNode(const string& name);

View file

@ -278,22 +278,21 @@ XMLNode::children(const string& n) const
{ {
/* returns all children matching name */ /* returns all children matching name */
static XMLNodeList retval;
XMLNodeConstIterator cur; XMLNodeConstIterator cur;
if (n.empty()) { if (n.empty()) {
return _children; return _children;
} }
retval.erase(retval.begin(), retval.end()); _selected_children.clear();
for (cur = _children.begin(); cur != _children.end(); ++cur) { for (cur = _children.begin(); cur != _children.end(); ++cur) {
if ((*cur)->name() == n) { if ((*cur)->name() == n) {
retval.insert(retval.end(), *cur); _selected_children.insert(_selected_children.end(), *cur);
} }
} }
return retval; return _selected_children;
} }
XMLNode * XMLNode *

View file

@ -30,6 +30,7 @@ cp.Append(CCFLAGS="-D_REENTRANT -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE")
cp.Append(CXXFLAGS="-DDATA_DIR=\\\""+final_prefix+"/share\\\"") cp.Append(CXXFLAGS="-DDATA_DIR=\\\""+final_prefix+"/share\\\"")
cp.Append(CXXFLAGS="-DCONFIG_DIR=\\\""+final_config_prefix+"\\\"") cp.Append(CXXFLAGS="-DCONFIG_DIR=\\\""+final_config_prefix+"\\\"")
cp.Append(CXXFLAGS="-DLOCALEDIR=\\\""+final_prefix+"/share/locale\\\"") cp.Append(CXXFLAGS="-DLOCALEDIR=\\\""+final_prefix+"/share/locale\\\"")
cp.Append(CPPPATH = libraries['jack'].get('CPPPATH', []))
cp.Merge ([ cp.Merge ([
libraries['ardour'], libraries['ardour'],

View file

@ -30,6 +30,7 @@ genericmidi.Append(CCFLAGS="-D_REENTRANT -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOUR
genericmidi.Append(CXXFLAGS="-DDATA_DIR=\\\""+final_prefix+"/share\\\"") genericmidi.Append(CXXFLAGS="-DDATA_DIR=\\\""+final_prefix+"/share\\\"")
genericmidi.Append(CXXFLAGS="-DCONFIG_DIR=\\\""+final_config_prefix+"\\\"") genericmidi.Append(CXXFLAGS="-DCONFIG_DIR=\\\""+final_config_prefix+"\\\"")
genericmidi.Append(CXXFLAGS="-DLOCALEDIR=\\\""+final_prefix+"/share/locale\\\"") genericmidi.Append(CXXFLAGS="-DLOCALEDIR=\\\""+final_prefix+"/share/locale\\\"")
genericmidi.Append(CPPPATH = libraries['jack'].get('CPPPATH', []))
genericmidi.Merge ([ genericmidi.Merge ([
libraries['ardour'], libraries['ardour'],

View file

@ -44,6 +44,7 @@ mackie.Append(CCFLAGS="-D_REENTRANT -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE")
mackie.Append(CXXFLAGS="-DDATA_DIR=\\\""+final_prefix+"/share\\\"") mackie.Append(CXXFLAGS="-DDATA_DIR=\\\""+final_prefix+"/share\\\"")
mackie.Append(CXXFLAGS="-DCONFIG_DIR=\\\""+final_config_prefix+"\\\"") mackie.Append(CXXFLAGS="-DCONFIG_DIR=\\\""+final_config_prefix+"\\\"")
mackie.Append(CXXFLAGS="-DLOCALEDIR=\\\""+final_prefix+"/share/locale\\\"") mackie.Append(CXXFLAGS="-DLOCALEDIR=\\\""+final_prefix+"/share/locale\\\"")
mackie.Append(CPPPATH = libraries['jack'].get('CPPPATH', []))
mackie.Merge ([ mackie.Merge ([
libraries['ardour'], libraries['ardour'],

View file

@ -52,6 +52,7 @@ tranzport.Append(CXXFLAGS="-DLOCALEDIR=\\\""+final_prefix+"/share/locale\\\"")
# tranzport.Append(CXXFLAGS="-DHAVE_TRANZPORT_KERNEL_DRIVER=1") # tranzport.Append(CXXFLAGS="-DHAVE_TRANZPORT_KERNEL_DRIVER=1")
#merge more into tranzport files for the right io lib #merge more into tranzport files for the right io lib
tranzport.Append(CPPPATH = libraries['jack'].get('CPPPATH', []))
tranzport.Merge ([ tranzport.Merge ([
libraries['ardour'], libraries['ardour'],

View file

@ -29,6 +29,9 @@ sources = plugin_files
if vampplugs['AUBIO']: if vampplugs['AUBIO']:
sources += aubio_files sources += aubio_files
vampplugs.Merge ([libraries['aubio']]) vampplugs.Merge ([libraries['aubio']])
vampplugs.Merge ([libraries['fftw3f']])
else:
print 'WARNING: some VAMP plugins will not be built because this machine has no AUBIO support'
libvampplugins = vampplugs.SharedLibrary('ardourvampplugins', sources) libvampplugins = vampplugs.SharedLibrary('ardourvampplugins', sources)

View file

@ -1,4 +1,4 @@
#ifndef __ardour_svn_revision_h__ #ifndef __ardour_svn_revision_h__
#define __ardour_svn_revision_h__ #define __ardour_svn_revision_h__
static const char* ardour_svn_revision = "3530"; static const char* ardour_svn_revision = "3581";
#endif #endif

View file

@ -81,7 +81,7 @@ $stdout.print("Copying libs to #{libdir} ...\n");
results.each do |s| results.each do |s|
s = s.split[0] s = s.split[0]
# exclude frameworks, system libraries, X11 libraries, and libjack. # exclude frameworks, system libraries, X11 libraries, and libjack.
unless s =~ /System|\/usr\/lib|\/usr\/X11R6|libjack|:$/ then unless s =~ /System|\/usr\/lib|\/usr\/X11|Jackmp|libjack|:$/ then
#$stdout.print("Copying #{s}\n") #$stdout.print("Copying #{s}\n")
`cp #{s} #{odir}/#{libdir}/` `cp #{s} #{odir}/#{libdir}/`
end end
@ -94,7 +94,7 @@ results.uniq!
results.each do |s| results.each do |s|
s = s.split[0] s = s.split[0]
# exclude frameworks, system libraries, X11 libraries, and libjack. # exclude frameworks, system libraries, X11 libraries, and libjack.
unless s =~ /System|\/usr\/lib|\/usr\/X11R6|libjack|:$/ then unless s =~ /System|\/usr\/lib|\/usr\/X11|Jackmp|libjack|:$/ then
sbase = File.basename(s) sbase = File.basename(s)
targfile = "#{odir}/#{libdir}/#{sbase}" targfile = "#{odir}/#{libdir}/#{sbase}"
#$stdout.print("Targ is : " + targfile + "\n") #$stdout.print("Targ is : " + targfile + "\n")