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); }
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); }
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); }
private void OnAfterResourceStarted(object sender, PlayInfoEventArgs e) { lock (Lock) { CurrentPlayData = e; AfterResourceStarted?.Invoke(this, e); ++NextSongIndex; UpdateNextSong(); } }
private void OnBeforeResourceStarted(object sender, PlayInfoEventArgs e) { lock (Lock) { if (sender == null || !ReferenceEquals(sender, Current)) { return; } BeforeResourceStarted?.Invoke(this, e); } }
private void OnAfterResourceStarted(object sender, PlayInfoEventArgs e) { lock (Lock) { if (sender == null || !ReferenceEquals(sender, Current)) { return; } CurrentPlayData = e; AfterResourceStarted?.Invoke(this, e); ClearTask(); UpdateNextSong(); } }
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); }
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); }
private void OnBeforeResourceStarted(object sender, PlayInfoEventArgs e) { lock (Lock) { BeforeResourceStarted?.Invoke(this, e); } }