コード例 #1
0
        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);
        }
コード例 #2
0
 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.
     }
 }
コード例 #3
0
        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);
        }
コード例 #4
0
 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.
         }
     }
 }
コード例 #5
0
 public override bool IsLoaded(string fileName)
 {
     return(this.IsStarted && BassOutputStreams.Contains(fileName));
 }