private async Task <bool> IsPlaylistEmpty() { if (!Playlist.Any()) { await ChatChannel.SafeSendMessage("No tracks in playlist."); return(true); } return(false); }
public async Task StartPlaylist() { if (IsPlaying) { return; } if (await IsPlaylistEmpty()) { return; } if (PlaybackChannel == null) { await ChatChannel.SafeSendMessage("Audio playback channel has not been set."); return; } if (!await DiscordUtils.CanJoinAndTalkInVoiceChannel(PlaybackChannel, ChatChannel)) { return; } _voiceClient = await _client.Audio().Join(PlaybackChannel); while (true) { if (_stopPlaylistFlag) { _stopPlaylistFlag = false; break; } if (await IsPlaylistEmpty()) { return; } await StartCurrentTrackPlayback(); if (_prevFlag) { _prevFlag = false; TrackIndex--; } else if (!_skipToFlag) { TrackIndex++; } } _voiceClient.Wait(); await _voiceClient.Disconnect(); }
public async Task PrintCurrentTrack() { if (CurrentTrack != null) { StringBuilder builder = new StringBuilder($"Currently playing: {CurrentTrack.Name}"); if (CurrentTrack.Length != null && CurrentTrack.Length != TimeSpan.Zero) { builder.Append($" `[{CurrentTrack.Length}]`"); } await ChatChannel.SafeSendMessage(builder.ToString()); } else { await ChatChannel.SafeSendMessage("No track playing"); } }
private async Task StartCurrentTrackPlayback() { if (IsPlaying) { return; } if (PlaybackChannel == null) { await ChatChannel.SafeSendMessage( "Playback channel wasn't set when attempting to start track playback."); return; } if (_voiceClient == null) { await ChatChannel.SafeSendMessage("Voice client wasn't set when attempting to start track playback."); return; } _stopTrackFlag = false; IsPlaying = true; using (AudioStreamer streamer = new AudioStreamer(await CurrentTrack.GetStream(), _client)) { if (_skipToFlag) { streamer.Start(_skipTime); _skipTime = TimeSpan.Zero; _skipToFlag = false; } else { await PrintCurrentTrack(); streamer.Start(); } int bufferSize = 1920 * _client.Audio().Config.Channels; byte[] buffer = new byte[bufferSize]; // Wait for the ffmpeg stream to become available. while (streamer.OutputStream == null) { await Task.Delay(10); } while (true) { if (_stopTrackFlag) { _pausePlaybackFlag = false; _stopTrackFlag = false; break; } if (_pausePlaybackFlag) { await Task.Delay(100); } else { if (streamer.OutputStream.ReadExactly(buffer, bufferSize)) { break; } _voiceClient.Send(buffer, 0, bufferSize); } } } IsPlaying = false; }