summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Perry <avaglir@gmail.com>2017-07-29 16:01:03 -0400
committerNathan Perry <avaglir@gmail.com>2017-07-29 16:01:03 -0400
commitb562764a74caa986b99b523dbf78beced6fc1e88 (patch)
tree561fe6886701b739fe94b9cf4aff7210d155fe3c
parent2d867f0e32ec8eacdd0c9bb51094cd38707e4d88 (diff)
about to start pause refactor
-rw-r--r--downloader/download_manager.go136
1 files changed, 133 insertions, 3 deletions
diff --git a/downloader/download_manager.go b/downloader/download_manager.go
index de028ab..481fc4f 100644
--- a/downloader/download_manager.go
+++ b/downloader/download_manager.go
@@ -1,14 +1,144 @@
package downloader
-import "github.com/bwmarrin/discordgo"
+import (
+ "time"
+
+ "github.com/bwmarrin/discordgo"
+)
+
+type DlMessage int
+
+const (
+ Clear DlMessage = iota
+ Pause
+ Resume
+)
+
+type connUpdate int
+
+const (
+ attach connUpdate = iota
+ detach
+)
type DownloadManager struct {
+ conn *discordgo.VoiceConnection
session *discordgo.Session
+ dls chan *Downloader
+
+ PlayState chan DlMessage
+ playStateChan chan DlMessage
+ proxyStateChan chan DlMessage
+
+ connUpdate chan connUpdate
+ proxyChan chan []byte
}
+const proxyBufSize = 512
+
func NewManager(s *discordgo.Session) *DownloadManager {
+ dm := &DownloadManager{
+ session: s,
+ dls: make(chan *Downloader),
+ connUpdate: make(chan connUpdate, 1),
+ PlayState: make(chan DlMessage),
+
+ playStateChan: make(chan DlMessage),
+
+ proxyStateChan: make(chan DlMessage),
+ proxyChan: make(chan []byte, proxyBufSize),
+ }
+
+ 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) proxyOpusPackets() {
+ attachState := detach
+ playState := Resume
+ clear := false
+
+loop:
+ for {
+ if playState == Pause {
+ select {
+ case playState = <-m.proxyStateChan:
+ continue loop
+ }
+ }
+
+ select { // first check if we have a state update message coming in
+ case playState = <-m.proxyStateChan:
+ continue loop
+ default:
+ }
+
+ // if we're clearing, empty
+ if clear {
+ for {
+ select {
+ case <-m.proxyChan:
+ case playState = <-m.proxyStateChan:
+ continue loop
+ default:
+ }
+ }
+ }
+
+ select {
+ case upd := <-m.connUpdate:
+ attachState = upd
+ default:
+ }
+
+ if attachState == attach {
+ select {
+ case upd := <-m.connUpdate:
+ attachState = upd
+ case m.conn.OpusSend <- <-m.proxyChan:
+ }
+ } else {
+ select {
+ case upd := <-m.connUpdate:
+ attachState = upd
+ }
+ }
+ }
+}
+
+func (m *DownloadManager) playFromQueue() {
+loop:
+ for {
+ select {
+ case dl := <-m.dls:
+ dl.SendOn(m.proxyChan)
+ select {
+ case <-dl.done:
+ continue loop
+
+ case upd:=<-m.playStateChan:
+
+ }
+
+ }
+ }
+}
- return &DownloadManager{
- session: s,
+func (m *DownloadManager) Enqueue(url string, startTime, endTime time.Duration) error {
+ dl, err := NewDownload(url, startTime, endTime)
+ if err != nil {
+ return err
}
+ m.dls <- dl
+ return nil
}