X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_rulers.cc;h=f6663c3914e52fd28dfd99eab4da1c5a19cbe6c6;hb=39aec8e0ca34feb78be8cc526fa57687b5cbe642;hp=275019e6eb98d009696c3ada757c0ed5f05dd752;hpb=c38fdbc64c73c686f9f55729b352f8d0f4c09070;p=ardour.git diff --git a/gtk2_ardour/editor_rulers.cc b/gtk2_ardour/editor_rulers.cc index 275019e6eb..f6663c3914 100644 --- a/gtk2_ardour/editor_rulers.cc +++ b/gtk2_ardour/editor_rulers.cc @@ -35,6 +35,7 @@ using namespace sigc; using namespace ARDOUR; +using namespace PBD; using namespace Gtk; using namespace Editing; @@ -133,7 +134,7 @@ Editor::ruler_button_press (GdkEventButton* ev) else if (minsec_ruler->is_realized() && ev->window == minsec_ruler->get_window()->gobj()) grab_widget = minsec_ruler; if (grab_widget) { - Gtk::Main::grab_add (*grab_widget); + grab_widget->add_modal_grab (); ruler_grabbed_widget = grab_widget; } @@ -159,7 +160,7 @@ Editor::ruler_button_release (GdkEventButton* ev) hide_verbose_canvas_cursor(); stop_canvas_autoscroll(); - jack_nframes_t where = leftmost_frame + pixel_to_frame (x); + nframes_t where = leftmost_frame + pixel_to_frame (x); switch (ev->button) { case 1: @@ -189,7 +190,7 @@ Editor::ruler_button_release (GdkEventButton* ev) if (ruler_grabbed_widget) { - Gtk::Main::grab_remove (*ruler_grabbed_widget); + ruler_grabbed_widget->remove_modal_grab(); ruler_grabbed_widget = 0; } @@ -214,7 +215,7 @@ Editor::ruler_mouse_motion (GdkEventMotion* ev) if (session == 0 || !ruler_pressed_button) { return FALSE; } - + double wcx=0,wcy=0; double cx=0,cy=0; @@ -225,29 +226,28 @@ Editor::ruler_mouse_motion (GdkEventMotion* ev) time_canvas_event_box.get_window()->get_pointer (x, y, state); - gnome_canvas_window_to_world (GNOME_CANVAS(track_gnome_canvas), x, y, &wcx, &wcy); - gnome_canvas_w2c_d (GNOME_CANVAS(track_gnome_canvas), wcx, wcy, &cx, &cy); + track_canvas.c2w (x, y, wcx, wcy); + track_canvas.w2c (wcx, wcy, cx, cy); - jack_nframes_t where = leftmost_frame + pixel_to_frame (x); + nframes_t where = leftmost_frame + pixel_to_frame (x); - /// ripped from maybe_autoscroll - jack_nframes_t one_page = (jack_nframes_t) rint (canvas_width * frames_per_unit); - jack_nframes_t rightmost_frame = leftmost_frame + one_page; - jack_nframes_t frame = pixel_to_frame (cx); + /// ripped from maybe_autoscroll, and adapted to work here + nframes_t one_page = (nframes_t) rint (canvas_width * frames_per_unit); + nframes_t rightmost_frame = leftmost_frame + one_page; if (autoscroll_timeout_tag < 0) { - if (frame > rightmost_frame) { + if (where > rightmost_frame) { if (rightmost_frame < max_frames) { start_canvas_autoscroll (1); } - } else if (frame < leftmost_frame) { + } else if (where <= leftmost_frame) { if (leftmost_frame > 0) { start_canvas_autoscroll (-1); } } } else { - if (frame >= leftmost_frame && frame < rightmost_frame) { + if (where >= leftmost_frame && where < rightmost_frame) { stop_canvas_autoscroll (); } } @@ -288,7 +288,7 @@ Editor::ruler_mouse_motion (GdkEventMotion* ev) void -Editor::popup_ruler_menu (jack_nframes_t where, ItemType t) +Editor::popup_ruler_menu (nframes_t where, ItemType t) { using namespace Menu_Helpers; @@ -520,7 +520,7 @@ Editor::update_ruler_visibility () lab_children.clear(); - // leave the last one (the time_canvas_scroller) intact + // leave the last one (the time_canvas) intact while (ruler_children.size() > 1) { ruler_children.pop_front(); } @@ -599,89 +599,76 @@ Editor::update_ruler_visibility () double tbpos = 0.0; double old_unit_pos ; - GtkArg args[1] ; - args[0].name = "y"; if (ruler_shown[ruler_time_meter]) { lab_children.push_back (Element(meter_label, PACK_SHRINK, PACK_START)); - gtk_object_getv (GTK_OBJECT(meter_group), 1, args) ; - old_unit_pos = GTK_VALUE_DOUBLE (args[0]) ; + old_unit_pos = meter_group->property_y(); if (tbpos != old_unit_pos) { - gnome_canvas_item_move (meter_group, 0.0, tbpos - old_unit_pos) ; + meter_group->move ( 0.0, tbpos - old_unit_pos); } - - //gnome_canvas_item_set (meter_group, "y", tbpos, NULL); - gnome_canvas_item_show (meter_group); + meter_group->show(); tbpos += timebar_height; visible_timebars++; } else { - gnome_canvas_item_hide (meter_group); + meter_group->hide(); } if (ruler_shown[ruler_time_tempo]) { lab_children.push_back (Element(tempo_label, PACK_SHRINK, PACK_START)); - gtk_object_getv (GTK_OBJECT(tempo_group), 1, args) ; - old_unit_pos = GTK_VALUE_DOUBLE (args[0]) ; + old_unit_pos = tempo_group->property_y(); if (tbpos != old_unit_pos) { - gnome_canvas_item_move (tempo_group, 0.0, tbpos - old_unit_pos) ; + tempo_group->move(0.0, tbpos - old_unit_pos); } - //gnome_canvas_item_set (tempo_group, "y", tbpos, NULL); - gnome_canvas_item_show (tempo_group); + tempo_group->show(); tbpos += timebar_height; visible_timebars++; } else { - gnome_canvas_item_hide (tempo_group); + tempo_group->hide(); } if (ruler_shown[ruler_time_marker]) { lab_children.push_back (Element(mark_label, PACK_SHRINK, PACK_START)); - gtk_object_getv (GTK_OBJECT(marker_group), 1, args) ; - old_unit_pos = GTK_VALUE_DOUBLE (args[0]) ; + old_unit_pos = marker_group->property_y(); if (tbpos != old_unit_pos) { - gnome_canvas_item_move (marker_group, 0.0, tbpos - old_unit_pos) ; + marker_group->move ( 0.0, tbpos - old_unit_pos); } - //gnome_canvas_item_set (marker_group, "y", tbpos, NULL); - gnome_canvas_item_show (marker_group); + marker_group->show(); tbpos += timebar_height; visible_timebars++; } else { - gnome_canvas_item_hide (marker_group); + marker_group->hide(); } if (ruler_shown[ruler_time_range_marker]) { lab_children.push_back (Element(range_mark_label, PACK_SHRINK, PACK_START)); - gtk_object_getv (GTK_OBJECT(range_marker_group), 1, args) ; - old_unit_pos = GTK_VALUE_DOUBLE (args[0]) ; + old_unit_pos = range_marker_group->property_y(); if (tbpos != old_unit_pos) { - gnome_canvas_item_move (range_marker_group, 0.0, tbpos - old_unit_pos) ; + range_marker_group->move (0.0, tbpos - old_unit_pos); } - //gnome_canvas_item_set (marker_group, "y", tbpos, NULL); - gnome_canvas_item_show (range_marker_group); + range_marker_group->show(); tbpos += timebar_height; visible_timebars++; } else { - gnome_canvas_item_hide (range_marker_group); + range_marker_group->hide(); } if (ruler_shown[ruler_time_transport_marker]) { lab_children.push_back (Element(transport_mark_label, PACK_SHRINK, PACK_START)); - gtk_object_getv (GTK_OBJECT(transport_marker_group), 1, args) ; - old_unit_pos = GTK_VALUE_DOUBLE (args[0]) ; + old_unit_pos = transport_marker_group->property_y(); if (tbpos != old_unit_pos) { - gnome_canvas_item_move (transport_marker_group, 0.0, tbpos - old_unit_pos) ; + transport_marker_group->move ( 0.0, tbpos - old_unit_pos); } - //gnome_canvas_item_set (marker_group, "y", tbpos, NULL); - gnome_canvas_item_show (transport_marker_group); + transport_marker_group->show(); tbpos += timebar_height; visible_timebars++; } else { - gnome_canvas_item_hide (transport_marker_group); + transport_marker_group->hide(); } time_canvas_vbox.set_size_request (-1, (int)(timebar_height * visible_timebars)); @@ -708,8 +695,8 @@ Editor::update_just_smpte () an uint32_t (or larger) to a float ... what to do ? */ - jack_nframes_t page = (jack_nframes_t) floor (canvas_width * frames_per_unit); - jack_nframes_t rightmost_frame = leftmost_frame + page; + nframes_t page = (nframes_t) floor (canvas_width * frames_per_unit); + nframes_t rightmost_frame = leftmost_frame + page; if (ruler_shown[ruler_metric_smpte]) { gtk_custom_ruler_set_range (GTK_CUSTOM_RULER(_smpte_ruler), leftmost_frame, rightmost_frame, @@ -720,7 +707,7 @@ Editor::update_just_smpte () void Editor::update_fixed_rulers () { - jack_nframes_t rightmost_frame; + nframes_t rightmost_frame; if (session == 0) { return; @@ -730,7 +717,7 @@ Editor::update_fixed_rulers () an uint32_t (or larger) to a float ... what to do ? */ - jack_nframes_t page = (jack_nframes_t) floor (canvas_width * frames_per_unit); + nframes_t page = (nframes_t) floor (canvas_width * frames_per_unit); ruler_metrics[ruler_metric_smpte].units_per_pixel = frames_per_unit; ruler_metrics[ruler_metric_frames].units_per_pixel = frames_per_unit; @@ -769,7 +756,7 @@ Editor::update_tempo_based_rulers () an uint32_t (or larger) to a float ... what to do ? */ - jack_nframes_t page = (jack_nframes_t) floor (canvas_width * frames_per_unit); + nframes_t page = (nframes_t) floor (canvas_width * frames_per_unit); ruler_metrics[ruler_metric_bbt].units_per_pixel = frames_per_unit; if (ruler_shown[ruler_metric_bbt]) { @@ -781,37 +768,37 @@ Editor::update_tempo_based_rulers () /* Mark generation */ gint -Editor::_metric_get_smpte (GtkCustomRulerMark **marks, gulong lower, gulong upper, gint maxchars) +Editor::_metric_get_smpte (GtkCustomRulerMark **marks, gdouble lower, gdouble upper, gint maxchars) { return ruler_editor->metric_get_smpte (marks, lower, upper, maxchars); } gint -Editor::_metric_get_bbt (GtkCustomRulerMark **marks, gulong lower, gulong upper, gint maxchars) +Editor::_metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper, gint maxchars) { return ruler_editor->metric_get_bbt (marks, lower, upper, maxchars); } gint -Editor::_metric_get_frames (GtkCustomRulerMark **marks, gulong lower, gulong upper, gint maxchars) +Editor::_metric_get_frames (GtkCustomRulerMark **marks, gdouble lower, gdouble upper, gint maxchars) { return ruler_editor->metric_get_frames (marks, lower, upper, maxchars); } gint -Editor::_metric_get_minsec (GtkCustomRulerMark **marks, gulong lower, gulong upper, gint maxchars) +Editor::_metric_get_minsec (GtkCustomRulerMark **marks, gdouble lower, gdouble upper, gint maxchars) { return ruler_editor->metric_get_minsec (marks, lower, upper, maxchars); } gint -Editor::metric_get_smpte (GtkCustomRulerMark **marks, gulong lower, gulong upper, gint maxchars) +Editor::metric_get_smpte (GtkCustomRulerMark **marks, gdouble lower, gdouble upper, gint maxchars) { - jack_nframes_t range; - jack_nframes_t pos; - jack_nframes_t spacer; - jack_nframes_t fr; - SMPTE_Time smpte; + nframes_t range; + nframes_t pos; + nframes_t spacer; + nframes_t fr; + SMPTE::Time smpte; gchar buf[16]; gint nmarks = 0; gint n; @@ -828,13 +815,13 @@ Editor::metric_get_smpte (GtkCustomRulerMark **marks, gulong lower, gulong upper fr = session->frame_rate(); - if (lower > (spacer = (jack_nframes_t)(128 * Editor::get_current_zoom ()))) { + if (lower > (spacer = (nframes_t)(128 * Editor::get_current_zoom ()))) { lower = lower - spacer; } else { - upper = upper + spacer - lower; lower = 0; } - range = upper - lower; + upper = upper + spacer; + range = (nframes_t) floor (upper - lower); if (range < (2 * session->frames_per_smpte_frame())) { /* 0 - 2 frames */ show_bits = true; @@ -843,19 +830,19 @@ Editor::metric_get_smpte (GtkCustomRulerMark **marks, gulong lower, gulong upper } else if (range <= (fr / 4)) { /* 2 frames - 0.250 second */ show_frames = true; mark_modulo = 1; - nmarks = 1 + (range / (jack_nframes_t)session->frames_per_smpte_frame()); + nmarks = 1 + (range / (nframes_t)session->frames_per_smpte_frame()); } else if (range <= (fr / 2)) { /* 0.25-0.5 second */ show_frames = true; mark_modulo = 2; - nmarks = 1 + (range / (jack_nframes_t)session->frames_per_smpte_frame()); + nmarks = 1 + (range / (nframes_t)session->frames_per_smpte_frame()); } else if (range <= fr) { /* 0.5-1 second */ show_frames = true; mark_modulo = 5; - nmarks = 1 + (range / (jack_nframes_t)session->frames_per_smpte_frame()); + nmarks = 1 + (range / (nframes_t)session->frames_per_smpte_frame()); } else if (range <= 2 * fr) { /* 1-2 seconds */ show_frames = true; mark_modulo = 10; - nmarks = 1 + (range / (jack_nframes_t)session->frames_per_smpte_frame()); + nmarks = 1 + (range / (nframes_t)session->frames_per_smpte_frame()); } else if (range <= 8 * fr) { /* 2-8 seconds */ show_seconds = true; mark_modulo = 1; @@ -906,15 +893,15 @@ Editor::metric_get_smpte (GtkCustomRulerMark **marks, gulong lower, gulong upper nmarks = 1 + 24; } else { - /* not possible if jack_nframes_t is a 32 bit quantity */ + /* not possible if nframes_t is a 32 bit quantity */ show_hours = true; mark_modulo = 4; nmarks = 1 + 24; } - pos = lower; - + pos = (nframes_t) floor (lower); + *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks); if (show_bits) { @@ -926,10 +913,10 @@ Editor::metric_get_smpte (GtkCustomRulerMark **marks, gulong lower, gulong upper if ((smpte.subframes % mark_modulo) == 0) { if (smpte.subframes == 0) { (*marks)[n].style = GtkCustomRulerMarkMajor; - snprintf (buf, sizeof(buf), "%s%02ld:%02ld:%02ld:%02ld", smpte.negative ? "-" : "", smpte.hours, smpte.minutes, smpte.seconds, smpte.frames); + snprintf (buf, sizeof(buf), "%s%02u:%02u:%02u:%02u", smpte.negative ? "-" : "", smpte.hours, smpte.minutes, smpte.seconds, smpte.frames); } else { (*marks)[n].style = GtkCustomRulerMarkMinor; - snprintf (buf, sizeof(buf), ".%02ld", smpte.subframes); + snprintf (buf, sizeof(buf), ".%02u", smpte.subframes); } } else { snprintf (buf, sizeof(buf)," "); @@ -940,13 +927,13 @@ Editor::metric_get_smpte (GtkCustomRulerMark **marks, gulong lower, gulong upper (*marks)[n].position = pos; // Increment subframes by one - session->smpte_increment_subframes( smpte ); + SMPTE::increment_subframes( smpte ); } } else if (show_seconds) { // Find smpte time of this sample (pos) session->sample_to_smpte(pos, smpte, true /* use_offset */, false /* use_subframes */ ); // Go to next whole second down - session->smpte_seconds_floor( smpte ); + SMPTE::seconds_floor( smpte ); for (n = 0; n < nmarks; n++) { session->smpte_to_sample(smpte, pos, true /* use_offset */, false /* use_subframes */ ); @@ -958,7 +945,7 @@ Editor::metric_get_smpte (GtkCustomRulerMark **marks, gulong lower, gulong upper (*marks)[n].style = GtkCustomRulerMarkMinor; (*marks)[n].position = pos; } - snprintf (buf, sizeof(buf), "%s%02ld:%02ld:%02ld:%02ld", smpte.negative ? "-" : "", smpte.hours, smpte.minutes, smpte.seconds, smpte.frames); + snprintf (buf, sizeof(buf), "%s%02u:%02u:%02u:%02u", smpte.negative ? "-" : "", smpte.hours, smpte.minutes, smpte.seconds, smpte.frames); } else { snprintf (buf, sizeof(buf)," "); (*marks)[n].style = GtkCustomRulerMarkMicro; @@ -966,13 +953,13 @@ Editor::metric_get_smpte (GtkCustomRulerMark **marks, gulong lower, gulong upper } (*marks)[n].label = g_strdup (buf); - session->smpte_increment_seconds( smpte ); + SMPTE::increment_seconds( smpte ); } } else if (show_minutes) { // Find smpte time of this sample (pos) session->sample_to_smpte(pos, smpte, true /* use_offset */, false /* use_subframes */ ); // Go to next whole minute down - session->smpte_minutes_floor( smpte ); + SMPTE::minutes_floor( smpte ); for (n = 0; n < nmarks; n++) { session->smpte_to_sample(smpte, pos, true /* use_offset */, false /* use_subframes */ ); @@ -982,7 +969,7 @@ Editor::metric_get_smpte (GtkCustomRulerMark **marks, gulong lower, gulong upper } else { (*marks)[n].style = GtkCustomRulerMarkMinor; } - snprintf (buf, sizeof(buf), "%s%02ld:%02ld:%02ld:%02ld", smpte.negative ? "-" : "", smpte.hours, smpte.minutes, smpte.seconds, smpte.frames); + snprintf (buf, sizeof(buf), "%s%02u:%02u:%02u:%02u", smpte.negative ? "-" : "", smpte.hours, smpte.minutes, smpte.seconds, smpte.frames); } else { snprintf (buf, sizeof(buf)," "); (*marks)[n].style = GtkCustomRulerMarkMicro; @@ -990,19 +977,19 @@ Editor::metric_get_smpte (GtkCustomRulerMark **marks, gulong lower, gulong upper } (*marks)[n].label = g_strdup (buf); (*marks)[n].position = pos; - session->smpte_increment_minutes( smpte ); + SMPTE::increment_minutes( smpte ); } } else if (show_hours) { // Find smpte time of this sample (pos) session->sample_to_smpte(pos, smpte, true /* use_offset */, false /* use_subframes */ ); // Go to next whole hour down - session->smpte_hours_floor( smpte ); + SMPTE::hours_floor( smpte ); for (n = 0; n < nmarks; n++) { session->smpte_to_sample(smpte, pos, true /* use_offset */, false /* use_subframes */ ); if ((smpte.hours % mark_modulo) == 0) { (*marks)[n].style = GtkCustomRulerMarkMajor; - snprintf (buf, sizeof(buf), "%s%02ld:%02ld:%02ld:%02ld", smpte.negative ? "-" : "", smpte.hours, smpte.minutes, smpte.seconds, smpte.frames); + snprintf (buf, sizeof(buf), "%s%02u:%02u:%02u:%02u", smpte.negative ? "-" : "", smpte.hours, smpte.minutes, smpte.seconds, smpte.frames); } else { snprintf (buf, sizeof(buf)," "); (*marks)[n].style = GtkCustomRulerMarkMicro; @@ -1011,20 +998,20 @@ Editor::metric_get_smpte (GtkCustomRulerMark **marks, gulong lower, gulong upper (*marks)[n].label = g_strdup (buf); (*marks)[n].position = pos; - session->smpte_increment_hours( smpte ); + SMPTE::increment_hours( smpte ); } } else { // show_frames // Find smpte time of this sample (pos) session->sample_to_smpte(pos, smpte, true /* use_offset */, false /* use_subframes */ ); // Go to next whole frame down - session->smpte_frames_floor( smpte ); + SMPTE::frames_floor( smpte ); for (n = 0; n < nmarks; n++) { session->smpte_to_sample(smpte, pos, true /* use_offset */, false /* use_subframes */ ); if ((smpte.frames % mark_modulo) == 0) { (*marks)[n].style = GtkCustomRulerMarkMajor; (*marks)[n].position = pos; - snprintf (buf, sizeof(buf), "%s%02ld:%02ld:%02ld:%02ld", smpte.negative ? "-" : "", smpte.hours, smpte.minutes, smpte.seconds, smpte.frames); + snprintf (buf, sizeof(buf), "%s%02u:%02u:%02u:%02u", smpte.negative ? "-" : "", smpte.hours, smpte.minutes, smpte.seconds, smpte.frames); } else { snprintf (buf, sizeof(buf)," "); (*marks)[n].style = GtkCustomRulerMarkMicro; @@ -1032,7 +1019,7 @@ Editor::metric_get_smpte (GtkCustomRulerMark **marks, gulong lower, gulong upper } (*marks)[n].label = g_strdup (buf); - session->smpte_increment( smpte ); + SMPTE::increment( smpte ); } } @@ -1041,137 +1028,109 @@ Editor::metric_get_smpte (GtkCustomRulerMark **marks, gulong lower, gulong upper gint -Editor::metric_get_bbt (GtkCustomRulerMark **marks, gulong lower, gulong upper, gint maxchars) +Editor::metric_get_bbt (GtkCustomRulerMark **marks, gdouble lower, gdouble upper, gint maxchars) { if (session == 0) { return 0; } - TempoMap::BBTPointList::iterator i; - TempoMap::BBTPointList *zoomed_bbt_points; + TempoMap::BBTPointList::iterator i; + uint32_t beats = 0; uint32_t bars = 0; - uint32_t tick = 0; - uint32_t skip; - uint32_t t; - uint32_t zoomed_beats = 0; - uint32_t zoomed_bars = 0; uint32_t desirable_marks; uint32_t magic_accent_number = 1; gint nmarks; char buf[64]; gint n; - jack_nframes_t pos; - jack_nframes_t frame_one_beats_worth; - jack_nframes_t frame_skip; - double frame_skip_error; - double accumulated_error; - bool bar_helper_on = true; - + nframes_t pos; + bool bar_helper_on = true; - BBT_Time previous_beat; BBT_Time next_beat; - jack_nframes_t next_beat_pos; + nframes_t next_beat_pos; + nframes_t ilower = (nframes_t) floor (lower); - if ((desirable_marks = maxchars / 6) == 0) { + if ((desirable_marks = maxchars / 7) == 0) { return 0; } /* align the tick marks to whatever we're snapping to... */ - - if (snap_type == SnapToAThirdBeat) { + + switch (snap_type) { + case SnapToAThirdBeat: bbt_beat_subdivision = 3; - } else if (snap_type == SnapToAQuarterBeat) { + break; + case SnapToAQuarterBeat: bbt_beat_subdivision = 4; - } else if (snap_type == SnapToAEighthBeat) { + break; + case SnapToAEighthBeat: bbt_beat_subdivision = 8; magic_accent_number = 2; - } else if (snap_type == SnapToASixteenthBeat) { + break; + case SnapToASixteenthBeat: bbt_beat_subdivision = 16; magic_accent_number = 4; - } else if (snap_type == SnapToAThirtysecondBeat) { + break; + case SnapToAThirtysecondBeat: bbt_beat_subdivision = 32; magic_accent_number = 8; - } else { + break; + default: bbt_beat_subdivision = 4; + break; } - /* First find what a beat's distance is, so we can start plotting stuff before the beginning of the ruler */ - - session->bbt_time(lower,previous_beat); - previous_beat.ticks = 0; - next_beat = previous_beat; - - if (session->tempo_map().meter_at(lower).beats_per_bar() < (next_beat.beats + 1)) { - next_beat.bars += 1; - next_beat.beats = 1; - } else { - next_beat.beats += 1; - } - - frame_one_beats_worth = session->tempo_map().frame_time(next_beat) - session->tempo_map().frame_time(previous_beat); - - - zoomed_bbt_points = session->tempo_map().get_points((lower >= frame_one_beats_worth) ? lower - frame_one_beats_worth : 0, upper); - - if (current_bbt_points == 0 || zoomed_bbt_points == 0 || zoomed_bbt_points->empty()) { + if (current_bbt_points == 0 || current_bbt_points->empty()) { return 0; } - for (i = current_bbt_points->begin(); i != current_bbt_points->end(); i++) { - if ((*i).type == TempoMap::Beat) { - beats++; - } else if ((*i).type == TempoMap::Bar) { - bars++; - } - } + i = current_bbt_points->end(); + i--; + bars = (*i).bar - (*current_bbt_points->begin()).bar; + beats = current_bbt_points->size() - bars; + /*Only show the bar helper if there aren't many bars on the screen */ - if (bars > 1) { + if (bars > 2) { bar_helper_on = false; } - for (i = zoomed_bbt_points->begin(); i != zoomed_bbt_points->end(); i++) { - if ((*i).type == TempoMap::Beat) { - zoomed_beats++; - } else if ((*i).type == TempoMap::Bar) { - zoomed_bars++; - } - } - if (desirable_marks > (beats / 4)) { /* we're in beat land...*/ + uint32_t tick = 0; + uint32_t skip; + uint32_t t; + nframes_t frame_skip; + double frame_skip_error; + double accumulated_error; double position_of_helper; bool i_am_accented = false; bool we_need_ticks = false; - position_of_helper = lower + (30 * Editor::get_current_zoom ()); + position_of_helper = ilower + (30 * Editor::get_current_zoom ()); - if (desirable_marks >= (beats * 2)) { - nmarks = (zoomed_beats * bbt_beat_subdivision) + 1; + if (desirable_marks >= (beats)) { + nmarks = ((beats + 1) * bbt_beat_subdivision) + 1; we_need_ticks = true; } else { - nmarks = zoomed_beats + 1; + nmarks = beats + 1; } *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks); (*marks)[0].label = g_strdup(" "); - (*marks)[0].position = lower; + (*marks)[0].position = ilower; (*marks)[0].style = GtkCustomRulerMarkMicro; - for (n = 1, i = zoomed_bbt_points->begin(); i != zoomed_bbt_points->end() && n < nmarks; ++i) { - - if ((*i).frame <= lower && (bar_helper_on)) { - + for (n = 1, i = current_bbt_points->begin(); n < nmarks && i != current_bbt_points->end(); i++) { + + if ((*i).frame < ilower && (bar_helper_on)) { snprintf (buf, sizeof(buf), "<%" PRIu32 "|%" PRIu32, (*i).bar, (*i).beat); (*marks)[0].label = g_strdup (buf); } else { - if ((*i).type == TempoMap::Bar) { - tick = 0; (((*i).frame < position_of_helper) && bar_helper_on) ? snprintf (buf, sizeof(buf), " ") : snprintf (buf, sizeof(buf), "%" PRIu32, (*i).bar); (*marks)[n].label = g_strdup (buf); @@ -1180,7 +1139,6 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gulong lower, gulong upper, n++; } else if (((*i).type == TempoMap::Beat) && ((*i).beat > 1)) { - tick = 0; ((((*i).frame < position_of_helper) && bar_helper_on) || !we_need_ticks) ? snprintf (buf, sizeof(buf), " ") : snprintf (buf, sizeof(buf), "%" PRIu32, (*i).beat); if (((*i).beat % 2 == 1) || we_need_ticks) { @@ -1194,33 +1152,36 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gulong lower, gulong upper, } } - /* Find the next beat */ - - session->bbt_time((*i).frame, next_beat); - if (session->tempo_map().meter_at((*i).frame).beats_per_bar() > (next_beat.beats + 1)) { - next_beat.beats += 1; - } else { - next_beat.bars += 1; - next_beat.beats = 1; - } - - next_beat_pos = session->tempo_map().frame_time(next_beat); /* Add the tick marks */ - if (we_need_ticks) { + if (we_need_ticks && (*i).type != TempoMap::Bar) { + + /* Find the next beat */ + + next_beat.beats = (*i).beat; + next_beat.bars = (*i).bar; + + if ((*i).meter->beats_per_bar() > (next_beat.beats + 1)) { + next_beat.beats += 1; + } else { + next_beat.bars += 1; + next_beat.beats = 1; + } + + next_beat_pos = session->tempo_map().frame_time(next_beat); - frame_skip = (jack_nframes_t) floor ((session->frame_rate() * 60) / (bbt_beat_subdivision * (*i).tempo->beats_per_minute())); - frame_skip_error = ((session->frame_rate() * 60.0f) / (bbt_beat_subdivision * (*i).tempo->beats_per_minute())) - frame_skip; + frame_skip = (nframes_t) floor (frame_skip_error = (session->frame_rate() * 60) / (bbt_beat_subdivision * (*i).tempo->beats_per_minute())); + frame_skip_error -= frame_skip; skip = (uint32_t) (Meter::ticks_per_beat / bbt_beat_subdivision); pos = (*i).frame + frame_skip; accumulated_error = frame_skip_error; - tick += skip; + tick = skip; - for (t = 0; tick < Meter::ticks_per_beat && pos <= next_beat_pos ; pos += frame_skip, tick += skip, ++t) { + for (t = 0; (tick < Meter::ticks_per_beat) && (n < nmarks) && (pos < next_beat_pos) ; pos += frame_skip, tick += skip, ++t) { if (t % magic_accent_number == (magic_accent_number - 1)) { i_am_accented = true; @@ -1237,7 +1198,7 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gulong lower, gulong upper, (*marks)[n].label = g_strdup (buf); - /* Error compensation for float to jack_nframes_t*/ + /* Error compensation for float to nframes_t*/ accumulated_error += frame_skip_error; if (accumulated_error > 1) { pos += 1; @@ -1257,23 +1218,22 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gulong lower, gulong upper, } } } - delete zoomed_bbt_points; return n; //return the actual number of marks made, since we might have skipped some fro fractional time signatures } else { /* we're in bar land */ - if (desirable_marks < (uint32_t) (zoomed_bars / 256)) { + if (desirable_marks < (uint32_t) (bars / 256)) { nmarks = 1; *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks); - snprintf (buf, sizeof(buf), "too many bars... (currently %" PRIu32 ")", zoomed_bars ); + snprintf (buf, sizeof(buf), "too many bars... (currently %" PRIu32 ")", bars ); (*marks)[0].style = GtkCustomRulerMarkMajor; (*marks)[0].label = g_strdup (buf); - (*marks)[0].position = lower; - } else if (desirable_marks < (uint32_t) (nmarks = (gint) (zoomed_bars / 64))) { + (*marks)[0].position = ilower; + } else if (desirable_marks < (uint32_t) (nmarks = (gint) (bars / 64))) { *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks); - for (n = 0, i = zoomed_bbt_points->begin(); i != zoomed_bbt_points->end() && n < nmarks; i++) { + for (n = 0, i = current_bbt_points->begin(); i != current_bbt_points->end() && n < nmarks; i++) { if ((*i).type == TempoMap::Bar) { if ((*i).bar % 64 == 1) { if ((*i).bar % 256 == 1) { @@ -1293,9 +1253,9 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gulong lower, gulong upper, } } } - } else if (desirable_marks < (uint32_t) (nmarks = (gint)(zoomed_bars / 16))) { + } else if (desirable_marks < (uint32_t) (nmarks = (gint)(bars / 16))) { *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks); - for (n = 0, i = zoomed_bbt_points->begin(); i != zoomed_bbt_points->end() && n < nmarks; i++) { + for (n = 0, i = current_bbt_points->begin(); i != current_bbt_points->end() && n < nmarks; i++) { if ((*i).type == TempoMap::Bar) { if ((*i).bar % 16 == 1) { if ((*i).bar % 64 == 1) { @@ -1315,9 +1275,9 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gulong lower, gulong upper, } } } - } else if (desirable_marks < (uint32_t) (nmarks = (gint)(zoomed_bars / 4))){ + } else if (desirable_marks < (uint32_t) (nmarks = (gint)(bars / 4))){ *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks); - for (n = 0, i = zoomed_bbt_points->begin(); i != zoomed_bbt_points->end() && n < nmarks; ++i) { + for (n = 0, i = current_bbt_points->begin(); i != current_bbt_points->end() && n < nmarks; ++i) { if ((*i).type == TempoMap::Bar) { if ((*i).bar % 4 == 1) { if ((*i).bar % 16 == 1) { @@ -1338,9 +1298,9 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gulong lower, gulong upper, } } } else { - nmarks = zoomed_bars; + nmarks = bars; *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks); - for (n = 0, i = zoomed_bbt_points->begin(); i != zoomed_bbt_points->end() && n < nmarks; i++) { + for (n = 0, i = current_bbt_points->begin(); i != current_bbt_points->end() && n < nmarks; i++) { if ((*i).type == TempoMap::Bar) { if ((*i).bar % 4 == 1) { snprintf (buf, sizeof(buf), "%" PRIu32, (*i).bar); @@ -1359,16 +1319,17 @@ Editor::metric_get_bbt (GtkCustomRulerMark **marks, gulong lower, gulong upper, } } } - delete zoomed_bbt_points; return nmarks; } } gint -Editor::metric_get_frames (GtkCustomRulerMark **marks, gulong lower, gulong upper, gint maxchars) +Editor::metric_get_frames (GtkCustomRulerMark **marks, gdouble lower, gdouble upper, gint maxchars) { - jack_nframes_t mark_interval; - jack_nframes_t pos; + nframes_t mark_interval; + nframes_t pos; + nframes_t ilower = (nframes_t) floor (lower); + nframes_t iupper = (nframes_t) floor (upper); gchar buf[16]; gint nmarks; gint n; @@ -1377,7 +1338,7 @@ Editor::metric_get_frames (GtkCustomRulerMark **marks, gulong lower, gulong uppe return 0; } - mark_interval = (upper - lower) / 5; + mark_interval = (iupper - ilower) / 5; if (mark_interval > session->frame_rate()) { mark_interval -= mark_interval % session->frame_rate(); } else { @@ -1385,7 +1346,7 @@ Editor::metric_get_frames (GtkCustomRulerMark **marks, gulong lower, gulong uppe } nmarks = 5; *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks); - for (n = 0, pos = lower; n < nmarks; pos += mark_interval, ++n) { + for (n = 0, pos = ilower; n < nmarks; pos += mark_interval, ++n) { snprintf (buf, sizeof(buf), "%u", pos); (*marks)[n].label = g_strdup (buf); (*marks)[n].position = pos; @@ -1396,15 +1357,15 @@ Editor::metric_get_frames (GtkCustomRulerMark **marks, gulong lower, gulong uppe } static void -sample_to_clock_parts ( jack_nframes_t sample, - jack_nframes_t sample_rate, +sample_to_clock_parts ( nframes_t sample, + nframes_t sample_rate, long *hrs_p, long *mins_p, long *secs_p, long *millisecs_p) { - jack_nframes_t left; + nframes_t left; long hrs; long mins; long secs; @@ -1428,13 +1389,13 @@ sample_to_clock_parts ( jack_nframes_t sample, } gint -Editor::metric_get_minsec (GtkCustomRulerMark **marks, gulong lower, gulong upper, gint maxchars) +Editor::metric_get_minsec (GtkCustomRulerMark **marks, gdouble lower, gdouble upper, gint maxchars) { - jack_nframes_t range; - jack_nframes_t fr; - jack_nframes_t mark_interval; - jack_nframes_t pos; - jack_nframes_t spacer; + nframes_t range; + nframes_t fr; + nframes_t mark_interval; + nframes_t pos; + nframes_t spacer; long hrs, mins, secs, millisecs; gchar buf[16]; gint nmarks; @@ -1443,6 +1404,8 @@ Editor::metric_get_minsec (GtkCustomRulerMark **marks, gulong lower, gulong uppe bool show_seconds = false; bool show_minutes = false; bool show_hours = false; + nframes_t ilower = (nframes_t) floor (lower); + nframes_t iupper = (nframes_t) floor (upper); if (session == 0) { return 0; @@ -1451,13 +1414,13 @@ Editor::metric_get_minsec (GtkCustomRulerMark **marks, gulong lower, gulong uppe fr = session->frame_rate(); /* to prevent 'flashing' */ - if (lower > (spacer = (jack_nframes_t)(128 * Editor::get_current_zoom ()))) { + if (lower > (spacer = (nframes_t)(128 * Editor::get_current_zoom ()))) { lower = lower - spacer; } else { - upper = upper + spacer; lower = 0; } - range = upper - lower; + upper = upper + spacer; + range = iupper - ilower; if (range < (fr / 50)) { mark_interval = fr / 100; /* show 1/100 seconds */ @@ -1523,14 +1486,14 @@ Editor::metric_get_minsec (GtkCustomRulerMark **marks, gulong lower, gulong uppe mark_modulo = 2; } else { - /* not possible if jack_nframes_t is a 32 bit quantity */ + /* not possible if nframes_t is a 32 bit quantity */ mark_interval = 4 * 60 * 60 * fr; /* show 4 hrs */ } nmarks = 1 + (range / mark_interval); *marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks); - pos = ((lower + (mark_interval/2))/mark_interval) * mark_interval; + pos = ((ilower + (mark_interval/2))/mark_interval) * mark_interval; if (show_seconds) { for (n = 0; n < nmarks; pos += mark_interval, ++n) {