コード例 #1
0
        private E <LocalStr> StartResource(InvokerData invoker, PlayResource play, MetaData meta = null)
        {
            play.Meta = meta ?? play.Meta ?? new MetaData();
            var sourceLink = resourceResolver.RestoreLink(play.BaseData).OkOr(null);
            var playInfo   = new PlayInfoEventArgs(invoker, play, sourceLink);

            BeforeResourceStarted?.Invoke(this, playInfo);

            if (string.IsNullOrWhiteSpace(play.PlayUri))
            {
                Log.Error("Internal resource error: link is empty (resource:{0})", play);
                return(new LocalStr(strings.error_playmgr_internal_error));
            }

            Log.Debug("AudioResource start: {0}", play);
            var result = playerConnection.Play(play);

            if (!result)
            {
                Log.Error("Error return from player: {0}", result.Error);
                return(new LocalStr(strings.error_playmgr_internal_error));
            }

            playerConnection.Volume = Tools.Clamp(playerConnection.Volume, confBot.Audio.Volume.Min, confBot.Audio.Volume.Max);
            CurrentPlayData         = playInfo;     // TODO meta as readonly
            AfterResourceStarted?.Invoke(this, playInfo);

            return(R.Ok);
        }
コード例 #2
0
        private E <LocalStr> StartResource(InvokerData invoker, PlayResource play, MetaData meta)
        {
            if (meta.From != PlaySource.FromPlaylist)
            {
                meta.ResourceOwnerUid = invoker.ClientUid;
            }

            var sourceLink = resourceFactory.RestoreLink(play.BaseData).OkOr(null);
            var playInfo   = new PlayInfoEventArgs(invoker, play, meta, sourceLink);

            BeforeResourceStarted?.Invoke(this, playInfo);

            if (string.IsNullOrWhiteSpace(play.PlayUri))
            {
                Log.Error("Internal resource error: link is empty (resource:{0})", play);
                return(new LocalStr(strings.error_playmgr_internal_error));
            }

            Log.Debug("AudioResource start: {0}", play);
            var result = playerConnection.AudioStart(play);

            if (!result)
            {
                Log.Error("Error return from player: {0}", result.Error);
                return(new LocalStr(strings.error_playmgr_internal_error));
            }

            playerConnection.Volume = Util.Clamp(playerConnection.Volume, confBot.Audio.Volume.Min, confBot.Audio.Volume.Max);
            CurrentPlayData         = playInfo;     // TODO meta as readonly
            AfterResourceStarted?.Invoke(this, playInfo);

            return(R.Ok);
        }
コード例 #3
0
        private E <LocalStr> Start(PlayResource resource, string restoredLink)
        {
            Log.Trace("Starting resource...");

            var playInfo = new PlayInfoEventArgs(resource.Meta.ResourceOwnerUid, resource, restoredLink);

            BeforeResourceStarted?.Invoke(this, playInfo);
            if (string.IsNullOrWhiteSpace(resource.PlayUri))
            {
                Log.Error("Internal resource error: link is empty (resource:{0})", resource);
                return(new LocalStr(strings.error_playmgr_internal_error));
            }

            var gain = resource.BaseData.Gain ?? 0;

            Log.Debug("AudioResource start: {0} with gain {1}", resource, gain);
            var result = player.Play(resource, gain);

            if (!result)
            {
                Log.Error("Error return from player: {0}", result.Error);
                return(new LocalStr(strings.error_playmgr_internal_error));
            }

            player.Volume = Tools.Clamp(player.Volume, config.Audio.Volume.Min, config.Audio.Volume.Max);
            AfterResourceStarted?.Invoke(this, playInfo);
            return(R.Ok);
        }
コード例 #4
0
ファイル: PlayManager.cs プロジェクト: jwiesler/TS3AudioBot
 private void OnAfterResourceStarted(object sender, PlayInfoEventArgs e)
 {
     lock (Lock) {
         CurrentPlayData = e;
         AfterResourceStarted?.Invoke(this, e);
         ++NextSongIndex;
         UpdateNextSong();
     }
 }
コード例 #5
0
        private void OnBeforeResourceStarted(object sender, PlayInfoEventArgs e)
        {
            lock (Lock) {
                if (sender == null || !ReferenceEquals(sender, Current))
                {
                    return;
                }

                BeforeResourceStarted?.Invoke(this, e);
            }
        }
コード例 #6
0
        private void OnAfterResourceStarted(object sender, PlayInfoEventArgs e)
        {
            lock (Lock) {
                if (sender == null || !ReferenceEquals(sender, Current))
                {
                    return;
                }

                CurrentPlayData = e;
                AfterResourceStarted?.Invoke(this, e);
                ClearTask();
                UpdateNextSong();
            }
        }
コード例 #7
0
        private void StopInternal(bool songEndedByCallback)
        {
            BeforeResourceStopped?.Invoke(this, new SongEndEventArgs(songEndedByCallback));

            if (songEndedByCallback)
            {
                var result = Next(CurrentPlayData?.Invoker ?? InvokerData.Anonymous, false);
                if (result.Ok)
                {
                    return;
                }
                Log.Info("Song queue ended: {0}", result.Error);
            }
            else
            {
                playerConnection.Stop();
            }

            CurrentPlayData = null;
            AfterResourceStopped?.Invoke(this, EventArgs.Empty);
        }
コード例 #8
0
ファイル: PlayManager.cs プロジェクト: yakMM/TS3AudioBot
        private async Task StartResource(InvokerData invoker, PlayResource play)
        {
            var sourceLink = resourceResolver.RestoreLink(play.AudioResource);
            var playInfo   = new PlayInfoEventArgs(invoker, play, sourceLink);
            await BeforeResourceStarted.InvokeAsync(this, playInfo);

            if (string.IsNullOrWhiteSpace(play.PlayUri))
            {
                Log.Error("Internal resource error: link is empty (resource:{0})", play);
                throw Error.LocalStr(strings.error_playmgr_internal_error);
            }

            Log.Debug("AudioResource start: {0}", play);
            try { await playerConnection.Play(play); }
            catch (AudioBotException ex)
            {
                Log.Error("Error return from player: {0}", ex.Message);
                throw Error.Exception(ex).LocalStr(strings.error_playmgr_internal_error);
            }

            playerConnection.Volume = Tools.Clamp(playerConnection.Volume, confBot.Audio.Volume.Min, confBot.Audio.Volume.Max);
            CurrentPlayData         = playInfo;     // TODO meta as readonly
            await AfterResourceStarted.InvokeAsync(this, playInfo);
        }
コード例 #9
0
ファイル: PlayManager.cs プロジェクト: jwiesler/TS3AudioBot
 private void OnBeforeResourceStarted(object sender, PlayInfoEventArgs e)
 {
     lock (Lock) {
         BeforeResourceStarted?.Invoke(this, e);
     }
 }