This repository has been archived on 2022-08-05. You can view files and clone it, but cannot push or open issues or pull requests.
testexetrisathlon/testexetrisathlon/SoundManagement/WindowsSoundManager.cs

54 lines
1.8 KiB
C#

using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using NAudio.Wave;
namespace testexetrisathlon.SoundManagement
{
public sealed class SoundManager : ISoundManager
{
private static readonly Assembly Assembly = Assembly.GetExecutingAssembly();
private WaveStream _current;
private string _currentId;
private Dictionary<string, LoopStream> _loadedSounds;
private WaveOutEvent _output;
public void Init(Dictionary<string, string> manifestResources)
{
_output = new WaveOutEvent();
_loadedSounds = manifestResources.ToDictionary(s => s.Key,
s => new LoopStream(new WaveFileReader(Mp3ToWav(Assembly.GetManifestResourceStream(s.Value)))));
}
public void SetCurrent(string id)
{
if (_currentId == id) return;
_currentId = id;
if (_current != null)
_current.Position = 0;
_current = _loadedSounds[id];
_output.Stop();
_output.Init(_current);
_output.Play();
}
public void SetVolume(int percent) => _output.Volume = percent / 100f;
public void Dispose()
{
foreach (LoopStream reader in _loadedSounds.Values) reader.Dispose();
_output.Dispose();
}
private static MemoryStream Mp3ToWav(Stream mp3File)
{
using Mp3FileReader reader = new Mp3FileReader(mp3File);
using WaveStream pcmStream = WaveFormatConversionStream.CreatePcmStream(reader);
MemoryStream ms = new MemoryStream();
WaveFileWriter.WriteWavFileToStream(ms, pcmStream);
ms.Position = 0;
return ms;
}
}
}