diff options
| author | Nathan Perry <avaglir@gmail.com> | 2017-07-29 17:12:30 -0400 |
|---|---|---|
| committer | Nathan Perry <avaglir@gmail.com> | 2017-07-29 17:12:30 -0400 |
| commit | b892dd48234dcbed539ddb982af4a76e81d2e8a1 (patch) | |
| tree | a2fd9d347c575d85d2bb95020d592eb9c0d0a73f | |
| parent | 4cd4870a85ed3b3d69d8455faeb7ca466dc42b7b (diff) | |
simplify further
| -rw-r--r-- | downloader/download_manager.go | 75 |
1 files changed, 25 insertions, 50 deletions
diff --git a/downloader/download_manager.go b/downloader/download_manager.go index 8f9e8a3..c0ceecb 100644 --- a/downloader/download_manager.go +++ b/downloader/download_manager.go @@ -25,15 +25,9 @@ type DownloadManager struct { voiceID string dls chan *downloader - PlayState chan DlMessage - playStateChan chan DlMessage - proxyStateChan chan DlMessage - - proxyChan chan playBundle + PlayState chan DlMessage } -const proxyBufSize = 512 - func NewManager(s *discordgo.Session, guildID string, voiceChanID string) *DownloadManager { dm := &DownloadManager{ session: s, @@ -41,55 +35,54 @@ func NewManager(s *discordgo.Session, guildID string, voiceChanID string) *Downl PlayState: make(chan DlMessage), guildID: guildID, voiceID: voiceChanID, - - playStateChan: make(chan DlMessage), - - proxyStateChan: make(chan DlMessage), - proxyChan: make(chan playBundle), } - go dm.teeStateMessages() - go dm.proxyOpusPackets() go dm.playFromQueue() return dm } -func (m *DownloadManager) teeStateMessages() { - for msg := range m.PlayState { - m.playStateChan <- msg - m.proxyStateChan <- msg - } -} +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 + } + + out, _ := dl.Start() -func (m *DownloadManager) proxyOpusPackets() { -loop: - for bundle := range m.proxyChan { playState := Play - bundle.conn.Speaking(true) + conn.Speaking(true) cleanup := func() { - bundle.conn.Speaking(false) - bundle.conn.Disconnect() + conn.Speaking(false) + conn.Disconnect() } + inner: for { switch playState { case Clear: for { select { - case <-m.proxyChan: + case <-m.PlayState: default: } } - cleanup() - continue loop + break inner case Pause: - playState = <-m.proxyStateChan + playState = <-m.PlayState case Play: select { // first check if we have a state update message coming in - case playState = <-m.proxyStateChan: - case bundle.conn.OpusSend <- <-bundle.data: + case playState = <-m.PlayState: + case elem, ok := <-out: + if !ok { + break inner + } + + conn.OpusSend <- elem } } } @@ -97,24 +90,6 @@ loop: } } -func (m *DownloadManager) playFromQueue() { - for dl := range m.dls { - ch, 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, done := dl.Start() - m.proxyChan <- playBundle{ - data: out, - conn: ch, - } - <-done - } -} - func (m *DownloadManager) Enqueue(url string, startTime, duration time.Duration) error { dl, err := newDownload(url, startTime, duration) if err != nil { |
