diff --git a/OpenRA.Game/GameRules/MusicInfo.cs b/OpenRA.Game/GameRules/MusicInfo.cs index 917481349d..a46ff9f66a 100644 --- a/OpenRA.Game/GameRules/MusicInfo.cs +++ b/OpenRA.Game/GameRules/MusicInfo.cs @@ -13,38 +13,16 @@ using OpenRA.FileFormats; namespace OpenRA.GameRules { public class MusicInfo - { - public readonly MusicPool Pool; - public readonly string[] Music = { }; + { + public readonly string Filename = null; + public readonly string Title = null; + public readonly float Length = 0; // seconds - public MusicInfo( MiniYaml y ) + public MusicInfo( string key, MiniYaml value ) { - FieldLoader.Load(this, y); - Pool = new MusicPool(Music); + FieldLoader.Load(this, value); + if (Filename == null) + Filename = key+".aud"; } } - - public class MusicPool - { - readonly string[] clips; - int playing = 0; - - public MusicPool(params string[] clips) - { - this.clips = clips; - } - - public string GetNext() - { - playing = (playing + 1) % clips.Length; - return clips[playing]; - } - public string GetPrev() - { - playing = (playing + clips.Length - 1) % clips.Length; - return clips[playing]; - } - public string GetCurrent(){ return clips[playing];} - - } } diff --git a/OpenRA.Game/GameRules/Rules.cs b/OpenRA.Game/GameRules/Rules.cs index 4676d17531..d95ae1cba1 100755 --- a/OpenRA.Game/GameRules/Rules.cs +++ b/OpenRA.Game/GameRules/Rules.cs @@ -32,7 +32,7 @@ namespace OpenRA Info = LoadYamlRules(m.Rules, map.Rules, (k, y) => new ActorInfo(k.Key.ToLowerInvariant(), k.Value, y)); Weapons = LoadYamlRules(m.Weapons, map.Weapons, (k, _) => new WeaponInfo(k.Key.ToLowerInvariant(), k.Value)); Voices = LoadYamlRules(m.Voices, map.Voices, (k, _) => new VoiceInfo(k.Value)); - Music = LoadYamlRules(m.Music, map.Music, (k, _) => new MusicInfo(k.Value)); + Music = LoadYamlRules(m.Music, map.Music, (k, _) => new MusicInfo(k.Key, k.Value)); Movies = LoadYamlRules(m.Movies, new Dictionary(), (k, v) => k.Value.Value); TileSets = new Dictionary(); diff --git a/OpenRA.Game/Sound.cs b/OpenRA.Game/Sound.cs index 194b993cd8..73ab065ea8 100644 --- a/OpenRA.Game/Sound.cs +++ b/OpenRA.Game/Sound.cs @@ -21,11 +21,10 @@ namespace OpenRA { static ISoundEngine soundEngine; static Cache sounds; + static ISoundSource rawSource; static ISound music; static ISound video; - - static bool paused; - static bool stopped; + static string currentMusic; static ISoundSource LoadSound(string filename) { @@ -43,26 +42,12 @@ namespace OpenRA soundEngine = new OpenAlSoundEngine(); sounds = new Cache(LoadSound); music = null; + currentMusic = null; video = null; - paused = false; - stopped = false; } public static void SetListenerPosition(float2 position) { soundEngine.SetListenerPosition(position); } - static ISoundSource rawSource; - public static void PlayVideoSoundtrack(byte[] raw) - { - rawSource = LoadSoundRaw(raw); - video = soundEngine.Play2D(rawSource, false, true, float2.Zero, SoundVolume); - } - - public static void StopVideoSoundtrack() - { - if (video != null) - soundEngine.StopSound(video); - } - public static void Play(string name) { if (name == "" || name == null) @@ -93,36 +78,47 @@ namespace OpenRA Play(name, pos); } + public static void PlayVideoSoundtrack(byte[] raw) + { + rawSource = LoadSoundRaw(raw); + video = soundEngine.Play2D(rawSource, false, true, float2.Zero, SoundVolume); + } + + public static void StopVideoSoundtrack() + { + if (video != null) + soundEngine.StopSound(video); + } + public static void PlayMusic(string name) { if (name == "" || name == null) return; - if (music != null) - soundEngine.StopSound(music); + if (name == currentMusic && music != null) + { + soundEngine.PauseSound(music, false); + return; + } + StopMusic(); + currentMusic = name; var sound = sounds[name]; music = soundEngine.Play2D(sound, true, true, float2.Zero, MusicVolume); } - public static bool MusicPaused + public static void StopMusic() { - get { return paused; } - set { - paused = value; - if (music != null) - soundEngine.PauseSound(music, paused); - } + if (music != null) + soundEngine.StopSound(music); + + currentMusic = null; } - public static bool MusicStopped + public static void PauseMusic() { - get { return stopped; } - set { - stopped = value; - if (music != null && stopped) - soundEngine.StopSound(music); - } + if (music != null) + soundEngine.PauseSound(music, true); } public static float GlobalVolume diff --git a/OpenRA.Game/Widgets/Delegates/MusicPlayerDelegate.cs b/OpenRA.Game/Widgets/Delegates/MusicPlayerDelegate.cs index 86a5b388ea..ba3f6f45d9 100644 --- a/OpenRA.Game/Widgets/Delegates/MusicPlayerDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/MusicPlayerDelegate.cs @@ -1,3 +1,5 @@ +using System.Linq; +using OpenRA.FileFormats; #region Copyright & License Information /* * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) @@ -12,85 +14,86 @@ namespace OpenRA.Widgets.Delegates { public class MusicPlayerDelegate : IWidgetDelegate { + string CurrentSong = null; public MusicPlayerDelegate() { var bg = Widget.RootWidget.GetWidget("MUSIC_BG"); bg.Visible = Game.Settings.MusicPlayer; + CurrentSong = GetNextSong(); bg.GetWidget("BUTTON_PLAY").OnMouseUp = mi => { - var foo = Widget.RootWidget.GetWidget("VIDEOPLAYER"); - foo.Load("intro2.vqa"); - foo.Play(); - /* - if (Sound.MusicStopped) - Sound.PlayMusic(GetSong()); - Sound.MusicStopped = false; - Sound.MusicPaused = false; + if (CurrentSong == null) + return true; + + Sound.PlayMusic(Rules.Music[CurrentSong].Filename); bg.GetWidget("BUTTON_PLAY").Visible = false; bg.GetWidget("BUTTON_PAUSE").Visible = true; - */ + return true; }; - /* + bg.GetWidget("BUTTON_PAUSE").OnMouseUp = mi => - { - Sound.MusicPaused = true; + { + Sound.PauseMusic(); bg.GetWidget("BUTTON_PAUSE").Visible = false; bg.GetWidget("BUTTON_PLAY").Visible = true; return true; }; - */ + bg.GetWidget("BUTTON_STOP").OnMouseUp = mi => { - var foo = Widget.RootWidget.GetWidget("VIDEOPLAYER"); - foo.Stop(); - /* - Sound.MusicStopped = true; + Sound.StopMusic(); bg.GetWidget("BUTTON_PAUSE").Visible = false; bg.GetWidget("BUTTON_PLAY").Visible = true; - */ + return true; }; - /* + bg.GetWidget("BUTTON_NEXT").OnMouseUp = mi => { - Sound.PlayMusic(GetNextSong()); - Sound.MusicStopped = false; - Sound.MusicPaused = false; - bg.GetWidget("BUTTON_PLAY").Visible = false; - bg.GetWidget("BUTTON_PAUSE").Visible = true; - return true; + CurrentSong = GetNextSong(); + return bg.GetWidget("BUTTON_PLAY").OnMouseUp(mi); }; bg.GetWidget("BUTTON_PREV").OnMouseUp = mi => { - Sound.PlayMusic(GetPrevSong()); - Sound.MusicStopped = false; - Sound.MusicPaused = false; - bg.GetWidget("BUTTON_PLAY").Visible = false; - bg.GetWidget("BUTTON_PAUSE").Visible = true; - return true; + CurrentSong = GetPrevSong(); + return bg.GetWidget("BUTTON_PLAY").OnMouseUp(mi); }; - */ } - + string GetNextSong() { - if (!Rules.Music.ContainsKey("allmusic")) return null; - return Rules.Music["allmusic"].Pool.GetNext(); + var songs = Rules.Music.Select(a => a.Key) + .Where(a => FileSystem.Exists(Rules.Music[a].Filename)); + + var nextSong = songs + .SkipWhile(m => m != CurrentSong) + .Skip(1) + .FirstOrDefault(); + + if (nextSong == null) + nextSong = songs.FirstOrDefault(); + + return nextSong; } string GetPrevSong() { - if (!Rules.Music.ContainsKey("allmusic")) return null; - return Rules.Music["allmusic"].Pool.GetPrev(); - } - - string GetSong() - { - if (!Rules.Music.ContainsKey("allmusic")) return null; - return Rules.Music["allmusic"].Pool.GetCurrent(); + var songs = Rules.Music.Select(a => a.Key) + .Where(a => FileSystem.Exists(Rules.Music[a].Filename)) + .Reverse(); + + var nextSong = songs + .SkipWhile(m => m != CurrentSong) + .Skip(1) + .FirstOrDefault(); + + if (nextSong == null) + nextSong = songs.FirstOrDefault(); + + return nextSong; } } } diff --git a/mods/ra/chrome/mainmenu.yaml b/mods/ra/chrome/mainmenu.yaml index e4003288a1..f1df036750 100644 --- a/mods/ra/chrome/mainmenu.yaml +++ b/mods/ra/chrome/mainmenu.yaml @@ -92,4 +92,89 @@ Background@PERF_BG: X:20 Y:205 Width:170 - Height:40 \ No newline at end of file + Height:40 +Background@MUSIC_BG: + Id:MUSIC_BG + Delegate:MusicPlayerDelegate + X:WINDOW_RIGHT - 175 + Y:WINDOW_BOTTOM - 95 + Width: 160 + Height: 55 + Visible: true + Children: + Button@BUTTON_PLAY: + Id:BUTTON_PLAY + Visible:false + X:50 + Y:15 + Width:25 + Height:25 + Children: + Image@IMAGE_PLAY: + Id:IMAGE_PLAY + X:0 + Y:0 + Width:25 + Height:25 + ImageCollection:music + ImageName:play + Button@BUTTON_PAUSE: + Id:BUTTON_PAUSE + X:50 + Y:15 + Width:25 + Height:25 + Children: + Image@IMAGE_PAUSE: + Id:IMAGE_PAUSE + X:0 + Y:0 + Width:25 + Height:25 + ImageCollection:music + ImageName:pause + Button@BUTTON_STOP: + Id:BUTTON_STOP + X:85 + Y:15 + Width:25 + Height:25 + Children: + Image@IMAGE_STOP: + Id:IMAGE_STOP + X:0 + Y:0 + Width:25 + Height:25 + ImageCollection:music + ImageName:stop + Button@BUTTON_NEXT: + Id:BUTTON_NEXT + X:120 + Y:15 + Width:25 + Height:25 + Children: + Image@IMAGE_NEXT: + Id:IMAGE_NEXT + X:0 + Y:0 + Width:25 + Height:25 + ImageCollection:music + ImageName:next + Button@BUTTON_PREV: + Id:BUTTON_PREV + X:15 + Y:15 + Width:25 + Height:25 + Children: + Image@IMAGE_PREV: + Id:IMAGE_PREV + X:0 + Y:0 + Width:25 + Height:25 + ImageCollection:music + ImageName:prev \ No newline at end of file diff --git a/mods/ra/music.yaml b/mods/ra/music.yaml index 4d8b4b1d48..4a75a60c40 100644 --- a/mods/ra/music.yaml +++ b/mods/ra/music.yaml @@ -1,2 +1,83 @@ -AllMusic: - Music: hell226m.aud \ No newline at end of file +await_r: + Title: Afterlife + Length: 0 + +bigf225m: + Title: Bigfoot + Length: 0 + +credits: + Title: End Credits + Length: 0 + +crus226m: + Title: Crush + Length: 0 + +dense_r: + Title: Dense + Length: 0 + +fac1225m: + Title: Face to the Enemy 1 + Length: 0 + +fac2226m: + Title: Face to the Enemy 2 + Length: 0 + +fogger1a: + Title: Fogger + Length: 0 + +hell225m: + Title: Hell March + Length: 0 + +mud1a: + Title: Mud + Length: 0 + +radio2: + Title: Radio 2 + Length: 0 + +rollout: + Title: Roll Out + Length: 0 + +run1225m: + Title: Run for your Life + Length: 0 + +score: + Title: Mission Accomplished + Length: 0 + +smsh225m: + Title: Smash + Length: 0 + +snake: + Title: Snake + Length: 0 + +terminat: + Title: Terminate + Length: 0 + +tren226m: + Title: Trenches + Length: 0 + +twin: + Title: Twin + Length: 0 + +vector1a: + Title: Vector + Length: 0 + +work226m: + Title: Workmen + Length: 0 \ No newline at end of file