Skip to main content
Support Documentation

How to Setup Multi-Screen Spanning on an XC Model BrightSign

  • June 5, 2025
  • 0 replies
  • 250 views

WARNING - Modifying the main.brs file is no longer advised on Brightsigns as of Jan. 24, 2026. Please reference this article moving forward: Configuring Custom Plugins for BrightSigns.

 

Adapted from: https://docs.brightsign.biz/advanced/multiscreen-videomode

 

As of 2/3/23, the following lines need to be manually added to the /autorun/appspace/main.brs in order to leverage the other HDMI outputs in a video wall configuration. The changes are near line 39 in the file.

 

Screens:

To enable or disable a screen is merely a matter of setting sm[x].enabled or sm[x].disabled, where 'x' is the number of the HDMI output/screen. 

For each screen required, a new block should be added that includes:

  • video_mode—Resolution Setting

  • transform—Rotation Setting

  • display_x—Position of content on x-axis (screen width)

  • display_y—Position of content on the y-axis (screen height)

  • enabled/disabled—Flag to power on/off this HDMI output.

After setting vm.SetScreenModes(sm), because we're utilizing more than one screen, we need to define the amount of screens in the height and width. This is another gotcha line of code that's very easy to miss. Here is what the missing code would look like for finalizing a 2x1 video.

aa1=CreateObject("roAssociativeArray")
aa1.MultiscreenWidth = 2
aa1.MultiscreenHeight = 1
aa1.MultiscreenX = 0
aa1.MultiscreenY = 0

Orientations:

As you can see, it's merely a matter of changing the sm[x].display_x or sm[x].display_y values depending on whether the wall is vertical or horizontal.

You may need to take into account a bezel offset if perhaps the client screens are physically offset and they wish this effect to translate to the content.


 

Resolutions:

The resolution values can be changed according to the supported resolutions guide from BrightSign.

Review those here: https://docs.brightsign.biz/advanced/video-modes

Note that at this time the XC series isn't listed in the supported video modes, so it may be the case that some modes are not possible; you'll have to verify with BrightSign at support@brightsign.biz if a mode is supported.


 

Rotation:

To denote the proper screen rotation, change the sm[x].transform value to either = { "normal", "90", "180", "270" }

Consider these two examples:

This example assumes a 2 x 1 video wall (1080p—"horizontal row" or a "standard wall")

vm=CreateObject("roVideoMode") sm =

vm.GetScreenModes()

 

sm[0].video_mode="1920x1080x60p"

'sm[0].video_mode=“3840x2160x30p:fullres:gfxmemlarge”

'uncomment this line for 4K support

sm[0].transform = "normal" sm[0].display_x=0

sm[0].display_y=0 sm[0].enabled=true

 

sm[1].video_mode="1920x1080x60p"

'sm[1].video_mode=“3840x2160x30p:fullres:gfxmemlarge”

'uncomment this line for 4K support

sm[1].transform = "normal"

sm[1].display_x=1920 'Not adding an offet for bezels, might need to increase this value if screen 2 is cutoff.

sm[1].display_y=0

sm[1].enabled=true

 

sm[2].enabled=false 'Disabling the other two screens just for testing

sm[3].enabled=false 'Disabling the other two screens just for testing

 

vm.SetScreenModes(sm)

 

aa1=CreateObject("roAssociativeArray")

aa1.MultiscreenWidth = 2

aa1.MultiscreenHeight = 1

aa1.MultiscreenX = 0

aa1.MultiscreenY = 0

 

This example assumes a 1 x 2 video wall (1080p—"landscape stack").

vm=CreateObject("roVideoMode")

sm = vm.GetScreenModes()

 
sm[0].video_mode="1920x1080x60p"

sm[0].transform = "normal"

sm[0].display_x=0

sm[0].display_y=0

sm[0].enabled=true

 
sm[1].video_mode="1920x1080x60p"

sm[1].transform = "normal"

sm[1].display_x=0

sm[1].display_y=1100    ' Bezel compensation of 20 pixels

sm[1].enabled=true

 

sm[2].enabled=false

sm[3].enabled=false

 
vm.SetScreenModes(sm)

aa1=CreateObject("roAssociativeArray")

aa1.MultiscreenWidth = 1

aa1.MultiscreenHeight = 2

aa1.MultiscreenX = 0

aa1.MultiscreenY = 0

 

 

Example of a 4 x 1 Portrait Screen

 

Create an example advanced channel to test HDMI layouts to ensure they are correct (below). Some clients have had images mismatched due to this after installation; HDMIs may need to be swapped at the unit.

 

 

vm=CreateObject("roVideoMode")

sm = vm.GetScreenModes()

 

sm[0].video_mode="1920x1080x60p"

'sm[0].video_mode=“3840x2160x30p:fullres:gfxmemlarge” 'uncomment this line for 4K support

sm[0].transform = "90"

sm[0].display_x=0

sm[0].display_y=0

sm[0].enabled=true

 

sm[1].video_mode="1920x1080x60p"

'sm[1].video_mode=“3840x2160x30p:fullres:gfxmemlarge” 'uncomment this line for 4K support

sm[1].transform = "90" 

sm[1].display_x=1080 'Not adding an offet for bezels, might need to increase this value if screen 2 is cutoff.

sm[1].display_y=0

sm[1].enabled=true

 

sm[2].video_mode="1920x1080x60p"

'sm[2].video_mode=“3840x2160x30p:fullres:gfxmemlarge” 'uncomment this line for 4K support

sm[2].transform = "90" 

sm[2].display_x=2160 'Not adding an offet for bezels, might need to increase this value if screen 2 is cutoff.

sm[2].display_y=0

sm[2].enabled=true

 

sm[3].video_mode="1920x1080x60p"

'sm[3].video_mode=“3840x2160x30p:fullres:gfxmemlarge” 'uncomment this line for 4K support

sm[3].transform = "90" 

sm[3].display_x=3240 'Not adding an offet for bezels, might need to increase this value if screen 2 is cutoff.

sm[3].display_y=0

sm[3].enabled=true

 

vm.SetScreenModes(sm)

aa1=CreateObject("roAssociativeArray")

aa1.MultiscreenWidth = 4

aa1.MultiscreenHeight = 1

aa1.MultiscreenX = 0