Roku Developer Program

Join our online forum to talk to Roku developers and fellow channel creators. Ask questions, share tips with the community, and find helpful resources.
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

how to create screen stacks in simplevideoplayer template

What is the best way to create a second screen in appMain.brs from simplevideoplayer? I have the first button mapped to a 'HLS' live stream, the second button I want to send to a second screen showing categories for VOD playback. In each Category click I need to have the videos in the category... How's the best way to do this?
0 Kudos
8 REPLIES 8
RokuJoel
Binge Watcher

Re: how to create screen stacks in simplevideoplayer templat

You could probably do this just by creating a new posterscreen, call screen=preshowposterscreen() then showposterscreen(screen,category), but you'll probably need to make some modifications in order to get categories and shows that are not in the initial set that you've downloaded.

- Joel
0 Kudos

Re: how to create screen stacks in simplevideoplayer templat

Thanks for the quick reply.

Would I need to have a separate appPosterScreen.brs file for this? What code do I need to use call it? I started working with the videoplayer example and now I've switched to the simplevideoplayer example because it has the kind of home screen we want. But I don't know very much about BrightScript yet or any coding for that matter [but I want to learn], so I'm still at the basic level. Here's the code I have for appMain.brs.

' ********************************************************************
' ** Sample PlayVideo App
' ** Copyright (c) 2009 Roku Inc. All Rights Reserved.
' ********************************************************************

Sub Main(args As Dynamic)
'initialize theme attributes like titles, logos and overhang color
initTheme()

if type(args) = "roAssociativeArray" and type(args.url) = "roString" then
displayVideo(args)
end if
print "Type args = "; type(args)
print "Type args.url = "; type(args.url)

'has to live for the duration of the whole app to prevent flashing
'back to the roku home screen.
screenFacade = CreateObject("roPosterScreen")
screenFacade.show()

itemMpeg4 = { ContentType:"episode"
SDPosterUrl:"file://pkg:/images/DanGilbert.jpg"
HDPosterUrl:"file://pkg:/images/DanGilbert.jpg"
IsHD:False
HDBranded:False
ShortDescriptionLine1:"Dan Gilbert asks, Why are we happy?"
ShortDescriptionLine2:""
Description:"Harvard psychologist Dan Gilbert says our beliefs about what will make us happy are often wrong -- a premise he supports with intriguing research, and explains in his accessible and unexpectedly funny book, Stumbling on Happiness."
Rating:"NR"
StarRating:"80"
Length:1280
Categories:["Technology","Talk"]
Title:"Dan Gilbert asks, Why are we happy?"
}

itemVenter = { ContentType:"episode"
SDPosterUrl:"file://pkg:/images/CraigVenter-2008.jpg"
HDPosterUrl:"file://pkg:/images/CraigVenter-2008.jpg"
IsHD:False
HDBranded:False
ShortDescriptionLine1:"Can we create new life out of our digital universe?"
ShortDescriptionLine2:""
Description:"He walks the TED2008 audience through his latest research into fourth-generation fuels -- biologically created fuels with CO2 as their feedstock. His talk covers the details of creating brand-new chromosomes using digital technology, the reasons why we would want to do this, and the bioethics of synthetic life. A fascinating Q&A with TED's Chris Anderson follows."
Rating:"NR"
StarRating:"80"
Length:1972
Categories:["Technology","Talk"]
Title:"Craig Venter asks, Can we create new life out of our digital universe?"
}

itemMissionTV = { ContentType:"episode"
SDPosterUrl:"file://pkg:/images/MainMenu.png"
HDPosterUrl:"file://pkg:/images/MainMenu.png"
IsHD:true
HDBranded:true
ShortDescriptionLine1:"Watch mission videos anytime!"
ShortDescriptionLine2:""
Description:"Mission TV is a 24/7 channel devoted to the Great Commission of Matthew 28:17-20. Watch front line mission video adventures and see interviews of missionaries who have been there. Most of all, get encouraged to be a part of hastening the coming of Christ by giving the Gospel to the world."
Rating:"NR"
StarRating:"80"
Length:600
Categories:["Gospel","Christian"]
Title:"Watch mission videos anytime!"
}

'showSpringboardScreen(itemVenter)
'showSpringboardScreen(itemMpeg4) 'uncomment this line and comment out the next to see the old mpeg4 example
showSpringboardScreen(itemMissionTV) 'uncomment this line to see the BigBuckBunny example

'exit the app gently so that the screen doesn't flash to black
screenFacade.showMessage("")
sleep(25)
End Sub

'*************************************************************
'** Set the configurable theme attributes for the application
'**
'** Configure the custom overhang and Logo attributes
'*************************************************************

Sub initTheme()

