+ } break;
+
+ default: {
+ if ((direction == RoundUpMaybe || direction == RoundDownMaybe) &&
+ presnap.sample % one_hour == 0) {
+ /* start is already on a whole hour, do nothing */
+ } else if (((direction == 0) && (presnap.sample % one_hour > one_hour / 2)) || (direction > 0)) {
+ ret.sample = (samplepos_t) ceil ((double) presnap.sample / one_hour) * one_hour;
+ } else {
+ ret.sample = (samplepos_t) floor ((double) presnap.sample / one_hour) * one_hour;
+ }
+ } break;
+ }
+
+ return ret;
+}
+
+MusicSample
+Editor::snap_to_cd_frames ( MusicSample presnap, RoundMode direction, SnapPref gpref )
+{
+ if ( (gpref != SnapToGrid_Unscaled) && (minsec_ruler_scale != minsec_show_msecs) ) {
+ return snap_to_minsec( presnap, direction, gpref );
+ }
+
+ const samplepos_t one_second = _session->sample_rate();
+
+ MusicSample ret(presnap);
+
+ if ((direction == RoundUpMaybe || direction == RoundDownMaybe) &&
+ presnap.sample % (one_second/75) == 0) {
+ /* start is already on a whole CD sample, do nothing */
+ } else if (((direction == 0) && (presnap.sample % (one_second/75) > (one_second/75) / 2)) || (direction > 0)) {
+ ret.sample = (samplepos_t) ceil ((double) presnap.sample / (one_second / 75)) * (one_second / 75);
+ } else {
+ ret.sample = (samplepos_t) floor ((double) presnap.sample / (one_second / 75)) * (one_second / 75);
+ }
+
+ return ret;
+}
+
+MusicSample
+Editor::snap_to_bbt ( MusicSample presnap, RoundMode direction, SnapPref gpref )
+{
+ MusicSample ret(presnap);
+
+ if ( gpref != SnapToGrid_Unscaled ) { //use the visual grid lines which are limited by the zoom scale that the user selected
+
+ int divisor = 2;
+ switch (_grid_type) {
+ case GridTypeBeatDiv3:
+ case GridTypeBeatDiv6:
+ case GridTypeBeatDiv12:
+ case GridTypeBeatDiv24:
+ divisor = 3;
+ break;
+ case GridTypeBeatDiv5:
+ case GridTypeBeatDiv10:
+ case GridTypeBeatDiv20:
+ divisor = 5;
+ break;
+ case GridTypeBeatDiv7:
+ case GridTypeBeatDiv14:
+ case GridTypeBeatDiv28:
+ divisor = 7;
+ break;
+ default:
+ divisor = 2;
+ };
+
+ BBTRulerScale scale = bbt_ruler_scale;
+ switch (scale) {
+ case bbt_show_many:
+ case bbt_show_64:
+ case bbt_show_16:
+ case bbt_show_4:
+ case bbt_show_1:
+ ret = _session->tempo_map().round_to_bar (presnap.sample, direction);
+ break;
+ case bbt_show_quarters:
+ ret = _session->tempo_map().round_to_beat (presnap.sample, direction);
+ break;
+ case bbt_show_eighths:
+ ret = _session->tempo_map().round_to_quarter_note_subdivision (presnap.sample, 1 * divisor, direction);
+ break;
+ case bbt_show_sixteenths:
+ ret = _session->tempo_map().round_to_quarter_note_subdivision (presnap.sample, 2 * divisor, direction);
+ break;
+ case bbt_show_thirtyseconds:
+ ret = _session->tempo_map().round_to_quarter_note_subdivision (presnap.sample, 4 * divisor, direction);
+ break;