aboutsummaryrefslogtreecommitdiff
path: root/ShiftOS_TheReturn/AudioManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ShiftOS_TheReturn/AudioManager.cs')
-rw-r--r--ShiftOS_TheReturn/AudioManager.cs111
1 files changed, 64 insertions, 47 deletions
diff --git a/ShiftOS_TheReturn/AudioManager.cs b/ShiftOS_TheReturn/AudioManager.cs
index a548cf6..553a1d9 100644
--- a/ShiftOS_TheReturn/AudioManager.cs
+++ b/ShiftOS_TheReturn/AudioManager.cs
@@ -22,10 +22,11 @@
* SOFTWARE.
*/
-//#define NOSOUND
+#define NOSOUND
using System;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
@@ -40,68 +41,84 @@ namespace ShiftOS.Engine
private static WaveOut _out = null;
private static AudioFileReader _reader = null;
private static IAudioProvider _provider = null;
- private static bool _running = true;
-
- public static void Init(IAudioProvider _p)
+
+ /// <summary>
+ /// Stops the current sound if one is playing and disposes of the sound.
+ /// </summary>
+ public static void Stop()
{
-#if !NOSOUND
- _provider = _p;
- AppearanceManager.OnExit += () =>
+ Desktop.InvokeOnWorkerThread(() =>
{
- _running = false;
_out?.Stop();
_reader?.Dispose();
_out?.Dispose();
- System.IO.File.Delete("temp.mp3");
- };
- var t = new Thread(() =>
- {
- SaveSystem.GameReady += () =>
- {
- while(_out == null)
- {
-
- }
- _out.Volume = _provider.Volume;
- };
- Random rnd = new Random();
- while(_running == true)
- {
- int track = rnd.Next(0, _provider.Count);
- byte[] mp3 = _provider.GetTrack(track);
- System.IO.File.WriteAllBytes("temp.mp3", mp3);
- _reader = new AudioFileReader("temp.mp3");
- _out = new WaveOut();
- _out.Init(_reader);
- _out.Volume = _provider.Volume;
-
- _out.Play();
- while(_out.PlaybackState == PlaybackState.Playing)
- {
- Thread.Sleep(5000); //even when the player isn't playing, this will give a good delay between songs.
- }
- _reader.Dispose();
- _out.Dispose();
- }
});
- t.IsBackground = true;
- t.Start();
-#endif
}
+ /// <summary>
+ /// Initiates this engine module using an <see cref="IAudioProvider"/> as a backend for selecting background soundtrack as well as the volume level for the sound.
+ /// </summary>
+ /// <param name="_p">A background soundtrack and volume provider.</param>
+ /// <exception cref="ArgumentNullException">Thrown if <paramref name="_p"/> is null.</exception>
+ public static void Init(IAudioProvider _p)
+ {
+ if (_p == null)
+ throw new ArgumentNullException("_p");
+ _provider = _p;
+ }
+
+ /// <summary>
+ /// Sets the volume of the audio system.
+ /// </summary>
+ /// <param name="volume">The volume to use, from 0 to 1.</param>
public static void SetVolume(float volume)
{
_provider.Volume = volume; //persist between songs
_out.Volume = volume;
}
- internal static void Kill()
+ /// <summary>
+ /// Plays a specified sound file.
+ /// </summary>
+ /// <param name="file">The file to play.</param>
+ public static void Play(string file)
+ {
+ try
+ {
+ _reader = new AudioFileReader(file);
+ _out = new WaveOut();
+ _out.Init(_reader);
+ _out.Play();
+ if (SaveSystem.CurrentSave == null)
+ _out.Volume = 1.0f;
+ else
+ _out.Volume = (float)SaveSystem.CurrentSave.MusicVolume / 100;
+ _out.PlaybackStopped += (o, a) => { PlayCompleted?.Invoke(); };
+ }
+ catch(Exception ex)
+ {
+ Console.WriteLine("Audio error: " + ex.Message);
+ }
+ }
+
+ /// <summary>
+ /// Writes the data in the specified <see cref="Stream"/> to a file, and plays it as a sound file.
+ /// </summary>
+ /// <param name="str">The stream to read from.</param>
+ public static void PlayStream(Stream str)
{
- _running = false;
- _out.Stop();
- _out.Dispose();
- _reader.Dispose();
+ var bytes = new byte[str.Length];
+ str.Read(bytes, 0, bytes.Length);
+ ShiftOS.Engine.AudioManager.Stop();
+ if (File.Exists("snd.wav"))
+ File.Delete("snd.wav");
+ File.WriteAllBytes("snd.wav", bytes);
+
+ ShiftOS.Engine.AudioManager.Play("snd.wav");
+
}
+
+ public static event Action PlayCompleted;
}
public interface IAudioProvider