public void Init() { __CacheStream = __Storage.GetCacheStream(__Audio); switch (__CacheStream.Status) { case AudioStorageStatus.Stored: __ProducerConsumerStream = new ProducerConsumerMemoryStream(__CacheStream); __ProducerConsumerStream.LoadToMemory(); __ProducerConsumerStream.WriteFinished = true; DownloadedFracion = 1.0; break; case AudioStorageStatus.PartiallyStored: case AudioStorageStatus.NotStored: if (__Downloader == null || __Url == null) { throw new PuckevichException("__Url or __Downloader cannot be null for not cached audio!"); } __WebDownloaderTask = Task.Run((Action)WebDownloader); break; default: throw new ArgumentOutOfRangeException(); } __TasksInitialized = true; while (__CacheStream.Status != AudioStorageStatus.Stored && !__ThresholdDownloaded) { Thread.Sleep(1); } if (__RequestTasksStop) { return; } __BassStream = Bass.BASS_StreamCreateFileUser(BASSStreamSystem.STREAMFILE_BUFFER, BASSFlag.BASS_DEFAULT, __BassFileProcs, IntPtr.Zero); WhenInit(); }
private void CleanActions() { __PlayingStopwatch.Reset(); __ProducerConsumerStream.Dispose(); __ProducerConsumerStream = null; }
private void WebDownloader() { Stream webStream = null; try { long audioLengthInBytes; if (__RequestTasksStop) { return; } webStream = __Downloader.GetUrlStream(__Url, __CacheStream.Position, out audioLengthInBytes); if (webStream == null) { throw new PuckevichException("Error while creating Url Stream!"); } if (__RequestTasksStop) { return; } if (__CacheStream.Status == AudioStorageStatus.NotStored) { __CacheStream.AudioSize = audioLengthInBytes; } if (__RequestTasksStop) { return; } __ProducerConsumerStream = new ProducerConsumerMemoryStream(__CacheStream); __ProducerConsumerStream.LoadToMemory(); if (__RequestTasksStop) { return; } var buffer = new byte[WEB_BUFFER_SIZE]; int blockRead = 0; int lengthRead; if (__RequestTasksStop) { return; } while ((lengthRead = webStream.Read(buffer, 0, buffer.Length)) != 0) { blockRead += lengthRead; __ProducerConsumerStream.Write(buffer, 0, lengthRead); if (__RequestTasksStop) { return; } if (blockRead >= WEB_THRESHOLD) { __ThresholdDownloaded = true; } if (__CacheStream == null) { return; } if (__RequestTasksStop) { return; } } } finally { if (webStream != null) { webStream.Dispose(); } __ProducerConsumerStream.FlushToCache(); __ProducerConsumerStream.WriteFinished = true; __ThresholdDownloaded = true; } }
public void Init() { __CacheStream = __Storage.GetCacheStream(__Audio); switch (__CacheStream.Status) { case AudioStorageStatus.Stored: __ProducerConsumerStream = new ProducerConsumerMemoryStream(__CacheStream); __ProducerConsumerStream.LoadToMemory(); __ProducerConsumerStream.WriteFinished = true; DownloadedFracion = 1.0; break; case AudioStorageStatus.PartiallyStored: case AudioStorageStatus.NotStored: if (__Downloader == null || __Url == null) throw new PuckevichException("__Url or __Downloader cannot be null for not cached audio!"); __WebDownloaderTask = Task.Run((Action)WebDownloader); break; default: throw new ArgumentOutOfRangeException(); } __TasksInitialized = true; while (__CacheStream.Status != AudioStorageStatus.Stored && !__ThresholdDownloaded) Thread.Sleep(1); if (__RequestTasksStop) return; __BassStream = Bass.BASS_StreamCreateFileUser(BASSStreamSystem.STREAMFILE_BUFFER, BASSFlag.BASS_DEFAULT, __BassFileProcs, IntPtr.Zero); WhenInit(); }
private void WebDownloader() { Stream webStream = null; try { long audioLengthInBytes; if (__RequestTasksStop) return; webStream = __Downloader.GetUrlStream(__Url, __CacheStream.Position, out audioLengthInBytes); if (webStream == null) throw new PuckevichException("Error while creating Url Stream!"); if (__RequestTasksStop) return; if (__CacheStream.Status == AudioStorageStatus.NotStored) __CacheStream.AudioSize = audioLengthInBytes; if (__RequestTasksStop) return; __ProducerConsumerStream = new ProducerConsumerMemoryStream(__CacheStream); __ProducerConsumerStream.LoadToMemory(); if (__RequestTasksStop) return; var buffer = new byte[WEB_BUFFER_SIZE]; int blockRead = 0; int lengthRead; if (__RequestTasksStop) return; while ((lengthRead = webStream.Read(buffer, 0, buffer.Length)) != 0) { blockRead += lengthRead; __ProducerConsumerStream.Write(buffer, 0, lengthRead); if (__RequestTasksStop) return; if (blockRead >= WEB_THRESHOLD) { __ThresholdDownloaded = true; } if (__CacheStream == null) return; if (__RequestTasksStop) return; } } finally { if (webStream != null) webStream.Dispose(); __ProducerConsumerStream.FlushToCache(); __ProducerConsumerStream.WriteFinished = true; __ThresholdDownloaded = true; } }