roSlideShow is buggy with TextOverlay

All,

I am attempting to use the “roSlideShow” object and it appears to be broken if I make the overlay visible.

It displays the first picture, but never changes. I can manually change it using the arrow keys on the remote. If I disable the overlay it operates normally. Additionally, the “isPlaybackPosition” message is generated constantly at a rate of about 10 per second with an index of the current picture.

FUNCTION Main() AS VOID
        port = CreateObject("roMessagePort")
        ui = CreateObject("roSlideShow")
        ui.SetMessagePort(port)

        ui.SetContentList([
                {
                        url: "http://www.rkeene.org/tmp/image0.jpg"
                        TextOverlayBody: "BODY0"
                        TextOverlayUL: "UL0"
                        TextOverlayUR: "UR0"
                }, {
                        url: "http://www.rkeene.org/tmp/image1.jpg"
                        TextOverlayBody: "BODY1"
                        TextOverlayUL: "UL1"
                        TextOverlayUR: "UR1"
                }, {
                        url: "http://www.rkeene.org/tmp/image2.jpg"
                        TextOverlayBody: "BODY2"
                        TextOverlayUL: "UL2"
                        TextOverlayUR: "UR2"
                }
        ])

        ui.SetTextOverlayIsVisible(true)
        ui.SetPeriod(10)
        ui.Show()

        WHILE true
                msg = WAIT(0, port)

                IF msg.isScreenClosed() THEN
                        RETURN
                END IF

                IF msg.isPlaybackPosition() THEN
                        PRINT "Got isPlaybackPosition message for "; msg.GetIndex()
                END IF
        END WHILE
END FUNCTION

The output is:


------ Running ------
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0
Got isPlaybackPosition message for  0

for about 1 second of runtime.

Is there some way to work around this bug ?

I don’t know if it’ll help here, but try setting the content list last. Generally speaking, it’s usually best to set all of the screen options prior to setting the content.

TheEndless,

Thanks for the suggestion, but unfortunately it had no effect.

Thanks,
Roy Keene

Instead of SetTextOverlayIsVisible(), try using SetTextOverlayHoldTime()

ui.SetTextOverlayHoldTime(10000)
ui.SetPeriod(10)

RokuChris,

Thanks for this workaround, but it breaks down in a few ways:

  1. If the user pauses the slideshow the overlay disappears (clearly this can be compensated for by increasing the timeout)
  2. There appears to be no way to hide the overlay after a remote key is pressed, and then to immediately display it again when a remote key is pressed (i.e., toggle the overlay visibility with a remote key). I can make it hide immediately by setting the hold time to “0” and then setting the visibility to “false”, but obviously making it visible again is problematic because I can’t set the visibility to “true” or I hit this bug

Here is the updated code with the workaround and the remote key to toggle the overlay. I’m only able to make the “hiding” portion work with this workaround.

FUNCTION Main() AS VOID
        port = CreateObject("roMessagePort")
        ui = CreateObject("roSlideShow")
        ui.SetMessagePort(port)

        ui.SetPeriod(10)
        overlay_visible = false

        ui.SetContentList([
                {
                        url: "http://www.rkeene.org/tmp/image0.jpg"
                        TextOverlayBody: "BODY0"
                        TextOverlayUL: "UL0"
                        TextOverlayUR: "UR0"
                }, {
                        url: "http://www.rkeene.org/tmp/image1.jpg"
                        TextOverlayBody: "BODY1"
                        TextOverlayUL: "UL1"
                        TextOverlayUR: "UR1"
                }, {
                        url: "http://www.rkeene.org/tmp/image2.jpg"
                        TextOverlayBody: "BODY2"
                        TextOverlayUL: "UL2"
                        TextOverlayUR: "UR2"
                }
        ])

        ui.Show()
        WHILE true
                msg = WAIT(0, port)

                IF msg.isScreenClosed() THEN
                        RETURN
                END IF

                IF msg.isPlaybackPosition() THEN
                        PRINT "Got isPlaybackPosition message for "; msg.GetIndex()
                END IF

                IF msg.isRemoteKeyPressed() THEN
                        IF msg.GetIndex() = 3 THEN
                                IF overlay_visible THEN
                                        overlay_visible = false
                                ELSE
                                        overlay_visible = true
                                END IF

                                IF overlay_visible THEN
                                        PRINT "Making overlay visible"
                                        ui.SetTextOverlayHoldTime(0)
                                        ui.SetTextOverlayIsVisible(true)
                                        ui.SetTextOverlayIsVisible(false)
                                        ui.SetTextOverlayHoldTime(10000)
                                ELSE
                                        PRINT "Making overlay invisible"
                                        ui.SetTextOverlayHoldTime(0)
                                        ui.SetTextOverlayIsVisible(true)
                                        ui.SetTextOverlayIsVisible(false)
                                END IF
                        END IF
                END IF
        END WHILE
END FUNCTION

Does anyone know if the roSlideShow component ever worked ?

How are others working around this component’s failures ?

I’m not sure if it ever worked, but it has been broken for years in various ways (losing image counts, displaying wrong images, inaccurate timing delays, poor buffering, etc etc)
How to work around it? Create your own slideshow using roImageCanvas or roScreen.
The ability to display slides is nothing compared to the power of the Roku (streaming videos) so I can understand how the slideshow is possibly the lowest priority for them to work on.