app = CreateObject("roAppManager")
theme = CreateObject("roAssociativeArray")

theme.OverhangOffsetSD_X = "72"
theme.OverhangOffsetSD_Y = "31"
theme.OverhangSliceSD = "pkg:/images/Overhang_Background_SD.png"
theme.OverhangLogoSD = "pkg:/images/Overhang_Logo_SD.png"

theme.OverhangOffsetHD_X = "125"
theme.OverhangOffsetHD_Y = "35"
theme.OverhangSliceHD = "pkg:/images/Overhang_Background_HD.png"
theme.OverhangLogoHD = "pkg:/images/Overhang_Logo_HD.png"

theme.BackgroundColor = "#000000"

app.SetTheme(theme)

End Sub

'*************************************************************
'** showSpringboardScreen()
'*************************************************************

Function showSpringboardScreen(item as object) As Boolean
port = CreateObject("roMessagePort")
screen = CreateObject("roSpringboardScreen")

print "showSpringboardScreen"

screen.SetMessagePort(port)
screen.AllowUpdates(false)
if item <> invalid and type(item) = "roAssociativeArray"
screen.SetContent(item)
endif

screen.SetDescriptionStyle("generic") 'audio, movie, video, generic
' generic+episode=4x3,
screen.ClearButtons()
screen.AddButton(1,"Play Live Stream")
screen.AddButton(2,"Play On Demand Videos")
screen.SetStaticRatingEnabled(false)
screen.AllowUpdates(true)
screen.Show()

downKey=3
selectKey=6
while true
msg = wait(0, screen.GetMessagePort())
if type(msg) = "roSpringboardScreenEvent"
if msg.isScreenClosed()
print "Screen closed"
exit while
else if msg.isButtonPressed()
print "Button pressed: "; msg.GetIndex(); " " msg.GetData()
if msg.GetIndex() = 1
displayVideo("")
else if msg.GetIndex() = 2
InitContentList("1")
return true
endif
else
print "Unknown event: "; msg.GetType(); " msg: "; msg.GetMessage()
endif
else
print "wrong type.... type=";msg.GetType(); " msg: "; msg.GetMessage()
endif
end while


return true
End Function


'*************************************************************
'** displayVideo()
'*************************************************************

Function displayVideo(args As Dynamic)
print "Displaying video: "
p = CreateObject("roMessagePort")
video = CreateObject("roVideoScreen")
video.setMessagePort(p)

'bitrates = [0] ' 0 = no dots, adaptive bitrate
'bitrates = [348] ' <200 Kbps = 1 dot
'bitrates = [664] ' <600 Kbps = 2 dots
'bitrates = [996] ' <1.1Mbps = 3 dots
'bitrates = [2048] ' >=1.6Mbps = 4 dots
'bitrates = [0]

'Low Bandwidth'
urls = ["http://[realhost-low]/playlist.m3u8"]
bitrates = [348]
qualities = ["SD"]
StreamFormat = "HLS"
title = "Loading Stream... Auto-Bandwidth Low"
srt = ""

'Medium Bandwidth'
urls = ["http://[realhost-medium]/playlist.m3u8"]
bitrates = [664]
qualities = ["SD"]
StreamFormat = "HLS"
title = "Loading Stream... Auto-Bandwidth Medium"
srt = ""

'High Bandwidth'
urls = ["http://[realhost-high]/playlist.m3u8"]
bitrates = [2048]
qualities = ["SD"]
StreamFormat = "HLS"
title = "Loading Stream... Auto-Bandwidth High"
srt = ""

'Ted Talks'
'urls = ["[code][/code]"]
'qualities = ["SD"]
'StreamFormat = "mp4"
'title = "Loading Stream..."

' Apple's HLS test stream
'urls = ["http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"]
'qualities = ["SD"]
'streamformat = "hls"
'title = "Apple BipBop Test Stream"


if type(args) = "roAssociativeArray"
if type(args.url) = "roString" and args.url <> "" then
urls[0] = args.url
end if
if type(args.StreamFormat) = "roString" and args.StreamFormat <> "" then
StreamFormat = args.StreamFormat
end if
if type(args.title) = "roString" and args.title <> "" then
title = args.title
else
title = ""
end if
if type(args.srt) = "roString" and args.srt <> "" then
srt = args.StreamFormat
else
srt = ""
end if
end if

videoclip = CreateObject("roAssociativeArray")
videoclip.StreamBitrates = bitrates
videoclip.StreamUrls = urls
videoclip.switchingStrategy = "full-adaptation"
videoclip.StreamQualities = qualities
videoclip.StreamFormat = StreamFormat
videoclip.Title = title
videoclip.Live = True

'print "srt = ";srt
if srt <> invalid and srt <> "" then
videoclip.SubtitleUrl = srt
end if

