Good evening, I'm trying to develop a timeout functionality much like what you see with Netflix. The basic concept goes that when a live stream is being broadcast, a timer is running in the background and when a predetermined amount of time elapses a confirmation box pops up asking the viewer if they are still watching the stream. I was able to create a working example with a basic channel from scratch only using one static video.
However, when I tried to migrate the timer code into an existing channel we have, based on the videoPlayer example, it breaks. Navigation happens like normal and when a video is selected it starts playing. However, if you click no on the "Still Watching" confirmation box, or if the confirmation times out and goes back to the previous screen from the video, the channel is pretty much stuck. You can go backward in the stack, but can't select anything that moves you forward. In other words, you can go back all the way to the main screen on the Roku, but you can't start playing another video or continue playing the video you were just on.
What I did was to take the timer functions that I was using and plug them into the channel and call the timer right after the video starts playing in the appVideoScreen.brs. I also pass the video screen object so that the timer functions would have access to it and be able to close it if need be.
Initially called here from appVideoScreen.brs:
while true print "Playing Video" msg = wait(0, port)
if type(msg) = "roVideoScreenEvent" then print "showHomeScreen | msg = "; msg.getMessage() " | index = "; msg.GetIndex() if msg.isfullresult() print "Video Completed Playback Normally" RegDelete(episode.ContentId) print "deleted bookmark for playback position" else if msg.isScreenClosed() print "Screen closed" exit while elseif msg.isRequestFailed() print "Video request failure: "; msg.GetIndex(); " " msg.GetData() elseif msg.isStatusMessage() print "Video status: "; msg.GetIndex(); " " msg.GetData() elseif msg.isButtonPressed() print "Button pressed: "; msg.GetIndex(); " " msg.GetData() elseif msg.isPlaybackPosition() then nowpos = msg.GetIndex() RegWrite(episode.ContentId, nowpos.toStr()) else print "Unexpected event type: "; msg.GetType() end if else print "Unexpected message class: "; type(msg) end if Main_Timer(screen) ' <----------------------- Timer is called here end while
The timer functions:
Sub Main_Timer(screen as object) timer_bool = 1 popup_time = 10000 m.close_time = 10000
if(ticks > popup_time AND ticks < (popup_time+2000) AND timer_bool = 1) print Stri(popup_time+2000) response = Show_Popup() if (response = true) timer_bool = 1 print "Yes Button Was Pressed" timer_main.Mark() else if (response = false) timer_bool = 0 print "No Button Was Pressed" 'END m.watching_popup.Close() screen.Close() end if end if end if end while End Sub
Function Show_Popup() as Boolean print "Starting Popup Function" newport = CreateObject("roMessagePort") m.watching_popup = CreateObject("roMessageDialog") m.watching_popup.SetMessagePort(newport) ' instruct screen to send events to port
m.watching_popup.SetTitle("Viewer") m.watching_popup.SetText("Are you still watching?")
while true msg = wait(m.close_time, m.watching_popup.GetMessagePort()) if type(msg) = "roMessageDialogEvent" if msg.isButtonPressed() if msg.GetIndex() = 0 print "Popup - Yes pressed" m.watching_popup.Close() return true exit while else if msg.GetIndex() = 1 print "Popup - No pressed" m.watching_popup.Close() return false exit while end if end if end if return false end while
Now I know that Netflix doesn't actually go back in the stack like I'm doing here. It just stops the video. So is that what I need to do instead?
Dean at the School of Truth: a part of Autodidact University.
"A programmer is just a tool which converts caffeine into code" Temet nosce Vi Veri Veniversum Vivus Vici Si vis pacem, para bellum
You should not have an event loop inside your Main_Timer function. Main_Timer is already being called in every iteration of your main (video processing) event loop. You should create the timer before your main loop starts, not in Main_Timer, and just check the timer in Main_Timer. BTW you may also want to use a nonzero timeout in your wait call, so that the timer code gets called even when no events are occurring.