From 2a782100a01bba36c11cbb8f4e84157e60bd05ab Mon Sep 17 00:00:00 2001 From: giongto35 Date: Sat, 11 May 2019 19:46:24 +0800 Subject: [PATCH] client closes peerconnection --- emulator/director.go | 1 + emulator/gameview.go | 4 ++++ handler/handlers.go | 12 ++++++++++++ handler/room/room.go | 13 ++++++++----- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/emulator/director.go b/emulator/director.go index 7f63cdf4..fda84e99 100644 --- a/emulator/director.go +++ b/emulator/director.go @@ -24,6 +24,7 @@ type Director struct { const FPS = 60 func NewDirector(roomID string, imageChannel chan *image.RGBA, audioChannel chan float32, inputChannel chan int) *Director { + // return image channel from where it write director := Director{} director.Done = make(chan struct{}) director.audioChannel = audioChannel diff --git a/emulator/gameview.go b/emulator/gameview.go index 67e36918..5a4c270f 100644 --- a/emulator/gameview.go +++ b/emulator/gameview.go @@ -130,6 +130,10 @@ func (view *GameView) Exit() { if cartridge.Battery != 0 { writeSRAM(sramPath(view.saveFile), cartridge.SRAM) } + + // close producer + close(view.imageChannel) + close(view.audioChannel) } // Update is called for every period of time, dt is the elapsed time from the last frame diff --git a/handler/handlers.go b/handler/handlers.go index 0d9d1fe6..00a942bf 100644 --- a/handler/handlers.go +++ b/handler/handlers.go @@ -107,10 +107,22 @@ func (h *Handler) WS(w http.ResponseWriter, r *http.Request) { }, nil) wssession.BrowserClient.Listen() + + // TODO: Use callback + // listen to socket done to close peerconnection + go func() { + for { + <-client.Done + h.detachPeerConn(wssession.peerconnection) + return + } + }() + } // Detach peerconnection detach/remove a peerconnection from current room func (h *Handler) detachPeerConn(pc *webrtc.WebRTC) { + log.Println("Detach peerconnection") roomID := pc.RoomID room := h.getRoom(roomID) if room == nil { diff --git a/handler/room/room.go b/handler/room/room.go index e3a9b4df..953bc743 100644 --- a/handler/room/room.go +++ b/handler/room/room.go @@ -171,12 +171,15 @@ func (r *Room) removeSession(w *webrtc.WebRTC) { } func (r *Room) Close() { - log.Println("Closing room", r.ID) + if r.Done == false { + log.Println("Closing room", r.ID) + log.Println("Closing director of room ", r.ID) + close(r.director.Done) + log.Println("Closing input of room ", r.ID) + close(r.inputChannel) + r.Done = true + } r.Done = true - log.Println("Closing director of room ", r.ID) - close(r.director.Done) - log.Println("Closing input of room ", r.ID) - close(r.inputChannel) // Close here is a bit wrong because this read channel //close(r.imageChannel) //close(r.audioChannel)