prevent exiting program when close streamer
This commit is contained in:
parent
817bcdcefe
commit
8138c0df63
1
main.go
1
main.go
@ -77,6 +77,7 @@ func inputHandler() {
|
|||||||
GlobalStreamer.Prev()
|
GlobalStreamer.Prev()
|
||||||
case "quit":
|
case "quit":
|
||||||
GlobalStreamer.Close()
|
GlobalStreamer.Close()
|
||||||
|
os.Exit(0)
|
||||||
case "current":
|
case "current":
|
||||||
fmt.Println(GlobalStreamer.GetCurrentVideoPath())
|
fmt.Println(GlobalStreamer.GetCurrentVideoPath())
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import (
|
|||||||
"html/template"
|
"html/template"
|
||||||
"live-streamer/streamer"
|
"live-streamer/streamer"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"os"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -180,5 +181,6 @@ func (s *Server) RequestHandler(reqType RequestType) {
|
|||||||
s.streamer.Prev()
|
s.streamer.Prev()
|
||||||
case TypeQuit:
|
case TypeQuit:
|
||||||
s.streamer.Close()
|
s.streamer.Close()
|
||||||
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,6 @@ import (
|
|||||||
"live-streamer/model"
|
"live-streamer/model"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"os"
|
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
@ -26,8 +25,9 @@ type Streamer struct {
|
|||||||
outputQueue chan string
|
outputQueue chan string
|
||||||
outputReq chan chan string // address output concurrency security issue
|
outputReq chan chan string // address output concurrency security issue
|
||||||
|
|
||||||
wg sync.WaitGroup // wait all handlers(except closehandler) to finish before closure
|
wg sync.WaitGroup // wait all handlers(except closehandler) to finish before closure
|
||||||
close chan any
|
close chan any // inform actorLoop() to return
|
||||||
|
closed chan any // inform Close() to return
|
||||||
|
|
||||||
log *zap.Logger
|
log *zap.Logger
|
||||||
option *Option
|
option *Option
|
||||||
@ -70,6 +70,7 @@ func NewStreamer(rtmpServer string, streamKey string, videoList []model.VideoIte
|
|||||||
log: log,
|
log: log,
|
||||||
rtmpServer: rtmpServer,
|
rtmpServer: rtmpServer,
|
||||||
streamKey: streamKey,
|
streamKey: streamKey,
|
||||||
|
closed: make(chan any),
|
||||||
}
|
}
|
||||||
GlobalStreamer = s
|
GlobalStreamer = s
|
||||||
go s.actorLoop()
|
go s.actorLoop()
|
||||||
@ -237,10 +238,7 @@ func (s *Streamer) handleNext() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
s.state.manualControl = true
|
s.state.manualControl = true
|
||||||
s.state.currentVideoIndex++
|
s.state.currentVideoIndex = (s.state.currentVideoIndex + 1) % len(s.state.videoList)
|
||||||
if s.state.currentVideoIndex >= len(s.state.videoList) {
|
|
||||||
s.state.currentVideoIndex = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
s.mailbox <- StopMessage{}
|
s.mailbox <- StopMessage{}
|
||||||
s.mailbox <- StartMessage{}
|
s.mailbox <- StartMessage{}
|
||||||
@ -252,10 +250,7 @@ func (s *Streamer) handlePrev() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
s.state.manualControl = true
|
s.state.manualControl = true
|
||||||
s.state.currentVideoIndex--
|
s.state.currentVideoIndex = (s.state.currentVideoIndex - 1 + len(s.state.videoList)) % len(s.state.videoList)
|
||||||
if s.state.currentVideoIndex < 0 {
|
|
||||||
s.state.currentVideoIndex = len(s.state.videoList) - 1
|
|
||||||
}
|
|
||||||
|
|
||||||
s.mailbox <- StopMessage{}
|
s.mailbox <- StopMessage{}
|
||||||
s.mailbox <- StartMessage{}
|
s.mailbox <- StartMessage{}
|
||||||
@ -289,7 +284,12 @@ func (s *Streamer) handleClose() {
|
|||||||
close(s.close)
|
close(s.close)
|
||||||
s.handleStop()
|
s.handleStop()
|
||||||
s.wg.Wait()
|
s.wg.Wait()
|
||||||
os.Exit(0)
|
close(s.mailbox)
|
||||||
|
close(s.outputQueue)
|
||||||
|
close(s.outputReq)
|
||||||
|
s.output.Reset()
|
||||||
|
GlobalStreamer = nil
|
||||||
|
close(s.closed)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Public methods that send messages to the actor
|
// Public methods that send messages to the actor
|
||||||
@ -343,6 +343,7 @@ func (s *Streamer) GetCurrentIndex() int {
|
|||||||
|
|
||||||
func (s *Streamer) Close() {
|
func (s *Streamer) Close() {
|
||||||
s.mailbox <- CloseMessage{}
|
s.mailbox <- CloseMessage{}
|
||||||
|
<-s.closed
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Streamer) handleOutput() {
|
func (s *Streamer) handleOutput() {
|
||||||
|
Loading…
Reference in New Issue
Block a user