using System; using System.IO; using System.Threading; using Aurora.Proto.Party; using Aurora.Proto.General; namespace Aurora.Models.Media { public class RemoteAudio : BaseMedia { private RemotePartyService.RemotePartyServiceClient _client; private CancellationTokenSource _cancellationTokenSource; #region Constructor public RemoteAudio(string id, RemotePartyService.RemotePartyServiceClient client) { this.Id = id; this._client = client; _cancellationTokenSource = new CancellationTokenSource(); } public RemoteAudio(string id, AudioMetadata metadata, RemotePartyService.RemotePartyServiceClient client) { this.Id = id; this._client = client; this.Metadata = metadata; _cancellationTokenSource = new CancellationTokenSource(); } #endregion Constructor #region Properties public override BaseMetadata Metadata { get; protected set; } public override MediaTypeEnum MediaType { get { return MediaTypeEnum.Audio; } } #endregion Properties /// /// Override load method. /// public override async void Load() { this.DataStream = new MemoryStream(); using (var call = _client.GetSongStream(new SongRequest() { Id = this.Id })) { while (await call.ResponseStream.MoveNext(_cancellationTokenSource.Token)) { Chunk chunk = call.ResponseStream.Current; byte[] buffer = chunk.Content.ToByteArray(); await this.DataStream.WriteAsync(buffer, 0, buffer.Length, _cancellationTokenSource.Token); Console.WriteLine(string.Format("Wrote byte chunk of size {0} to output stream", buffer.Length)); } Console.WriteLine("Done receiving stream"); } base.Load(); } /// /// Override unload method /// public override void Unload() { if (!_cancellationTokenSource.IsCancellationRequested) { _cancellationTokenSource.Cancel(); //Wait for cancellation WaitHandle.WaitAny(new[] { _cancellationTokenSource.Token.WaitHandle }); } base.Unload(); } } }