video.SetContent(videoclip)
video.show()

lastSavedPos = 0
statusInterval = 10 'position must change by more than this number of seconds before saving

while true
msg = wait(0, video.GetMessagePort())
if type(msg) = "roVideoScreenEvent"
if msg.isScreenClosed() then 'ScreenClosed event
print "Closing video screen"
exit while
else if msg.isPlaybackPosition() then
nowpos = msg.GetIndex()
if nowpos > 10000

end if
if nowpos > 0
if abs(nowpos - lastSavedPos) > statusInterval
lastSavedPos = nowpos
end if
end if
else if msg.isRequestFailed()
print "play failed: "; msg.GetMessage()
else
print "Unknown event: "; msg.GetType(); " msg: "; msg.GetMessage()
endif
end if
end while
End Function
0 Kudos

Re: how to create screen stacks in simplevideoplayer templat

Ok, So I've tried to do this as much as I can, I've basically copied the code from the video player example I had setup before and set it as a new file (appPosterScreen.brs), but now It's crashing and I'm getting this in the debugger... Any ideas?


Current Function:
012: Function preShowPosterScreen(breadA=invalid, breadB=invalid) As Object
013:
014: if validateParam(breadA, "roString", "preShowPosterScreen", true) = false return -1
015: if validateParam(breadB, "roString", "preShowPosterScreen", true) = false return -1
016:
017: port=CreateObject("roMessagePort")
018: screen = CreateObject("roPosterScreen")
019: screen.SetMessagePort(port)
020: if breadA<>invalid and breadB<>invalid then
021: screen.SetBreadcrumbText(breadA, breadB)
022: end if
023:
024: screen.SetListStyle("arced-landscape")
025: return screen
026:
027: End Function
Function Call Operator ( ) attempted on non-function. (runtime error &he0) in ...g:/source/appPosterScreen.brs(14)

014: if validateParam(breadA, "roString", "preShowPosterScreen", true) = false return -1
Backtrace:
Function preshowposterscreen(breada As ) As
file/line: /tmp/plugin/LABAAAswQzn8...g:/source/appPosterScreen.brs(14)
Function showspringboardscreen(item As <uninitialized>) As Boolean
file/line: /tmp/plugin/LABAAAswQzn8/pkg:/source/appMain.brs(141)
Function main(args As ) As
file/line: /tmp/plugin/LABAAAswQzn8/pkg:/source/appMain.brs(68)

Local Variables:
breada &h0100 String (VT_STR_CONST) val:
breadb &h0080 Invalid val:invalid
global &h0020 rotINTERFACE:ifGlobal
m &h0010 bsc:roAssociativeArray, refcnt=4
port &h0000 <uninitialized> val:Uninitialized
screen &h0000 <uninitialized> val:Uninitialized
validateparam &h0000 <uninitialized> val:Uninitialized
0 Kudos
RokuChris
Roku Employee
Roku Employee

Re: how to create screen stacks in simplevideoplayer templat

Function Call Operator ( ) attempted on non-function. (runtime error &he0) in ...g:/source/appPosterScreen.brs(14)

014: if validateParam(breadA, "roString", "preShowPosterScreen", true) = false return -1


validateparam &h0000 <uninitialized> val:Uninitialized


It's telling you that it can't find a definition for the function validateParam anywhere in your channel. You need to find the function definition in the channel you borrowed that code from and include it in your channel.
0 Kudos

Re: how to create screen stacks in simplevideoplayer templat

Thanks for the reply! So I need to find the part where it says 'Function validateParam...' ? I'm curious, what does this function actually do?
0 Kudos

Re: how to create screen stacks in simplevideoplayer templat

I found the function validateParam and added it into the channel... but now I have another problem. Sorry I don't know how to interpret these yet. The channel is still crashing and the debugger is showing this:

invalid parameter of type roInvalid for roString in function preShowPosterScreen
0 Kudos

Re: how to create screen stacks in simplevideoplayer templat

Here is my preShowPosterScreen code:

Function preShowPosterScreen(breadA=invalid, breadB=invalid) As Object

if validateParam(breadA, "roString", "preShowPosterScreen", true) = false return -1
if validateParam(breadB, "roString", "preShowPosterScreen", true) = false return -1

port=CreateObject("roMessagePort")
screen = CreateObject("roPosterScreen")
screen.SetMessagePort(port)
if breadA<>invalid and breadB<>invalid then
screen.SetBreadcrumbText(breadA, breadB)
end if

screen.SetListStyle("arced-landscape")
return screen

End Function
0 Kudos

Re: how to create screen stacks in simplevideoplayer templat

Does anyone know what this error from debugger means?

invalid parameter of type roInvalid for roString in function preShowPosterScreen
0 Kudos