From 44468fbd3d63ede16592829a321ec447ab9f97a5 Mon Sep 17 00:00:00 2001
From: Thomas Goyne <plorkyeran@aegisub.org>
Date: Thu, 4 Oct 2012 16:15:45 -0700
Subject: [PATCH] Add "audio/play/line" command

---
 aegisub/src/audio_timing.h            |  7 +++++++
 aegisub/src/audio_timing_dialogue.cpp |  6 ++++++
 aegisub/src/audio_timing_karaoke.cpp  |  7 ++++++-
 aegisub/src/command/audio.cpp         | 16 ++++++++++++++++
 aegisub/src/command/icon.cpp          |  1 +
 5 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/aegisub/src/audio_timing.h b/aegisub/src/audio_timing.h
index 334271180..d2312c6b4 100644
--- a/aegisub/src/audio_timing.h
+++ b/aegisub/src/audio_timing.h
@@ -78,6 +78,13 @@ public:
 	/// currently.
 	virtual TimeRange GetPrimaryPlaybackRange() const = 0;
 
+	/// @brief Get the active line's time
+	/// @return A time range
+	///
+	/// Get the time range which the active line would have if any pending
+	/// modifications were committed.
+	virtual TimeRange GetActiveLineRange() const = 0;
+
 	/// @brief Get all rendering style ranges
 	/// @param[out] ranges Rendering ranges will be added to this
 	virtual void GetRenderingStyles(AudioRenderingStyleRanges &ranges) const = 0;
diff --git a/aegisub/src/audio_timing_dialogue.cpp b/aegisub/src/audio_timing_dialogue.cpp
index d5d4d45db..2ceb2c1d2 100644
--- a/aegisub/src/audio_timing_dialogue.cpp
+++ b/aegisub/src/audio_timing_dialogue.cpp
@@ -390,6 +390,7 @@ public:
 	wxString GetWarningMessage() const;
 	TimeRange GetIdealVisibleTimeRange() const;
 	TimeRange GetPrimaryPlaybackRange() const;
+	TimeRange GetActiveLineRange() const;
 	void GetRenderingStyles(AudioRenderingStyleRanges &ranges) const;
 	void GetLabels(TimeRange const& range, std::vector<AudioLabel> &out) const { }
 	void Next(NextMode mode);
@@ -499,6 +500,11 @@ TimeRange AudioTimingControllerDialogue::GetPrimaryPlaybackRange() const
 	return active_line;
 }
 
+TimeRange AudioTimingControllerDialogue::GetActiveLineRange() const
+{
+	return active_line;
+}
+
 void AudioTimingControllerDialogue::GetRenderingStyles(AudioRenderingStyleRanges &ranges) const
 {
 	active_line.GetStyleRange(&ranges);
diff --git a/aegisub/src/audio_timing_karaoke.cpp b/aegisub/src/audio_timing_karaoke.cpp
index fdf873dd5..07cd16e17 100644
--- a/aegisub/src/audio_timing_karaoke.cpp
+++ b/aegisub/src/audio_timing_karaoke.cpp
@@ -124,6 +124,7 @@ public:
 	TimeRange GetIdealVisibleTimeRange() const;
 	void GetRenderingStyles(AudioRenderingStyleRanges &ranges) const;
 	TimeRange GetPrimaryPlaybackRange() const;
+	TimeRange GetActiveLineRange() const;
 	void GetLabels(const TimeRange &range, std::vector<AudioLabel> &out_labels) const;
 	void Next(NextMode mode);
 	void Prev();
@@ -227,10 +228,14 @@ TimeRange AudioTimingControllerKaraoke::GetPrimaryPlaybackRange() const {
 		cur_syl < markers.size() ? markers[cur_syl] : end_marker);
 }
 
-TimeRange AudioTimingControllerKaraoke::GetIdealVisibleTimeRange() const {
+TimeRange AudioTimingControllerKaraoke::GetActiveLineRange() const {
 	return TimeRange(start_marker, end_marker);
 }
 
+TimeRange AudioTimingControllerKaraoke::GetIdealVisibleTimeRange() const {
+	return GetActiveLineRange();
+}
+
 void AudioTimingControllerKaraoke::GetMarkers(TimeRange const& range, AudioMarkerVector &out) const {
 	size_t i;
 	for (i = 0; i < markers.size() && markers[i] < range.begin(); ++i) ;
diff --git a/aegisub/src/command/audio.cpp b/aegisub/src/command/audio.cpp
index d7b406208..8772ba0c5 100644
--- a/aegisub/src/command/audio.cpp
+++ b/aegisub/src/command/audio.cpp
@@ -241,6 +241,21 @@ struct audio_play_current_selection : public validate_audio_open {
 	}
 };
 
+/// Play the current line
+struct audio_play_current_line : public validate_audio_open {
+	CMD_NAME("audio/play/line")
+	STR_MENU("Play current line")
+	STR_DISP("Play current line")
+	STR_HELP("Play current line")
+
+	void operator()(agi::Context *c) {
+		c->videoController->Stop();
+		AudioTimingController *tc = c->audioController->GetTimingController();
+		if (tc)
+			c->audioController->PlayRange(tc->GetActiveLineRange());
+	}
+};
+
 /// Play the current audio selection
 struct audio_play_selection : public validate_audio_open {
 	CMD_NAME("audio/play/selection")
@@ -593,6 +608,7 @@ namespace cmd {
 		reg(new audio_play_begin);
 		reg(new audio_play_end);
 		reg(new audio_play_current_selection);
+		reg(new audio_play_current_line);
 		reg(new audio_play_selection);
 		reg(new audio_play_to_end);
 		reg(new audio_play_toggle);
diff --git a/aegisub/src/command/icon.cpp b/aegisub/src/command/icon.cpp
index 3a99f894d..e837d39e2 100644
--- a/aegisub/src/command/icon.cpp
+++ b/aegisub/src/command/icon.cpp
@@ -92,6 +92,7 @@ INSERT_ICON("audio/opt/autoscroll", toggle_audio_autoscroll)
 INSERT_ICON("audio/opt/spectrum", toggle_audio_spectrum)
 INSERT_ICON("audio/opt/vertical_link", toggle_audio_link)
 INSERT_ICON("audio/play/selection", button_playsel)
+INSERT_ICON("audio/play/line", button_playline)
 INSERT_ICON("audio/play/selection/after", button_playfivehafter)
 INSERT_ICON("audio/play/selection/before", button_playfivehbefore)
 INSERT_ICON("audio/play/selection/begin", button_playfirstfiveh)
-- 
GitLab