From 8b4551c6056eba38bd3f68b6579b3919c83076a9 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Fri, 10 Sep 2010 21:51:11 +1200 Subject: [PATCH] Next track / repeat on song completion. --- OpenRA.Game/Game.cs | 2 +- OpenRA.Game/GameRules/Settings.cs | 1 + OpenRA.Game/Sound.cs | 33 +++++++++++++++++-- .../Widgets/Delegates/MusicPlayerDelegate.cs | 11 ++++++- 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index 5bf30fe66a..fd4949e96a 100644 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -118,7 +118,7 @@ namespace OpenRA { lastTime += Settings.Game.Timestep; Widget.DoTick(world); - + Sound.Tick(); orderManager.TickImmediate(world); var isNetTick = LocalTick % NetTickScale == 0; diff --git a/OpenRA.Game/GameRules/Settings.cs b/OpenRA.Game/GameRules/Settings.cs index 753ceaefca..8a2a374b16 100755 --- a/OpenRA.Game/GameRules/Settings.cs +++ b/OpenRA.Game/GameRules/Settings.cs @@ -49,6 +49,7 @@ namespace OpenRA.GameRules public float MusicVolume = 0.5f; public float VideoVolume = 0.5f; public bool Shuffle = false; + public bool Repeat = false; } public class PlayerSettings diff --git a/OpenRA.Game/Sound.cs b/OpenRA.Game/Sound.cs index 5e7b8115f3..df52332144 100644 --- a/OpenRA.Game/Sound.cs +++ b/OpenRA.Game/Sound.cs @@ -102,9 +102,27 @@ namespace OpenRA soundEngine.StopSound(video); } + public static void Tick() + { + // Song finished + if (MusicPlaying && !music.Playing) + { + StopMusic(); + OnMusicComplete(); + } + } + + static Action OnMusicComplete; public static bool MusicPlaying { get; private set; } + public static void PlayMusic(string name) { + PlayMusicThen(name, () => {}); + } + public static void PlayMusicThen(string name, Action then) + { + OnMusicComplete = then; + if (name == "" || name == null) return; @@ -114,11 +132,11 @@ namespace OpenRA return; } StopMusic(); - + currentMusic = name; MusicPlaying = true; var sound = sounds[name]; - music = soundEngine.Play2D(sound, true, true, float2.Zero, MusicVolume); + music = soundEngine.Play2D(sound, false, true, float2.Zero, MusicVolume); } public static void PlayMusic() @@ -236,6 +254,7 @@ namespace OpenRA { float Volume { get; set; } float SeekPosition { get; } + bool Playing { get; } } class OpenAlSoundEngine : ISoundEngine @@ -448,5 +467,15 @@ namespace OpenRA return pos/22050f; } } + + public bool Playing + { + get + { + int state; + Al.alGetSourcei(source, Al.AL_SOURCE_STATE, out state); + return state == Al.AL_PLAYING; + } + } } } diff --git a/OpenRA.Game/Widgets/Delegates/MusicPlayerDelegate.cs b/OpenRA.Game/Widgets/Delegates/MusicPlayerDelegate.cs index 1962a7d9da..d4d42b6aaa 100644 --- a/OpenRA.Game/Widgets/Delegates/MusicPlayerDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/MusicPlayerDelegate.cs @@ -38,7 +38,8 @@ namespace OpenRA.Widgets.Delegates if (CurrentSong == null) return true; - Sound.PlayMusic(Rules.Music[CurrentSong].Filename); + Sound.PlayMusicThen(Rules.Music[CurrentSong].Filename, + () => bg.GetWidget(Game.Settings.Sound.Repeat ? "BUTTON_PLAY" : "BUTTON_NEXT").OnMouseUp(new MouseInput())); bg.GetWidget("BUTTON_PLAY").Visible = false; bg.GetWidget("BUTTON_PAUSE").Visible = true; @@ -82,6 +83,14 @@ namespace OpenRA.Widgets.Delegates }; shuffle.Checked = () => Game.Settings.Sound.Shuffle; + var repeat = bg.GetWidget("REPEAT"); + repeat.OnMouseDown = mi => + { + Game.Settings.Sound.Repeat ^= true; + return true; + }; + repeat.Checked = () => Game.Settings.Sound.Repeat; + bg.GetWidget("TIME").GetText = () => { if (CurrentSong == null)