aboutsummaryrefslogtreecommitdiff
path: root/downloader/download_manager.go
diff options
context:
space:
mode:
Diffstat (limited to 'downloader/download_manager.go')
-rw-r--r--downloader/download_manager.go132
1 files changed, 47 insertions, 85 deletions
diff --git a/downloader/download_manager.go b/downloader/download_manager.go
index d6f3fa0..8f9e8a3 100644
--- a/downloader/download_manager.go
+++ b/downloader/download_manager.go
@@ -11,18 +11,15 @@ type DlMessage int
const (
Clear DlMessage = iota
Pause
- Resume
+ Play
)
-type connUpdate int
-
-const (
- attach connUpdate = iota
- detach
-)
+type playBundle struct {
+ data <-chan []byte
+ conn *discordgo.VoiceConnection
+}
type DownloadManager struct {
- conn *discordgo.VoiceConnection
session *discordgo.Session
guildID string
voiceID string
@@ -32,25 +29,23 @@ type DownloadManager struct {
playStateChan chan DlMessage
proxyStateChan chan DlMessage
- connUpdate chan connUpdate
- proxyChan chan []byte
+ proxyChan chan playBundle
}
const proxyBufSize = 512
func NewManager(s *discordgo.Session, guildID string, voiceChanID string) *DownloadManager {
dm := &DownloadManager{
- session: s,
- dls: make(chan *downloader),
- connUpdate: make(chan connUpdate, 1),
- PlayState: make(chan DlMessage),
- guildID: guildID,
- voiceID: voiceChanID,
+ session: s,
+ dls: make(chan *downloader),
+ PlayState: make(chan DlMessage),
+ guildID: guildID,
+ voiceID: voiceChanID,
playStateChan: make(chan DlMessage),
proxyStateChan: make(chan DlMessage),
- proxyChan: make(chan []byte, proxyBufSize),
+ proxyChan: make(chan playBundle),
}
go dm.teeStateMessages()
@@ -68,88 +63,55 @@ func (m *DownloadManager) teeStateMessages() {
}
func (m *DownloadManager) proxyOpusPackets() {
- attachState := detach
- playState := Resume
- clear := false
-
loop:
- for {
- if playState == Pause {
- select {
- case playState = <-m.proxyStateChan:
- continue loop
- }
- }
+ for bundle := range m.proxyChan {
+ playState := Play
+ bundle.conn.Speaking(true)
- select { // first check if we have a state update message coming in
- case playState = <-m.proxyStateChan:
- continue loop
- default:
+ cleanup := func() {
+ bundle.conn.Speaking(false)
+ bundle.conn.Disconnect()
}
- // if we're clearing, empty
- if clear {
- for {
- select {
- case <-m.proxyChan:
+ for {
+ switch playState {
+ case Clear:
+ for {
+ select {
+ case <-m.proxyChan:
+ default:
+ }
+ }
+ cleanup()
+ continue loop
+ case Pause:
+ playState = <-m.proxyStateChan
+ case Play:
+ select { // first check if we have a state update message coming in
case playState = <-m.proxyStateChan:
- continue loop
- default:
+ case bundle.conn.OpusSend <- <-bundle.data:
}
}
}
-
- select {
- case upd := <-m.connUpdate:
- attachState = upd
- default:
- }
-
- if attachState == attach {
- select {
- case attachState = <-m.connUpdate:
- case m.conn.OpusSend <- <-m.proxyChan:
- }
- } else {
- select {
- case attachState = <-m.connUpdate:
- }
- }
+ cleanup()
}
}
func (m *DownloadManager) playFromQueue() {
- //timer := time.After(5*time.Second)
-
- for {
- select {
- case dl := <-m.dls:
- if m.conn == nil {
- 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
- }
-
- m.conn = ch
- m.connUpdate <- attach
- }
+ 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
+ }
- m.conn.Speaking(true)
- // todo: figure out how to do disconnection checking
- dl.SendOn(m.proxyChan)
- <-dl.done
- m.conn.Speaking(false)
- //case <-timer:
- // if m.conn != nil {
- // m.connUpdate<-detach
- // if err := m.conn.Disconnect(); err != nil {
- // log.Errorf("disconnecting from voice connection: %q", err)
- // }
- // m.conn = nil
- // }
+ out, done := dl.Start()
+ m.proxyChan <- playBundle{
+ data: out,
+ conn: ch,
}
+ <-done
}
}