public override async Task <IOutputStream> Load(PlaylistItem playlistItem, bool immidiate) { if (!this.IsStarted) { await this.Start().ConfigureAwait(false); } if (BassOutputStreams.Contains(playlistItem.FileName)) { Logger.Write(this, LogLevel.Warn, "The stream is already loaded: {0} => {1}", playlistItem.Id, playlistItem.FileName); } Logger.Write(this, LogLevel.Debug, "Loading stream: {0} => {1}", playlistItem.Id, playlistItem.FileName); var flags = BassFlags.Default; if (this.Float) { flags |= BassFlags.Float; } var stream = this.StreamFactory.CreateInteractiveStream(playlistItem, immidiate, flags); if (stream.IsEmpty) { return(null); } var outputStream = new BassOutputStream(this, this.PipelineManager, stream, playlistItem); outputStream.InitializeComponent(this.Core); this.OnLoaded(outputStream); return(outputStream); }
public BassOutputStream(IBassOutput output, IBassStreamPipelineManager manager, IBassStream stream, PlaylistItem playlistItem) : base(playlistItem) { this.Output = output; this.Manager = manager; this.Stream = stream; if (!BassOutputStreams.Add(this)) { //TODO: Warn. } }
public IBassStream CreateInteractiveStream(PlaylistItem playlistItem, bool immidiate, BassFlags flags) { flags |= BassFlags.Decode; Logger.Write(this, LogLevel.Debug, "Attempting to create stream for file \"{0}\".", playlistItem.FileName); var provider = this.GetProviders(playlistItem).FirstOrDefault(); if (provider == null) { Logger.Write(this, LogLevel.Warn, "No provider was found for file \"{0}\".", playlistItem.FileName); return(BassStream.Empty); } Logger.Write(this, LogLevel.Debug, "Using bass stream provider \"{0}\".", provider.GetType().Name); var advice = this.GetAdvice(provider, playlistItem).ToArray(); var stream = provider.CreateInteractiveStream(playlistItem, advice, flags); if (stream.ChannelHandle != 0) { Logger.Write(this, LogLevel.Debug, "Created stream from file {0}: {1}", playlistItem.FileName, stream.ChannelHandle); return(stream); } if (stream.Errors == Errors.Already && provider.Flags.HasFlag(BassStreamProviderFlags.Serial)) { if (immidiate) { Logger.Write(this, LogLevel.Debug, "Provider does not support multiple streams but immidiate playback was requested, releasing active streams."); if (BassOutputStreams.Clear()) { Logger.Write(this, LogLevel.Debug, "Active streams were released, retrying."); stream = provider.CreateInteractiveStream(playlistItem, advice, flags); if (stream.ChannelHandle != 0) { Logger.Write(this, LogLevel.Debug, "Created stream from file {0}: {1}", playlistItem.FileName, stream.ChannelHandle); return(stream); } } else { Logger.Write(this, LogLevel.Debug, "Failed to release active streams."); } } else { return(stream); } } Logger.Write(this, LogLevel.Debug, "Failed to create stream from file {0}: {1}", playlistItem.FileName, Enum.GetName(typeof(Errors), stream.Errors)); return(stream); }
protected override void OnDisposing() { try { if (this.Stream != null) { if (this.Stream.Syncs != null) { foreach (var sync in this.Stream.Syncs) { Bass.ChannelRemoveSync(this.ChannelHandle, sync); } } this.Stream.Provider.FreeStream(this.PlaylistItem, this.ChannelHandle); } } finally { if (!BassOutputStreams.Remove(this)) { //TODO: Warn. } } }
public override bool IsLoaded(string fileName) { return(this.IsStarted && BassOutputStreams.Contains(fileName)); }