using NVorbis; using System; using System.IO; using UnityEngine; namespace SanAndreasUnity.Audio { /// <summary> /// Audio stream class /// </summary> public class AudioStream : IDisposable { /// <summary> /// Reader /// </summary> private VorbisReader reader; /// <summary> /// Audio clip /// </summary> private AudioClip audioClip; /// <summary> /// Audio clip /// </summary> public AudioClip AudioClip { get { return audioClip; } } /// <summary> /// Constructor /// </summary> /// <param name="stream">Stream</param> /// <param name="audioClipName">Audio clip name</param> /// <param name="closeStreamOnDispose">Close stream on dispose</param> public AudioStream(Stream stream, string audioClipName, bool closeStreamOnDispose) { reader = new VorbisReader(stream, closeStreamOnDispose); audioClip = AudioClip.Create(audioClipName, (int)(reader.TotalSamples), reader.Channels, reader.SampleRate, true, (data) => { if (data != null) { if (data.Length > 0) { reader.ReadSamples(data, 0, Mathf.Min(data.Length, Mathf.Max(0, (int)(reader.TotalSamples - reader.DecodedPosition)))); } } }, (newPosition) => { reader.DecodedPosition = newPosition; }); } /// <summary> /// Dispose /// </summary> public void Dispose() { if (reader != null) { reader.Dispose(); reader = null; } } } }