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 ++++++++++++++++++++++++------------------ downloader/downloader.go | 29 +++++++++++---- 2 files changed, 70 insertions(+), 41 deletions(-) (limited to 'downloader') 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() } } diff --git a/downloader/downloader.go b/downloader/downloader.go index 6abe7f0..b7645da 100644 --- a/downloader/downloader.go +++ b/downloader/downloader.go @@ -62,13 +62,21 @@ func (d *downloader) Stop() { }) } -func (d *downloader) Start() (<-chan []byte, <-chan struct{}) { +func (d *downloader) Start() <-chan []byte { out := make(chan []byte, 1024) - done := make(chan struct{}, 1) go func() { - defer close(done) defer close(out) + select { + case <-d.done: + for wavB := range d.pb { + wavB.wav.Stop() + wavB.cleanup() + } + return + default: + } + for wavB := range d.pb { wavB.wav.Start(out) @@ -78,17 +86,22 @@ func (d *downloader) Start() (<-chan []byte, <-chan struct{}) { wavB.cleanup() case <-wavB.wav.Done: - break } } }() - return out, done + return out } func (d *downloader) schedule() { defer close(d.pb) for i := 0; ; i++ { + select { + case <-d.done: + return + default: + } + clipStart := time.Duration(i)*clipTime + d.StartTime clipEnd := time.Duration(i+1)*clipTime + d.StartTime @@ -107,7 +120,11 @@ func (d *downloader) schedule() { return } - d.pb <- wavb + select { + case d.pb <- wavb: + case <-d.done: + return + } } } -- cgit v1.3.1