From 9bd93434fbefc56ac6c154c569e064cc7e5f956d Mon Sep 17 00:00:00 2001 From: Nathan Perry Date: Sat, 29 Jul 2017 18:02:10 -0400 Subject: working on adding playback commands --- downloader/download_manager.go | 82 ++++++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 35 deletions(-) (limited to 'downloader/download_manager.go') diff --git a/downloader/download_manager.go b/downloader/download_manager.go index c0ceecb..16054ae 100644 --- a/downloader/download_manager.go +++ b/downloader/download_manager.go @@ -12,6 +12,7 @@ const ( Clear DlMessage = iota Pause Play + Skip ) type playBundle struct { @@ -43,50 +44,61 @@ func NewManager(s *discordgo.Session, guildID string, voiceChanID string) *Downl } func (m *DownloadManager) playFromQueue() { - for dl := range m.dls { - conn, err := m.session.ChannelVoiceJoin(m.guildID, m.voiceID, false, false) - if err != nil { - log.Errorf("unable to connect to the voice channel: %q", err) - time.Sleep(1 * time.Second) - break - } + for { + select { + case <-m.PlayState: // ignore play state updates while not playing anything + case dl := <-m.dls: + conn, err := m.session.ChannelVoiceJoin(m.guildID, m.voiceID, false, false) + if err != nil { + log.Errorf("unable to connect to the voice channel: %q", err) + time.Sleep(1 * time.Second) + break + } - out, _ := dl.Start() + m.session.UpdateStatus(0, dl.info.Url.Host) + out := dl.Start() - playState := Play - conn.Speaking(true) + playState := Play + conn.Speaking(true) - cleanup := func() { - conn.Speaking(false) - conn.Disconnect() - } + cleanup := func() { + conn.Speaking(false) + conn.Disconnect() + m.session.UpdateStatus(0, "literally nothing") + } - inner: - for { - switch playState { - case Clear: - for { - select { - case <-m.PlayState: - default: + inner: + for { + switch playState { + case Clear: + dl.Stop() + for { + select { + case dl := <-m.dls: + dl.Stop() + dl.Start() // this is a hacky way of ensuring all the wavs are closed and cleaned up + default: + } } - } - break inner - case Pause: - playState = <-m.PlayState - case Play: - select { // first check if we have a state update message coming in - case playState = <-m.PlayState: - case elem, ok := <-out: - if !ok { - break inner + break inner + case Skip: + break inner + case Pause: + playState = <-m.PlayState + case Play: + select { // first check if we have a state update message coming in + case playState = <-m.PlayState: + case elem, ok := <-out: + if !ok { + break inner + } + + conn.OpusSend <- elem } - - conn.OpusSend <- elem } } + cleanup() } - cleanup() } } -- cgit v1.3.1