Skip to content

Commit 2513eb3

Browse files
committed
Add support to move line edges in karaoke mode
1 parent 6996f34 commit 2513eb3

File tree

1 file changed

+44
-6
lines changed

1 file changed

+44
-6
lines changed

src/audio_timing_karaoke.cpp

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ class AudioTimingControllerKaraoke final : public AudioTimingController {
110110

111111
void DoCommit();
112112
void ApplyLead(bool announce_primary);
113+
void UpdateLineTimes();
113114
int MoveMarker(KaraokeMarker *marker, int new_position);
114115
void AnnounceChanges(int syl);
115116

@@ -236,8 +237,10 @@ void AudioTimingControllerKaraoke::GetMarkers(TimeRange const& range, AudioMarke
236237

237238
void AudioTimingControllerKaraoke::DoCommit() {
238239
active_line->Text = kara->GetText();
240+
active_line->Start = (int)start_marker;
241+
active_line->End = (int)end_marker;
239242
file_changed_slot.Block();
240-
commit_id = c->ass->Commit(_("karaoke timing"), AssFile::COMMIT_DIAG_TEXT, commit_id, active_line);
243+
commit_id = c->ass->Commit(_("karaoke timing"), AssFile::COMMIT_DIAG_TEXT | AssFile::COMMIT_DIAG_TIME, commit_id, active_line);
241244
file_changed_slot.Unblock();
242245
pending_changes = false;
243246
}
@@ -287,16 +290,24 @@ void AudioTimingControllerKaraoke::AddLeadOut() {
287290
}
288291

289292
void AudioTimingControllerKaraoke::ApplyLead(bool announce_primary) {
290-
active_line->Start = (int)start_marker;
291-
active_line->End = (int)end_marker;
292293
kara->SetLineTimes(start_marker, end_marker);
293294
if (!announce_primary)
294295
AnnounceUpdatedStyleRanges();
295296
AnnounceChanges(announce_primary ? cur_syl : cur_syl + 2);
296297
}
297298

299+
void AudioTimingControllerKaraoke::UpdateLineTimes() {
300+
kara->SetLineTimes(start_marker, end_marker);
301+
AnnounceChanges(cur_syl);
302+
}
303+
298304
void AudioTimingControllerKaraoke::ModifyLength(int delta, bool shift_following) {
299-
if (cur_syl == markers.size()) return;
305+
if (cur_syl == markers.size()) {
306+
end_marker.Move(end_marker + delta);
307+
labels.back().range = TimeRange(labels.back().range.begin(), end_marker);
308+
UpdateLineTimes();
309+
return;
310+
}
300311

301312
int cur, end, step;
302313
if (delta < 0) {
@@ -317,7 +328,13 @@ void AudioTimingControllerKaraoke::ModifyLength(int delta, bool shift_following)
317328
}
318329

319330
void AudioTimingControllerKaraoke::ModifyStart(int delta) {
320-
if (cur_syl == 0) return;
331+
if (cur_syl == 0) {
332+
start_marker.Move(start_marker + delta);
333+
labels.front().range = TimeRange(start_marker, labels.front().range.end());
334+
UpdateLineTimes();
335+
return;
336+
}
337+
321338
MoveMarker(&markers[cur_syl - 1], markers[cur_syl - 1] + delta * 10);
322339
AnnounceChanges(cur_syl);
323340
}
@@ -326,7 +343,7 @@ bool AudioTimingControllerKaraoke::IsNearbyMarker(int ms, int sensitivity, bool)
326343
TimeRange range(ms - sensitivity, ms + sensitivity);
327344
return any_of(markers.begin(), markers.end(), [&](KaraokeMarker const& km) {
328345
return range.contains(km);
329-
});
346+
}) || range.contains(start_marker) || range.contains(end_marker);
330347
}
331348

332349
template<typename Out, typename In>
@@ -347,6 +364,11 @@ std::vector<AudioMarker*> AudioTimingControllerKaraoke::OnLeftClick(int ms, bool
347364
if (syl > 0 && range.contains(markers[syl - 1]))
348365
return copy_ptrs<AudioMarker>(markers, syl - 1, ctrl_down ? markers.size() : syl);
349366

367+
if (syl == 0 && range.contains(start_marker))
368+
return std::vector<AudioMarker*> {&start_marker};
369+
if (syl == markers.size() && range.contains(end_marker))
370+
return std::vector<AudioMarker*> {&end_marker};
371+
350372
cur_syl = syl;
351373

352374
AnnounceUpdatedPrimaryRange();
@@ -366,6 +388,22 @@ std::vector<AudioMarker*> AudioTimingControllerKaraoke::OnRightClick(int ms, boo
366388
}
367389

368390
int AudioTimingControllerKaraoke::MoveMarker(KaraokeMarker *marker, int new_position) {
391+
if (marker == &start_marker) {
392+
new_position = std::min(new_position, labels.front().range.end());
393+
start_marker.Move(new_position);
394+
labels.front().range = TimeRange(start_marker, labels.front().range.end());
395+
UpdateLineTimes();
396+
return -1;
397+
}
398+
399+
if (marker == &end_marker) {
400+
new_position = std::max(new_position, labels.back().range.begin());
401+
end_marker.Move(new_position);
402+
labels.back().range = TimeRange(labels.back().range.begin(), end_marker);
403+
UpdateLineTimes();
404+
return -1;
405+
}
406+
369407
// No rearranging of syllables allowed
370408
new_position = mid(
371409
marker == &markers.front() ? start_marker.GetPosition() : (marker - 1)->GetPosition(),

0 commit comments

Comments
 (0)